diff --git a/CLAUDE.md b/CLAUDE.md index 450eac26fd..43930e1da6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ This file provides guidance to AI coding assistants when working with code in th - **Search smart**: Prefer `ast-grep` for semantic queries; fall back to `rg`/`grep` when needed. - **Build with Tailwind CSS & Shadcn UI**: Use components from `@packages/ui` (Shadcn UI + Tailwind CSS) for every new UI component; never add `antd` or `styled-components`. - **Log centrally**: Route all logging through `loggerService` with the right context—no `console.log`. -- **Access paths centrally**: Use `application.getPath('namespace.key', filename?)` for all main-process filesystem paths—never call `app.getPath()`, `os.homedir()`, or construct paths ad-hoc. +- **Access paths centrally**: Use `application.getPath('namespace.key', filename?)` for all main-process filesystem paths—never call `app.getPath()`, `os.homedir()`, or construct paths ad-hoc. Import the singleton via `import { application } from '@application'`. - **Research via subagent**: Lean on `subagent` for external docs, APIs, news, and references. - **Always propose before executing**: Before making any changes, clearly explain your planned approach and wait for explicit user approval to ensure alignment and prevent unwanted modifications. - **Lint, test, and format before completion**: Coding tasks are only complete after running `pnpm lint`, `pnpm test`, and `pnpm format` successfully. diff --git a/docs/references/data/cache-overview.md b/docs/references/data/cache-overview.md index cbf4909045..a882486bf9 100644 --- a/docs/references/data/cache-overview.md +++ b/docs/references/data/cache-overview.md @@ -114,7 +114,7 @@ Note: Template keys follow the same dot-separated naming pattern as fixed keys. Access in main process via lifecycle: ```typescript -import { application } from '@main/core/application' +import { application } from '@application' const cacheService = application.get('CacheService') cacheService.setShared('window.layout', layoutConfig) diff --git a/docs/references/data/cache-usage.md b/docs/references/data/cache-usage.md index 6ba977236a..552c493bbc 100644 --- a/docs/references/data/cache-usage.md +++ b/docs/references/data/cache-usage.md @@ -118,7 +118,7 @@ Main process CacheService provides SharedCache for cross-window state management ### SharedCache in Main Process ```typescript -import { application } from '@main/core/application' +import { application } from '@application' const cacheService = application.get('CacheService') diff --git a/docs/references/data/data-api-in-main.md b/docs/references/data/data-api-in-main.md index 949f4f6569..517a0ac445 100644 --- a/docs/references/data/data-api-in-main.md +++ b/docs/references/data/data-api-in-main.md @@ -86,7 +86,7 @@ export const allHandlers: ApiImplementation = { ```typescript // services/TopicService.ts import { eq, desc, sql } from 'drizzle-orm' -import { application } from '@main/core/application' +import { application } from '@application' import { topicTable } from '@data/db/schemas/topic' import { DataApiErrorFactory } from '@shared/data/api' diff --git a/docs/references/data/preference-overview.md b/docs/references/data/preference-overview.md index 24ba6b9101..9a86ba0b57 100644 --- a/docs/references/data/preference-overview.md +++ b/docs/references/data/preference-overview.md @@ -118,7 +118,7 @@ Main process provides `getStats(details?)` for debugging subscription status: - **Warning**: Resource-intensive, recommended for development only ```typescript -import { application } from '@main/core/application' +import { application } from '@application' const preferenceService = application.get('PreferenceService') const stats = preferenceService.getStats(true); diff --git a/docs/references/data/preference-usage.md b/docs/references/data/preference-usage.md index 76fba08a59..4c433613d1 100644 --- a/docs/references/data/preference-usage.md +++ b/docs/references/data/preference-usage.md @@ -135,7 +135,7 @@ unsubscribe() In the main process, PreferenceService is lifecycle-managed. Access it via `application.get()`: ```typescript -import { application } from '@main/core/application' +import { application } from '@application' const preferenceService = application.get('PreferenceService') diff --git a/docs/references/lifecycle/application-overview.md b/docs/references/lifecycle/application-overview.md index 9eefd4f73f..7cc42d7c6f 100644 --- a/docs/references/lifecycle/application-overview.md +++ b/docs/references/lifecycle/application-overview.md @@ -15,9 +15,10 @@ For lifecycle internals (phases, hooks, states, decorators, events), see [Lifecy ## Quick Start +Both `application` and `serviceList` are barrel-exported from the `@application` path alias (configured in `tsconfig.node.json` and `electron.vite.config.ts`): + ```typescript -import { application } from '@main/core/application' -import { serviceList } from '@main/core/application' +import { application, serviceList } from '@application' // 1. Register all services application.registerAll(serviceList) @@ -164,7 +165,7 @@ Always use `application.relaunch()` instead of calling `app.relaunch()` directly - **Platform fixes**: Linux AppImage `execPath` rewrite, Windows Portable executable path ```typescript -import { application } from '@main/core/application' +import { application } from '@application' // Simple relaunch application.relaunch() @@ -178,7 +179,7 @@ application.relaunch({ args: ['--safe-mode'] }) Always use `application.quit()` or `application.forceExit()` instead of calling `app.quit()` / `app.exit()` directly. An ESLint rule (`no-restricted-properties`) will warn if `app.quit()` or `app.exit()` is used in `src/main/` outside of `Application.ts`. ```typescript -import { application } from '@main/core/application' +import { application } from '@application' // Graceful quit — triggers the Electron before-quit / will-quit event chain application.quit() @@ -242,7 +243,7 @@ The exported `application` constant is a lazy proxy — safe to import at module ```typescript // Safe to import anywhere, even at module scope -import { application } from '@main/core/application' +import { application } from '@application' ``` ## File Structure diff --git a/docs/references/lifecycle/lifecycle-migration-guide.md b/docs/references/lifecycle/lifecycle-migration-guide.md index 32b353d169..208a71d006 100644 --- a/docs/references/lifecycle/lifecycle-migration-guide.md +++ b/docs/references/lifecycle/lifecycle-migration-guide.md @@ -118,7 +118,7 @@ import { windowService } from '@main/services/WindowService' windowService.createMainWindow() // NEW -import { application } from '@main/core/application' +import { application } from '@application' const windowService = application.get('WindowService') windowService.createMainWindow() ``` diff --git a/docs/references/lifecycle/lifecycle-usage.md b/docs/references/lifecycle/lifecycle-usage.md index dfeaa5f9c4..ea30adeabd 100644 --- a/docs/references/lifecycle/lifecycle-usage.md +++ b/docs/references/lifecycle/lifecycle-usage.md @@ -31,7 +31,7 @@ class PreferenceService extends BaseService { // 2. Register in serviceRegistry.ts and bootstrap via Application // See: docs/references/lifecycle/application-overview.md -import { application } from '@main/core/application' +import { application } from '@application' await application.bootstrap() // 3. Access service instance @@ -350,7 +350,7 @@ class RealTimeService extends BaseService implements Pausable { All services support stop/start operations (no special interface needed): ```typescript -import { application } from '@main/core/application' +import { application } from '@application' await application.stop('HeavyComputeService') // calls onStop() await application.start('HeavyComputeService') // calls onInit() again @@ -368,7 +368,7 @@ Unlike `Pausable` (which temporarily suspends execution), `Activatable` controls ### Interface ```typescript -import { application } from '@main/core/application' +import { application } from '@application' import { BaseService, Injectable, type Activatable } from '@main/core/lifecycle' @Injectable('SelectionService') diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 6dceaf2f8f..0d39d00990 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -34,6 +34,7 @@ export default defineConfig({ resolve: { alias: { '@main': resolve('src/main'), + '@application': resolve('src/main/core/application'), '@types': resolve('src/renderer/src/types'), '@data': resolve('src/main/data'), '@shared': resolve('packages/shared'), diff --git a/src/main/apiServer/middleware/__tests__/auth.test.ts b/src/main/apiServer/middleware/__tests__/auth.test.ts index 77da89a73a..b10e5b7990 100644 --- a/src/main/apiServer/middleware/__tests__/auth.test.ts +++ b/src/main/apiServer/middleware/__tests__/auth.test.ts @@ -8,7 +8,7 @@ const { mockPreferenceGet } = vi.hoisted(() => ({ mockPreferenceGet: vi.fn() })) -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory({ PreferenceService: { get: mockPreferenceGet } diff --git a/src/main/apiServer/middleware/auth.ts b/src/main/apiServer/middleware/auth.ts index daae39bed3..618a695dac 100644 --- a/src/main/apiServer/middleware/auth.ts +++ b/src/main/apiServer/middleware/auth.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import crypto from 'crypto' import type { NextFunction, Request, Response } from 'express' diff --git a/src/main/apiServer/server.ts b/src/main/apiServer/server.ts index d9e383befd..692bf0f60e 100644 --- a/src/main/apiServer/server.ts +++ b/src/main/apiServer/server.ts @@ -1,7 +1,7 @@ import { createServer } from 'node:http' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { IpcChannel } from '@shared/IpcChannel' import { createApp } from './app' diff --git a/src/main/apiServer/services/mcp.ts b/src/main/apiServer/services/mcp.ts index 1782bf3747..bf3c70d656 100644 --- a/src/main/apiServer/services/mcp.ts +++ b/src/main/apiServer/services/mcp.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { mcpServerService } from '@data/services/McpServerService' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { Tool } from '@modelcontextprotocol/sdk/types' import type { MCPServer } from '@shared/data/types/mcpServer' diff --git a/src/main/apiServer/utils/index.ts b/src/main/apiServer/utils/index.ts index 621e5fcff1..c2fb400514 100644 --- a/src/main/apiServer/utils/index.ts +++ b/src/main/apiServer/utils/index.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { formatProviderApiHost } from '@main/aiCore/provider/providerConfig' -import { application } from '@main/core/application' import { reduxService } from '@main/services/ReduxService' import { isSiliconAnthropicCompatibleModel } from '@shared/config/providers' import type { ApiModel, Model, Provider, ProviderType } from '@types' diff --git a/src/main/core/application/README.md b/src/main/core/application/README.md index 1d6e8dc4fb..7036f8ad2c 100644 --- a/src/main/core/application/README.md +++ b/src/main/core/application/README.md @@ -5,6 +5,16 @@ Application is the top-level orchestrator that ties together the lifecycle syste > **Full documentation** has moved to [docs/references/lifecycle/](../../../../docs/references/lifecycle/README.md). > This file is a quick-reference pointer. +## Import + +Main-process code imports the singleton (and its companions) via the `@application` path alias: + +```ts +import { application, serviceList, services } from '@application' +``` + +The alias is configured in `tsconfig.node.json` (`compilerOptions.paths`) and `electron.vite.config.ts` (`main.resolve.alias`). Vitest inherits the Vite alias automatically. + ## Quick Links | Topic | Reference Doc | diff --git a/src/main/core/application/__tests__/Application.getPath.test.ts b/src/main/core/application/__tests__/Application.getPath.test.ts index 886ee123e6..307f50516d 100644 --- a/src/main/core/application/__tests__/Application.getPath.test.ts +++ b/src/main/core/application/__tests__/Application.getPath.test.ts @@ -50,10 +50,11 @@ vi.mock('@main/core/paths/pathRegistry', async () => { import { Application } from '@main/core/application/Application' import { buildPathRegistry } from '@main/core/paths/pathRegistry' -// Bypass the global mock of '@main/core/application' (which exports a stub +// Bypass the global mock of '@application' (which exports a stub // `application` proxy with a no-op bootstrap) by importing the real // Application class directly via its file path. The global mock only -// intercepts the directory/index path. +// intercepts the directory/index path, leaving `Application.ts` reachable +// via the `@main/*` alias. describe('Application.getPath', () => { const app = Application.getInstance() diff --git a/src/main/core/paths/README.md b/src/main/core/paths/README.md index a5882f9e78..4dc3bd95d0 100644 --- a/src/main/core/paths/README.md +++ b/src/main/core/paths/README.md @@ -6,7 +6,7 @@ All paths are registered in `pathRegistry.ts` and accessed exclusively via `appl ## Quick Start ```ts -import { application } from '@main/core/application' +import { application } from '@application' const dir = application.getPath('feature.files.data') //=> '/Users/alice/Library/Application Support/CherryStudio/Data/Files' diff --git a/src/main/core/preboot/__tests__/singleInstance.test.ts b/src/main/core/preboot/__tests__/singleInstance.test.ts index 95eb98a4e8..d8219e6518 100644 --- a/src/main/core/preboot/__tests__/singleInstance.test.ts +++ b/src/main/core/preboot/__tests__/singleInstance.test.ts @@ -6,7 +6,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' * Mocking strategy (mirrors crashTelemetry.test.ts): * - `electron` is shadowed per test; only `app.requestSingleInstanceLock` * is needed. The return value is toggled via a shared vi.fn(). - * - `@main/core/application` is shadowed per test with a stub that + * - `@application` is shadowed per test with a stub that * exposes only `quit()` — the global mock in tests/main.setup.ts * does not provide it. * - `process.exit` is a Node global. We temporarily replace it with a @@ -40,7 +40,7 @@ function stubElectron() { } function stubApplication() { - vi.doMock('@main/core/application', () => ({ + vi.doMock('@application', () => ({ application: { quit: applicationQuitMock } diff --git a/src/main/core/preboot/__tests__/v2MigrationGate.test.ts b/src/main/core/preboot/__tests__/v2MigrationGate.test.ts index a9b9bf3075..07968c7a2a 100644 --- a/src/main/core/preboot/__tests__/v2MigrationGate.test.ts +++ b/src/main/core/preboot/__tests__/v2MigrationGate.test.ts @@ -13,7 +13,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' * manager, and IPC handler registration functions are all backed by * shared vi.fn() instances at module scope so assertions can inspect * call order across test boundaries. - * - `@main/core/application` is globally mocked in tests/main.setup.ts + * - `@application` is globally mocked in tests/main.setup.ts * but the global mock has no `quit()`; we shadow it per test with a * factory that provides a spy-able `quit`. * - `electron` is shadowed so `app.whenReady()` resolves synchronously @@ -88,7 +88,7 @@ function stubElectron() { } function stubApplication() { - vi.doMock('@main/core/application', () => ({ + vi.doMock('@application', () => ({ application: { quit: appQuitMock } diff --git a/src/main/core/preboot/singleInstance.ts b/src/main/core/preboot/singleInstance.ts index d0a0ce6f5a..a441eb6870 100644 --- a/src/main/core/preboot/singleInstance.ts +++ b/src/main/core/preboot/singleInstance.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { app } from 'electron' const logger = loggerService.withContext('SingleInstance') diff --git a/src/main/core/preboot/v2MigrationGate.ts b/src/main/core/preboot/v2MigrationGate.ts index f5f747ca87..e40fe1c271 100644 --- a/src/main/core/preboot/v2MigrationGate.ts +++ b/src/main/core/preboot/v2MigrationGate.ts @@ -1,5 +1,6 @@ import fs from 'node:fs' +import { application } from '@application' import { getAllMigrators, migrationEngine, @@ -15,7 +16,6 @@ import { readPreviousVersion } from '@data/migration/v2/core/versionPolicy' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { app, dialog } from 'electron' const logger = loggerService.withContext('V2MigrationGate') diff --git a/src/main/data/PreferenceService.ts b/src/main/data/PreferenceService.ts index b1be916399..5587978914 100644 --- a/src/main/data/PreferenceService.ts +++ b/src/main/data/PreferenceService.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { isDev } from '@main/constant' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, ServicePhase } from '@main/core/lifecycle' import { Phase } from '@main/core/lifecycle' import { bootConfigService } from '@main/data/bootConfig' diff --git a/src/main/data/db/DbService.ts b/src/main/data/db/DbService.ts index d4c72d8229..ccecf20190 100644 --- a/src/main/data/db/DbService.ts +++ b/src/main/data/db/DbService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import type { Client } from '@libsql/client' import { createClient } from '@libsql/client' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { BaseService, ErrorHandling, Injectable, Priority, ServicePhase } from '@main/core/lifecycle' import { Phase } from '@main/core/lifecycle' import { sql } from 'drizzle-orm' @@ -28,7 +28,7 @@ const logger = loggerService.withContext('DbService') * * @example * ```typescript - * import { application } from '@main/core/application' + * import { application } from '@application' * * const db = application.get('DbService').getDb() * ``` diff --git a/src/main/data/db/seeding/seeders/__tests__/presetProviderSeeder.test.ts b/src/main/data/db/seeding/seeders/__tests__/presetProviderSeeder.test.ts index f12b091295..1257ffc44e 100644 --- a/src/main/data/db/seeding/seeders/__tests__/presetProviderSeeder.test.ts +++ b/src/main/data/db/seeding/seeders/__tests__/presetProviderSeeder.test.ts @@ -13,7 +13,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' // Mocks — must be declared before dynamic imports // ───────────────────────────────────────────────────────────────────────────── -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory() }) diff --git a/src/main/data/db/seeding/seeders/presetProviderSeeder.ts b/src/main/data/db/seeding/seeders/presetProviderSeeder.ts index 65cd7476c3..4592f18f3b 100644 --- a/src/main/data/db/seeding/seeders/presetProviderSeeder.ts +++ b/src/main/data/db/seeding/seeders/presetProviderSeeder.ts @@ -1,8 +1,8 @@ +import { application } from '@application' import type { ProtoProviderConfig } from '@cherrystudio/provider-registry' import { buildRuntimeEndpointConfigs, ENDPOINT_TYPE } from '@cherrystudio/provider-registry' import { RegistryLoader } from '@cherrystudio/provider-registry/node' import { userProviderTable } from '@data/db/schemas/userProvider' -import { application } from '@main/core/application' import type { DbType, ISeeder } from '../../types' diff --git a/src/main/data/migration/v2/migrators/__tests__/KnowledgeVectorMigrator.test.ts b/src/main/data/migration/v2/migrators/__tests__/KnowledgeVectorMigrator.test.ts index 0624d47e95..a55859bdbc 100644 --- a/src/main/data/migration/v2/migrators/__tests__/KnowledgeVectorMigrator.test.ts +++ b/src/main/data/migration/v2/migrators/__tests__/KnowledgeVectorMigrator.test.ts @@ -49,7 +49,7 @@ vi.mock('node:os', async (importOriginal) => { return (await importOriginal()) as any }) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { getPath: getPathMock } diff --git a/src/main/data/migration/v2/migrators/__tests__/ProviderModelMigrator.test.ts b/src/main/data/migration/v2/migrators/__tests__/ProviderModelMigrator.test.ts index 92efa67570..ac26289274 100644 --- a/src/main/data/migration/v2/migrators/__tests__/ProviderModelMigrator.test.ts +++ b/src/main/data/migration/v2/migrators/__tests__/ProviderModelMigrator.test.ts @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import type { MigrationContext } from '../../core/MigrationContext' import { ProviderModelMigrator } from '../ProviderModelMigrator' -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory() }) diff --git a/src/main/data/migration/v2/utils/KnowledgeVectorSourceReader.ts b/src/main/data/migration/v2/utils/KnowledgeVectorSourceReader.ts index 471cdd8c9d..1d8a740fd3 100644 --- a/src/main/data/migration/v2/utils/KnowledgeVectorSourceReader.ts +++ b/src/main/data/migration/v2/utils/KnowledgeVectorSourceReader.ts @@ -1,8 +1,8 @@ import fs from 'node:fs' import { pathToFileURL } from 'node:url' +import { application } from '@application' import { type Client, createClient, type Value as LibsqlValue } from '@libsql/client' -import { application } from '@main/core/application' import { sanitizeFilename } from '@main/utils/file' const LEGACY_VECTOR_TABLE_NAME = 'vectors' diff --git a/src/main/data/migration/v2/utils/__tests__/KnowledgeVectorSourceReader.test.ts b/src/main/data/migration/v2/utils/__tests__/KnowledgeVectorSourceReader.test.ts index 5c5d041742..1fca53bb69 100644 --- a/src/main/data/migration/v2/utils/__tests__/KnowledgeVectorSourceReader.test.ts +++ b/src/main/data/migration/v2/utils/__tests__/KnowledgeVectorSourceReader.test.ts @@ -23,7 +23,7 @@ const { setKnowledgeBaseRoot, getPathMock } = vi.hoisted(() => { } }) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { getPath: getPathMock } diff --git a/src/main/data/services/FileProcessingService.ts b/src/main/data/services/FileProcessingService.ts index 76e11330d2..60d394bf9a 100644 --- a/src/main/data/services/FileProcessingService.ts +++ b/src/main/data/services/FileProcessingService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { FileProcessorFeature, diff --git a/src/main/data/services/KnowledgeBaseService.ts b/src/main/data/services/KnowledgeBaseService.ts index f39c217c6d..84dbb985ea 100644 --- a/src/main/data/services/KnowledgeBaseService.ts +++ b/src/main/data/services/KnowledgeBaseService.ts @@ -4,9 +4,9 @@ * Handles CRUD operations for knowledge bases stored in SQLite. */ +import { application } from '@application' import { knowledgeBaseTable } from '@data/db/schemas/knowledge' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { OffsetPaginationResponse } from '@shared/data/api/apiTypes' import { diff --git a/src/main/data/services/KnowledgeItemService.ts b/src/main/data/services/KnowledgeItemService.ts index 14c214fe69..a0383d8fe8 100644 --- a/src/main/data/services/KnowledgeItemService.ts +++ b/src/main/data/services/KnowledgeItemService.ts @@ -4,9 +4,9 @@ * Handles CRUD operations for knowledge items stored in SQLite. */ +import { application } from '@application' import { knowledgeItemTable } from '@data/db/schemas/knowledge' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { OffsetPaginationResponse } from '@shared/data/api' import { DataApiErrorFactory } from '@shared/data/api' import type { diff --git a/src/main/data/services/McpServerService.ts b/src/main/data/services/McpServerService.ts index c68d41dc01..783f68c8d3 100644 --- a/src/main/data/services/McpServerService.ts +++ b/src/main/data/services/McpServerService.ts @@ -6,9 +6,9 @@ * - Listing with optional filters (isActive, type) */ +import { application } from '@application' import { mcpServerTable } from '@data/db/schemas/mcpServer' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { CreateMCPServerDto, ListMCPServersQuery, UpdateMCPServerDto } from '@shared/data/api/schemas/mcpServers' import type { MCPServer } from '@shared/data/types/mcpServer' diff --git a/src/main/data/services/MessageService.ts b/src/main/data/services/MessageService.ts index d4896f9b91..6985ee674c 100644 --- a/src/main/data/services/MessageService.ts +++ b/src/main/data/services/MessageService.ts @@ -8,10 +8,10 @@ * - Cascade delete and reparenting */ +import { application } from '@application' import { messageTable } from '@data/db/schemas/message' import { topicTable } from '@data/db/schemas/topic' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { ActiveNodeStrategy, diff --git a/src/main/data/services/MiniAppService.ts b/src/main/data/services/MiniAppService.ts index c77b91128f..f453defc4b 100644 --- a/src/main/data/services/MiniAppService.ts +++ b/src/main/data/services/MiniAppService.ts @@ -12,10 +12,10 @@ * definitions with DB preference rows to produce a unified MiniApp view. */ +import { application } from '@application' import { type MiniAppInsert, type MiniAppSelect } from '@data/db/schemas/miniapp' import { type MiniAppStatus, miniappTable, type MiniAppType } from '@data/db/schemas/miniapp' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { OffsetPaginationResponse } from '@shared/data/api/apiTypes' import type { CreateMiniappDto, UpdateMiniappDto } from '@shared/data/api/schemas/miniapps' diff --git a/src/main/data/services/ModelService.ts b/src/main/data/services/ModelService.ts index 107350cca5..9b25fe462c 100644 --- a/src/main/data/services/ModelService.ts +++ b/src/main/data/services/ModelService.ts @@ -7,11 +7,11 @@ * - Registry import support */ +import { application } from '@application' import type { ModelLookupResult } from '@cherrystudio/provider-registry' import type { NewUserModel, UserModel } from '@data/db/schemas/userModel' import { isRegistryEnrichableField, userModelTable } from '@data/db/schemas/userModel' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { CreateModelDto, ListModelsQuery, UpdateModelDto } from '@shared/data/api/schemas/models' import type { diff --git a/src/main/data/services/ProviderRegistryService.ts b/src/main/data/services/ProviderRegistryService.ts index c72f9245b6..96e685363a 100644 --- a/src/main/data/services/ProviderRegistryService.ts +++ b/src/main/data/services/ProviderRegistryService.ts @@ -10,12 +10,12 @@ * (RegistryLoader, buildRuntimeEndpointConfigs). */ +import { application } from '@application' import type { ProtoModelConfig, ProtoProviderModelOverride } from '@cherrystudio/provider-registry' import type { EndpointType } from '@cherrystudio/provider-registry' import { buildRuntimeEndpointConfigs } from '@cherrystudio/provider-registry' import { RegistryLoader } from '@cherrystudio/provider-registry/node' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { ErrorCode, isDataApiError } from '@shared/data/api/apiErrors' import type { Model } from '@shared/data/types/model' import type { EndpointConfig, ReasoningFormatType } from '@shared/data/types/provider' diff --git a/src/main/data/services/ProviderService.ts b/src/main/data/services/ProviderService.ts index 52be928dae..5dadf07546 100644 --- a/src/main/data/services/ProviderService.ts +++ b/src/main/data/services/ProviderService.ts @@ -6,10 +6,10 @@ * - Row to Provider conversion */ +import { application } from '@application' import type { NewUserProvider, UserProvider } from '@data/db/schemas/userProvider' import { userProviderTable } from '@data/db/schemas/userProvider' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { CreateProviderDto, ListProvidersQuery, UpdateProviderDto } from '@shared/data/api/schemas/providers' import type { diff --git a/src/main/data/services/TopicService.ts b/src/main/data/services/TopicService.ts index 641203a6e7..4310014646 100644 --- a/src/main/data/services/TopicService.ts +++ b/src/main/data/services/TopicService.ts @@ -7,10 +7,10 @@ * - Active node switching */ +import { application } from '@application' import { messageTable } from '@data/db/schemas/message' import { topicTable } from '@data/db/schemas/topic' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { CreateTopicDto, UpdateTopicDto } from '@shared/data/api/schemas/topics' import type { Topic } from '@shared/data/types/topic' diff --git a/src/main/data/services/TranslateHistoryService.ts b/src/main/data/services/TranslateHistoryService.ts index 8343ab4249..9e4c9fe598 100644 --- a/src/main/data/services/TranslateHistoryService.ts +++ b/src/main/data/services/TranslateHistoryService.ts @@ -2,9 +2,9 @@ * Translate History Service - handles translate history CRUD */ +import { application } from '@application' import { translateHistoryTable } from '@data/db/schemas/translateHistory' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { OffsetPaginationResponse } from '@shared/data/api/apiTypes' import type { diff --git a/src/main/data/services/TranslateLanguageService.ts b/src/main/data/services/TranslateLanguageService.ts index aea162876f..f8b121cc56 100644 --- a/src/main/data/services/TranslateLanguageService.ts +++ b/src/main/data/services/TranslateLanguageService.ts @@ -4,9 +4,9 @@ * langCode is the primary key (immutable after creation). */ +import { application } from '@application' import { translateLanguageTable } from '@data/db/schemas/translateLanguage' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { DataApiErrorFactory } from '@shared/data/api' import type { CreateTranslateLanguageDto, UpdateTranslateLanguageDto } from '@shared/data/api/schemas/translate' import type { TranslateLanguage } from '@shared/data/types/translate' diff --git a/src/main/data/services/__tests__/KnowledgeBaseService.test.ts b/src/main/data/services/__tests__/KnowledgeBaseService.test.ts index 52dd1d34d5..de0e2efe10 100644 --- a/src/main/data/services/__tests__/KnowledgeBaseService.test.ts +++ b/src/main/data/services/__tests__/KnowledgeBaseService.test.ts @@ -7,7 +7,7 @@ const mockInsert = vi.fn() const mockUpdate = vi.fn() const mockDelete = vi.fn() -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn(() => ({ getDb: vi.fn(() => ({ diff --git a/src/main/data/services/__tests__/KnowledgeItemService.test.ts b/src/main/data/services/__tests__/KnowledgeItemService.test.ts index 140acab10f..aaee52af55 100644 --- a/src/main/data/services/__tests__/KnowledgeItemService.test.ts +++ b/src/main/data/services/__tests__/KnowledgeItemService.test.ts @@ -27,7 +27,7 @@ const mockDb = { let realDb: DbType | null = null let closeClient: (() => void) | undefined -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn(() => ({ getDb: vi.fn(() => realDb ?? mockDb) diff --git a/src/main/data/services/__tests__/McpServerService.test.ts b/src/main/data/services/__tests__/McpServerService.test.ts index 27256261b7..cd4115a60a 100644 --- a/src/main/data/services/__tests__/McpServerService.test.ts +++ b/src/main/data/services/__tests__/McpServerService.test.ts @@ -72,7 +72,7 @@ function mockChain(resolvedValue: unknown) { let mockDb: any -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory({ DbService: { getDb: () => mockDb } diff --git a/src/main/data/services/__tests__/MiniAppService.test.ts b/src/main/data/services/__tests__/MiniAppService.test.ts index 025ca2f993..f60c0e6df1 100644 --- a/src/main/data/services/__tests__/MiniAppService.test.ts +++ b/src/main/data/services/__tests__/MiniAppService.test.ts @@ -9,7 +9,7 @@ const mockUpdate = vi.fn() const mockDelete = vi.fn() const mockTransaction = vi.fn() -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn(() => ({ getDb: vi.fn(() => ({ diff --git a/src/main/data/services/__tests__/ModelService.test.ts b/src/main/data/services/__tests__/ModelService.test.ts index 721d0c3ae1..006c5de297 100644 --- a/src/main/data/services/__tests__/ModelService.test.ts +++ b/src/main/data/services/__tests__/ModelService.test.ts @@ -82,7 +82,7 @@ function createCapturingMockDb(selectResults: unknown[][] = [[]]) { // Mocks // ───────────────────────────────────────────────────────────────────────────── -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory() }) diff --git a/src/main/data/services/__tests__/ProviderRegistryService.test.ts b/src/main/data/services/__tests__/ProviderRegistryService.test.ts index 7c6c3fb195..ab1dbc7a5c 100644 --- a/src/main/data/services/__tests__/ProviderRegistryService.test.ts +++ b/src/main/data/services/__tests__/ProviderRegistryService.test.ts @@ -30,7 +30,7 @@ function createChainableMockDb() { // Mocks // ───────────────────────────────────────────────────────────────────────────── -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory() }) diff --git a/src/main/data/services/__tests__/ProviderService.delete.test.ts b/src/main/data/services/__tests__/ProviderService.delete.test.ts index 8d492c8f53..a58424ef85 100644 --- a/src/main/data/services/__tests__/ProviderService.delete.test.ts +++ b/src/main/data/services/__tests__/ProviderService.delete.test.ts @@ -46,7 +46,7 @@ function createMockDbForProvider(providerRow: unknown) { // Mocks // ───────────────────────────────────────────────────────────────────────────── -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory() }) diff --git a/src/main/data/services/__tests__/TranslateHistoryService.test.ts b/src/main/data/services/__tests__/TranslateHistoryService.test.ts index 00dcace6e3..3cfcfffd84 100644 --- a/src/main/data/services/__tests__/TranslateHistoryService.test.ts +++ b/src/main/data/services/__tests__/TranslateHistoryService.test.ts @@ -22,7 +22,7 @@ const mockDb = { transaction: vi.fn(async (fn: (tx: typeof mockTx) => Promise) => fn(mockTx)) } -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory({ DbService: { getDb: () => mockDb } diff --git a/src/main/data/services/__tests__/TranslateLanguageService.test.ts b/src/main/data/services/__tests__/TranslateLanguageService.test.ts index 3c5dbbc6aa..b6e8a2567a 100644 --- a/src/main/data/services/__tests__/TranslateLanguageService.test.ts +++ b/src/main/data/services/__tests__/TranslateLanguageService.test.ts @@ -22,7 +22,7 @@ const mockDb = { transaction: vi.fn(async (fn: (tx: typeof mockTx) => Promise) => fn(mockTx)) } -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory({ DbService: { getDb: () => mockDb } diff --git a/src/main/index.ts b/src/main/index.ts index 0cd83db627..cfa6913792 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -16,6 +16,7 @@ import '@main/data/bootConfig' +import { application, serviceList } from '@application' // Preboot (sync pre-bootstrap setup). Order matters — each module's JSDoc // documents its own timing contract. See core/preboot/README.md. import { configureChromiumFlags } from '@main/core/preboot/chromiumFlags' @@ -24,8 +25,6 @@ import { requireSingleInstance } from '@main/core/preboot/singleInstance' import { resolveUserDataLocation } from '@main/core/preboot/userDataLocation' import { runV2MigrationGate } from '@main/core/preboot/v2MigrationGate' -import { application, serviceList } from './core/application' - requireSingleInstance() resolveUserDataLocation() configureChromiumFlags() diff --git a/src/main/ipc.ts b/src/main/ipc.ts index a28d0457f8..f948131449 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -2,9 +2,9 @@ import fs from 'node:fs' import { arch } from 'node:os' import path from 'node:path' +import { application } from '@application' import { loggerService } from '@logger' import { isMac, isWin } from '@main/constant' -import { application } from '@main/core/application' import { generateSignature } from '@main/integration/cherryai' import { anthropicService } from '@main/services/AnthropicService' import { getIpCountry } from '@main/utils/ipService' diff --git a/src/main/knowledge/embedjs/loader/epubLoader.ts b/src/main/knowledge/embedjs/loader/epubLoader.ts index e375f46e93..119979ce79 100644 --- a/src/main/knowledge/embedjs/loader/epubLoader.ts +++ b/src/main/knowledge/embedjs/loader/epubLoader.ts @@ -1,8 +1,8 @@ +import { application } from '@application' import { BaseLoader } from '@cherrystudio/embedjs-interfaces' import { cleanString } from '@cherrystudio/embedjs-utils' import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters' import { loggerService } from '@logger' -import { application } from '@main/core/application' import EPub from 'epub' import * as fs from 'fs' import path from 'path' diff --git a/src/main/knowledge/preprocess/BasePreprocessProvider.ts b/src/main/knowledge/preprocess/BasePreprocessProvider.ts index 1f6e6e46b5..abbef480f6 100644 --- a/src/main/knowledge/preprocess/BasePreprocessProvider.ts +++ b/src/main/knowledge/preprocess/BasePreprocessProvider.ts @@ -1,7 +1,7 @@ import fs from 'node:fs' import path from 'node:path' -import { application } from '@main/core/application' +import { application } from '@application' import { getFileExt } from '@main/utils/file' import type { FileMetadata, PreprocessProvider, PreprocessReadPdfResult } from '@types' import { PDFDocument } from 'pdf-lib' diff --git a/src/main/knowledge/preprocess/PreprocessingService.ts b/src/main/knowledge/preprocess/PreprocessingService.ts index a782c58842..6ae54d70ea 100644 --- a/src/main/knowledge/preprocess/PreprocessingService.ts +++ b/src/main/knowledge/preprocess/PreprocessingService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import PreprocessProvider from '@main/knowledge/preprocess/PreprocessProvider' import type { FileMetadata, KnowledgeBaseParams, KnowledgeItem } from '@types' diff --git a/src/main/mcpServers/assistant.ts b/src/main/mcpServers/assistant.ts index 667bde413a..efad741713 100644 --- a/src/main/mcpServers/assistant.ts +++ b/src/main/mcpServers/assistant.ts @@ -2,8 +2,8 @@ import fs from 'node:fs' import os from 'node:os' import path from 'node:path' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' import type { Tool } from '@modelcontextprotocol/sdk/types.js' import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js' @@ -538,7 +538,7 @@ class AssistantServer { const defaultModel = configManager.get>('defaultModel', {}) const topicNamingModel = configManager.get>('topicNamingModel', {}) - const { application } = await import('@main/core/application') + const { application } = await import('@application') const preferenceService = application.get('PreferenceService') const settings = { diff --git a/src/main/mcpServers/filesystem/server.ts b/src/main/mcpServers/filesystem/server.ts index 656306c790..6512411cba 100644 --- a/src/main/mcpServers/filesystem/server.ts +++ b/src/main/mcpServers/filesystem/server.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' import fs from 'fs/promises' diff --git a/src/main/mcpServers/hub/__tests__/hub.test.ts b/src/main/mcpServers/hub/__tests__/hub.test.ts index e0182477ce..0e2ebc485d 100644 --- a/src/main/mcpServers/hub/__tests__/hub.test.ts +++ b/src/main/mcpServers/hub/__tests__/hub.test.ts @@ -83,7 +83,7 @@ const mockCacheService = { delete: vi.fn((key: string) => cacheStore.delete(key)) } -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn((name: string) => { if (name === 'MCPService') { diff --git a/src/main/mcpServers/hub/__tests__/mcp-bridge.test.ts b/src/main/mcpServers/hub/__tests__/mcp-bridge.test.ts index e218dd88ae..86f0bb276e 100644 --- a/src/main/mcpServers/hub/__tests__/mcp-bridge.test.ts +++ b/src/main/mcpServers/hub/__tests__/mcp-bridge.test.ts @@ -7,7 +7,7 @@ const mockMCPService = { abortTool: vi.fn(async () => true) } -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn((name: string) => { if (name === 'MCPService') { diff --git a/src/main/mcpServers/hub/index.ts b/src/main/mcpServers/hub/index.ts index 5e07da8027..7b74c676fb 100644 --- a/src/main/mcpServers/hub/index.ts +++ b/src/main/mcpServers/hub/index.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js' import type { MCPTool } from '@types' diff --git a/src/main/mcpServers/hub/mcp-bridge.ts b/src/main/mcpServers/hub/mcp-bridge.ts index eef74150e1..15664d43de 100644 --- a/src/main/mcpServers/hub/mcp-bridge.ts +++ b/src/main/mcpServers/hub/mcp-bridge.ts @@ -1,7 +1,7 @@ /** * Bridge module for Hub server to access MCPService. */ -import { application } from '@main/core/application' +import { application } from '@application' import type { MCPCallToolResponse, MCPTool, MCPToolResultContent } from '@types' import { buildToolNameMapping, resolveToolId, type ToolIdentity, type ToolNameMapping } from './toolname' diff --git a/src/main/mcpServers/memory.ts b/src/main/mcpServers/memory.ts index 3f4cb0b028..82e5facf2b 100644 --- a/src/main/mcpServers/memory.ts +++ b/src/main/mcpServers/memory.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { TraceMethod } from '@mcp-trace/trace-core' import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js' diff --git a/src/main/mcpServers/python.ts b/src/main/mcpServers/python.ts index f697e1be9f..3fa99b2491 100644 --- a/src/main/mcpServers/python.ts +++ b/src/main/mcpServers/python.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js' diff --git a/src/main/services/AnalyticsService.ts b/src/main/services/AnalyticsService.ts index 78cdc01ec1..4d16f5bee5 100644 --- a/src/main/services/AnalyticsService.ts +++ b/src/main/services/AnalyticsService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import type { TokenUsageData } from '@cherrystudio/analytics-client' import { AnalyticsClient } from '@cherrystudio/analytics-client' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { type Activatable, BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { generateUserAgent, getClientId } from '@main/utils/systemInfo' import { APP_NAME } from '@shared/config/constant' diff --git a/src/main/services/AnthropicService.ts b/src/main/services/AnthropicService.ts index 041ceb3241..9734196bb6 100644 --- a/src/main/services/AnthropicService.ts +++ b/src/main/services/AnthropicService.ts @@ -3,8 +3,8 @@ * This code is adapted from https://github.com/ThinkInAIXYZ/deepchat * Original file: src/main/presenter/anthropicOAuth.ts */ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import * as crypto from 'crypto' import { net, shell } from 'electron' import { promises } from 'fs' diff --git a/src/main/services/ApiServerService.ts b/src/main/services/ApiServerService.ts index 6c04dd1e55..bc4d6d97c8 100644 --- a/src/main/services/ApiServerService.ts +++ b/src/main/services/ApiServerService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { type Activatable, BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { IpcChannel } from '@shared/IpcChannel' import type { diff --git a/src/main/services/AppMenuService.ts b/src/main/services/AppMenuService.ts index 8a69de37f7..d30da18d26 100644 --- a/src/main/services/AppMenuService.ts +++ b/src/main/services/AppMenuService.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { BaseService, Conditional, Injectable, onPlatform, Phase, ServicePhase } from '@main/core/lifecycle' import { getAppLanguage, locales } from '@main/utils/language' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/AppService.ts b/src/main/services/AppService.ts index accddd40e7..8a07dea9a8 100644 --- a/src/main/services/AppService.ts +++ b/src/main/services/AppService.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { isDev, isLinux, isMac, isWin } from '@main/constant' -import { application } from '@main/core/application' import { app } from 'electron' import fs from 'fs' import os from 'os' diff --git a/src/main/services/AppUpdaterService.ts b/src/main/services/AppUpdaterService.ts index 4c381f214d..104fd929d4 100644 --- a/src/main/services/AppUpdaterService.ts +++ b/src/main/services/AppUpdaterService.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { isWin } from '@main/constant' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { getIpCountry } from '@main/utils/ipService' import { generateUserAgent, getClientId } from '@main/utils/systemInfo' diff --git a/src/main/services/BackupManager.ts b/src/main/services/BackupManager.ts index befcfa702f..453c94acac 100644 --- a/src/main/services/BackupManager.ts +++ b/src/main/services/BackupManager.ts @@ -14,9 +14,9 @@ * - v2 Refactor PR : https://github.com/CherryHQ/cherry-studio/pull/10162 * -------------------------------------------------------------------------- */ +import { application } from '@application' import { loggerService } from '@logger' import { isWin } from '@main/constant' -import { application } from '@main/core/application' import { IpcChannel } from '@shared/IpcChannel' import type { WebDavConfig } from '@types' import type { S3Config } from '@types' diff --git a/src/main/services/CopilotService.ts b/src/main/services/CopilotService.ts index e3cb21ecd6..47b0f3c7c0 100644 --- a/src/main/services/CopilotService.ts +++ b/src/main/services/CopilotService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { net, safeStorage } from 'electron' import fs from 'fs' import path from 'path' diff --git a/src/main/services/DetachedWindowManager.ts b/src/main/services/DetachedWindowManager.ts index 698880a5be..e7a739595d 100644 --- a/src/main/services/DetachedWindowManager.ts +++ b/src/main/services/DetachedWindowManager.ts @@ -1,8 +1,8 @@ +import { application } from '@application' import { is } from '@electron-toolkit/utils' import { loggerService } from '@logger' import { titleBarOverlayDark, titleBarOverlayLight } from '@main/config' import { isLinux, isMac, isWin } from '@main/constant' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { IpcChannel } from '@shared/IpcChannel' import { BrowserWindow, nativeTheme, shell } from 'electron' diff --git a/src/main/services/DxtService.ts b/src/main/services/DxtService.ts index 8f60af0187..90fc3e3f8b 100644 --- a/src/main/services/DxtService.ts +++ b/src/main/services/DxtService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import * as fs from 'fs' import StreamZip from 'node-stream-zip' import * as os from 'os' diff --git a/src/main/services/FileStorage.ts b/src/main/services/FileStorage.ts index 1ec5c67986..8e013de78f 100644 --- a/src/main/services/FileStorage.ts +++ b/src/main/services/FileStorage.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { toAsarUnpackedPath } from '@main/utils' import { checkName, diff --git a/src/main/services/KnowledgeService.ts b/src/main/services/KnowledgeService.ts index df123826e3..4bda4f0292 100644 --- a/src/main/services/KnowledgeService.ts +++ b/src/main/services/KnowledgeService.ts @@ -16,13 +16,13 @@ import * as fs from 'node:fs' import path from 'node:path' +import { application } from '@application' import type { RAGApplication } from '@cherrystudio/embedjs' import { RAGApplicationBuilder } from '@cherrystudio/embedjs' import { LibSqlDb } from '@cherrystudio/embedjs-libsql' import { SitemapLoader } from '@cherrystudio/embedjs-loader-sitemap' import { WebLoader } from '@cherrystudio/embedjs-loader-web' import { loggerService } from '@logger' -import { application } from '@main/core/application' import Embeddings from '@main/knowledge/embedjs/embeddings/Embeddings' import { addFileLoader } from '@main/knowledge/embedjs/loader' import { NoteLoader } from '@main/knowledge/embedjs/loader/noteLoader' diff --git a/src/main/services/MCPService.ts b/src/main/services/MCPService.ts index 26e34115c3..8e1f32f8fa 100644 --- a/src/main/services/MCPService.ts +++ b/src/main/services/MCPService.ts @@ -2,9 +2,9 @@ import crypto from 'node:crypto' import os from 'node:os' import path from 'node:path' +import { application } from '@application' import { mcpServerService } from '@data/services/McpServerService' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { createInMemoryMCPServer } from '@main/mcpServers/factory' import { makeSureDirExists, removeEnvProxy } from '@main/utils' diff --git a/src/main/services/NodeTraceService.ts b/src/main/services/NodeTraceService.ts index 61f3c427be..bd55cb8d99 100644 --- a/src/main/services/NodeTraceService.ts +++ b/src/main/services/NodeTraceService.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { isDev } from '@main/constant' -import { application } from '@main/core/application' import { type Activatable, BaseService, diff --git a/src/main/services/NotificationService.ts b/src/main/services/NotificationService.ts index 619943b8bc..28d3f0e45b 100644 --- a/src/main/services/NotificationService.ts +++ b/src/main/services/NotificationService.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import type { Notification } from '@types' import { Notification as ElectronNotification } from 'electron' diff --git a/src/main/services/OpenClawService.ts b/src/main/services/OpenClawService.ts index 53ed73d5c3..5c007579e3 100644 --- a/src/main/services/OpenClawService.ts +++ b/src/main/services/OpenClawService.ts @@ -5,9 +5,9 @@ import { Socket } from 'node:net' import os from 'node:os' import path from 'node:path' +import { application } from '@application' import { loggerService } from '@logger' import { isWin } from '@main/constant' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { isUserInChina } from '@main/utils/ipService' import { crossPlatformSpawn, findExecutableInEnv, getBinaryPath, runInstallScript } from '@main/utils/process' diff --git a/src/main/services/ProtocolService.ts b/src/main/services/ProtocolService.ts index bcf8f1e790..3ddb8f84ba 100644 --- a/src/main/services/ProtocolService.ts +++ b/src/main/services/ProtocolService.ts @@ -2,8 +2,8 @@ import { exec } from 'node:child_process' import fs from 'node:fs/promises' import { promisify } from 'node:util' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { app } from 'electron' diff --git a/src/main/services/PythonService.ts b/src/main/services/PythonService.ts index 3dc10be325..c9b5762ee1 100644 --- a/src/main/services/PythonService.ts +++ b/src/main/services/PythonService.ts @@ -1,6 +1,6 @@ import { randomUUID } from 'node:crypto' -import { application } from '@main/core/application' +import { application } from '@application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/ReduxService.ts b/src/main/services/ReduxService.ts index 73b616590e..f564b80270 100644 --- a/src/main/services/ReduxService.ts +++ b/src/main/services/ReduxService.ts @@ -14,8 +14,8 @@ * - v2 Refactor PR : https://github.com/CherryHQ/cherry-studio/pull/10162 * -------------------------------------------------------------------------- */ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { IpcChannel } from '@shared/IpcChannel' import { ipcMain } from 'electron' diff --git a/src/main/services/SelectionService.ts b/src/main/services/SelectionService.ts index a4feca1038..87eab0e2e4 100644 --- a/src/main/services/SelectionService.ts +++ b/src/main/services/SelectionService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import { loggerService } from '@logger' import { SELECTION_FINETUNED_LIST, SELECTION_PREDEFINED_BLACKLIST } from '@main/configs/SelectionConfig' import { isDev, isLinux, isMac, isWin } from '@main/constant' -import { application } from '@main/core/application' import { type Activatable, BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import type { SelectionActionItem } from '@shared/data/preference/preferenceTypes' import { SelectionTriggerMode } from '@shared/data/preference/preferenceTypes' diff --git a/src/main/services/ShortcutService.ts b/src/main/services/ShortcutService.ts index 154309a5f3..83012e2348 100644 --- a/src/main/services/ShortcutService.ts +++ b/src/main/services/ShortcutService.ts @@ -14,8 +14,8 @@ * - v2 Refactor PR : https://github.com/CherryHQ/cherry-studio/pull/10162 * -------------------------------------------------------------------------- */ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { handleZoomFactor } from '@main/utils/zoom' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/SpanCacheService.ts b/src/main/services/SpanCacheService.ts index 323df4d995..b724f5893c 100644 --- a/src/main/services/SpanCacheService.ts +++ b/src/main/services/SpanCacheService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { type Activatable, BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { convertSpanToSpanEntity } from '@mcp-trace/trace-core/core/spanConvert' import type { TraceCache } from '@mcp-trace/trace-core/core/traceCache' diff --git a/src/main/services/ThemeService.ts b/src/main/services/ThemeService.ts index 15fc1a25fe..5fa7b1a459 100644 --- a/src/main/services/ThemeService.ts +++ b/src/main/services/ThemeService.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { ThemeMode } from '@shared/data/preference/preferenceTypes' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/TrayService.ts b/src/main/services/TrayService.ts index 3356f3de03..91807d42f2 100644 --- a/src/main/services/TrayService.ts +++ b/src/main/services/TrayService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { isLinux, isMac, isWin } from '@main/constant' -import { application } from '@main/core/application' import { type Activatable, BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { getI18n } from '@main/utils/language' import type { MenuItemConstructorOptions } from 'electron' diff --git a/src/main/services/VersionService.ts b/src/main/services/VersionService.ts index 88f9f0ca37..d3900cd1ab 100644 --- a/src/main/services/VersionService.ts +++ b/src/main/services/VersionService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { app } from 'electron' import fs from 'fs' diff --git a/src/main/services/WebviewService.ts b/src/main/services/WebviewService.ts index 9e63b89640..0bcbf38e4d 100644 --- a/src/main/services/WebviewService.ts +++ b/src/main/services/WebviewService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { BaseService, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { getAppLanguage, t } from '@main/utils/language' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/WindowService.ts b/src/main/services/WindowService.ts index 3887b3b2eb..5da2d8c6b5 100644 --- a/src/main/services/WindowService.ts +++ b/src/main/services/WindowService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import { is } from '@electron-toolkit/utils' import { loggerService } from '@logger' import { isDev, isLinux, isMac, isWin } from '@main/constant' -import { application } from '@main/core/application' import { BaseService, Emitter, type Event, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import { getWindowsBackgroundMaterial, replaceDevtoolsFont } from '@main/utils/windowUtil' import { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH } from '@shared/config/constant' diff --git a/src/main/services/__tests__/AppUpdaterService.test.ts b/src/main/services/__tests__/AppUpdaterService.test.ts index 663cd1d008..181efc3966 100644 --- a/src/main/services/__tests__/AppUpdaterService.test.ts +++ b/src/main/services/__tests__/AppUpdaterService.test.ts @@ -19,7 +19,7 @@ vi.mock('@data/PreferenceService', async () => { }) // Mock application using unified factory -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') const result = mockApplicationFactory() const originalGet = result.application.get.getMockImplementation()! @@ -101,7 +101,7 @@ vi.mock('electron-updater', () => ({ })) // Import after mocks -import { application } from '@main/core/application' +import { application } from '@application' import { UpdateMirror } from '@shared/config/constant' import { MockMainPreferenceServiceUtils } from '@test-mocks/main/PreferenceService' import { app, net } from 'electron' diff --git a/src/main/services/__tests__/BackupManager.test.ts b/src/main/services/__tests__/BackupManager.test.ts index 23c3b9a2eb..e4950b6a56 100644 --- a/src/main/services/__tests__/BackupManager.test.ts +++ b/src/main/services/__tests__/BackupManager.test.ts @@ -87,7 +87,7 @@ vi.mock('fs-extra', () => ({ createReadStream: vi.fn() })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn((name: string) => { if (name === 'WindowService') { diff --git a/src/main/services/__tests__/MCPService.test.ts b/src/main/services/__tests__/MCPService.test.ts index ff8e3c0416..5b9214cdce 100644 --- a/src/main/services/__tests__/MCPService.test.ts +++ b/src/main/services/__tests__/MCPService.test.ts @@ -8,7 +8,7 @@ vi.mock('@data/services/McpServerService', () => ({ } })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn((name: string) => { if (name === 'WindowService') { diff --git a/src/main/services/__tests__/OpenClawService.test.ts b/src/main/services/__tests__/OpenClawService.test.ts index 0b0dc61291..4474471c32 100644 --- a/src/main/services/__tests__/OpenClawService.test.ts +++ b/src/main/services/__tests__/OpenClawService.test.ts @@ -15,7 +15,7 @@ vi.mock('@main/core/lifecycle', () => { } }) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn((name: string) => { if (name === 'WindowService') { diff --git a/src/main/services/agents/BaseService.ts b/src/main/services/agents/BaseService.ts index 65a1c4dd41..1514cc88bc 100644 --- a/src/main/services/agents/BaseService.ts +++ b/src/main/services/agents/BaseService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import { loggerService } from '@logger' import { getMcpApiService } from '@main/apiServer/services/mcp' import { type ModelValidationError, validateModelId } from '@main/apiServer/utils' -import { application } from '@main/core/application' import { buildFunctionCallToolName } from '@shared/mcp' import type { AgentType, SlashCommand, SystemProviderId, Tool } from '@types' import { objectKeys } from '@types' diff --git a/src/main/services/agents/services/builtin/BuiltinAgentProvisioner.ts b/src/main/services/agents/services/builtin/BuiltinAgentProvisioner.ts index 7a47019612..381a2622ef 100644 --- a/src/main/services/agents/services/builtin/BuiltinAgentProvisioner.ts +++ b/src/main/services/agents/services/builtin/BuiltinAgentProvisioner.ts @@ -8,8 +8,8 @@ * The Claude Agent SDK auto-discovers skills from .claude/skills/ and * plugins from .claude/plugins.json, so no programmatic injection is needed. */ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import fs from 'fs' import path from 'path' diff --git a/src/main/services/agents/services/channels/ChannelManager.ts b/src/main/services/agents/services/channels/ChannelManager.ts index c1f2885723..849527cfc0 100644 --- a/src/main/services/agents/services/channels/ChannelManager.ts +++ b/src/main/services/agents/services/channels/ChannelManager.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { ChannelLogEntry, ChannelStatusEvent } from '@shared/config/types' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/agents/services/channels/adapters/feishu/FeishuAdapter.ts b/src/main/services/agents/services/channels/adapters/feishu/FeishuAdapter.ts index 8f4102e80e..c39bcd9e62 100644 --- a/src/main/services/agents/services/channels/adapters/feishu/FeishuAdapter.ts +++ b/src/main/services/agents/services/channels/adapters/feishu/FeishuAdapter.ts @@ -1,8 +1,8 @@ import { Readable } from 'node:stream' import type { ReadableStream as NodeReadableStream } from 'node:stream/web' +import { application } from '@application' import * as Lark from '@larksuiteoapi/node-sdk' -import { application } from '@main/core/application' import type { FeishuDomain } from '@main/services/agents/database/schema' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/agents/services/channels/adapters/wechat/WeChatAdapter.ts b/src/main/services/agents/services/channels/adapters/wechat/WeChatAdapter.ts index d5e61250c9..30ea3ccee4 100644 --- a/src/main/services/agents/services/channels/adapters/wechat/WeChatAdapter.ts +++ b/src/main/services/agents/services/channels/adapters/wechat/WeChatAdapter.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { IpcChannel } from '@shared/IpcChannel' import { parseDataUrl } from '@shared/utils' diff --git a/src/main/services/agents/services/channels/sessionStreamIpc.ts b/src/main/services/agents/services/channels/sessionStreamIpc.ts index c564850a4a..8152fc2c24 100644 --- a/src/main/services/agents/services/channels/sessionStreamIpc.ts +++ b/src/main/services/agents/services/channels/sessionStreamIpc.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { IpcChannel } from '@shared/IpcChannel' import { ipcMain } from 'electron' diff --git a/src/main/services/agents/services/claudecode/createSdkMcpServerInstance.ts b/src/main/services/agents/services/claudecode/createSdkMcpServerInstance.ts index 4e56e2e473..5fcfb4861c 100644 --- a/src/main/services/agents/services/claudecode/createSdkMcpServerInstance.ts +++ b/src/main/services/agents/services/claudecode/createSdkMcpServerInstance.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { mcpServerService } from '@data/services/McpServerService' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' diff --git a/src/main/services/agents/services/claudecode/index.ts b/src/main/services/agents/services/claudecode/index.ts index a54738a7ee..798adeeaf7 100644 --- a/src/main/services/agents/services/claudecode/index.ts +++ b/src/main/services/agents/services/claudecode/index.ts @@ -18,11 +18,11 @@ import type { } from '@anthropic-ai/claude-agent-sdk' import { query } from '@anthropic-ai/claude-agent-sdk' import type { Base64ImageSource, ContentBlockParam } from '@anthropic-ai/sdk/resources/messages/messages' +import { application } from '@application' import { mcpServerService } from '@data/services/McpServerService' import { loggerService } from '@logger' import { validateModelId } from '@main/apiServer/utils' import { isWin } from '@main/constant' -import { application } from '@main/core/application' import AssistantServer from '@main/mcpServers/assistant' import BrowserServer from '@main/mcpServers/browser/server' import ClawServer from '@main/mcpServers/claw' diff --git a/src/main/services/agents/services/claudecode/tool-permissions.ts b/src/main/services/agents/services/claudecode/tool-permissions.ts index 89fdcf5338..7490e75bdd 100644 --- a/src/main/services/agents/services/claudecode/tool-permissions.ts +++ b/src/main/services/agents/services/claudecode/tool-permissions.ts @@ -1,8 +1,8 @@ import { randomUUID } from 'node:crypto' import type { PermissionResult, PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { IpcChannel } from '@shared/IpcChannel' import { ipcMain } from 'electron' diff --git a/src/main/services/agents/skills/SkillService.ts b/src/main/services/agents/skills/SkillService.ts index 82afb043e9..6f04c92a26 100644 --- a/src/main/services/agents/skills/SkillService.ts +++ b/src/main/services/agents/skills/SkillService.ts @@ -2,8 +2,8 @@ import { randomUUID } from 'node:crypto' import * as fs from 'node:fs' import * as path from 'node:path' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { directoryExists } from '@main/utils/file' import { deleteDirectoryRecursive } from '@main/utils/fileOperations' import { findAllSkillDirectories, findSkillMdPath, parseSkillMetadata } from '@main/utils/markdownParser' diff --git a/src/main/services/knowledge/KnowledgeOrchestrationService.ts b/src/main/services/knowledge/KnowledgeOrchestrationService.ts index 3d3dc7212e..67856ac5af 100644 --- a/src/main/services/knowledge/KnowledgeOrchestrationService.ts +++ b/src/main/services/knowledge/KnowledgeOrchestrationService.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { knowledgeBaseService } from '@data/services/KnowledgeBaseService' import { knowledgeItemService } from '@data/services/KnowledgeItemService' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import type { CreateKnowledgeItemsDto } from '@shared/data/api/schemas/knowledges' import type { KnowledgeItem, KnowledgeSearchResult } from '@shared/data/types/knowledge' diff --git a/src/main/services/knowledge/__tests__/KnowledgeOrchestrationService.test.ts b/src/main/services/knowledge/__tests__/KnowledgeOrchestrationService.test.ts index 620cb2e95b..1234054a92 100644 --- a/src/main/services/knowledge/__tests__/KnowledgeOrchestrationService.test.ts +++ b/src/main/services/knowledge/__tests__/KnowledgeOrchestrationService.test.ts @@ -29,7 +29,7 @@ const { knowledgeItemGetByIdsInBaseMock: vi.fn() })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: appGetMock } diff --git a/src/main/services/knowledge/runtime/KnowledgeAddRuntime.ts b/src/main/services/knowledge/runtime/KnowledgeAddRuntime.ts index 64e70d76e3..d864c9f6cb 100644 --- a/src/main/services/knowledge/runtime/KnowledgeAddRuntime.ts +++ b/src/main/services/knowledge/runtime/KnowledgeAddRuntime.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { knowledgeItemService } from '@data/services/KnowledgeItemService' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { KnowledgeBase, KnowledgeItem } from '@shared/data/types/knowledge' import type { BaseVectorStore } from '@vectorstores/core' diff --git a/src/main/services/knowledge/runtime/KnowledgeRuntimeService.ts b/src/main/services/knowledge/runtime/KnowledgeRuntimeService.ts index 1876e743d5..ff1355f80e 100644 --- a/src/main/services/knowledge/runtime/KnowledgeRuntimeService.ts +++ b/src/main/services/knowledge/runtime/KnowledgeRuntimeService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { knowledgeItemService } from '@data/services/KnowledgeItemService' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import type { KnowledgeBase, KnowledgeItem, KnowledgeSearchResult } from '@shared/data/types/knowledge' import { MetadataMode } from '@vectorstores/core' diff --git a/src/main/services/knowledge/runtime/__tests__/KnowledgeRuntimeService.test.ts b/src/main/services/knowledge/runtime/__tests__/KnowledgeRuntimeService.test.ts index a6bc37617c..9126cb8595 100644 --- a/src/main/services/knowledge/runtime/__tests__/KnowledgeRuntimeService.test.ts +++ b/src/main/services/knowledge/runtime/__tests__/KnowledgeRuntimeService.test.ts @@ -38,7 +38,7 @@ const { vectorStoreQueryMock: vi.fn() })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: appGetMock } diff --git a/src/main/services/knowledge/runtime/utils/__tests__/cleanup.test.ts b/src/main/services/knowledge/runtime/utils/__tests__/cleanup.test.ts index aa9911c9ad..a94d54e235 100644 --- a/src/main/services/knowledge/runtime/utils/__tests__/cleanup.test.ts +++ b/src/main/services/knowledge/runtime/utils/__tests__/cleanup.test.ts @@ -10,7 +10,7 @@ const { appGetMock, getStoreIfExistsMock, knowledgeItemUpdateMock, loggerErrorMo vectorDeleteMock: vi.fn() })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: appGetMock } diff --git a/src/main/services/knowledge/runtime/utils/cleanup.ts b/src/main/services/knowledge/runtime/utils/cleanup.ts index b8b0b3e100..c22f65d37a 100644 --- a/src/main/services/knowledge/runtime/utils/cleanup.ts +++ b/src/main/services/knowledge/runtime/utils/cleanup.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { knowledgeItemService } from '@data/services/KnowledgeItemService' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { KnowledgeBase, KnowledgeItem } from '@shared/data/types/knowledge' const logger = loggerService.withContext('KnowledgeRuntimeCleanup') diff --git a/src/main/services/knowledge/vectorstore/providers/LibSqlVectorStoreProvider.ts b/src/main/services/knowledge/vectorstore/providers/LibSqlVectorStoreProvider.ts index b4a9a73788..a945508695 100644 --- a/src/main/services/knowledge/vectorstore/providers/LibSqlVectorStoreProvider.ts +++ b/src/main/services/knowledge/vectorstore/providers/LibSqlVectorStoreProvider.ts @@ -1,8 +1,8 @@ import fs from 'node:fs' import { pathToFileURL } from 'node:url' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { sanitizeFilename } from '@main/utils/file' import type { KnowledgeBase } from '@shared/data/types/knowledge' import type { BaseVectorStore } from '@vectorstores/core' diff --git a/src/main/services/lanTransfer/LanTransferService.ts b/src/main/services/lanTransfer/LanTransferService.ts index d862796f52..f6319958b8 100644 --- a/src/main/services/lanTransfer/LanTransferService.ts +++ b/src/main/services/lanTransfer/LanTransferService.ts @@ -1,8 +1,8 @@ import * as crypto from 'node:crypto' import { createConnection, type Socket } from 'node:net' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { BaseService, DependsOn, Injectable, Phase, ServicePhase } from '@main/core/lifecycle' import type { LanClientEvent, diff --git a/src/main/services/lanTransfer/__tests__/LanTransferService.test.ts b/src/main/services/lanTransfer/__tests__/LanTransferService.test.ts index 9a4f6105c9..cdd521d241 100644 --- a/src/main/services/lanTransfer/__tests__/LanTransferService.test.ts +++ b/src/main/services/lanTransfer/__tests__/LanTransferService.test.ts @@ -35,7 +35,7 @@ vi.mock('@logger', () => ({ } })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { get: vi.fn((name: string) => { if (name === 'WindowService') { diff --git a/src/main/services/mcp/oauth/provider.ts b/src/main/services/mcp/oauth/provider.ts index 45b44dbb31..cf0e1d0bd4 100644 --- a/src/main/services/mcp/oauth/provider.ts +++ b/src/main/services/mcp/oauth/provider.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth' import type { OAuthClientInformation, diff --git a/src/main/services/memory/MemoryService.ts b/src/main/services/memory/MemoryService.ts index 36d2fc8244..9ce743194d 100644 --- a/src/main/services/memory/MemoryService.ts +++ b/src/main/services/memory/MemoryService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import type { Client } from '@libsql/client' import { createClient } from '@libsql/client' import { loggerService } from '@logger' -import { application } from '@main/core/application' import Embeddings from '@main/knowledge/embedjs/embeddings/Embeddings' import type { AddMemoryOptions, diff --git a/src/main/services/ocr/builtin/TesseractService.ts b/src/main/services/ocr/builtin/TesseractService.ts index 065f9052a9..395f5a5d19 100644 --- a/src/main/services/ocr/builtin/TesseractService.ts +++ b/src/main/services/ocr/builtin/TesseractService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { getIpCountry } from '@main/utils/ipService' import { loadOcrImage } from '@main/utils/ocr' import { MB } from '@shared/config/constant' diff --git a/src/main/services/remotefile/GeminiService.ts b/src/main/services/remotefile/GeminiService.ts index 90b76e97f6..cfccbbf053 100644 --- a/src/main/services/remotefile/GeminiService.ts +++ b/src/main/services/remotefile/GeminiService.ts @@ -1,7 +1,7 @@ +import { application } from '@application' import type { File, Files } from '@google/genai' import { FileState, GoogleGenAI } from '@google/genai' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { fileStorage } from '@main/services/FileStorage' import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' import { v4 as uuidv4 } from 'uuid' diff --git a/src/main/services/remotefile/OpenAIService.ts b/src/main/services/remotefile/OpenAIService.ts index 13ea2b821d..b1f0497061 100644 --- a/src/main/services/remotefile/OpenAIService.ts +++ b/src/main/services/remotefile/OpenAIService.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import OpenAI from '@cherrystudio/openai' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { fileStorage } from '@main/services/FileStorage' import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' import * as fs from 'fs' diff --git a/src/main/services/urlschema/handle-navigate.ts b/src/main/services/urlschema/handle-navigate.ts index 9278429c63..d6994d1885 100644 --- a/src/main/services/urlschema/handle-navigate.ts +++ b/src/main/services/urlschema/handle-navigate.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { isMac } from '@main/constant' -import { application } from '@main/core/application' const logger = loggerService.withContext('URLSchema:handleNavigateProtocolUrl') diff --git a/src/main/services/urlschema/handle-providers.ts b/src/main/services/urlschema/handle-providers.ts index 668a96ecf8..5666ef5665 100644 --- a/src/main/services/urlschema/handle-providers.ts +++ b/src/main/services/urlschema/handle-providers.ts @@ -1,6 +1,6 @@ +import { application } from '@application' import { loggerService } from '@logger' import { isMac } from '@main/constant' -import { application } from '@main/core/application' const logger = loggerService.withContext('URLSchema:handleProvidersProtocolUrl') function ParseData(data: string) { diff --git a/src/main/services/urlschema/mcp-install.ts b/src/main/services/urlschema/mcp-install.ts index 5130a02cb9..13cf37a197 100644 --- a/src/main/services/urlschema/mcp-install.ts +++ b/src/main/services/urlschema/mcp-install.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { nanoid } from '@reduxjs/toolkit' import type { MCPServer } from '@shared/data/types/mcpServer' import { IpcChannel } from '@shared/IpcChannel' diff --git a/src/main/services/webSearch/WebSearchService.ts b/src/main/services/webSearch/WebSearchService.ts index f0aa26d628..06ccd5f8e7 100644 --- a/src/main/services/webSearch/WebSearchService.ts +++ b/src/main/services/webSearch/WebSearchService.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { WebSearchExecutionConfig, WebSearchRequest, diff --git a/src/main/utils/__tests__/rtk.test.ts b/src/main/utils/__tests__/rtk.test.ts index a53df9fb90..e560cdf91d 100644 --- a/src/main/utils/__tests__/rtk.test.ts +++ b/src/main/utils/__tests__/rtk.test.ts @@ -48,7 +48,7 @@ vi.mock('../../constant', () => ({ isWin: false })) -vi.mock('@main/core/application', () => ({ +vi.mock('@application', () => ({ application: { getPath: (key: string) => { if (key === 'app.root.resources.binaries') return '/app/resources/binaries' diff --git a/src/main/utils/builtinSkills.ts b/src/main/utils/builtinSkills.ts index 522af681e3..6de6011944 100644 --- a/src/main/utils/builtinSkills.ts +++ b/src/main/utils/builtinSkills.ts @@ -2,8 +2,8 @@ import { createHash } from 'node:crypto' import fs from 'node:fs/promises' import path from 'node:path' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { parseSkillMetadata } from '@main/utils/markdownParser' import { app } from 'electron' diff --git a/src/main/utils/file.ts b/src/main/utils/file.ts index d01b3b0021..15cd5c8de7 100644 --- a/src/main/utils/file.ts +++ b/src/main/utils/file.ts @@ -4,8 +4,8 @@ import { readFile } from 'node:fs/promises' import os from 'node:os' import path from 'node:path' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { audioExts, documentExts, imageExts, MB, textExts, videoExts } from '@shared/config/constant' import type { FileMetadata, FileType, NotesTreeNode } from '@types' import { FILE_TYPE } from '@types' diff --git a/src/main/utils/language.ts b/src/main/utils/language.ts index 2b2288dcf3..1cc91ed8cf 100644 --- a/src/main/utils/language.ts +++ b/src/main/utils/language.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { defaultLanguage } from '@shared/config/constant' import type { LanguageVarious } from '@shared/data/preference/preferenceTypes' import { app } from 'electron' diff --git a/src/main/utils/process.ts b/src/main/utils/process.ts index 36d0fcbb64..8719fb4cda 100644 --- a/src/main/utils/process.ts +++ b/src/main/utils/process.ts @@ -1,5 +1,5 @@ +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import type { GitBashPathInfo, GitBashPathSource } from '@shared/config/constant' import { HOME_CHERRY_DIR } from '@shared/config/constant' import chardet from 'chardet' diff --git a/src/main/utils/rtk.ts b/src/main/utils/rtk.ts index a28a98a28e..21d82f0aa9 100644 --- a/src/main/utils/rtk.ts +++ b/src/main/utils/rtk.ts @@ -4,8 +4,8 @@ import os from 'node:os' import path from 'node:path' import { promisify } from 'node:util' +import { application } from '@application' import { loggerService } from '@logger' -import { application } from '@main/core/application' import { HOME_CHERRY_DIR } from '@shared/config/constant' import { gte as semverGte } from 'semver' diff --git a/src/main/utils/systemInfo.ts b/src/main/utils/systemInfo.ts index 4796837613..16c5f9a82e 100644 --- a/src/main/utils/systemInfo.ts +++ b/src/main/utils/systemInfo.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import { app } from 'electron' import macosRelease from 'macos-release' import os from 'os' diff --git a/src/main/utils/zoom.ts b/src/main/utils/zoom.ts index b7f2051b90..3408a6c4ac 100644 --- a/src/main/utils/zoom.ts +++ b/src/main/utils/zoom.ts @@ -1,4 +1,4 @@ -import { application } from '@main/core/application' +import { application } from '@application' import type { BrowserWindow } from 'electron' export function handleZoomFactor(wins: BrowserWindow[], delta: number, reset: boolean = false) { diff --git a/tests/__mocks__/README.md b/tests/__mocks__/README.md index 80cec728ff..0829a516ee 100644 --- a/tests/__mocks__/README.md +++ b/tests/__mocks__/README.md @@ -271,7 +271,7 @@ All main-process tests get `application.get()` mocked globally via `tests/main.s **Global setup** (already configured in `tests/main.setup.ts`): ```typescript -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('./__mocks__/main/application') return mockApplicationFactory() }) @@ -282,7 +282,7 @@ vi.mock('@main/core/application', async () => { ```typescript const mockDb = { select: vi.fn(), insert: vi.fn() } -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory({ DbService: { getDb: () => mockDb } @@ -295,7 +295,7 @@ vi.mock('@main/core/application', async () => { ```typescript const mockPreferenceGet = vi.fn() -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('@test-mocks/main/application') return mockApplicationFactory({ PreferenceService: { get: mockPreferenceGet } diff --git a/tests/__mocks__/main/application.ts b/tests/__mocks__/main/application.ts index eb77b8cc18..d5f900e926 100644 --- a/tests/__mocks__/main/application.ts +++ b/tests/__mocks__/main/application.ts @@ -9,13 +9,13 @@ import { MockMainPreferenceServiceExport } from './PreferenceService' * Unified mock application factory for main process testing. * * Usage in vi.mock(): - * vi.mock('@main/core/application', async () => { + * vi.mock('@application', async () => { * const { mockApplicationFactory } = await import('@test-mocks/main/application') * return mockApplicationFactory() * }) * * With service overrides: - * vi.mock('@main/core/application', async () => { + * vi.mock('@application', async () => { * const { mockApplicationFactory } = await import('@test-mocks/main/application') * return mockApplicationFactory({ * DbService: { getDb: () => customMockDb } @@ -69,7 +69,7 @@ export function createMockApplication(overrides: ServiceOverrides = {}) { } /** - * Create the full mock module for vi.mock('@main/core/application', ...). + * Create the full mock module for vi.mock('@application', ...). * Returns { application, serviceList }. */ export function mockApplicationFactory(overrides: ServiceOverrides = {}) { diff --git a/tests/main.setup.ts b/tests/main.setup.ts index 7a53e99c26..7552040b49 100644 --- a/tests/main.setup.ts +++ b/tests/main.setup.ts @@ -44,7 +44,7 @@ vi.mock('@main/data/db/DbService', async () => { }) // Mock application globally - provides type-safe service access via application.get() -vi.mock('@main/core/application', async () => { +vi.mock('@application', async () => { const { mockApplicationFactory } = await import('./__mocks__/main/application') return mockApplicationFactory() }) diff --git a/tsconfig.node.json b/tsconfig.node.json index 2e466748e9..a7e203f719 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -6,6 +6,7 @@ "incremental": true, "moduleResolution": "bundler", "paths": { + "@application": ["./src/main/core/application"], "@cherrystudio/provider-registry": ["./packages/provider-registry/src/index.ts"], "@cherrystudio/provider-registry/node": ["./packages/provider-registry/src/registry-loader.ts"], "@data/*": ["./src/main/data/*"],