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.
Files changed (111) hide show
  1. package/dist/{chat-command-ISJ2DC7R.mjs → chat-command-JKG3FY5B.mjs} +8 -5
  2. package/dist/{chat-command-ISJ2DC7R.mjs.map → chat-command-JKG3FY5B.mjs.map} +1 -1
  3. package/dist/chunk-2MZ6G4AC.mjs +1339 -0
  4. package/dist/chunk-2MZ6G4AC.mjs.map +1 -0
  5. package/dist/{chunk-NJB2NNB2.mjs → chunk-6FPEP2ZX.mjs} +2 -2
  6. package/dist/{chunk-YBS3YQB6.mjs → chunk-7RW4CQAO.mjs} +31 -57
  7. package/dist/chunk-7RW4CQAO.mjs.map +1 -0
  8. package/dist/{chunk-GHTGFM6O.mjs → chunk-ARZM6HBX.mjs} +14 -12
  9. package/dist/{chunk-GHTGFM6O.mjs.map → chunk-ARZM6HBX.mjs.map} +1 -1
  10. package/dist/{chunk-3QBVO4J7.mjs → chunk-CIB23U32.mjs} +2 -2
  11. package/dist/chunk-D4WTE7LV.mjs +526 -0
  12. package/dist/chunk-D4WTE7LV.mjs.map +1 -0
  13. package/dist/{chunk-T7IETWHN.mjs → chunk-I35WHWA6.mjs} +5 -3
  14. package/dist/{chunk-T7IETWHN.mjs.map → chunk-I35WHWA6.mjs.map} +1 -1
  15. package/dist/{chunk-AB6TAXTQ.mjs → chunk-KL2NGIMQ.mjs} +171 -47
  16. package/dist/chunk-KL2NGIMQ.mjs.map +1 -0
  17. package/dist/{chunk-ZVDOFWL7.mjs → chunk-QQK7MLCR.mjs} +3926 -10867
  18. package/dist/chunk-QQK7MLCR.mjs.map +1 -0
  19. package/dist/{chunk-ERAAWLEF.mjs → chunk-SKUG5XVD.mjs} +10 -8
  20. package/dist/{chunk-ERAAWLEF.mjs.map → chunk-SKUG5XVD.mjs.map} +1 -1
  21. package/dist/chunk-WPI6YSAR.mjs +8813 -0
  22. package/dist/chunk-WPI6YSAR.mjs.map +1 -0
  23. package/dist/cli.mjs +7 -4
  24. package/dist/contacts-worker.mjs +48 -0
  25. package/dist/contacts-worker.mjs.map +1 -0
  26. package/dist/{http-MBILV37U.mjs → http-5E7ARYFW.mjs} +11 -8
  27. package/dist/{import-EYV3GXHE.mjs → import-3KG6VK6O.mjs} +7 -4
  28. package/dist/index.mjs +11 -8
  29. package/dist/{mcp-H55AEXU5.mjs → mcp-JBI4CUQT.mjs} +8 -5
  30. package/dist/{mcp-H55AEXU5.mjs.map → mcp-JBI4CUQT.mjs.map} +1 -1
  31. package/dist/people-relationships-worker.mjs +48 -0
  32. package/dist/people-relationships-worker.mjs.map +1 -0
  33. package/dist/semantic-index-worker.mjs +1 -1
  34. package/dist/{src-36ZIR65K.mjs → src-UTBQAOJ3.mjs} +62 -44
  35. package/dist/{stream-import-YZMZ56B5.mjs → stream-import-7HZ4IRYJ.mjs} +7 -4
  36. package/dist/{worker-runtime-YDYS2C6T.mjs → worker-runtime-ALS4MR2A.mjs} +7 -3
  37. package/dist/{worker-runtime-YDYS2C6T.mjs.map → worker-runtime-ALS4MR2A.mjs.map} +1 -1
  38. package/dist-web/assets/BufferResource-MsqP5sq3.js +185 -0
  39. package/dist-web/assets/CanvasRenderer-BKCvcc2p.js +1 -0
  40. package/dist-web/assets/DebugToolsPanel-D_lFIW6j.css +1 -0
  41. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-HGJb0Et1.js +110 -0
  42. package/dist-web/assets/{EChartWordcloud-B_YisOW5.js → EChartWordcloud-Clg60FMo.js} +1 -1
  43. package/dist-web/assets/Filter-wRJtdXx9.js +1 -0
  44. package/dist-web/assets/MessageExportModal-BCrMf5Kw.js +1 -0
  45. package/dist-web/assets/PageHeader-Bbn87QZS.css +1 -0
  46. package/dist-web/assets/PageHeader-C_yw54le.js +1 -0
  47. package/dist-web/assets/RelationshipGalaxyCanvas-DTzJq7q7.js +244 -0
  48. package/dist-web/assets/RelationshipGalaxyThreeCanvas-BluPHjCR.css +1 -0
  49. package/dist-web/assets/RelationshipGalaxyThreeCanvas-DIE-0_iM.js +4108 -0
  50. package/dist-web/assets/RenderTargetSystem-BSAQFamI.js +184 -0
  51. package/dist-web/assets/WebGLRenderer-lfzmCZNT.js +156 -0
  52. package/dist-web/assets/WebGPURenderer-BnEdfdr_.js +41 -0
  53. package/dist-web/assets/browserAll-gRNfDyPu.js +14 -0
  54. package/dist-web/assets/{electron-DWDCqx_d.js → electron-BHaEaaZP.js} +1 -1
  55. package/dist-web/assets/{fetch-29ZBtGV0.js → fetch-BW3aO7PS.js} +1 -1
  56. package/dist-web/assets/fetch-BwF5hNuF.js +1 -0
  57. package/dist-web/assets/{fetch-Bh1fo3Df.js → fetch-C1fI_KOX.js} +1 -1
  58. package/dist-web/assets/{fetch-DyD8wDhb.js → fetch-CBZbgZqk.js} +1 -1
  59. package/dist-web/assets/{fetch-C3yhWO2S.js → fetch-CFRoSIAn.js} +1 -1
  60. package/dist-web/assets/fetch-CN91TIwV.js +1 -0
  61. package/dist-web/assets/{fetch-BcxrU2mr.js → fetch-CQt-gb-f.js} +1 -1
  62. package/dist-web/assets/{fetch-TCeykOkO.js → fetch-DPCJ-1l-.js} +1 -1
  63. package/dist-web/assets/{fetch-tIIVdXSv.js → fetch-gMB4wuBd.js} +1 -1
  64. package/dist-web/assets/{fetch-BYczbT4C.js → fetch-mFlEBZyB.js} +1 -1
  65. package/dist-web/assets/index---rXG1hZ.css +1 -0
  66. package/dist-web/assets/index--6C0sK6a.css +1 -0
  67. package/dist-web/assets/index-B6wEGata.js +173 -0
  68. package/dist-web/assets/index-Bg4GGPXv.js +1 -0
  69. package/dist-web/assets/index-BgVbj5qX.js +12 -0
  70. package/dist-web/assets/index-BkoXaBV_.js +64 -0
  71. package/dist-web/assets/index-C56IuV5U.css +1 -0
  72. package/dist-web/assets/index-CLRaKwpT.js +2 -0
  73. package/dist-web/assets/index-Dj1BSD7O.js +1 -0
  74. package/dist-web/assets/index-DosG7LmJ.css +1 -0
  75. package/dist-web/assets/index-DveHdPfK.js +1 -0
  76. package/dist-web/assets/{index-BX3tqfLz.css → index-MBRD3wPd.css} +1 -1
  77. package/dist-web/assets/index-RoDgJcHU.js +2 -0
  78. package/dist-web/assets/{index-fbWrQpgH.js → index-ZdCB7xcf.js} +4 -4
  79. package/dist-web/assets/index-aljYO5ms.js +1 -0
  80. package/dist-web/assets/people-page-header-Mupn-U_b.js +1 -0
  81. package/dist-web/assets/relationship-galaxy-viewport-Cwfa51ER.js +1 -0
  82. package/dist-web/assets/{vendor-echarts-CITQeskI.js → vendor-echarts-hJVnODyU.js} +2 -2
  83. package/dist-web/assets/{vendor-echarts-wordcloud-B1kQMklB.js → vendor-echarts-wordcloud-k5ih2Jl4.js} +1 -1
  84. package/dist-web/assets/{vendor-nuxt-ui-Zy8txNdC.js → vendor-nuxt-ui-Dr2T8_OZ.js} +2 -2
  85. package/dist-web/assets/{vendor-reka-ui-mMvma1EP.js → vendor-reka-ui-CzM4kDQ7.js} +1 -1
  86. package/dist-web/assets/{vendor-zrender-DFl4U2Oe.js → vendor-zrender-5DcYjSZk.js} +1 -1
  87. package/dist-web/assets/{web-H3XLx159.js → web-BakeV58u.js} +1 -1
  88. package/dist-web/assets/webworkerAll-D_6PgURS.js +83 -0
  89. package/dist-web/index.html +4 -4
  90. package/package.json +1 -1
  91. package/dist/chunk-AB6TAXTQ.mjs.map +0 -1
  92. package/dist/chunk-YBS3YQB6.mjs.map +0 -1
  93. package/dist/chunk-ZVDOFWL7.mjs.map +0 -1
  94. package/dist-web/assets/DebugToolsPanel-DFw6_G5V.css +0 -1
  95. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-Do3x4aL3.js +0 -110
  96. package/dist-web/assets/MessageExportModal-rijqUusq.js +0 -1
  97. package/dist-web/assets/fetch-BAxKmbKF.js +0 -1
  98. package/dist-web/assets/fetch-Da_TBxrX.js +0 -1
  99. package/dist-web/assets/index-BzjLqlW_.js +0 -173
  100. package/dist-web/assets/index-C74qEDFh.js +0 -64
  101. package/dist-web/assets/index-CM6xNPFp.css +0 -1
  102. package/dist-web/assets/index-CgK2LLIF.js +0 -12
  103. package/dist-web/assets/index-CjkOvM3N.js +0 -2
  104. package/dist-web/assets/index-Dno7CADA.js +0 -1
  105. package/dist-web/assets/index-I3SWZjnW.css +0 -1
  106. /package/dist/{chunk-NJB2NNB2.mjs.map → chunk-6FPEP2ZX.mjs.map} +0 -0
  107. /package/dist/{chunk-3QBVO4J7.mjs.map → chunk-CIB23U32.mjs.map} +0 -0
  108. /package/dist/{http-MBILV37U.mjs.map → http-5E7ARYFW.mjs.map} +0 -0
  109. /package/dist/{import-EYV3GXHE.mjs.map → import-3KG6VK6O.mjs.map} +0 -0
  110. /package/dist/{src-36ZIR65K.mjs.map → src-UTBQAOJ3.mjs.map} +0 -0
  111. /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":"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","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-ERAAWLEF.mjs";
17
+ } from "./chunk-SKUG5XVD.mjs";
12
18
  import {
13
19
  AGENT_TOOL_REGISTRY,
14
20
  CoreDataProvider
15
- } from "./chunk-3QBVO4J7.mjs";
21
+ } from "./chunk-CIB23U32.mjs";
16
22
  import {
17
23
  assertCliDataDirCompatible
18
- } from "./chunk-NJB2NNB2.mjs";
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-YBS3YQB6.mjs";
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
- createDatabaseManagerAdapter,
74
- deleteAuthProfile,
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
- getDefaultRulesForLocale,
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-ZVDOFWL7.mjs";
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-YZMZ56B5.mjs");
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-AB6TAXTQ.mjs.map
4216
+ //# sourceMappingURL=chunk-KL2NGIMQ.mjs.map