diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index 8023338c9..7f44e6024 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -1,25 +1,26 @@ -import express from "express"; -import path from "path"; -import favicon from "serve-favicon"; -import cookieParser from "cookie-parser"; -import helmet from "helmet"; -import compression from "compression"; -import config from "./services/config.js"; -import utils, { getResourceDir, isDev } from "./services/utils.js"; -import assets from "./routes/assets.js"; -import routes from "./routes/routes.js"; -import custom from "./routes/custom.js"; -import error_handlers from "./routes/error_handlers.js"; -import { startScheduledCleanup } from "./services/erase.js"; -import sql_init from "./services/sql_init.js"; -import { auth } from "express-openid-connect"; -import openID from "./services/open_id.js"; -import { t } from "i18next"; -import eventService from "./services/events.js"; -import log from "./services/log.js"; import "./services/handlers.js"; import "./becca/becca_loader.js"; + +import compression from "compression"; +import cookieParser from "cookie-parser"; +import express from "express"; +import { auth } from "express-openid-connect"; +import helmet from "helmet"; +import { t } from "i18next"; +import path from "path"; +import favicon from "serve-favicon"; + +import assets from "./routes/assets.js"; +import custom from "./routes/custom.js"; +import error_handlers from "./routes/error_handlers.js"; +import routes from "./routes/routes.js"; +import config from "./services/config.js"; +import { startScheduledCleanup } from "./services/erase.js"; +import log from "./services/log.js"; +import openID from "./services/open_id.js"; import { RESOURCE_DIR } from "./services/resource_dir.js"; +import sql_init from "./services/sql_init.js"; +import utils, { getResourceDir, isDev } from "./services/utils.js"; export default async function buildApp() { const app = express(); diff --git a/apps/server/src/becca/becca_loader.ts b/apps/server/src/becca/becca_loader.ts index f7faf1309..3d5e7c320 100644 --- a/apps/server/src/becca/becca_loader.ts +++ b/apps/server/src/becca/becca_loader.ts @@ -1,20 +1,19 @@ -"use strict"; - -import sql from "../services/sql.js"; -import eventService from "../services/events.js"; -import becca from "./becca.js"; -import log from "../services/log.js"; -import BNote from "./entities/bnote.js"; -import BBranch from "./entities/bbranch.js"; -import BAttribute from "./entities/battribute.js"; -import BOption from "./entities/boption.js"; -import BEtapiToken from "./entities/betapi_token.js"; -import cls from "../services/cls.js"; -import entityConstructor from "../becca/entity_constructor.js"; import type { AttributeRow, BranchRow, EtapiTokenRow, NoteRow, OptionRow } from "@triliumnext/commons"; -import type AbstractBeccaEntity from "./entities/abstract_becca_entity.js"; -import ws from "../services/ws.js"; +import { events as eventService } from "@triliumnext/core"; + +import entityConstructor from "../becca/entity_constructor.js"; +import cls from "../services/cls.js"; +import log from "../services/log.js"; +import sql from "../services/sql.js"; import { dbReady } from "../services/sql_init.js"; +import ws from "../services/ws.js"; +import becca from "./becca.js"; +import type AbstractBeccaEntity from "./entities/abstract_becca_entity.js"; +import BAttribute from "./entities/battribute.js"; +import BBranch from "./entities/bbranch.js"; +import BEtapiToken from "./entities/betapi_token.js"; +import BNote from "./entities/bnote.js"; +import BOption from "./entities/boption.js"; export const beccaLoaded = new Promise(async (res, rej) => { // We have to import async since options init requires keyboard actions which require translations. diff --git a/apps/server/src/becca/entities/abstract_becca_entity.ts b/apps/server/src/becca/entities/abstract_becca_entity.ts index 3b30eccd8..0792c6bd4 100644 --- a/apps/server/src/becca/entities/abstract_becca_entity.ts +++ b/apps/server/src/becca/entities/abstract_becca_entity.ts @@ -1,8 +1,9 @@ +import { events as eventService } from "@triliumnext/core"; + import blobService from "../../services/blob.js"; import cls from "../../services/cls.js"; import dateUtils from "../../services/date_utils.js"; import entityChangesService from "../../services/entity_changes.js"; -import eventService from "../../services/events.js"; import log from "../../services/log.js"; import protectedSessionService from "../../services/protected_session.js"; import sql from "../../services/sql.js"; diff --git a/apps/server/src/becca/entities/bnote.ts b/apps/server/src/becca/entities/bnote.ts index 7f271e88c..2ed302ccc 100644 --- a/apps/server/src/becca/entities/bnote.ts +++ b/apps/server/src/becca/entities/bnote.ts @@ -1,10 +1,10 @@ import type { AttachmentRow, AttributeType, CloneResponse, NoteRow, NoteType, RevisionRow } from "@triliumnext/commons"; import { dayjs } from "@triliumnext/commons"; +import { events as eventService } from "@triliumnext/core"; import cloningService from "../../services/cloning.js"; import dateUtils from "../../services/date_utils.js"; import eraseService from "../../services/erase.js"; -import eventService from "../../services/events.js"; import handlers from "../../services/handlers.js"; import log from "../../services/log.js"; import noteService from "../../services/notes.js"; diff --git a/apps/server/src/routes/api/branches.ts b/apps/server/src/routes/api/branches.ts index 73ce03a7a..bf28fff98 100644 --- a/apps/server/src/routes/api/branches.ts +++ b/apps/server/src/routes/api/branches.ts @@ -1,18 +1,17 @@ -"use strict"; - -import sql from "../../services/sql.js"; -import utils from "../../services/utils.js"; -import entityChangesService from "../../services/entity_changes.js"; -import treeService from "../../services/tree.js"; -import eraseService from "../../services/erase.js"; -import becca from "../../becca/becca.js"; -import TaskContext from "../../services/task_context.js"; -import branchService from "../../services/branches.js"; -import log from "../../services/log.js"; -import ValidationError from "../../errors/validation_error.js"; -import eventService from "../../services/events.js"; +import { events as eventService } from "@triliumnext/core"; import type { Request } from "express"; +import becca from "../../becca/becca.js"; +import ValidationError from "../../errors/validation_error.js"; +import branchService from "../../services/branches.js"; +import entityChangesService from "../../services/entity_changes.js"; +import eraseService from "../../services/erase.js"; +import log from "../../services/log.js"; +import sql from "../../services/sql.js"; +import TaskContext from "../../services/task_context.js"; +import treeService from "../../services/tree.js"; +import utils from "../../services/utils.js"; + /** * Code in this file deals with moving and cloning branches. The relationship between note and parent note is unique * for not deleted branches. There may be multiple deleted note-parent note relationships. @@ -256,7 +255,7 @@ function deleteBranch(req: Request) { } return { - noteDeleted: noteDeleted + noteDeleted }; } @@ -272,7 +271,7 @@ function setPrefix(req: Request) { function setPrefixBatch(req: Request) { const { branchIds, prefix } = req.body; - + if (!Array.isArray(branchIds)) { throw new ValidationError("branchIds must be an array"); } diff --git a/apps/server/src/routes/api/login.ts b/apps/server/src/routes/api/login.ts index 22c0e6ab0..b7dc4eace 100644 --- a/apps/server/src/routes/api/login.ts +++ b/apps/server/src/routes/api/login.ts @@ -1,20 +1,19 @@ -"use strict"; - -import options from "../../services/options.js"; -import utils from "../../services/utils.js"; -import dateUtils from "../../services/date_utils.js"; -import instanceId from "../../services/instance_id.js"; -import passwordEncryptionService from "../../services/encryption/password_encryption.js"; -import protectedSessionService from "../../services/protected_session.js"; -import appInfo from "../../services/app_info.js"; -import eventService from "../../services/events.js"; -import sqlInit from "../../services/sql_init.js"; -import sql from "../../services/sql.js"; -import ws from "../../services/ws.js"; -import etapiTokenService from "../../services/etapi_tokens.js"; +import { events as eventService } from "@triliumnext/core"; import type { Request } from "express"; -import totp from "../../services/totp"; + +import appInfo from "../../services/app_info.js"; +import dateUtils from "../../services/date_utils.js"; +import passwordEncryptionService from "../../services/encryption/password_encryption.js"; import recoveryCodeService from "../../services/encryption/recovery_codes"; +import etapiTokenService from "../../services/etapi_tokens.js"; +import instanceId from "../../services/instance_id.js"; +import options from "../../services/options.js"; +import protectedSessionService from "../../services/protected_session.js"; +import sql from "../../services/sql.js"; +import sqlInit from "../../services/sql_init.js"; +import totp from "../../services/totp"; +import utils from "../../services/utils.js"; +import ws from "../../services/ws.js"; /** * @swagger @@ -115,7 +114,7 @@ function loginSync(req: Request) { req.session.loggedIn = true; return { - instanceId: instanceId, + instanceId, maxEntityChangeId: sql.getValue("SELECT COALESCE(MAX(id), 0) FROM entity_changes WHERE isSynced = 1") }; } diff --git a/apps/server/src/services/entity_changes.ts b/apps/server/src/services/entity_changes.ts index c0a97c7d6..d6e86ef0e 100644 --- a/apps/server/src/services/entity_changes.ts +++ b/apps/server/src/services/entity_changes.ts @@ -1,14 +1,15 @@ -import sql from "./sql.js"; -import dateUtils from "./date_utils.js"; -import log from "./log.js"; -import cls from "./cls.js"; -import { randomString } from "./utils.js"; -import instanceId from "./instance_id.js"; +import type { EntityChange } from "@triliumnext/commons"; +import { events as eventService } from "@triliumnext/core"; + import becca from "../becca/becca.js"; import blobService from "../services/blob.js"; -import type { EntityChange } from "@triliumnext/commons"; import type { Blob } from "./blob-interface.js"; -import eventService from "./events.js"; +import cls from "./cls.js"; +import dateUtils from "./date_utils.js"; +import instanceId from "./instance_id.js"; +import log from "./log.js"; +import sql from "./sql.js"; +import { randomString } from "./utils.js"; let maxEntityChangeId = 0; diff --git a/apps/server/src/services/handlers.ts b/apps/server/src/services/handlers.ts index f32bf6ddd..39387c799 100644 --- a/apps/server/src/services/handlers.ts +++ b/apps/server/src/services/handlers.ts @@ -1,14 +1,15 @@ -import eventService from "./events.js"; +import { events as eventService } from "@triliumnext/core"; + +import becca from "../becca/becca.js"; +import type AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; +import BAttribute from "../becca/entities/battribute.js"; +import type BNote from "../becca/entities/bnote.js"; +import hiddenSubtreeService from "./hidden_subtree.js"; +import noteService from "./notes.js"; +import oneTimeTimer from "./one_time_timer.js"; +import type { DefinitionObject } from "./promoted_attribute_definition_interface.js"; import scriptService from "./script.js"; import treeService from "./tree.js"; -import noteService from "./notes.js"; -import becca from "../becca/becca.js"; -import BAttribute from "../becca/entities/battribute.js"; -import hiddenSubtreeService from "./hidden_subtree.js"; -import oneTimeTimer from "./one_time_timer.js"; -import type BNote from "../becca/entities/bnote.js"; -import type AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; -import type { DefinitionObject } from "./promoted_attribute_definition_interface.js"; type Handler = (definition: DefinitionObject, note: BNote, targetNote: BNote) => void; diff --git a/apps/server/src/services/llm/ai_service_manager.ts b/apps/server/src/services/llm/ai_service_manager.ts index bd47b4327..5a1614647 100644 --- a/apps/server/src/services/llm/ai_service_manager.ts +++ b/apps/server/src/services/llm/ai_service_manager.ts @@ -1,32 +1,28 @@ -import options from '../options.js'; -import eventService from '../events.js'; -import type { AIService, ChatCompletionOptions, ChatResponse, Message } from './ai_interface.js'; -import { AnthropicService } from './providers/anthropic_service.js'; -import { ContextExtractor } from './context/index.js'; -import agentTools from './context_extractors/index.js'; -import contextService from './context/services/context_service.js'; import log from '../log.js'; -import { OllamaService } from './providers/ollama_service.js'; -import { OpenAIService } from './providers/openai_service.js'; - -// Import interfaces -import type { - ServiceProviders, - IAIServiceManager, - ProviderMetadata -} from './interfaces/ai_service_interfaces.js'; -import type { NoteSearchResult } from './interfaces/context_interfaces.js'; - +import options from '../options.js'; +import type { AIService, ChatCompletionOptions, ChatResponse, Message } from './ai_interface.js'; // Import new configuration system import { - getSelectedProvider, - parseModelIdentifier, - isAIEnabled, - getDefaultModelForProvider, clearConfigurationCache, + getDefaultModelForProvider, + getSelectedProvider, + isAIEnabled, + parseModelIdentifier, validateConfiguration } from './config/configuration_helpers.js'; +import { ContextExtractor } from './context/index.js'; +import contextService from './context/services/context_service.js'; +import agentTools from './context_extractors/index.js'; +// Import interfaces +import type { + IAIServiceManager, + ProviderMetadata, + ServiceProviders} from './interfaces/ai_service_interfaces.js'; import type { ProviderType } from './interfaces/configuration_interfaces.js'; +import type { NoteSearchResult } from './interfaces/context_interfaces.js'; +import { AnthropicService } from './providers/anthropic_service.js'; +import { OllamaService } from './providers/ollama_service.js'; +import { OpenAIService } from './providers/openai_service.js'; /** * Interface representing relevant note context @@ -173,7 +169,7 @@ export class AIServiceManager implements IAIServiceManager { /** * Get list of available providers */ - getAvailableProviders(): ServiceProviders[] { + getAvailableProviders(): ServiceProviders[] { this.ensureInitialized(); const allProviders: ServiceProviders[] = ['openai', 'anthropic', 'ollama']; diff --git a/apps/server/src/services/notes.ts b/apps/server/src/services/notes.ts index a4e1ed3cf..7b368e3b9 100644 --- a/apps/server/src/services/notes.ts +++ b/apps/server/src/services/notes.ts @@ -1,6 +1,7 @@ import type { AttachmentRow, AttributeRow, BranchRow, NoteRow } from "@triliumnext/commons"; import { dayjs } from "@triliumnext/commons"; import { date_utils } from "@triliumnext/core"; +import { events as eventService } from "@triliumnext/core"; import fs from "fs"; import html2plaintext from "html2plaintext"; import { t } from "i18next"; @@ -18,7 +19,6 @@ import log from "../services/log.js"; import protectedSessionService from "../services/protected_session.js"; import { newEntityId, quoteRegex, toMap,unescapeHtml } from "../services/utils.js"; import entityChangesService from "./entity_changes.js"; -import eventService from "./events.js"; import htmlSanitizer from "./html_sanitizer.js"; import imageService from "./image.js"; import noteTypesService from "./note_types.js"; diff --git a/apps/server/src/services/sql_init.ts b/apps/server/src/services/sql_init.ts index 93452669f..1b6911760 100644 --- a/apps/server/src/services/sql_init.ts +++ b/apps/server/src/services/sql_init.ts @@ -1,24 +1,25 @@ -import log from "./log.js"; +import { deferred, type OptionRow } from "@triliumnext/commons"; +import { events as eventService } from "@triliumnext/core"; import fs from "fs"; -import resourceDir from "./resource_dir.js"; -import sql from "./sql.js"; -import { isElectron } from "./utils.js"; -import optionService from "./options.js"; -import port from "./port.js"; +import { t } from "i18next"; + +import BBranch from "../becca/entities/bbranch.js"; +import BNote from "../becca/entities/bnote.js"; import BOption from "../becca/entities/boption.js"; -import TaskContext from "./task_context.js"; -import migrationService from "./migration.js"; +import backup from "./backup.js"; import cls from "./cls.js"; import config from "./config.js"; -import { deferred, type OptionRow } from "@triliumnext/commons"; -import BNote from "../becca/entities/bnote.js"; -import BBranch from "../becca/entities/bbranch.js"; -import zipImportService from "./import/zip.js"; import password from "./encryption/password.js"; -import backup from "./backup.js"; -import eventService from "./events.js"; -import { t } from "i18next"; import hidden_subtree from "./hidden_subtree.js"; +import zipImportService from "./import/zip.js"; +import log from "./log.js"; +import migrationService from "./migration.js"; +import optionService from "./options.js"; +import port from "./port.js"; +import resourceDir from "./resource_dir.js"; +import sql from "./sql.js"; +import TaskContext from "./task_context.js"; +import { isElectron } from "./utils.js"; export const dbReady = deferred(); @@ -65,7 +66,7 @@ async function initDbConnection() { isSetup TEXT DEFAULT "false", UNIQUE (tmpID), PRIMARY KEY (tmpID) - );`) + );`); dbReady.resolve(); } diff --git a/apps/server/src/services/sync_update.ts b/apps/server/src/services/sync_update.ts index 9d4ff5c4c..9e88e5796 100644 --- a/apps/server/src/services/sync_update.ts +++ b/apps/server/src/services/sync_update.ts @@ -1,10 +1,11 @@ -import sql from "./sql.js"; -import log from "./log.js"; -import entityChangesService from "./entity_changes.js"; -import eventService from "./events.js"; -import entityConstructor from "../becca/entity_constructor.js"; -import ws from "./ws.js"; import type { EntityChange, EntityChangeRecord, EntityRow } from "@triliumnext/commons"; +import { events as eventService } from "@triliumnext/core"; + +import entityConstructor from "../becca/entity_constructor.js"; +import entityChangesService from "./entity_changes.js"; +import log from "./log.js"; +import sql from "./sql.js"; +import ws from "./ws.js"; interface UpdateContext { alreadyErased: number; diff --git a/apps/server/src/share/shaca/shaca_loader.ts b/apps/server/src/share/shaca/shaca_loader.ts index c0834cb8b..4e374a784 100644 --- a/apps/server/src/share/shaca/shaca_loader.ts +++ b/apps/server/src/share/shaca/shaca_loader.ts @@ -1,15 +1,14 @@ -"use strict"; +import { events as eventService } from "@triliumnext/core"; -import sql from "../sql.js"; -import shaca from "./shaca.js"; import log from "../../services/log.js"; -import SNote from "./entities/snote.js"; -import SBranch from "./entities/sbranch.js"; -import SAttribute from "./entities/sattribute.js"; -import SAttachment from "./entities/sattachment.js"; import shareRoot from "../share_root.js"; -import eventService from "../../services/events.js"; +import sql from "../sql.js"; import type { SAttachmentRow, SAttributeRow, SBranchRow, SNoteRow } from "./entities/rows.js"; +import SAttachment from "./entities/sattachment.js"; +import SAttribute from "./entities/sattribute.js"; +import SBranch from "./entities/sbranch.js"; +import SNote from "./entities/snote.js"; +import shaca from "./shaca.js"; function load() { const start = Date.now(); diff --git a/packages/trilium-core/src/index.ts b/packages/trilium-core/src/index.ts index 042bde8b2..f38fc9692 100644 --- a/packages/trilium-core/src/index.ts +++ b/packages/trilium-core/src/index.ts @@ -10,6 +10,7 @@ export * as protected_session from "./services/encryption/protected_session"; export { default as data_encryption } from "./services/encryption/data_encryption" export * as binary_utils from "./services/utils/binary"; export { default as date_utils } from "./services/utils/date"; +export { default as events } from "./services/events"; export { getContext, type ExecutionContext } from "./services/context"; export type { CryptoProvider } from "./services/encryption/crypto"; diff --git a/apps/server/src/services/events.ts b/packages/trilium-core/src/services/events.ts similarity index 100% rename from apps/server/src/services/events.ts rename to packages/trilium-core/src/services/events.ts