chatlab-cli 0.30.2 → 0.31.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.
Files changed (136) hide show
  1. package/dist/{chat-command-VBDMWOKL.mjs → chat-command-CHV7RLBH.mjs} +9 -8
  2. package/dist/{chat-command-VBDMWOKL.mjs.map → chat-command-CHV7RLBH.mjs.map} +1 -1
  3. package/dist/{chunk-326OCJOT.mjs → chunk-DA5T64RY.mjs} +2 -2
  4. package/dist/{chunk-M2PXDX4G.mjs → chunk-DBBL74RK.mjs} +31 -22
  5. package/dist/chunk-DBBL74RK.mjs.map +1 -0
  6. package/dist/{chunk-KBSAVUFV.mjs → chunk-EXD2SXWL.mjs} +89 -15
  7. package/dist/chunk-EXD2SXWL.mjs.map +1 -0
  8. package/dist/{chunk-D3DPCDII.mjs → chunk-JH5RAJT2.mjs} +83 -34
  9. package/dist/chunk-JH5RAJT2.mjs.map +1 -0
  10. package/dist/{chunk-5EE2EFPE.mjs → chunk-RD335EMA.mjs} +4 -4
  11. package/dist/{chunk-WV5GSRQM.mjs → chunk-RDCUGC24.mjs} +5 -15
  12. package/dist/chunk-RDCUGC24.mjs.map +1 -0
  13. package/dist/{chunk-TEX44HNL.mjs → chunk-SNCXU2QL.mjs} +5 -15
  14. package/dist/chunk-SNCXU2QL.mjs.map +1 -0
  15. package/dist/{chunk-36JGKW6K.mjs → chunk-T64GA5HP.mjs} +1134 -364
  16. package/dist/chunk-T64GA5HP.mjs.map +1 -0
  17. package/dist/{chunk-LVEJHB3X.mjs → chunk-UWWFOEGF.mjs} +494 -97
  18. package/dist/chunk-UWWFOEGF.mjs.map +1 -0
  19. package/dist/{chunk-ULNRUS55.mjs → chunk-WQCY45U2.mjs} +3 -3
  20. package/dist/chunk-YAQLYL52.mjs +14 -0
  21. package/dist/chunk-YAQLYL52.mjs.map +1 -0
  22. package/dist/{chunk-TCZHG3G7.mjs → chunk-YPQ72HMX.mjs} +2 -2
  23. package/dist/cli.mjs +8 -7
  24. package/dist/contacts-worker.mjs +2 -2
  25. package/dist/global-insight-worker.mjs +179 -0
  26. package/dist/global-insight-worker.mjs.map +1 -0
  27. package/dist/{http-L4AMELPZ.mjs → http-3B5ARN7A.mjs} +12 -11
  28. package/dist/{import-WWCSXGVS.mjs → import-2DZGNSEX.mjs} +10 -7
  29. package/dist/index.mjs +12 -11
  30. package/dist/{mcp-A4M3LT5O.mjs → mcp-44I6FUUQ.mjs} +12 -11
  31. package/dist/{mcp-A4M3LT5O.mjs.map → mcp-44I6FUUQ.mjs.map} +1 -1
  32. package/dist/people-relationships-worker.mjs +2 -2
  33. package/dist/semantic-index-worker.mjs +1 -1
  34. package/dist/{src-MPNBTFOE.mjs → src-R3QX6L3L.mjs} +26 -6
  35. package/dist/{stream-import-HIE7PNL4.mjs → stream-import-VUEL2TTU.mjs} +10 -7
  36. package/dist/{worker-runtime-BJXO24XX.mjs → worker-runtime-GJAOIIZW.mjs} +6 -5
  37. package/dist/{worker-runtime-BJXO24XX.mjs.map → worker-runtime-GJAOIIZW.mjs.map} +1 -1
  38. package/dist-web/assets/ActionToolsPanel-fAio70bI.css +1 -0
  39. package/dist-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-CdJT0t2f.js +110 -0
  40. package/dist-web/assets/{BufferResource-q3rzaWWd.js → BufferResource-BPGkshPa.js} +1 -1
  41. package/dist-web/assets/{CanvasRenderer-BRk1y8tp.js → CanvasRenderer-DTKkZhq4.js} +1 -1
  42. package/dist-web/assets/{EChartWordcloud-Clg60FMo.js → EChartWordcloud-DU3ZYdgz.js} +1 -1
  43. package/dist-web/assets/{Filter-BJwode73.js → Filter-CHXKzS2l.js} +1 -1
  44. package/dist-web/assets/{LoadingState.vue_vue_type_script_setup_true_lang-D_dJuLWJ.js → LoadingState.vue_vue_type_script_setup_true_lang-DACMroOe.js} +1 -1
  45. package/dist-web/assets/MessageExportModal-h-zl0dx1.js +1 -0
  46. package/dist-web/assets/PageHeader-CK0hTsdx.js +1 -0
  47. package/dist-web/assets/PageHeader-XIXMTomn.css +1 -0
  48. package/dist-web/assets/{RelationshipGalaxyCanvas-CORMD7vL.js → RelationshipGalaxyCanvas-Dwdy5flh.js} +3 -3
  49. package/dist-web/assets/{RelationshipGalaxyThreeCanvas-B_w_P4ob.js → RelationshipGalaxyThreeCanvas-CtY4TGen.js} +1 -1
  50. package/dist-web/assets/{RenderTargetSystem-CGhV9R9E.js → RenderTargetSystem-BE56mKRG.js} +1 -1
  51. package/dist-web/assets/ThemeCard.vue_vue_type_script_setup_true_lang-BoZyssJF.js +1 -0
  52. package/dist-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-27hMyAUE.js +1 -0
  53. package/dist-web/assets/{WebGLRenderer-CAokTE5X.js → WebGLRenderer-Dm18dxOf.js} +1 -1
  54. package/dist-web/assets/{WebGPURenderer-DzP4ggSy.js → WebGPURenderer-BF6TF-is.js} +1 -1
  55. package/dist-web/assets/annual-summary-time-range-DVLXK1r4.js +1 -0
  56. package/dist-web/assets/base-CFPyD9Gy.js +1 -0
  57. package/dist-web/assets/{browserAll-CAZCK6dd.js → browserAll-Cn_CfkXl.js} +1 -1
  58. package/dist-web/assets/dateFormat-BcqNKTQ1.js +1 -0
  59. package/dist-web/assets/{electron-CkPDbAaS.js → electron-B6xOabTq.js} +1 -1
  60. package/dist-web/assets/electron-hcWiB7Gg.js +1 -0
  61. package/dist-web/assets/fetch-BPkgnY0R.js +1 -0
  62. package/dist-web/assets/{fetch-LX9jrJCC.js → fetch-BRXmDI_2.js} +1 -1
  63. package/dist-web/assets/{fetch-Apd5OLJw.js → fetch-BUm1isWe.js} +1 -1
  64. package/dist-web/assets/{fetch-B8rik0TM.js → fetch-CBOJwwJp.js} +3 -3
  65. package/dist-web/assets/{fetch-wqMSiaK3.js → fetch-CEhUu1Yu.js} +1 -1
  66. package/dist-web/assets/fetch-C_EfVFJi.js +3 -0
  67. package/dist-web/assets/{fetch-DQ9UNNAy.js → fetch-DL_u25Ui.js} +1 -1
  68. package/dist-web/assets/{fetch-BIEXkvDq.js → fetch-DMLq3xPG.js} +1 -1
  69. package/dist-web/assets/{fetch--UbRoBT7.js → fetch-DylpNKCR.js} +1 -1
  70. package/dist-web/assets/fetch-etgwVKIw.js +1 -0
  71. package/dist-web/assets/index-0x1QPzKZ.js +1 -0
  72. package/dist-web/assets/index-B5S9FnfP.js +1 -0
  73. package/dist-web/assets/index-BS6loLHW.js +1 -0
  74. package/dist-web/assets/index-BfO_LpDv.css +1 -0
  75. package/dist-web/assets/index-BrTlAl8b.js +1 -0
  76. package/dist-web/assets/index-ByUaiVQK.css +1 -0
  77. package/dist-web/assets/{index-S-YQRH1E.js → index-C3TnydSt.js} +1 -1
  78. package/dist-web/assets/index-CAWO10k1.js +2 -0
  79. package/dist-web/assets/index-C_0GHEcb.css +1 -0
  80. package/dist-web/assets/index-Chm17wNe.js +2 -0
  81. package/dist-web/assets/index-DAr_2DlV.js +173 -0
  82. package/dist-web/assets/index-Em6upenM.js +64 -0
  83. package/dist-web/assets/index-FoTy2Cce.js +1 -0
  84. package/dist-web/assets/index-YADL4XIp.js +22 -0
  85. package/dist-web/assets/index-ZsZwPLWy.css +1 -0
  86. package/dist-web/assets/index-_6lck7Bv.css +1 -0
  87. package/dist-web/assets/index-aMIgqj43.js +1 -0
  88. package/dist-web/assets/index-y7cxH1Et.css +1 -0
  89. package/dist-web/assets/index-zZVsV5HB.js +1 -0
  90. package/dist-web/assets/{people-page-header-Mupn-U_b.js → people-page-header-BdKM1qhX.js} +1 -1
  91. package/dist-web/assets/types-CZnACqaB.js +1 -0
  92. package/dist-web/assets/{vendor-echarts-hJVnODyU.js → vendor-echarts-B-i_56Av.js} +1 -1
  93. package/dist-web/assets/{vendor-echarts-wordcloud-k5ih2Jl4.js → vendor-echarts-wordcloud-Ca8n6qS6.js} +1 -1
  94. package/dist-web/assets/{vendor-nuxt-ui-DaLxYaC4.js → vendor-nuxt-ui-CS1uxE9C.js} +2 -2
  95. package/dist-web/assets/{vendor-reka-ui-CzM4kDQ7.js → vendor-reka-ui-Cta6JPvN.js} +1 -1
  96. package/dist-web/assets/{web-DbKs6-1b.js → web-BUZ-dZy0.js} +1 -1
  97. package/dist-web/assets/{webworkerAll-Bhv-hBqR.js → webworkerAll-BKGP--A4.js} +1 -1
  98. package/dist-web/index.html +4 -4
  99. package/package.json +1 -1
  100. package/dist/chunk-36JGKW6K.mjs.map +0 -1
  101. package/dist/chunk-D3DPCDII.mjs.map +0 -1
  102. package/dist/chunk-KBSAVUFV.mjs.map +0 -1
  103. package/dist/chunk-LVEJHB3X.mjs.map +0 -1
  104. package/dist/chunk-M2PXDX4G.mjs.map +0 -1
  105. package/dist/chunk-TEX44HNL.mjs.map +0 -1
  106. package/dist/chunk-WV5GSRQM.mjs.map +0 -1
  107. package/dist-web/assets/DebugToolsPanel-D_lFIW6j.css +0 -1
  108. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-F4n0zNX2.js +0 -110
  109. package/dist-web/assets/MessageExportModal-CGcdMOyw.js +0 -1
  110. package/dist-web/assets/PageHeader-Bbn87QZS.css +0 -1
  111. package/dist-web/assets/PageHeader-CZaqOdBQ.js +0 -1
  112. package/dist-web/assets/electron-D9vE5t3H.js +0 -1
  113. package/dist-web/assets/fetch-1pB-HbYw.js +0 -3
  114. package/dist-web/assets/fetch-CF_3ZqRa.js +0 -1
  115. package/dist-web/assets/fetch-FSNxSnAp.js +0 -1
  116. package/dist-web/assets/index---rXG1hZ.css +0 -1
  117. package/dist-web/assets/index-B01uUoHE.js +0 -1
  118. package/dist-web/assets/index-B4l3rHie.css +0 -1
  119. package/dist-web/assets/index-BSIyyt0z.js +0 -1
  120. package/dist-web/assets/index-Bh8z441f.js +0 -2
  121. package/dist-web/assets/index-C0rya8v4.js +0 -1
  122. package/dist-web/assets/index-C1p9CbmN.css +0 -1
  123. package/dist-web/assets/index-COpza1A4.css +0 -1
  124. package/dist-web/assets/index-CZbZv2fh.js +0 -64
  125. package/dist-web/assets/index-CqUuHQBQ.js +0 -22
  126. package/dist-web/assets/index-CzeTP5MJ.js +0 -173
  127. package/dist-web/assets/index-DgNxTM_8.js +0 -2
  128. package/dist-web/assets/index-DosG7LmJ.css +0 -1
  129. /package/dist/{chunk-326OCJOT.mjs.map → chunk-DA5T64RY.mjs.map} +0 -0
  130. /package/dist/{chunk-5EE2EFPE.mjs.map → chunk-RD335EMA.mjs.map} +0 -0
  131. /package/dist/{chunk-ULNRUS55.mjs.map → chunk-WQCY45U2.mjs.map} +0 -0
  132. /package/dist/{chunk-TCZHG3G7.mjs.map → chunk-YPQ72HMX.mjs.map} +0 -0
  133. /package/dist/{http-L4AMELPZ.mjs.map → http-3B5ARN7A.mjs.map} +0 -0
  134. /package/dist/{import-WWCSXGVS.mjs.map → import-2DZGNSEX.mjs.map} +0 -0
  135. /package/dist/{src-MPNBTFOE.mjs.map → src-R3QX6L3L.mjs.map} +0 -0
  136. /package/dist/{stream-import-HIE7PNL4.mjs.map → stream-import-VUEL2TTU.mjs.map} +0 -0
