chatlab-cli 0.28.1 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-command-ISJ2DC7R.mjs → chat-command-JKG3FY5B.mjs} +8 -5
- package/dist/{chat-command-ISJ2DC7R.mjs.map → chat-command-JKG3FY5B.mjs.map} +1 -1
- package/dist/chunk-2MZ6G4AC.mjs +1339 -0
- package/dist/chunk-2MZ6G4AC.mjs.map +1 -0
- package/dist/{chunk-NJB2NNB2.mjs → chunk-6FPEP2ZX.mjs} +2 -2
- package/dist/{chunk-YBS3YQB6.mjs → chunk-7RW4CQAO.mjs} +31 -57
- package/dist/chunk-7RW4CQAO.mjs.map +1 -0
- package/dist/{chunk-GHTGFM6O.mjs → chunk-ARZM6HBX.mjs} +14 -12
- package/dist/{chunk-GHTGFM6O.mjs.map → chunk-ARZM6HBX.mjs.map} +1 -1
- package/dist/{chunk-3QBVO4J7.mjs → chunk-CIB23U32.mjs} +2 -2
- package/dist/chunk-D4WTE7LV.mjs +526 -0
- package/dist/chunk-D4WTE7LV.mjs.map +1 -0
- package/dist/{chunk-T7IETWHN.mjs → chunk-I35WHWA6.mjs} +5 -3
- package/dist/{chunk-T7IETWHN.mjs.map → chunk-I35WHWA6.mjs.map} +1 -1
- package/dist/{chunk-AB6TAXTQ.mjs → chunk-KL2NGIMQ.mjs} +171 -47
- package/dist/chunk-KL2NGIMQ.mjs.map +1 -0
- package/dist/{chunk-ZVDOFWL7.mjs → chunk-QQK7MLCR.mjs} +3926 -10867
- package/dist/chunk-QQK7MLCR.mjs.map +1 -0
- package/dist/{chunk-ERAAWLEF.mjs → chunk-SKUG5XVD.mjs} +10 -8
- package/dist/{chunk-ERAAWLEF.mjs.map → chunk-SKUG5XVD.mjs.map} +1 -1
- package/dist/chunk-WPI6YSAR.mjs +8813 -0
- package/dist/chunk-WPI6YSAR.mjs.map +1 -0
- package/dist/cli.mjs +7 -4
- package/dist/contacts-worker.mjs +48 -0
- package/dist/contacts-worker.mjs.map +1 -0
- package/dist/{http-MBILV37U.mjs → http-5E7ARYFW.mjs} +11 -8
- package/dist/{import-EYV3GXHE.mjs → import-3KG6VK6O.mjs} +7 -4
- package/dist/index.mjs +11 -8
- package/dist/{mcp-H55AEXU5.mjs → mcp-JBI4CUQT.mjs} +8 -5
- package/dist/{mcp-H55AEXU5.mjs.map → mcp-JBI4CUQT.mjs.map} +1 -1
- package/dist/people-relationships-worker.mjs +48 -0
- package/dist/people-relationships-worker.mjs.map +1 -0
- package/dist/semantic-index-worker.mjs +1 -1
- package/dist/{src-36ZIR65K.mjs → src-UTBQAOJ3.mjs} +62 -44
- package/dist/{stream-import-YZMZ56B5.mjs → stream-import-7HZ4IRYJ.mjs} +7 -4
- package/dist/{worker-runtime-YDYS2C6T.mjs → worker-runtime-ALS4MR2A.mjs} +7 -3
- package/dist/{worker-runtime-YDYS2C6T.mjs.map → worker-runtime-ALS4MR2A.mjs.map} +1 -1
- package/dist-web/assets/BufferResource-MsqP5sq3.js +185 -0
- package/dist-web/assets/CanvasRenderer-BKCvcc2p.js +1 -0
- package/dist-web/assets/DebugToolsPanel-D_lFIW6j.css +1 -0
- package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-HGJb0Et1.js +110 -0
- package/dist-web/assets/{EChartWordcloud-B_YisOW5.js → EChartWordcloud-Clg60FMo.js} +1 -1
- package/dist-web/assets/Filter-wRJtdXx9.js +1 -0
- package/dist-web/assets/MessageExportModal-BCrMf5Kw.js +1 -0
- package/dist-web/assets/PageHeader-Bbn87QZS.css +1 -0
- package/dist-web/assets/PageHeader-C_yw54le.js +1 -0
- package/dist-web/assets/RelationshipGalaxyCanvas-DTzJq7q7.js +244 -0
- package/dist-web/assets/RelationshipGalaxyThreeCanvas-BluPHjCR.css +1 -0
- package/dist-web/assets/RelationshipGalaxyThreeCanvas-DIE-0_iM.js +4108 -0
- package/dist-web/assets/RenderTargetSystem-BSAQFamI.js +184 -0
- package/dist-web/assets/WebGLRenderer-lfzmCZNT.js +156 -0
- package/dist-web/assets/WebGPURenderer-BnEdfdr_.js +41 -0
- package/dist-web/assets/browserAll-gRNfDyPu.js +14 -0
- package/dist-web/assets/{electron-DWDCqx_d.js → electron-BHaEaaZP.js} +1 -1
- package/dist-web/assets/{fetch-29ZBtGV0.js → fetch-BW3aO7PS.js} +1 -1
- package/dist-web/assets/fetch-BwF5hNuF.js +1 -0
- package/dist-web/assets/{fetch-Bh1fo3Df.js → fetch-C1fI_KOX.js} +1 -1
- package/dist-web/assets/{fetch-DyD8wDhb.js → fetch-CBZbgZqk.js} +1 -1
- package/dist-web/assets/{fetch-C3yhWO2S.js → fetch-CFRoSIAn.js} +1 -1
- package/dist-web/assets/fetch-CN91TIwV.js +1 -0
- package/dist-web/assets/{fetch-BcxrU2mr.js → fetch-CQt-gb-f.js} +1 -1
- package/dist-web/assets/{fetch-TCeykOkO.js → fetch-DPCJ-1l-.js} +1 -1
- package/dist-web/assets/{fetch-tIIVdXSv.js → fetch-gMB4wuBd.js} +1 -1
- package/dist-web/assets/{fetch-BYczbT4C.js → fetch-mFlEBZyB.js} +1 -1
- package/dist-web/assets/index---rXG1hZ.css +1 -0
- package/dist-web/assets/index--6C0sK6a.css +1 -0
- package/dist-web/assets/index-B6wEGata.js +173 -0
- package/dist-web/assets/index-Bg4GGPXv.js +1 -0
- package/dist-web/assets/index-BgVbj5qX.js +12 -0
- package/dist-web/assets/index-BkoXaBV_.js +64 -0
- package/dist-web/assets/index-C56IuV5U.css +1 -0
- package/dist-web/assets/index-CLRaKwpT.js +2 -0
- package/dist-web/assets/index-Dj1BSD7O.js +1 -0
- package/dist-web/assets/index-DosG7LmJ.css +1 -0
- package/dist-web/assets/index-DveHdPfK.js +1 -0
- package/dist-web/assets/{index-BX3tqfLz.css → index-MBRD3wPd.css} +1 -1
- package/dist-web/assets/index-RoDgJcHU.js +2 -0
- package/dist-web/assets/{index-fbWrQpgH.js → index-ZdCB7xcf.js} +4 -4
- package/dist-web/assets/index-aljYO5ms.js +1 -0
- package/dist-web/assets/people-page-header-Mupn-U_b.js +1 -0
- package/dist-web/assets/relationship-galaxy-viewport-Cwfa51ER.js +1 -0
- package/dist-web/assets/{vendor-echarts-CITQeskI.js → vendor-echarts-hJVnODyU.js} +2 -2
- package/dist-web/assets/{vendor-echarts-wordcloud-B1kQMklB.js → vendor-echarts-wordcloud-k5ih2Jl4.js} +1 -1
- package/dist-web/assets/{vendor-nuxt-ui-Zy8txNdC.js → vendor-nuxt-ui-Dr2T8_OZ.js} +2 -2
- package/dist-web/assets/{vendor-reka-ui-mMvma1EP.js → vendor-reka-ui-CzM4kDQ7.js} +1 -1
- package/dist-web/assets/{vendor-zrender-DFl4U2Oe.js → vendor-zrender-5DcYjSZk.js} +1 -1
- package/dist-web/assets/{web-H3XLx159.js → web-BakeV58u.js} +1 -1
- package/dist-web/assets/webworkerAll-D_6PgURS.js +83 -0
- package/dist-web/index.html +4 -4
- package/package.json +1 -1
- package/dist/chunk-AB6TAXTQ.mjs.map +0 -1
- package/dist/chunk-YBS3YQB6.mjs.map +0 -1
- package/dist/chunk-ZVDOFWL7.mjs.map +0 -1
- package/dist-web/assets/DebugToolsPanel-DFw6_G5V.css +0 -1
- package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-Do3x4aL3.js +0 -110
- package/dist-web/assets/MessageExportModal-rijqUusq.js +0 -1
- package/dist-web/assets/fetch-BAxKmbKF.js +0 -1
- package/dist-web/assets/fetch-Da_TBxrX.js +0 -1
- package/dist-web/assets/index-BzjLqlW_.js +0 -173
- package/dist-web/assets/index-C74qEDFh.js +0 -64
- package/dist-web/assets/index-CM6xNPFp.css +0 -1
- package/dist-web/assets/index-CgK2LLIF.js +0 -12
- package/dist-web/assets/index-CjkOvM3N.js +0 -2
- package/dist-web/assets/index-Dno7CADA.js +0 -1
- package/dist-web/assets/index-I3SWZjnW.css +0 -1
- /package/dist/{chunk-NJB2NNB2.mjs.map → chunk-6FPEP2ZX.mjs.map} +0 -0
- /package/dist/{chunk-3QBVO4J7.mjs.map → chunk-CIB23U32.mjs.map} +0 -0
- /package/dist/{http-MBILV37U.mjs.map → http-5E7ARYFW.mjs.map} +0 -0
- /package/dist/{import-EYV3GXHE.mjs.map → import-3KG6VK6O.mjs.map} +0 -0
- /package/dist/{src-36ZIR65K.mjs.map → src-UTBQAOJ3.mjs.map} +0 -0
- /package/dist/{stream-import-YZMZ56B5.mjs.map → stream-import-7HZ4IRYJ.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/import/stream-import.ts"],"sourcesContent":["/**\n * Server/CLI streaming import — adapter for @openchatlab/node-runtime StreamingImporter.\n *\n * Replaces the old buffered-in-memory approach with the same high-performance\n * streaming pipeline used by Electron (batched transactions, deferred indexes,\n * nickname history, FTS, format fallback).\n */\n\nimport type { DatabaseManager } from '@openchatlab/node-runtime'\nimport {\n DataDirCompatibilityError,\n streamingImport,\n analyzeNewImport as sharedAnalyzeNewImport,\n analyzeIncrementalImport as sharedAnalyzeIncremental,\n incrementalImport as sharedIncrementalImport,\n} from '@openchatlab/node-runtime'\nimport type {\n StreamImportResult,\n StreamImportDeps,\n ImportProgressCallback,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n IncrementalImportDeps,\n ImportOptions,\n AnalyzeNewImportResult,\n} from '@openchatlab/node-runtime'\nimport {\n detectFormat as parserDetectFormat,\n detectAllFormats,\n getFormatFeatureById,\n getSupportedFormats as parserGetSupportedFormats,\n scanMultiChatFile as parserScanMultiChatFile,\n findEntryFileInDirectory,\n type FormatFeature,\n type MultiChatInfo,\n type ParseProgress,\n} from '@openchatlab/parser'\nimport * as crypto from 'crypto'\n\n// ==================== Legacy progress interface (for SSE routes) ====================\n\nexport interface StreamImportProgress {\n stage: 'detecting' | 'parsing' | 'saving' | 'indexing' | 'done' | 'error'\n progress: number\n message: string\n bytesRead?: number\n totalBytes?: number\n messagesProcessed?: number\n}\n\nexport interface StreamImportOptions {\n formatId?: string\n chatIndex?: number\n nativeBinding?: string\n onProgress?: (progress: StreamImportProgress) => void\n /** Fix the target session ID instead of auto-generating one. Used by sync/pull adapters. */\n sessionId?: string\n}\n\nfunction generateSessionId(): string {\n const ts = Date.now()\n const rand = crypto.randomBytes(4).toString('hex')\n return `chat_${ts}_${rand}`\n}\n\nfunction buildStreamImportDeps(dbManager: DatabaseManager, onProgress?: ImportProgressCallback): StreamImportDeps {\n return {\n openDatabase(sessionId: string) {\n return dbManager.openRawSessionDatabase(sessionId, { create: true, initializeChatTables: true })\n },\n deleteDatabase(sessionId: string) {\n dbManager.deleteSessionDatabaseFiles(sessionId)\n },\n onProgress: onProgress ?? (() => {}),\n generateSessionId,\n }\n}\n\nfunction deleteSessionDatabase(dbManager: DatabaseManager, sessionId: string): void {\n dbManager.deleteSessionDatabaseFiles(sessionId)\n}\n\n/**\n * High-performance streaming import: parse a file and write to DB\n * with batched transactions, deferred indexes, and FTS.\n */\nexport async function streamImport(\n dbManager: DatabaseManager,\n filePath: string,\n options?: StreamImportOptions\n): Promise<StreamImportResult> {\n const { formatId, chatIndex, onProgress, sessionId } = options || {}\n\n const formatOptions: Record<string, unknown> = {}\n if (formatId) formatOptions.formatId = formatId\n if (chatIndex !== undefined) formatOptions.chatIndex = chatIndex\n\n const progressAdapter: ImportProgressCallback = onProgress\n ? (progress) => {\n let stage: StreamImportProgress['stage'] = 'parsing'\n let pct = 0\n switch (progress.stage) {\n case 'detecting':\n stage = 'detecting'\n pct = 5\n break\n case 'parsing':\n stage = 'parsing'\n pct = Math.min(Math.round(progress.percentage * 0.7), 70)\n break\n case 'importing':\n case 'saving':\n stage = 'saving'\n pct = 80\n break\n case 'done':\n stage = 'done'\n pct = 100\n break\n case 'error':\n stage = 'error'\n pct = 0\n break\n }\n onProgress({\n stage,\n progress: pct,\n message: progress.message || '',\n bytesRead: progress.bytesRead,\n totalBytes: progress.totalBytes,\n messagesProcessed: progress.messagesProcessed,\n })\n }\n : () => {}\n\n const deps = buildStreamImportDeps(dbManager, progressAdapter)\n const result = await streamingImport(filePath, deps, formatOptions, sessionId)\n if (!result.success || !result.sessionId) return result\n\n try {\n dbManager.raiseCurrentChatDbCompatibilityGate()\n } catch (error) {\n deleteSessionDatabase(dbManager, result.sessionId)\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n diagnostics: result.diagnostics,\n }\n }\n\n return result\n}\n\n// ==================== Incremental import ====================\n\nfunction buildIncrementalDeps(\n dbManager: DatabaseManager,\n onProgress?: ImportProgressCallback,\n onCompatibilityError?: (error: DataDirCompatibilityError) => void\n): IncrementalImportDeps {\n return {\n openDatabase(sessionId: string, readonly?: boolean) {\n try {\n return dbManager.openRawSessionDatabase(sessionId, { readonly: readonly ?? false })\n } catch (error) {\n if (error instanceof DataDirCompatibilityError) onCompatibilityError?.(error)\n throw error\n }\n },\n onProgress: onProgress ?? (() => {}),\n }\n}\n\nexport async function incrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n options?: ImportOptions & { onProgress?: ImportProgressCallback }\n): Promise<IncrementalImportResult> {\n const { onProgress, ...importOpts } = options || {}\n let compatibilityError: DataDirCompatibilityError | null = null\n const result = await sharedIncrementalImport(\n sessionId,\n filePath,\n buildIncrementalDeps(dbManager, onProgress, (error) => {\n compatibilityError = error\n }),\n importOpts\n )\n if (compatibilityError) throw compatibilityError\n if (!result.success) return result\n\n try {\n dbManager.raiseCurrentChatDbCompatibilityGate()\n } catch (error) {\n return {\n ...result,\n success: false,\n newMessageCount: 0,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n\n return result\n}\n\nexport async function analyzeIncrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n onProgress?: ImportProgressCallback\n): Promise<IncrementalAnalyzeResult> {\n let compatibilityError: DataDirCompatibilityError | null = null\n const result = await sharedAnalyzeIncremental(\n sessionId,\n filePath,\n buildIncrementalDeps(dbManager, onProgress, (error) => {\n compatibilityError = error\n })\n )\n if (compatibilityError) throw compatibilityError\n return result\n}\n\nexport async function analyzeNewImport(\n filePath: string,\n onProgress?: ImportProgressCallback\n): Promise<AnalyzeNewImportResult> {\n return sharedAnalyzeNewImport(filePath, onProgress ?? (() => {}))\n}\n\n// ==================== Re-exports from parser ====================\n\nexport {\n parserDetectFormat as detectFormat,\n detectAllFormats,\n getFormatFeatureById,\n parserGetSupportedFormats as getSupportedFormats,\n parserScanMultiChatFile as scanMultiChatFile,\n findEntryFileInDirectory,\n}\nexport type { FormatFeature, MultiChatInfo, ParseProgress }\nexport type {\n StreamImportResult,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n AnalyzeNewImportResult,\n ImportOptions,\n}\n"],"mappings":"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","names":["incrementalImport","analyzeIncrementalImport","analyzeNewImport"]}
|
|
1
|
+
{"version":3,"sources":["../src/import/stream-import.ts"],"sourcesContent":["/**\n * Server/CLI streaming import — adapter for @openchatlab/node-runtime StreamingImporter.\n *\n * Replaces the old buffered-in-memory approach with the same high-performance\n * streaming pipeline used by Electron (batched transactions, deferred indexes,\n * nickname history, FTS, format fallback).\n */\n\nimport type { DatabaseManager } from '@openchatlab/node-runtime'\nimport {\n DataDirCompatibilityError,\n streamingImport,\n analyzeNewImport as sharedAnalyzeNewImport,\n analyzeIncrementalImport as sharedAnalyzeIncremental,\n incrementalImport as sharedIncrementalImport,\n} from '@openchatlab/node-runtime'\nimport type {\n StreamImportResult,\n StreamImportDeps,\n ImportProgressCallback,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n IncrementalImportDeps,\n ImportOptions,\n AnalyzeNewImportResult,\n} from '@openchatlab/node-runtime'\nimport {\n detectFormat as parserDetectFormat,\n detectAllFormats,\n getFormatFeatureById,\n getSupportedFormats as parserGetSupportedFormats,\n scanMultiChatFile as parserScanMultiChatFile,\n findEntryFileInDirectory,\n type FormatFeature,\n type MultiChatInfo,\n type ParseProgress,\n} from '@openchatlab/parser'\nimport * as crypto from 'crypto'\n\n// ==================== Legacy progress interface (for SSE routes) ====================\n\nexport interface StreamImportProgress {\n stage: 'detecting' | 'parsing' | 'saving' | 'indexing' | 'done' | 'error'\n progress: number\n message: string\n bytesRead?: number\n totalBytes?: number\n messagesProcessed?: number\n}\n\nexport interface StreamImportOptions {\n formatId?: string\n chatIndex?: number\n nativeBinding?: string\n onProgress?: (progress: StreamImportProgress) => void\n /** Fix the target session ID instead of auto-generating one. Used by sync/pull adapters. */\n sessionId?: string\n}\n\nfunction generateSessionId(): string {\n const ts = Date.now()\n const rand = crypto.randomBytes(4).toString('hex')\n return `chat_${ts}_${rand}`\n}\n\nfunction buildStreamImportDeps(dbManager: DatabaseManager, onProgress?: ImportProgressCallback): StreamImportDeps {\n return {\n openDatabase(sessionId: string) {\n return dbManager.openRawSessionDatabase(sessionId, { create: true, initializeChatTables: true })\n },\n deleteDatabase(sessionId: string) {\n dbManager.deleteSessionDatabaseFiles(sessionId)\n },\n onProgress: onProgress ?? (() => {}),\n generateSessionId,\n }\n}\n\nfunction deleteSessionDatabase(dbManager: DatabaseManager, sessionId: string): void {\n dbManager.deleteSessionDatabaseFiles(sessionId)\n}\n\n/**\n * High-performance streaming import: parse a file and write to DB\n * with batched transactions, deferred indexes, and FTS.\n */\nexport async function streamImport(\n dbManager: DatabaseManager,\n filePath: string,\n options?: StreamImportOptions\n): Promise<StreamImportResult> {\n const { formatId, chatIndex, onProgress, sessionId } = options || {}\n\n const formatOptions: Record<string, unknown> = {}\n if (formatId) formatOptions.formatId = formatId\n if (chatIndex !== undefined) formatOptions.chatIndex = chatIndex\n\n const progressAdapter: ImportProgressCallback = onProgress\n ? (progress) => {\n let stage: StreamImportProgress['stage'] = 'parsing'\n let pct = 0\n switch (progress.stage) {\n case 'detecting':\n stage = 'detecting'\n pct = 5\n break\n case 'parsing':\n stage = 'parsing'\n pct = Math.min(Math.round(progress.percentage * 0.7), 70)\n break\n case 'importing':\n case 'saving':\n stage = 'saving'\n pct = 80\n break\n case 'done':\n stage = 'done'\n pct = 100\n break\n case 'error':\n stage = 'error'\n pct = 0\n break\n }\n onProgress({\n stage,\n progress: pct,\n message: progress.message || '',\n bytesRead: progress.bytesRead,\n totalBytes: progress.totalBytes,\n messagesProcessed: progress.messagesProcessed,\n })\n }\n : () => {}\n\n const deps = buildStreamImportDeps(dbManager, progressAdapter)\n const result = await streamingImport(filePath, deps, formatOptions, sessionId)\n if (!result.success || !result.sessionId) return result\n\n try {\n dbManager.raiseCurrentChatDbCompatibilityGate()\n } catch (error) {\n deleteSessionDatabase(dbManager, result.sessionId)\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n diagnostics: result.diagnostics,\n }\n }\n\n return result\n}\n\n// ==================== Incremental import ====================\n\nfunction buildIncrementalDeps(\n dbManager: DatabaseManager,\n onProgress?: ImportProgressCallback,\n onCompatibilityError?: (error: DataDirCompatibilityError) => void\n): IncrementalImportDeps {\n return {\n openDatabase(sessionId: string, readonly?: boolean) {\n try {\n return dbManager.openRawSessionDatabase(sessionId, { readonly: readonly ?? false })\n } catch (error) {\n if (error instanceof DataDirCompatibilityError) onCompatibilityError?.(error)\n throw error\n }\n },\n onProgress: onProgress ?? (() => {}),\n }\n}\n\nexport async function incrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n options?: ImportOptions & { onProgress?: ImportProgressCallback }\n): Promise<IncrementalImportResult> {\n const { onProgress, ...importOpts } = options || {}\n let compatibilityError: DataDirCompatibilityError | null = null\n const result = await sharedIncrementalImport(\n sessionId,\n filePath,\n buildIncrementalDeps(dbManager, onProgress, (error) => {\n compatibilityError = error\n }),\n importOpts\n )\n if (compatibilityError) throw compatibilityError\n if (!result.success) return result\n\n try {\n dbManager.raiseCurrentChatDbCompatibilityGate()\n } catch (error) {\n return {\n ...result,\n success: false,\n newMessageCount: 0,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n\n return result\n}\n\nexport async function analyzeIncrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n onProgress?: ImportProgressCallback\n): Promise<IncrementalAnalyzeResult> {\n let compatibilityError: DataDirCompatibilityError | null = null\n const result = await sharedAnalyzeIncremental(\n sessionId,\n filePath,\n buildIncrementalDeps(dbManager, onProgress, (error) => {\n compatibilityError = error\n })\n )\n if (compatibilityError) throw compatibilityError\n return result\n}\n\nexport async function analyzeNewImport(\n filePath: string,\n onProgress?: ImportProgressCallback\n): Promise<AnalyzeNewImportResult> {\n return sharedAnalyzeNewImport(filePath, onProgress ?? (() => {}))\n}\n\n// ==================== Re-exports from parser ====================\n\nexport {\n parserDetectFormat as detectFormat,\n detectAllFormats,\n getFormatFeatureById,\n parserGetSupportedFormats as getSupportedFormats,\n parserScanMultiChatFile as scanMultiChatFile,\n findEntryFileInDirectory,\n}\nexport type { FormatFeature, MultiChatInfo, ParseProgress }\nexport type {\n StreamImportResult,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n AnalyzeNewImportResult,\n ImportOptions,\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAqCA,YAAY,YAAY;AAsBxB,SAAS,oBAA4B;AACnC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,OAAc,mBAAY,CAAC,EAAE,SAAS,KAAK;AACjD,SAAO,QAAQ,EAAE,IAAI,IAAI;AAC3B;AAEA,SAAS,sBAAsB,WAA4B,YAAuD;AAChH,SAAO;AAAA,IACL,aAAa,WAAmB;AAC9B,aAAO,UAAU,uBAAuB,WAAW,EAAE,QAAQ,MAAM,sBAAsB,KAAK,CAAC;AAAA,IACjG;AAAA,IACA,eAAe,WAAmB;AAChC,gBAAU,2BAA2B,SAAS;AAAA,IAChD;AAAA,IACA,YAAY,eAAe,MAAM;AAAA,IAAC;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,WAA4B,WAAyB;AAClF,YAAU,2BAA2B,SAAS;AAChD;AAMA,eAAsB,aACpB,WACA,UACA,SAC6B;AAC7B,QAAM,EAAE,UAAU,WAAW,YAAY,UAAU,IAAI,WAAW,CAAC;AAEnE,QAAM,gBAAyC,CAAC;AAChD,MAAI,SAAU,eAAc,WAAW;AACvC,MAAI,cAAc,OAAW,eAAc,YAAY;AAEvD,QAAM,kBAA0C,aAC5C,CAAC,aAAa;AACZ,QAAI,QAAuC;AAC3C,QAAI,MAAM;AACV,YAAQ,SAAS,OAAO;AAAA,MACtB,KAAK;AACH,gBAAQ;AACR,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR,cAAM,KAAK,IAAI,KAAK,MAAM,SAAS,aAAa,GAAG,GAAG,EAAE;AACxD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR,cAAM;AACN;AAAA,IACJ;AACA,eAAW;AAAA,MACT;AAAA,MACA,UAAU;AAAA,MACV,SAAS,SAAS,WAAW;AAAA,MAC7B,WAAW,SAAS;AAAA,MACpB,YAAY,SAAS;AAAA,MACrB,mBAAmB,SAAS;AAAA,IAC9B,CAAC;AAAA,EACH,IACA,MAAM;AAAA,EAAC;AAEX,QAAM,OAAO,sBAAsB,WAAW,eAAe;AAC7D,QAAM,SAAS,MAAM,gBAAgB,UAAU,MAAM,eAAe,SAAS;AAC7E,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,UAAW,QAAO;AAEjD,MAAI;AACF,cAAU,oCAAoC;AAAA,EAChD,SAAS,OAAO;AACd,0BAAsB,WAAW,OAAO,SAAS;AACjD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,aAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAIA,SAAS,qBACP,WACA,YACA,sBACuB;AACvB,SAAO;AAAA,IACL,aAAa,WAAmB,UAAoB;AAClD,UAAI;AACF,eAAO,UAAU,uBAAuB,WAAW,EAAE,UAAU,YAAY,MAAM,CAAC;AAAA,MACpF,SAAS,OAAO;AACd,YAAI,iBAAiB,0BAA2B,wBAAuB,KAAK;AAC5E,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,YAAY,eAAe,MAAM;AAAA,IAAC;AAAA,EACpC;AACF;AAEA,eAAsBA,mBACpB,WACA,WACA,UACA,SACkC;AAClC,QAAM,EAAE,YAAY,GAAG,WAAW,IAAI,WAAW,CAAC;AAClD,MAAI,qBAAuD;AAC3D,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,qBAAqB,WAAW,YAAY,CAAC,UAAU;AACrD,2BAAqB;AAAA,IACvB,CAAC;AAAA,IACD;AAAA,EACF;AACA,MAAI,mBAAoB,OAAM;AAC9B,MAAI,CAAC,OAAO,QAAS,QAAO;AAE5B,MAAI;AACF,cAAU,oCAAoC;AAAA,EAChD,SAAS,OAAO;AACd,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsBC,0BACpB,WACA,WACA,UACA,YACmC;AACnC,MAAI,qBAAuD;AAC3D,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,qBAAqB,WAAW,YAAY,CAAC,UAAU;AACrD,2BAAqB;AAAA,IACvB,CAAC;AAAA,EACH;AACA,MAAI,mBAAoB,OAAM;AAC9B,SAAO;AACT;AAEA,eAAsBC,kBACpB,UACA,YACiC;AACjC,SAAO,iBAAuB,UAAU,eAAe,MAAM;AAAA,EAAC,EAAE;AAClE;","names":["incrementalImport","analyzeIncrementalImport","analyzeNewImport"]}
|
|
@@ -4,30 +4,30 @@ import { fileURLToPath as __fileURLToPath } from 'url';
|
|
|
4
4
|
const require = __createRequire(import.meta.url);
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __pathDirname(__filename);
|
|
7
|
+
import {
|
|
8
|
+
analyzeIncrementalImport,
|
|
9
|
+
analyzeNewImport,
|
|
10
|
+
incrementalImport,
|
|
11
|
+
streamImport
|
|
12
|
+
} from "./chunk-I35WHWA6.mjs";
|
|
7
13
|
import {
|
|
8
14
|
closeServerAiLogger,
|
|
9
15
|
createCliRunAgentStream,
|
|
10
16
|
initServerAiLogger
|
|
11
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-SKUG5XVD.mjs";
|
|
12
18
|
import {
|
|
13
19
|
AGENT_TOOL_REGISTRY,
|
|
14
20
|
CoreDataProvider
|
|
15
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-CIB23U32.mjs";
|
|
16
22
|
import {
|
|
17
23
|
assertCliDataDirCompatible
|
|
18
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-6FPEP2ZX.mjs";
|
|
19
25
|
import {
|
|
20
26
|
getVersion
|
|
21
27
|
} from "./chunk-5ADKYYNA.mjs";
|
|
22
28
|
import {
|
|
23
29
|
resolveCliPath
|
|
24
30
|
} from "./chunk-FJ35V3TE.mjs";
|
|
25
|
-
import {
|
|
26
|
-
analyzeIncrementalImport,
|
|
27
|
-
analyzeNewImport,
|
|
28
|
-
incrementalImport,
|
|
29
|
-
streamImport
|
|
30
|
-
} from "./chunk-T7IETWHN.mjs";
|
|
31
31
|
import {
|
|
32
32
|
AnalyticsService,
|
|
33
33
|
NodePathProvider,
|
|
@@ -38,59 +38,80 @@ import {
|
|
|
38
38
|
createJiebaNlpProvider,
|
|
39
39
|
createNodeDataDirSwitch,
|
|
40
40
|
createSemanticIndexWorkerRuntimeClient,
|
|
41
|
-
getDbFileVersion,
|
|
42
41
|
getDefaultNodeUserDataDir,
|
|
43
|
-
getOrComputeAnalysisCache,
|
|
44
42
|
getPendingNodeDataDirMigration,
|
|
45
43
|
hasPendingElectronDataWarning,
|
|
46
44
|
serializeChatLabToJsonl
|
|
47
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-7RW4CQAO.mjs";
|
|
48
46
|
import {
|
|
49
47
|
AIChatManager,
|
|
50
|
-
ALL_MIGRATIONS,
|
|
51
48
|
ArchiveImportError,
|
|
52
49
|
ArchiveImportSourceManager,
|
|
53
50
|
AssistantManager,
|
|
54
|
-
BUILTIN_MODELS,
|
|
55
|
-
BUILTIN_PROVIDERS,
|
|
56
|
-
BUILTIN_TOOL_CATALOG,
|
|
57
51
|
CustomModelStore,
|
|
58
52
|
CustomProviderStore,
|
|
59
|
-
DataDirCompatibilityError,
|
|
60
|
-
DatabaseManager,
|
|
61
53
|
LLMConfigStore,
|
|
62
54
|
MergeSessionCache,
|
|
63
|
-
MigrationRunner,
|
|
64
|
-
POS_TAG_DEFINITIONS,
|
|
65
55
|
SEMANTIC_INDEX_CONFIG_FILE,
|
|
66
56
|
SemanticIndexConfigStore,
|
|
67
57
|
SkillManagerCore,
|
|
68
58
|
TempDbWriter,
|
|
69
|
-
appLogger,
|
|
70
59
|
buildPiModel,
|
|
71
60
|
computeWordFrequency,
|
|
72
61
|
countMessagesTokens,
|
|
73
|
-
|
|
74
|
-
|
|
62
|
+
createContactsService,
|
|
63
|
+
createPeopleRelationshipsService,
|
|
75
64
|
deleteDict,
|
|
76
65
|
detectAllFormats,
|
|
77
66
|
detectFormat,
|
|
78
67
|
downloadDict,
|
|
79
68
|
ensureDefaultDict,
|
|
80
|
-
executeReadonlySql,
|
|
81
|
-
executeSql,
|
|
82
69
|
exportSessionToJson,
|
|
83
70
|
export_service_exports,
|
|
84
71
|
fetchRemoteModels,
|
|
85
72
|
findEntryFileInDirectory,
|
|
73
|
+
getDefaultRulesForLocale,
|
|
74
|
+
getDictList,
|
|
75
|
+
getSupportedFormats,
|
|
76
|
+
isDictDownloaded,
|
|
77
|
+
isSemanticIndexConfigured,
|
|
78
|
+
member_service_exports,
|
|
79
|
+
mergeRulesForLocale,
|
|
80
|
+
owner_profile_service_exports,
|
|
81
|
+
persistSemanticIndexConfig,
|
|
82
|
+
pushImport,
|
|
83
|
+
resolveSemanticIndexApiKeySet,
|
|
84
|
+
runSimpleLlmStream,
|
|
85
|
+
scanMultiChatFile,
|
|
86
|
+
segmentText,
|
|
87
|
+
session_index_service_exports,
|
|
88
|
+
session_service_exports,
|
|
89
|
+
streamParseFileInfo,
|
|
90
|
+
summary_service_exports,
|
|
91
|
+
validateApiKey
|
|
92
|
+
} from "./chunk-QQK7MLCR.mjs";
|
|
93
|
+
import {
|
|
94
|
+
ALL_MIGRATIONS,
|
|
95
|
+
BUILTIN_MODELS,
|
|
96
|
+
BUILTIN_PROVIDERS,
|
|
97
|
+
BUILTIN_TOOL_CATALOG,
|
|
98
|
+
CONTACTS_TIME_RANGE_PRESETS,
|
|
99
|
+
DataDirCompatibilityError,
|
|
100
|
+
DatabaseManager,
|
|
101
|
+
MigrationRunner,
|
|
102
|
+
POS_TAG_DEFINITIONS,
|
|
103
|
+
appLogger,
|
|
104
|
+
createDatabaseManagerAdapter,
|
|
105
|
+
deleteAuthProfile,
|
|
106
|
+
executeReadonlySql,
|
|
107
|
+
executeSql,
|
|
86
108
|
getAvailableYears,
|
|
87
109
|
getBuiltinModelsByProvider,
|
|
88
110
|
getCatchphraseAnalysis,
|
|
89
111
|
getCheckInAnalysis,
|
|
90
112
|
getClusterGraph,
|
|
91
113
|
getDailyActivity,
|
|
92
|
-
|
|
93
|
-
getDictList,
|
|
114
|
+
getDbFileVersion,
|
|
94
115
|
getDivingAnalysis,
|
|
95
116
|
getDragonKingAnalysis,
|
|
96
117
|
getHourlyActivity,
|
|
@@ -109,13 +130,13 @@ import {
|
|
|
109
130
|
getMessageTypeStats,
|
|
110
131
|
getMonthlyActivity,
|
|
111
132
|
getNightOwlAnalysis,
|
|
133
|
+
getOrComputeAnalysisCache,
|
|
112
134
|
getRelationshipStats,
|
|
113
135
|
getRepeatAnalysis,
|
|
114
136
|
getSchemaDetailed,
|
|
115
137
|
getSessionInfo,
|
|
116
138
|
getSessionMeta,
|
|
117
139
|
getSessionOverview,
|
|
118
|
-
getSupportedFormats,
|
|
119
140
|
getTextLengthPercentiles,
|
|
120
141
|
getTextStats,
|
|
121
142
|
getTimeRange,
|
|
@@ -123,31 +144,15 @@ import {
|
|
|
123
144
|
getYearlyActivity,
|
|
124
145
|
initAppLogger,
|
|
125
146
|
initNlpDir,
|
|
126
|
-
isDictDownloaded,
|
|
127
147
|
isNewerStableVersion,
|
|
128
|
-
isSemanticIndexConfigured,
|
|
129
148
|
loadConfig,
|
|
130
|
-
member_service_exports,
|
|
131
|
-
mergeRulesForLocale,
|
|
132
|
-
owner_profile_service_exports,
|
|
133
|
-
persistSemanticIndexConfig,
|
|
134
|
-
pushImport,
|
|
135
149
|
queryMessages,
|
|
136
150
|
resolveApiKey,
|
|
137
|
-
resolveSemanticIndexApiKeySet,
|
|
138
|
-
runSimpleLlmStream,
|
|
139
|
-
scanMultiChatFile,
|
|
140
|
-
segmentText,
|
|
141
|
-
session_index_service_exports,
|
|
142
|
-
session_service_exports,
|
|
143
|
-
streamParseFileInfo,
|
|
144
151
|
stripAvatarFields,
|
|
145
|
-
summary_service_exports,
|
|
146
|
-
validateApiKey,
|
|
147
152
|
verifyCliDataPath,
|
|
148
153
|
writeAuthProfile,
|
|
149
154
|
writeConfigField
|
|
150
|
-
} from "./chunk-
|
|
155
|
+
} from "./chunk-WPI6YSAR.mjs";
|
|
151
156
|
|
|
152
157
|
// src/http/index.ts
|
|
153
158
|
import * as fs11 from "fs";
|
|
@@ -626,6 +631,121 @@ function registerMemberRoutes(server2, ctx) {
|
|
|
626
631
|
);
|
|
627
632
|
}
|
|
628
633
|
|
|
634
|
+
// ../../packages/http-routes/src/routes/web/contacts.ts
|
|
635
|
+
function registerContactsRoutes(server2, ctx) {
|
|
636
|
+
const service = ctx.contactsService ?? createContactsService({
|
|
637
|
+
adapter: ctx.sessionAdapter,
|
|
638
|
+
pathProvider: ctx.pathProvider,
|
|
639
|
+
runtimeIdentity: ctx.runtimeIdentity,
|
|
640
|
+
nativeBinding: ctx.nativeBinding
|
|
641
|
+
});
|
|
642
|
+
server2.addHook("onClose", async () => {
|
|
643
|
+
await service.close();
|
|
644
|
+
});
|
|
645
|
+
server2.get("/_web/contacts", async (request) => {
|
|
646
|
+
return service.getContactsPage({
|
|
647
|
+
acceptStale: isTruthy(request.query.acceptStale),
|
|
648
|
+
timeRangePreset: parseContactsTimeRangePreset(request.query.timeRange),
|
|
649
|
+
pool: parseContactPool(request.query.pool),
|
|
650
|
+
page: parsePositiveInteger(request.query.page),
|
|
651
|
+
pageSize: parsePositiveInteger(request.query.pageSize),
|
|
652
|
+
query: request.query.q
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
server2.post("/_web/contacts/recompute", async (request) => {
|
|
656
|
+
return service.startRecompute({
|
|
657
|
+
timeRangePreset: parseContactsTimeRangePreset(request.query.timeRange),
|
|
658
|
+
pool: parseContactPool(request.query.pool),
|
|
659
|
+
page: parsePositiveInteger(request.query.page),
|
|
660
|
+
pageSize: parsePositiveInteger(request.query.pageSize),
|
|
661
|
+
query: request.query.q
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
server2.get("/_web/contacts/:key/detail", async (request) => {
|
|
665
|
+
return service.getContactDetail(request.params.key, {
|
|
666
|
+
acceptStale: isTruthy(request.query.acceptStale),
|
|
667
|
+
timeRangePreset: parseContactsTimeRangePreset(request.query.timeRange)
|
|
668
|
+
});
|
|
669
|
+
});
|
|
670
|
+
server2.put(
|
|
671
|
+
"/_web/contacts/:key/mark-friend",
|
|
672
|
+
async (request) => {
|
|
673
|
+
return service.markContactAsFriend(request.params.key, {
|
|
674
|
+
timeRangePreset: parseContactsTimeRangePreset(request.query.timeRange)
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
);
|
|
678
|
+
server2.delete(
|
|
679
|
+
"/_web/contacts/:key/mark-friend",
|
|
680
|
+
async (request) => {
|
|
681
|
+
return service.unmarkContactAsFriend(request.params.key, {
|
|
682
|
+
timeRangePreset: parseContactsTimeRangePreset(request.query.timeRange)
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
);
|
|
686
|
+
}
|
|
687
|
+
function isTruthy(value) {
|
|
688
|
+
return value === "1" || value === "true" || value === "yes";
|
|
689
|
+
}
|
|
690
|
+
function parseContactsTimeRangePreset(value) {
|
|
691
|
+
return CONTACTS_TIME_RANGE_PRESETS.includes(value) ? value : "1y";
|
|
692
|
+
}
|
|
693
|
+
function parseContactPool(value) {
|
|
694
|
+
return value === "friend" || value === "non_friend" ? value : void 0;
|
|
695
|
+
}
|
|
696
|
+
function parsePositiveInteger(value) {
|
|
697
|
+
if (!value) return void 0;
|
|
698
|
+
const parsed = Number(value);
|
|
699
|
+
if (!Number.isFinite(parsed)) return void 0;
|
|
700
|
+
return Math.max(1, Math.trunc(parsed));
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// ../../packages/http-routes/src/routes/web/people-relationships.ts
|
|
704
|
+
function registerPeopleRelationshipsRoutes(server2, ctx) {
|
|
705
|
+
const service = ctx.peopleRelationshipsService ?? createPeopleRelationshipsService({
|
|
706
|
+
adapter: ctx.sessionAdapter,
|
|
707
|
+
pathProvider: ctx.pathProvider,
|
|
708
|
+
runtimeIdentity: ctx.runtimeIdentity,
|
|
709
|
+
nativeBinding: ctx.nativeBinding
|
|
710
|
+
});
|
|
711
|
+
server2.addHook("onClose", async () => {
|
|
712
|
+
await service.close();
|
|
713
|
+
});
|
|
714
|
+
server2.get("/_web/people/relationships", async (request) => {
|
|
715
|
+
return service.getGraph({
|
|
716
|
+
acceptStale: isTruthy2(request.query.acceptStale),
|
|
717
|
+
timeRangePreset: parseContactsTimeRangePreset2(request.query.timeRange),
|
|
718
|
+
graphScope: parsePeopleRelationshipsGraphScope(request.query.scope),
|
|
719
|
+
query: request.query.q
|
|
720
|
+
});
|
|
721
|
+
});
|
|
722
|
+
server2.post("/_web/people/relationships/recompute", async (request) => {
|
|
723
|
+
return service.startRecompute({
|
|
724
|
+
timeRangePreset: parseContactsTimeRangePreset2(request.query.timeRange),
|
|
725
|
+
graphScope: parsePeopleRelationshipsGraphScope(request.query.scope),
|
|
726
|
+
query: request.query.q
|
|
727
|
+
});
|
|
728
|
+
});
|
|
729
|
+
server2.get(
|
|
730
|
+
"/_web/people/relationships/:key/neighborhood",
|
|
731
|
+
async (request) => {
|
|
732
|
+
return service.getNeighborhood(request.params.key, {
|
|
733
|
+
acceptStale: isTruthy2(request.query.acceptStale),
|
|
734
|
+
timeRangePreset: parseContactsTimeRangePreset2(request.query.timeRange)
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
);
|
|
738
|
+
}
|
|
739
|
+
function isTruthy2(value) {
|
|
740
|
+
return value === "1" || value === "true" || value === "yes";
|
|
741
|
+
}
|
|
742
|
+
function parseContactsTimeRangePreset2(value) {
|
|
743
|
+
return CONTACTS_TIME_RANGE_PRESETS.includes(value) ? value : "1y";
|
|
744
|
+
}
|
|
745
|
+
function parsePeopleRelationshipsGraphScope(value) {
|
|
746
|
+
return value === "close" || value === "friends" ? value : "panorama";
|
|
747
|
+
}
|
|
748
|
+
|
|
629
749
|
// ../../packages/http-routes/src/routes/web/preferences.ts
|
|
630
750
|
function registerPreferencesRoutes(server2, ctx) {
|
|
631
751
|
const prefManager = ctx.preferencesManager ?? new PreferencesManager(ctx.pathProvider.getSystemDir());
|
|
@@ -2234,6 +2354,8 @@ function registerSharedRoutes(server2, ctx, options) {
|
|
|
2234
2354
|
registerImportRoutes(server2, resolvedCtx);
|
|
2235
2355
|
registerSessionRoutes(server2, resolvedCtx);
|
|
2236
2356
|
registerMemberRoutes(server2, resolvedCtx);
|
|
2357
|
+
registerContactsRoutes(server2, resolvedCtx);
|
|
2358
|
+
registerPeopleRelationshipsRoutes(server2, resolvedCtx);
|
|
2237
2359
|
registerPreferencesRoutes(server2, resolvedCtx);
|
|
2238
2360
|
registerAnalyticsRoutes(server2, resolvedCtx);
|
|
2239
2361
|
registerSqlRoutes(server2, resolvedCtx);
|
|
@@ -2830,7 +2952,7 @@ function registerWebRoutes(server2, dbManager2, options) {
|
|
|
2830
2952
|
const resolvedPathProvider = options?.pathProvider ?? fallbackPathProvider;
|
|
2831
2953
|
const ai = options?.aiContext;
|
|
2832
2954
|
const cliStreamImport = async (dm, filePath) => {
|
|
2833
|
-
const { streamImport: streamImport2 } = await import("./stream-import-
|
|
2955
|
+
const { streamImport: streamImport2 } = await import("./stream-import-7HZ4IRYJ.mjs");
|
|
2834
2956
|
const result = await streamImport2(dm, filePath);
|
|
2835
2957
|
if (!result.sessionId) throw new Error("Import succeeded but no sessionId returned");
|
|
2836
2958
|
return { sessionId: result.sessionId };
|
|
@@ -2845,6 +2967,7 @@ function registerWebRoutes(server2, dbManager2, options) {
|
|
|
2845
2967
|
dbManager: dbManager2,
|
|
2846
2968
|
sessionAdapter: adapter,
|
|
2847
2969
|
pathProvider: resolvedPathProvider,
|
|
2970
|
+
runtimeIdentity: options?.runtimeIdentity,
|
|
2848
2971
|
getVersion,
|
|
2849
2972
|
nativeBinding: options?.nativeBinding,
|
|
2850
2973
|
semanticIndexService,
|
|
@@ -4035,6 +4158,7 @@ async function startHttpServer(options) {
|
|
|
4035
4158
|
registerWebRoutes(server, dbManager, {
|
|
4036
4159
|
pathProvider,
|
|
4037
4160
|
nativeBinding,
|
|
4161
|
+
runtimeIdentity: runtime,
|
|
4038
4162
|
semanticIndexService,
|
|
4039
4163
|
aiContext: {
|
|
4040
4164
|
aiDataDir,
|
|
@@ -4089,4 +4213,4 @@ export {
|
|
|
4089
4213
|
startHttpServer,
|
|
4090
4214
|
stopHttpServer
|
|
4091
4215
|
};
|
|
4092
|
-
//# sourceMappingURL=chunk-
|
|
4216
|
+
//# sourceMappingURL=chunk-KL2NGIMQ.mjs.map
|