@@ -0,0 +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 IMPORT_IN_PROGRESS_ERROR_KEY,\n ImportInProgressError,\n autoImportFile as sharedAutoImportFile,\n streamingImport,\n analyzeNewImport as sharedAnalyzeNewImport,\n analyzeIncrementalImport as sharedAnalyzeIncremental,\n incrementalImport as sharedIncrementalImport,\n withDataDirImportLock,\n} from '@openchatlab/node-runtime'\nimport type {\n StreamImportResult,\n StreamImportDeps,\n ImportProgressCallback,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n IncrementalImportDeps,\n ImportOptions,\n AnalyzeNewImportResult,\n AutoImportResult,\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 createProgressAdapter(onProgress?: (progress: StreamImportProgress) => void): ImportProgressCallback {\n if (!onProgress) return () => {}\n return (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 'saving':\n stage = 'saving'\n pct = 80\n break\n case 'indexing':\n stage = 'indexing'\n pct = 90\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\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 */\nasync function streamImportUnlocked(\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 = createProgressAdapter(onProgress)\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\nexport async function streamImport(\n dbManager: DatabaseManager,\n filePath: string,\n options?: StreamImportOptions\n): Promise<StreamImportResult> {\n try {\n return await withDataDirImportLock(dbManager.getUserDataDir(), () =>\n streamImportUnlocked(dbManager, filePath, options)\n )\n } catch (error) {\n if (error instanceof ImportInProgressError) {\n return { success: false, error: IMPORT_IN_PROGRESS_ERROR_KEY }\n }\n throw error\n }\n}\n\nexport async function autoImport(\n dbManager: DatabaseManager,\n filePath: string,\n options?: StreamImportOptions\n): Promise<AutoImportResult> {\n const { formatId, chatIndex, onProgress, sessionId } = options ?? {}\n const formatOptions: Record<string, unknown> = {}\n if (formatId) formatOptions.formatId = formatId\n if (chatIndex !== undefined) formatOptions.chatIndex = chatIndex\n const progressAdapter = createProgressAdapter(onProgress)\n\n try {\n return await withDataDirImportLock(dbManager.getUserDataDir(), () =>\n sharedAutoImportFile(\n filePath,\n {\n listSessionIds: () => dbManager.listSessionIds(),\n openReadonly: (candidateSessionId) =>\n dbManager.openRawSessionDatabase(candidateSessionId, { readonly: true }),\n onProgress: progressAdapter,\n sessionExists: (candidateSessionId) => dbManager.listSessionIds().includes(candidateSessionId),\n createSession: (sourcePath, sourceFormatOptions, explicitSessionId) =>\n streamImportUnlocked(dbManager, sourcePath, {\n ...options,\n ...sourceFormatOptions,\n sessionId: explicitSessionId,\n }),\n appendSession: (targetSessionId, sourcePath, sourceFormatOptions) =>\n incrementalImportUnlocked(dbManager, targetSessionId, sourcePath, {\n ...sourceFormatOptions,\n onProgress: progressAdapter,\n }),\n },\n {\n explicitSessionId: sessionId,\n formatOptions,\n }\n )\n )\n } catch (error) {\n if (error instanceof ImportInProgressError) {\n return { success: false, error: IMPORT_IN_PROGRESS_ERROR_KEY }\n }\n throw error\n }\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\nasync function incrementalImportUnlocked(\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 incrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n options?: ImportOptions & { onProgress?: ImportProgressCallback }\n): Promise<IncrementalImportResult> {\n try {\n return await withDataDirImportLock(dbManager.getUserDataDir(), () =>\n incrementalImportUnlocked(dbManager, sessionId, filePath, options)\n )\n } catch (error) {\n if (error instanceof ImportInProgressError) {\n return { success: false, newMessageCount: 0, error: IMPORT_IN_PROGRESS_ERROR_KEY }\n }\n throw error\n }\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 AutoImportResult,\n}\n"],"mappings":"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","names":["incrementalImport","analyzeIncrementalImport","analyzeNewImport"]}
@@ -7,28 +7,26 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  analyzeIncrementalImport,
9
9
  analyzeNewImport,
10
+ autoImport,
10
11
  incrementalImport,
11
12
  streamImport
12
- } from "./chunk-KBSAVUFV.mjs";
13
+ } from "./chunk-EXD2SXWL.mjs";
13
14
  import {
14
15
  closeServerAiLogger,
15
16
  createCliRunAgentStream,
16
17
  getServerAiLogger,
17
18
  initServerAiLogger
18
- } from "./chunk-5EE2EFPE.mjs";
19
+ } from "./chunk-RD335EMA.mjs";
19
20
  import {
20
21
  AGENT_TOOL_REGISTRY,
21
22
  CoreDataProvider
22
- } from "./chunk-TCZHG3G7.mjs";
23
+ } from "./chunk-YPQ72HMX.mjs";
23
24
  import {
24
25
  assertCliDataDirCompatible
25
- } from "./chunk-326OCJOT.mjs";
26
+ } from "./chunk-DA5T64RY.mjs";
26
27
  import {
27
28
  getVersion
28
29
  } from "./chunk-5ADKYYNA.mjs";
29
- import {
30
- resolveCliPath
31
- } from "./chunk-FJ35V3TE.mjs";
32
30
  import {
33
31
  AnalyticsService,
34
32
  NodePathProvider,
@@ -43,7 +41,7 @@ import {
43
41
  getPendingNodeDataDirMigration,
44
42
  hasPendingElectronDataWarning,
45
43
  serializeChatLabToJsonl
46
- } from "./chunk-ULNRUS55.mjs";
44
+ } from "./chunk-WQCY45U2.mjs";
47
45
  import {
48
46
  AIChatManager,
49
47
  ArchiveImportError,
@@ -51,6 +49,8 @@ import {
51
49
  AssistantManager,
52
50
  CustomModelStore,
53
51
  CustomProviderStore,
52
+ IMPORT_IN_PROGRESS_ERROR_KEY,
53
+ ImportInProgressError,
54
54
  LLMConfigStore,
55
55
  MergeSessionCache,
56
56
  SEMANTIC_INDEX_CONFIG_FILE,
@@ -61,6 +61,7 @@ import {
61
61
  computeWordFrequency,
62
62
  countMessagesTokens,
63
63
  createContactsService,
64
+ createGlobalInsightService,
64
65
  createPeopleRelationshipsService,
65
66
  deleteDict,
66
67
  detectAllFormats,
@@ -91,7 +92,10 @@ import {
91
92
  streamParseFileInfo,
92
93
  summary_service_exports,
93
94
  validateApiKey
94
- } from "./chunk-36JGKW6K.mjs";
95
+ } from "./chunk-T64GA5HP.mjs";
96
+ import {
97
+ resolveCliPath
98
+ } from "./chunk-FJ35V3TE.mjs";
95
99
  import {
96
100
  ALL_MIGRATIONS,
97
101
  BUILTIN_MODELS,
@@ -154,7 +158,7 @@ import {
154
158
  verifyCliDataPath,
155
159
  writeAuthProfile,
156
160
  writeConfigField
157
- } from "./chunk-LVEJHB3X.mjs";
161
+ } from "./chunk-UWWFOEGF.mjs";
158
162
 
159
163
  // src/http/index.ts
160
164
  import * as fs12 from "fs";
@@ -220,6 +224,7 @@ function dataDirIncompatible(message) {
220
224
  }
221
225
  function apiErrorFromUnknown(error) {
222
226
  if (error instanceof ApiError) return error;
227
+ if (error instanceof ImportInProgressError) return importInProgress();
223
228
  if (error instanceof DataDirCompatibilityError) return dataDirIncompatible(error.message);
224
229
  return null;
225
230
  }
@@ -748,6 +753,43 @@ function parsePeopleRelationshipsGraphScope(value) {
748
753
  return value === "close" || value === "friends" ? value : "panorama";
749
754
  }
750
755
 
756
+ // ../../packages/http-routes/src/routes/web/global-insight.ts
757
+ function registerGlobalInsightRoutes(server2, ctx) {
758
+ const service = ctx.globalInsightService ?? createGlobalInsightService({
759
+ adapter: ctx.sessionAdapter,
760
+ pathProvider: ctx.pathProvider,
761
+ runtimeIdentity: ctx.runtimeIdentity,
762
+ nativeBinding: ctx.nativeBinding
763
+ });
764
+ server2.addHook("onClose", async () => service.close());
765
+ server2.get("/_web/global-insight/annual-summary", async (request) => {
766
+ return service.getAnnualSummary({
767
+ ...parseRange(request.query),
768
+ acceptStale: isTruthy3(request.query.acceptStale)
769
+ });
770
+ });
771
+ server2.post(
772
+ "/_web/global-insight/annual-summary/recompute",
773
+ async (request) => service.startRecompute(parseRange(request.query))
774
+ );
775
+ }
776
+ function parseRange(query) {
777
+ const mode = query.mode === "recent" ? "recent" : "year";
778
+ return {
779
+ mode,
780
+ year: parseInteger(query.year),
781
+ days: query.days === "365" ? 365 : void 0
782
+ };
783
+ }
784
+ function parseInteger(value) {
785
+ if (!value) return void 0;
786
+ const parsed = Number(value);
787
+ return Number.isInteger(parsed) ? parsed : void 0;
788
+ }
789
+ function isTruthy3(value) {
790
+ return value === "1" || value === "true" || value === "yes";
791
+ }
792
+
751
793
  // ../../packages/http-routes/src/routes/web/preferences.ts
752
794
  function registerPreferencesRoutes(server2, ctx) {
753
795
  const prefManager = ctx.preferencesManager ?? new PreferencesManager(ctx.pathProvider.getSystemDir());
@@ -2416,6 +2458,7 @@ function registerSharedRoutes(server2, ctx, options) {
2416
2458
  registerMemberRoutes(server2, resolvedCtx);
2417
2459
  registerContactsRoutes(server2, resolvedCtx);
2418
2460
  registerPeopleRelationshipsRoutes(server2, resolvedCtx);
2461
+ registerGlobalInsightRoutes(server2, resolvedCtx);
2419
2462
  registerPreferencesRoutes(server2, resolvedCtx);
2420
2463
  registerAnalyticsRoutes(server2, resolvedCtx);
2421
2464
  registerSqlRoutes(server2, resolvedCtx);
@@ -2710,19 +2753,14 @@ function registerImportRoutes2(server2, dbManager2, options = {}) {
2710
2753
  const sourceManager = options.sourceManager ?? new ArchiveImportSourceManager({
2711
2754
  tempRoot: fs7.mkdtempSync(path8.join(os2.tmpdir(), "chatlab-import-sources-"))
2712
2755
  });
2756
+ const runAutoImport = options.runAutoImport ?? autoImport.bind(null, dbManager2);
2713
2757
  const runPreparedImport = options.runPreparedImport ?? (async (manifestPath, onProgress) => {
2714
- const result = await streamImport(dbManager2, manifestPath, {
2758
+ const result = await runAutoImport(manifestPath, {
2715
2759
  formatId: "google-chat-takeout",
2716
2760
  nativeBinding: resolveNativeBinding(),
2717
2761
  onProgress
2718
2762
  });
2719
- return {
2720
- success: result.success,
2721
- sessionId: result.sessionId,
2722
- error: result.error,
2723
- messageCount: result.diagnostics?.messagesWritten ?? 0,
2724
- memberCount: 0
2725
- };
2763
+ return result;
2726
2764
  });
2727
2765
  server2.addHook("onClose", async () => {
2728
2766
  await sourceManager.close();
@@ -2857,19 +2895,14 @@ data: ${JSON.stringify(eventData)}
2857
2895
  }
2858
2896
  try {
2859
2897
  const nativeBinding = resolveNativeBinding();
2860
- const result = await streamImport(dbManager2, tmpPath, {
2898
+ const result = await runAutoImport(tmpPath, {
2861
2899
  formatId,
2862
2900
  chatIndex,
2863
2901
  nativeBinding,
2864
2902
  onProgress: (p) => sendEvent("progress", p)
2865
2903
  });
2866
2904
  if (result.success) {
2867
- sendEvent("done", {
2868
- success: true,
2869
- sessionId: result.sessionId,
2870
- messageCount: result.diagnostics?.messagesWritten ?? 0,
2871
- memberCount: 0
2872
- });
2905
+ sendEvent("done", result);
2873
2906
  } else {
2874
2907
  sendEvent("error", { success: false, error: result.error });
2875
2908
  }
@@ -2926,17 +2959,12 @@ data: ${JSON.stringify(eventData)}
2926
2959
  Connection: "keep-alive"
2927
2960
  });
2928
2961
  const nativeBinding = resolveNativeBinding();
2929
- const result = await streamImport(dbManager2, entryPath, {
2962
+ const result = await runAutoImport(entryPath, {
2930
2963
  nativeBinding,
2931
2964
  onProgress: (p) => sendEvent2("progress", p)
2932
2965
  });
2933
2966
  if (result.success) {
2934
- sendEvent2("done", {
2935
- success: true,
2936
- sessionId: result.sessionId,
2937
- messageCount: result.diagnostics?.messagesWritten ?? 0,
2938
- memberCount: 0
2939
- });
2967
+ sendEvent2("done", result);
2940
2968
  } else {
2941
2969
  sendEvent2("error", { success: false, error: result.error });
2942
2970
  }
@@ -3157,8 +3185,13 @@ function registerWebRoutes(server2, dbManager2, options) {
3157
3185
  const resolvedPathProvider = options?.pathProvider ?? fallbackPathProvider;
3158
3186
  const ai = options?.aiContext;
3159
3187
  const cliStreamImport = async (dm, filePath) => {
3160
- const { streamImport: streamImport2 } = await import("./stream-import-HIE7PNL4.mjs");
3188
+ const { streamImport: streamImport2 } = await import("./stream-import-VUEL2TTU.mjs");
3161
3189
  const result = await streamImport2(dm, filePath);
3190
+ if (!result.success) {
3191
+ const { IMPORT_IN_PROGRESS_ERROR_KEY: IMPORT_IN_PROGRESS_ERROR_KEY2, ImportInProgressError: ImportInProgressError2 } = await import("./src-R3QX6L3L.mjs");
3192
+ if (result.error === IMPORT_IN_PROGRESS_ERROR_KEY2) throw new ImportInProgressError2();
3193
+ throw new Error(result.error || "Import failed");
3194
+ }
3162
3195
  if (!result.sessionId) throw new Error("Import succeeded but no sessionId returned");
3163
3196
  return { sessionId: result.sessionId };
3164
3197
  };
@@ -3652,6 +3685,12 @@ var PullEngine = class {
3652
3685
  const externalId = deriveLocalSessionId(baseUrl, sess.remoteSessionId);
3653
3686
  return this.importer.importFile(tempFile, targetId || void 0, externalId);
3654
3687
  }
3688
+ deferRetryableImport(sess, error) {
3689
+ const errMsg = error || "Import deferred";
3690
+ this.logger.info(`[Pull] Deferring "${sess.name}": ${errMsg}`);
3691
+ this.markProgressDone(sess.id);
3692
+ return { success: false, newMessageCount: 0, error: errMsg };
3693
+ }
3655
3694
  async executePullSession(sourceId, ds, sess) {
3656
3695
  const currentDs = this.dsManager.get(sourceId);
3657
3696
  if (!currentDs || !currentDs.sessions.some((s) => s.id === sess.id)) {
@@ -3737,6 +3776,7 @@ var PullEngine = class {
3737
3776
  return { success: false, newMessageCount: 0, error: errMsg };
3738
3777
  }
3739
3778
  if (!retryResult.success) {
3779
+ if (retryResult.retryable) return this.deferRetryableImport(sess, retryResult.error);
3740
3780
  const errMsg = retryResult.error || "Import failed";
3741
3781
  this.dsManager.updateSession(sourceId, sess.id, {
3742
3782
  lastPullAt: Math.floor(Date.now() / 1e3),
@@ -3809,6 +3849,7 @@ var PullEngine = class {
3809
3849
  return { success: false, newMessageCount: 0, error: errMsg };
3810
3850
  }
3811
3851
  if (!result.success) {
3852
+ if (result.retryable) return this.deferRetryableImport(sess, result.error);
3812
3853
  const errMsg = result.error || "Import failed";
3813
3854
  this.dsManager.updateSession(sourceId, sess.id, {
3814
3855
  lastPullAt: Math.floor(Date.now() / 1e3),
@@ -4132,6 +4173,10 @@ var DirectImporter = class {
4132
4173
  if (result.error === "error.session_not_found" || result.error?.includes("no such table")) {
4133
4174
  return { success: false, newMessageCount: 0, sessionId, needFullResync: true };
4134
4175
  }
4176
+ if (result.error === IMPORT_IN_PROGRESS_ERROR_KEY) {
4177
+ this.logger.info(`[DirectImporter] Incremental import deferred: another import is in progress`);
4178
+ return { success: false, newMessageCount: 0, sessionId, error: result.error, retryable: true };
4179
+ }
4135
4180
  return { success: false, newMessageCount: 0, sessionId, error: result.error };
4136
4181
  } catch (err) {
4137
4182
  this.logger.error(`[DirectImporter] Incremental import failed`, err);
@@ -4146,6 +4191,10 @@ var DirectImporter = class {
4146
4191
  this.logger.info(`[DirectImporter] Full import OK: +${newMessageCount} messages`);
4147
4192
  return { success: true, newMessageCount, sessionId: result.sessionId ?? externalId };
4148
4193
  }
4194
+ if (result.error === IMPORT_IN_PROGRESS_ERROR_KEY) {
4195
+ this.logger.info(`[DirectImporter] Full import deferred: another import is in progress`);
4196
+ return { success: false, newMessageCount: 0, error: result.error, retryable: true };
4197
+ }
4149
4198
  return { success: false, newMessageCount: 0, error: result.error };
4150
4199
  } catch (err) {
4151
4200
  this.logger.error(`[DirectImporter] Full import failed`, err);
@@ -4383,4 +4432,4 @@ export {
4383
4432
  startHttpServer,
4384
4433
  stopHttpServer
4385
4434
  };
4386
- //# sourceMappingURL=chunk-D3DPCDII.mjs.map
4435
+ //# sourceMappingURL=chunk-JH5RAJT2.mjs.map