chatlab-cli 0.37.2 → 0.37.4

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 (148) hide show
  1. package/LICENSE +661 -0
  2. package/dist/{chat-command-G2EX7VHR.mjs → chat-command-DJKSQP6Y.mjs} +37 -9
  3. package/dist/chat-command-DJKSQP6Y.mjs.map +1 -0
  4. package/dist/{chunk-F4HVCFZL.mjs → chunk-3K7F2SRZ.mjs} +3 -3
  5. package/dist/{chunk-FCUUAGGC.mjs → chunk-ARRFRJOH.mjs} +2 -2
  6. package/dist/{chunk-H46CLFWK.mjs → chunk-D6BRSG3V.mjs} +4 -4
  7. package/dist/{chunk-YI3EQYEG.mjs → chunk-DJ7QEJNO.mjs} +12 -12
  8. package/dist/{chunk-XQ6Z2KNN.mjs → chunk-JWWWLW5G.mjs} +2 -2
  9. package/dist/{chunk-HBAQPF6X.mjs → chunk-NKSPJN6X.mjs} +210 -60
  10. package/dist/chunk-NKSPJN6X.mjs.map +1 -0
  11. package/dist/{chunk-HMVM7VCA.mjs → chunk-NVW3ZCYD.mjs} +3 -3
  12. package/dist/{chunk-T5H56AZV.mjs → chunk-OXRS2UPE.mjs} +13 -11
  13. package/dist/chunk-OXRS2UPE.mjs.map +1 -0
  14. package/dist/{chunk-EFX66A2O.mjs → chunk-QP77JL6O.mjs} +2 -2
  15. package/dist/{chunk-EK5QIJLZ.mjs → chunk-VCKF7RYB.mjs} +11 -11
  16. package/dist/{chunk-L6RJIVLS.mjs → chunk-WBPOMYBE.mjs} +315 -24
  17. package/dist/chunk-WBPOMYBE.mjs.map +1 -0
  18. package/dist/{chunk-E6LCCPIB.mjs → chunk-YPP3N2AX.mjs} +2 -2
  19. package/dist/cli.mjs +9 -9
  20. package/dist/contacts-worker.mjs +2 -2
  21. package/dist/global-insight-worker.mjs +1 -1
  22. package/dist/{http-5BRVWAJR.mjs → http-O4AZUIOD.mjs} +12 -12
  23. package/dist/{import-IAECQDKC.mjs → import-IALJQB7V.mjs} +7 -7
  24. package/dist/index.mjs +12 -12
  25. package/dist/{mcp-XXSQJBGU.mjs → mcp-VNBL4WMM.mjs} +24 -17
  26. package/dist/mcp-VNBL4WMM.mjs.map +1 -0
  27. package/dist/people-relationships-worker.mjs +2 -2
  28. package/dist/semantic-index-worker.mjs +1 -1
  29. package/dist/{src-4HLKMQ7S.mjs → src-6ICLBMOR.mjs} +6 -6
  30. package/dist/{stream-import-PUG42I36.mjs → stream-import-NKQYYSGZ.mjs} +7 -7
  31. package/dist/{worker-runtime-X5563TVT.mjs → worker-runtime-AE2I6U2G.mjs} +5 -5
  32. package/dist-cli-web/assets/{AISettingsTab-m_r2fFEj.js → AISettingsTab-mecu-HsX.js} +1 -1
  33. package/dist-cli-web/assets/{AboutTab-J65UqIuk.js → AboutTab-CgXYD50w.js} +1 -1
  34. package/dist-cli-web/assets/{Alert-qBIGn_CW.js → Alert-DR892gaV.js} +1 -1
  35. package/dist-cli-web/assets/{ApiSettingsTab-CxWRJI9j.js → ApiSettingsTab-Cvw8gStg.js} +1 -1
  36. package/dist-cli-web/assets/{BatchManageTab-BINNVwm1.js → BatchManageTab-DqSEzAtr.js} +1 -1
  37. package/dist-cli-web/assets/{BufferResource-C-jLPrHv.js → BufferResource-rydt5j-b.js} +1 -1
  38. package/dist-cli-web/assets/{CanvasRenderer-kDLW8GSt.js → CanvasRenderer-Ci5IaFxW.js} +1 -1
  39. package/dist-cli-web/assets/{CardDecoration-CnYxleQM.js → CardDecoration-8F4sZO4v.js} +1 -1
  40. package/dist-cli-web/assets/{ChatRecordDrawer-CMg3FEWH.js → ChatRecordDrawer-D3LzSRkL.js} +1 -1
  41. package/dist-cli-web/assets/{ChatRecordWorkspace-AfFIMUbZ.js → ChatRecordWorkspace-BDCIAjm3.js} +1 -1
  42. package/dist-cli-web/assets/{Checkbox-D-hAv15R.js → Checkbox-I1cjN4s_.js} +1 -1
  43. package/dist-cli-web/assets/{DataDirCleanupNotice-P80h2p4l.js → DataDirCleanupNotice-8zcIOyGl.js} +1 -1
  44. package/dist-cli-web/assets/{DatePicker.vue_vue_type_script_setup_true_lang-CSp691Uv.js → DatePicker.vue_vue_type_script_setup_true_lang-DWWzQOTU.js} +1 -1
  45. package/dist-cli-web/assets/{DebugToolsPanel-BK2VbKB0.js → DebugToolsPanel-CiGd5ttA.js} +1 -1
  46. package/dist-cli-web/assets/{EChart.vue_vue_type_script_setup_true_lang-BcE0mE_N.js → EChart.vue_vue_type_script_setup_true_lang-Rk-Bu-rv.js} +1 -1
  47. package/dist-cli-web/assets/{EChartBar.vue_vue_type_script_setup_true_lang-BypaV5wc.js → EChartBar.vue_vue_type_script_setup_true_lang-CB_KuKt4.js} +1 -1
  48. package/dist-cli-web/assets/{EChartLine.vue_vue_type_script_setup_true_lang-D8SyOfWC.js → EChartLine.vue_vue_type_script_setup_true_lang-5iW9KPRe.js} +1 -1
  49. package/dist-cli-web/assets/{EChartWordcloud-0rihhg03.js → EChartWordcloud-BiN68kpp.js} +1 -1
  50. package/dist-cli-web/assets/{FileDropZone.vue_vue_type_script_setup_true_lang-Dyuzh7Ex.js → FileDropZone.vue_vue_type_script_setup_true_lang-DpK_xXUN.js} +1 -1
  51. package/dist-cli-web/assets/{Filter-rD_jWpbO.js → Filter-Tmam9FK9.js} +1 -1
  52. package/dist-cli-web/assets/{GlobalTaskBar-sXQuGvF-.js → GlobalTaskBar-B77auVn7.js} +1 -1
  53. package/dist-cli-web/assets/{GroupRelationshipGalaxyView-BN1L9DFf.js → GroupRelationshipGalaxyView-DAmdqVxU.js} +1 -1
  54. package/dist-cli-web/assets/{Label-Ce4wl_Ph.js → Label-DTrL45eR.js} +1 -1
  55. package/dist-cli-web/assets/{LoadingState.vue_vue_type_script_setup_true_lang-DmVfwvnD.js → LoadingState.vue_vue_type_script_setup_true_lang-DH0zYa8f.js} +1 -1
  56. package/dist-cli-web/assets/{MessageExportModal-C2IUNPhg.js → MessageExportModal-DgvQvcc5.js} +1 -1
  57. package/dist-cli-web/assets/{PageHeader-D5BcYKBs.js → PageHeader-C-UYITO9.js} +1 -1
  58. package/dist-cli-web/assets/{PageTabs.vue_vue_type_script_setup_true_lang-DHly2-fe.js → PageTabs.vue_vue_type_script_setup_true_lang-BV344PR7.js} +1 -1
  59. package/dist-cli-web/assets/{RelationshipGalaxyCanvas-CHPqtqQz.js → RelationshipGalaxyCanvas-Bzh-vQI8.js} +3 -3
  60. package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-qR4S-9n7.js → RelationshipGalaxyThreeCanvas--DDkxCCc.js} +1 -1
  61. package/dist-cli-web/assets/{RenderTargetSystem-BaIFulUj.js → RenderTargetSystem-BP0KBa7R.js} +1 -1
  62. package/dist-cli-web/assets/{RovingFocusItem-Bqgmzo42.js → RovingFocusItem-BAQO8BlG.js} +1 -1
  63. package/dist-cli-web/assets/{ScreenCaptureModal-sJqB_hrK.js → ScreenCaptureModal-DtAB4lyN.js} +1 -1
  64. package/dist-cli-web/assets/{SectionTabs.vue_vue_type_script_setup_true_lang-BPt98e6z.js → SectionTabs.vue_vue_type_script_setup_true_lang-DjUq1i7-.js} +1 -1
  65. package/dist-cli-web/assets/{Select-BAnN4HMs.js → Select-CaRAtYOu.js} +1 -1
  66. package/dist-cli-web/assets/{SettingsModal-C4ANMlJJ.js → SettingsModal-BKu9l7vR.js} +2 -2
  67. package/dist-cli-web/assets/{StorageTab-BgNQliz4.js → StorageTab-DWUzStD4.js} +1 -1
  68. package/dist-cli-web/assets/{Switch-DddEvDJa.js → Switch-mMuTJ87v.js} +1 -1
  69. package/dist-cli-web/assets/{Tabs-xVtuBuO0.js → Tabs-B0DXvZn9.js} +1 -1
  70. package/dist-cli-web/assets/{Tabs-DwjL-ueH.js → Tabs-Bw65ChMB.js} +1 -1
  71. package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-CNCVa86b.js → ThemeCard.vue_vue_type_script_setup_true_lang-CFSCaL65.js} +1 -1
  72. package/dist-cli-web/assets/{TimeSelect.vue_vue_type_script_setup_true_lang-BehUIWki.js → TimeSelect.vue_vue_type_script_setup_true_lang-sP4Z2nbi.js} +1 -1
  73. package/dist-cli-web/assets/{VisuallyHiddenInput-ST6JNfSG.js → VisuallyHiddenInput-Cy3d6wW5.js} +1 -1
  74. package/dist-cli-web/assets/{WebGLRenderer-DRraqD4Y.js → WebGLRenderer-C86bSgXH.js} +1 -1
  75. package/dist-cli-web/assets/{WebGPURenderer-CnzaYARg.js → WebGPURenderer-EcnRVF_C.js} +1 -1
  76. package/dist-cli-web/assets/{aiChat-CeJy-gG-.js → aiChat-ZrHuq9Eb.js} +3 -3
  77. package/dist-cli-web/assets/{base-BHbtUviQ.js → base-DwqzgeyP.js} +1 -1
  78. package/dist-cli-web/assets/{browserAll-DYxkitnx.js → browserAll-DUX8qJC8.js} +1 -1
  79. package/dist-cli-web/assets/{chatMessages-Dj1u-tFB.js → chatMessages-By6kR5_1.js} +3 -3
  80. package/dist-cli-web/assets/{cli-web-BtH8nfjA.js → cli-web-JlckDfz0.js} +1 -1
  81. package/dist-cli-web/assets/{fetch-CAEyoWQA.js → fetch-Bhl8mtJ2.js} +11 -13
  82. package/dist-cli-web/assets/{fetch-DNmRaRxX.js → fetch-BjtwVVBg.js} +1 -1
  83. package/dist-cli-web/assets/{fetch-ejEMWPM2.js → fetch-BpoJa14b.js} +1 -1
  84. package/dist-cli-web/assets/{fetch-emZXHmoE.js → fetch-CY5yJNTL.js} +1 -1
  85. package/dist-cli-web/assets/{fetch-C1Tm66i9.js → fetch-ChSI9rRd.js} +1 -1
  86. package/dist-cli-web/assets/{fetch-JEEBqR_7.js → fetch-CuySZ9TW.js} +1 -1
  87. package/dist-cli-web/assets/{fetch-T5Gi1TUZ.js → fetch-DS-lTLBb.js} +1 -1
  88. package/dist-cli-web/assets/{fetch-D7hfFyoG.js → fetch-Dkyidev6.js} +1 -1
  89. package/dist-cli-web/assets/{fetch-U9QyidNZ.js → fetch-DtqHZHIT.js} +1 -1
  90. package/dist-cli-web/assets/{fetch-CGnWNSsG.js → fetch-GYzy1nua.js} +1 -1
  91. package/dist-cli-web/assets/{fetch-DogRrvT6.js → fetch-LZAcmdq3.js} +1 -1
  92. package/dist-cli-web/assets/{fetch-BJ82mWvv.js → fetch-w66ywFn5.js} +1 -1
  93. package/dist-cli-web/assets/{host-BUvwCvZR.js → host-CBXwW7_e.js} +1 -1
  94. package/dist-cli-web/assets/{host-VTWF81F5.js → host-CDCKLdfF.js} +1 -1
  95. package/dist-cli-web/assets/{index-DQFcmWSa.js → index-3KDkw8sV.js} +1 -1
  96. package/dist-cli-web/assets/{index-e6fOnhNS.js → index-BAjafcRU.js} +1 -1
  97. package/dist-cli-web/assets/{index-DZK9Njvy.js → index-BLO0CYvx.js} +1 -1
  98. package/dist-cli-web/assets/{index-KpnLSzzX.js → index-BVoFqt2r.js} +4 -4
  99. package/dist-cli-web/assets/{index-DDt7Tfda.js → index-CYmoNVAj.js} +1 -1
  100. package/dist-cli-web/assets/{index-D9C3dyV8.js → index-D07viL9P.js} +4 -4
  101. package/dist-cli-web/assets/{index-iEQnKg2R.js → index-DD7RFB6N.js} +2 -2
  102. package/dist-cli-web/assets/index-DEafpen2.js +137 -0
  103. package/dist-cli-web/assets/index-DRFMz0cs.css +1 -0
  104. package/dist-cli-web/assets/{index-HjrJ3DXO.js → index-D_CX3gzo.js} +1 -1
  105. package/dist-cli-web/assets/{index-BLYSew5C.js → index-D_SJKdur.js} +1 -1
  106. package/dist-cli-web/assets/{index-C75W1B5J.css → index-DbP9vQhR.css} +1 -1
  107. package/dist-cli-web/assets/{index-BI2Rb_L3.js → index-RqQZ2vvr.js} +2 -2
  108. package/dist-cli-web/assets/{index-B3MCGDwx.js → index-T_aveLoS.js} +1 -1
  109. package/dist-cli-web/assets/{index-BZpR015e.css → index-XC-s67UA.css} +1 -1
  110. package/dist-cli-web/assets/{index-DUBl6aBF.js → index-fhyFEtxF.js} +1 -1
  111. package/dist-cli-web/assets/{index-CVRBBnQw.js → index-sMeHjrc9.js} +1 -1
  112. package/dist-cli-web/assets/{people-page-header-DWXwFJ8M.js → people-page-header-DPOKmbHG.js} +1 -1
  113. package/dist-cli-web/assets/{prompt-Cepfb-5-.js → prompt-ipERjPzE.js} +1 -1
  114. package/dist-cli-web/assets/{semantic-index-config-builder-hTY6QyCe.js → semantic-index-config-builder-CjJ4q8PF.js} +1 -1
  115. package/dist-cli-web/assets/service-2UJZvVpa.js +1 -0
  116. package/dist-cli-web/assets/{service-DwCmXFtI.js → service-CAdsM9Hy.js} +1 -1
  117. package/dist-cli-web/assets/service-i_PJfTaR.js +1 -0
  118. package/dist-cli-web/assets/useFormControl-BPt9mIxj.js +1 -0
  119. package/dist-cli-web/assets/{useInsightTabAnalytics-CplGbsbe.js → useInsightTabAnalytics-s3wcN9Eo.js} +4 -4
  120. package/dist-cli-web/assets/{useTable-Dmpbk7fZ.js → useTable-DOM-gqX0.js} +1 -1
  121. package/dist-cli-web/assets/{useToast-Bmgpd3sl.js → useToast-BzK6i1Tk.js} +1 -1
  122. package/dist-cli-web/assets/{webworkerAll-DkPWEyVL.js → webworkerAll-ClkzpxNT.js} +1 -1
  123. package/dist-cli-web/index.html +2 -2
  124. package/package.json +1 -1
  125. package/dist/chat-command-G2EX7VHR.mjs.map +0 -1
  126. package/dist/chunk-HBAQPF6X.mjs.map +0 -1
  127. package/dist/chunk-L6RJIVLS.mjs.map +0 -1
  128. package/dist/chunk-T5H56AZV.mjs.map +0 -1
  129. package/dist/mcp-XXSQJBGU.mjs.map +0 -1
  130. package/dist-cli-web/assets/index-Bs7gk1gf.css +0 -1
  131. package/dist-cli-web/assets/index-Cza8BzZE.js +0 -137
  132. package/dist-cli-web/assets/service-BjE0YJaM.js +0 -1
  133. package/dist-cli-web/assets/service-DQxttlJp.js +0 -1
  134. package/dist-cli-web/assets/useFormControl-CJyJY8AK.js +0 -1
  135. /package/dist/{chunk-F4HVCFZL.mjs.map → chunk-3K7F2SRZ.mjs.map} +0 -0
  136. /package/dist/{chunk-FCUUAGGC.mjs.map → chunk-ARRFRJOH.mjs.map} +0 -0
  137. /package/dist/{chunk-H46CLFWK.mjs.map → chunk-D6BRSG3V.mjs.map} +0 -0
  138. /package/dist/{chunk-YI3EQYEG.mjs.map → chunk-DJ7QEJNO.mjs.map} +0 -0
  139. /package/dist/{chunk-XQ6Z2KNN.mjs.map → chunk-JWWWLW5G.mjs.map} +0 -0
  140. /package/dist/{chunk-HMVM7VCA.mjs.map → chunk-NVW3ZCYD.mjs.map} +0 -0
  141. /package/dist/{chunk-EFX66A2O.mjs.map → chunk-QP77JL6O.mjs.map} +0 -0
  142. /package/dist/{chunk-EK5QIJLZ.mjs.map → chunk-VCKF7RYB.mjs.map} +0 -0
  143. /package/dist/{chunk-E6LCCPIB.mjs.map → chunk-YPP3N2AX.mjs.map} +0 -0
  144. /package/dist/{http-5BRVWAJR.mjs.map → http-O4AZUIOD.mjs.map} +0 -0
  145. /package/dist/{import-IAECQDKC.mjs.map → import-IALJQB7V.mjs.map} +0 -0
  146. /package/dist/{src-4HLKMQ7S.mjs.map → src-6ICLBMOR.mjs.map} +0 -0
  147. /package/dist/{stream-import-PUG42I36.mjs.map → stream-import-NKQYYSGZ.mjs.map} +0 -0
  148. /package/dist/{worker-runtime-X5563TVT.mjs.map → worker-runtime-AE2I6U2G.mjs.map} +0 -0
@@ -6,16 +6,18 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  createCliRunAgentStream
9
- } from "./chunk-T5H56AZV.mjs";
10
- import "./chunk-L6RJIVLS.mjs";
11
- import "./chunk-F4HVCFZL.mjs";
12
- import "./chunk-H46CLFWK.mjs";
13
- import "./chunk-EFX66A2O.mjs";
14
- import "./chunk-E6LCCPIB.mjs";
9
+ } from "./chunk-OXRS2UPE.mjs";
10
+ import "./chunk-WBPOMYBE.mjs";
11
+ import "./chunk-3K7F2SRZ.mjs";
12
+ import "./chunk-D6BRSG3V.mjs";
13
+ import "./chunk-QP77JL6O.mjs";
14
+ import "./chunk-YPP3N2AX.mjs";
15
15
  import "./chunk-YKMQLAVP.mjs";
16
16
  import {
17
- getDefaultGeneralAssistantId
18
- } from "./chunk-HBAQPF6X.mjs";
17
+ extractToolResultText,
18
+ getDefaultGeneralAssistantId,
19
+ truncateToolResultText
20
+ } from "./chunk-NKSPJN6X.mjs";
19
21
  import "./chunk-VSOWNKPA.mjs";
20
22
 
21
23
  // src/ai/chat-command.ts
@@ -113,6 +115,7 @@ async function runChatTurn(options, deps) {
113
115
  const streamState = { error: null };
114
116
  const events = [];
115
117
  const contentBlocks = [];
118
+ const toolBlocks = /* @__PURE__ */ new Map();
116
119
  let hasReplayContentBlocks = false;
117
120
  const runAgentStream = (deps.createRunAgentStream ?? createCliRunAgentStream)(deps.dbManager, deps.aiChatManager);
118
121
  const appendTextBlock = (text) => {
@@ -227,6 +230,31 @@ async function runChatTurn(options, deps) {
227
230
  appendChartBlocks(extractChartPayloads(chunk.toolResult));
228
231
  return;
229
232
  }
233
+ if (chunk.type === "tool_start" && chunk.toolName && chunk.toolName !== "render_chart" && chunk.toolCallId) {
234
+ const block = {
235
+ type: "tool",
236
+ tool: {
237
+ name: chunk.toolName,
238
+ displayName: chunk.toolName,
239
+ status: "running",
240
+ toolCallId: chunk.toolCallId,
241
+ params: chunk.toolParams
242
+ }
243
+ };
244
+ toolBlocks.set(chunk.toolCallId, block);
245
+ contentBlocks.push(block);
246
+ hasReplayContentBlocks = true;
247
+ return;
248
+ }
249
+ if (chunk.type === "tool_result" && chunk.toolCallId) {
250
+ const block = toolBlocks.get(chunk.toolCallId);
251
+ if (block) {
252
+ block.tool.status = chunk.toolIsError ? "error" : "done";
253
+ block.tool.isError = chunk.toolIsError === true;
254
+ block.tool.result = truncateToolResultText(extractToolResultText(chunk.toolResult));
255
+ }
256
+ return;
257
+ }
230
258
  if (chunk.type === "content" && chunk.content) {
231
259
  answer += chunk.content;
232
260
  appendTextBlock(chunk.content);
@@ -323,4 +351,4 @@ export {
323
351
  runChatCommand,
324
352
  runChatTurn
325
353
  };
326
- //# sourceMappingURL=chat-command-G2EX7VHR.mjs.map
354
+ //# sourceMappingURL=chat-command-DJKSQP6Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai/chat-command.ts"],"sourcesContent":["import { createInterface } from 'node:readline/promises'\nimport type { Readable, Writable } from 'node:stream'\nimport type {\n DatabaseManager,\n AIChatManager,\n AgentStreamChunk,\n ContentBlock,\n PlanContentBlock,\n PlanDraftContentBlock,\n TokenUsageData,\n} from '@openchatlab/node-runtime'\nimport type { ChartPayload, PathProvider } from '@openchatlab/core'\nimport { extractToolResultText, truncateToolResultText } from '@openchatlab/core'\nimport { getDefaultGeneralAssistantId } from '@openchatlab/shared-types'\nimport { createCliRunAgentStream } from './agent-stream-runner'\n\nexport interface ChatCommandOptions {\n sessionId?: string\n aiChatId?: string\n question?: string\n json?: boolean\n stream?: boolean\n locale?: string\n includeEvents?: boolean\n}\n\nexport interface ChatCommandDeps {\n dbManager: DatabaseManager\n pathProvider: PathProvider\n aiChatManager: AIChatManager\n stdout?: Pick<Writable, 'write'>\n stderr?: Pick<Writable, 'write'>\n stdin?: Readable\n createRunAgentStream?: typeof createCliRunAgentStream\n}\n\nexport interface ResolvedAIChatTarget {\n sessionId: string\n aiChatId: string\n assistantId: string\n created: boolean\n}\n\nexport interface ChatTurnResult {\n sessionId: string\n aiChatId: string\n question: string\n answer: string\n /** Present for a persisted but incomplete turn, never for a successful completion. */\n error?: { name: string; message: string }\n events?: AgentStreamChunk[]\n contentBlocks?: ContentBlock[]\n usage: {\n durationMs: number\n tokenUsage: TokenUsageData | null\n }\n}\n\nfunction write(stream: Pick<Writable, 'write'>, text: string): void {\n stream.write(text)\n}\n\nfunction buildTitle(question?: string): string {\n const trimmed = question?.trim()\n if (!trimmed) return 'CLI Chat'\n return trimmed.length > 50 ? `${trimmed.slice(0, 50)}...` : trimmed\n}\n\nfunction createAgentStreamError(error: unknown): Error {\n if (error instanceof Error) return error\n if (typeof error === 'string' && error) return new Error(error)\n if (typeof error === 'object' && error !== null) {\n const record = error as { name?: unknown; message?: unknown; stack?: unknown }\n const streamError = new Error(\n typeof record.message === 'string' && record.message ? record.message : 'Agent stream failed'\n )\n if (typeof record.name === 'string' && record.name) streamError.name = record.name\n if (typeof record.stack === 'string' && record.stack) streamError.stack = record.stack\n return streamError\n }\n return new Error('Agent stream failed')\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isChartPayload(value: unknown): value is ChartPayload {\n return isRecord(value) && value.version === 1 && isRecord(value.spec) && isRecord(value.dataset)\n}\n\nfunction extractChartPayloads(toolResult: unknown): ChartPayload[] {\n if (!isRecord(toolResult)) return []\n const details = isRecord(toolResult.details) ? toolResult.details : toolResult\n const charts: ChartPayload[] = []\n if (isChartPayload(details.chart)) charts.push(details.chart)\n if (Array.isArray(details.charts)) {\n for (const chart of details.charts) {\n if (isChartPayload(chart)) charts.push(chart)\n }\n }\n return charts\n}\n\nfunction toPersistedChartPayload(chart: ChartPayload): ChartPayload {\n return {\n ...chart,\n dataset: {\n ...chart.dataset,\n rows: [],\n },\n }\n}\n\nfunction resolveSingleSessionId(dbManager: DatabaseManager): string {\n const sessionIds = dbManager.listSessionIds()\n if (sessionIds.length === 1) return sessionIds[0]!\n if (sessionIds.length === 0) {\n throw new Error('No chat sessions found. Import data first or run `clb sessions` to verify available sessions.')\n }\n throw new Error('Missing --session-id. Run `clb sessions` to choose a session ID.')\n}\n\nfunction assertSessionExists(dbManager: DatabaseManager, sessionId: string): void {\n const db = dbManager.open(sessionId)\n if (!db) {\n throw new Error(`Session ${sessionId} not found`)\n }\n}\n\nexport function resolveAIChatTarget(\n options: Pick<ChatCommandOptions, 'sessionId' | 'aiChatId' | 'question' | 'locale'>,\n deps: Pick<ChatCommandDeps, 'dbManager' | 'aiChatManager'>\n): ResolvedAIChatTarget {\n if (options.aiChatId) {\n const aiChat = deps.aiChatManager.getAIChat(options.aiChatId)\n if (!aiChat) {\n throw new Error(`AI chat ${options.aiChatId} not found`)\n }\n if (options.sessionId && options.sessionId !== aiChat.sessionId) {\n throw new Error(`AI chat ${options.aiChatId} belongs to session ${aiChat.sessionId}, not ${options.sessionId}`)\n }\n assertSessionExists(deps.dbManager, aiChat.sessionId)\n return { sessionId: aiChat.sessionId, aiChatId: aiChat.id, assistantId: aiChat.assistantId, created: false }\n }\n\n const sessionId = options.sessionId ?? resolveSingleSessionId(deps.dbManager)\n assertSessionExists(deps.dbManager, sessionId)\n const aiChat = deps.aiChatManager.createAIChat(\n sessionId,\n buildTitle(options.question),\n getDefaultGeneralAssistantId(options.locale)\n )\n return { sessionId, aiChatId: aiChat.id, assistantId: aiChat.assistantId, created: true }\n}\n\nexport async function runChatTurn(\n options: Required<Pick<ChatCommandOptions, 'question'>> &\n Pick<ChatCommandOptions, 'sessionId' | 'aiChatId' | 'json' | 'stream' | 'locale' | 'includeEvents'>,\n deps: ChatCommandDeps\n): Promise<ChatTurnResult> {\n const stdout = deps.stdout ?? process.stdout\n const target = resolveAIChatTarget(options, deps)\n const startedAt = Date.now()\n let answer = ''\n let tokenUsage: TokenUsageData | null = null\n const streamState: { error: Error | null } = { error: null }\n const events: AgentStreamChunk[] = []\n const contentBlocks: ContentBlock[] = []\n const toolBlocks = new Map<string, Extract<ContentBlock, { type: 'tool' }>>()\n let hasReplayContentBlocks = false\n\n const runAgentStream = (deps.createRunAgentStream ?? createCliRunAgentStream)(deps.dbManager, deps.aiChatManager)\n\n // 中文注释:CLI 历史回放依赖 contentBlocks 的时序;只要出现计划/思考块,\n // 就同步保留后续正文 text block,避免 UI 使用 blocks 渲染时丢失最终回答。\n const appendTextBlock = (text: string) => {\n if (!text) return\n const lastBlock = contentBlocks[contentBlocks.length - 1]\n if (lastBlock?.type === 'text') {\n lastBlock.text += text\n } else {\n contentBlocks.push({ type: 'text', text })\n }\n }\n\n const appendThinkBlock = (text: string, tag = 'thinking', durationMs?: number) => {\n if (!text && durationMs === undefined) return\n const lastBlock = contentBlocks[contentBlocks.length - 1]\n let targetBlock: ContentBlock | undefined\n\n if (lastBlock?.type === 'think' && lastBlock.tag === tag) {\n lastBlock.text += text\n targetBlock = lastBlock\n } else if (text.trim().length > 0) {\n targetBlock = { type: 'think', tag, text }\n contentBlocks.push(targetBlock)\n } else if (durationMs !== undefined) {\n for (let index = contentBlocks.length - 1; index >= 0; index--) {\n const block = contentBlocks[index]\n if (block.type === 'think' && block.tag === tag) {\n targetBlock = block\n break\n }\n }\n }\n\n if (durationMs !== undefined && targetBlock?.type === 'think') {\n targetBlock.durationMs = durationMs\n }\n if (targetBlock?.type === 'think') {\n hasReplayContentBlocks = true\n }\n }\n\n const appendChartBlocks = (charts: ChartPayload[]) => {\n if (charts.length === 0) return\n // 中文注释:图表 block 需要持久化给 CLI 生成的 AI 对话回放;\n // 原始 SQL 行数据可能较大,保存时只保留渲染数据和字段元信息。\n contentBlocks.push(...charts.map((chart) => ({ type: 'chart' as const, chart: toPersistedChartPayload(chart) })))\n hasReplayContentBlocks = true\n }\n\n const appendPlanDraftBlock = (delta: string) => {\n if (!delta) return\n const lastBlock = contentBlocks[contentBlocks.length - 1]\n if (lastBlock?.type === 'plan_draft') {\n lastBlock.text += delta\n } else {\n contentBlocks.push({ type: 'plan_draft', version: 1, status: 'streaming', text: delta } as PlanDraftContentBlock)\n }\n hasReplayContentBlocks = true\n }\n\n const removePlanDraftBlocks = () => {\n for (let index = contentBlocks.length - 1; index >= 0; index--) {\n if (contentBlocks[index]?.type === 'plan_draft') {\n contentBlocks.splice(index, 1)\n }\n }\n }\n\n const appendFinalPlanBlock = (plan: PlanContentBlock) => {\n const planBlock = JSON.parse(JSON.stringify(plan)) as PlanContentBlock\n for (let index = contentBlocks.length - 1; index >= 0; index--) {\n const block = contentBlocks[index]\n if (block?.type === 'plan_draft') {\n const displayText = block.text.trim()\n if (displayText) planBlock.displayText = displayText\n contentBlocks[index] = planBlock\n hasReplayContentBlocks = true\n return\n }\n }\n contentBlocks.push(planBlock)\n hasReplayContentBlocks = true\n }\n\n await runAgentStream(\n {\n userMessage: options.question,\n sessionId: target.sessionId,\n aiChatId: target.aiChatId,\n assistantId: target.assistantId,\n chatType: 'group',\n locale: options.locale ?? 'zh-CN',\n enableAutoSkill: true,\n chartAutoMode: 'suggest',\n },\n (chunk: AgentStreamChunk) => {\n if (options.includeEvents) {\n events.push(JSON.parse(JSON.stringify(chunk)) as AgentStreamChunk)\n }\n if (chunk.type === 'error') {\n removePlanDraftBlocks()\n streamState.error = createAgentStreamError(chunk.error)\n return\n }\n if (chunk.type === 'plan_delta' && chunk.planDelta) {\n appendPlanDraftBlock(chunk.planDelta)\n return\n }\n if (chunk.type === 'plan' && chunk.plan) {\n appendFinalPlanBlock(chunk.plan)\n return\n }\n if (chunk.type === 'plan_skipped') {\n removePlanDraftBlocks()\n return\n }\n if (chunk.type === 'think') {\n appendThinkBlock(chunk.content ?? '', chunk.thinkTag, chunk.thinkDurationMs)\n return\n }\n if (chunk.type === 'tool_result' && chunk.toolName === 'render_chart') {\n appendChartBlocks(extractChartPayloads(chunk.toolResult))\n return\n }\n if (chunk.type === 'tool_start' && chunk.toolName && chunk.toolName !== 'render_chart' && chunk.toolCallId) {\n const block: Extract<ContentBlock, { type: 'tool' }> = {\n type: 'tool',\n tool: {\n name: chunk.toolName,\n displayName: chunk.toolName,\n status: 'running',\n toolCallId: chunk.toolCallId,\n params: chunk.toolParams,\n },\n }\n toolBlocks.set(chunk.toolCallId, block)\n contentBlocks.push(block)\n hasReplayContentBlocks = true\n return\n }\n if (chunk.type === 'tool_result' && chunk.toolCallId) {\n const block = toolBlocks.get(chunk.toolCallId)\n if (block) {\n block.tool.status = chunk.toolIsError ? 'error' : 'done'\n block.tool.isError = chunk.toolIsError === true\n block.tool.result = truncateToolResultText(extractToolResultText(chunk.toolResult))\n }\n return\n }\n if (chunk.type === 'content' && chunk.content) {\n answer += chunk.content\n appendTextBlock(chunk.content)\n if (!options.json && options.stream !== false) write(stdout, chunk.content)\n }\n if (chunk.type === 'done' && chunk.usage) {\n tokenUsage = chunk.usage\n for (let index = contentBlocks.length - 1; index >= 0; index--) {\n const block = contentBlocks[index]\n if (block.type === 'plan') {\n block.status = streamState.error ? 'skipped' : 'done'\n break\n }\n }\n }\n },\n new AbortController().signal\n )\n\n const streamError = streamState.error\n if (streamError && streamError.name !== 'OutputLimitError') throw streamError\n if (streamError) {\n contentBlocks.push({\n type: 'error',\n error: { name: streamError.name, message: streamError.message, stack: null },\n })\n hasReplayContentBlocks = true\n }\n\n if (!options.json && options.stream !== false && answer && !answer.endsWith('\\n')) {\n write(stdout, '\\n')\n }\n\n deps.aiChatManager.addMessagePair(\n target.aiChatId,\n { content: options.question },\n {\n content: answer,\n contentBlocks: hasReplayContentBlocks ? contentBlocks : undefined,\n tokenUsage: tokenUsage ?? undefined,\n }\n )\n\n return {\n sessionId: target.sessionId,\n aiChatId: target.aiChatId,\n question: options.question,\n answer,\n ...(streamError ? { error: { name: streamError.name, message: streamError.message } } : {}),\n ...(options.includeEvents ? { events } : {}),\n ...(hasReplayContentBlocks ? { contentBlocks } : {}),\n usage: {\n durationMs: Date.now() - startedAt,\n tokenUsage,\n },\n }\n}\n\nexport async function runChatCommand(options: ChatCommandOptions, deps: ChatCommandDeps): Promise<void> {\n const stdout = deps.stdout ?? process.stdout\n const stderr = deps.stderr ?? process.stderr\n\n if (options.question?.trim()) {\n const result = await runChatTurn({ ...options, question: options.question.trim() }, deps)\n if (options.json) {\n write(stdout, `${JSON.stringify(result, null, 2)}\\n`)\n } else if (options.stream === false) {\n write(stdout, `${result.answer}\\n`)\n }\n if (result.error) throw createAgentStreamError(result.error)\n return\n }\n\n const rl = createInterface({\n input: deps.stdin ?? process.stdin,\n output: stdout as Writable,\n })\n\n try {\n let aiChatId = options.aiChatId\n while (true) {\n const question = (await rl.question('chatlab> ')).trim()\n if (!question || question === 'exit' || question === 'quit') break\n try {\n const result = await runChatTurn({ ...options, aiChatId, question, json: false, stream: true }, deps)\n aiChatId = result.aiChatId\n if (result.error) write(stderr, `${result.error.message}\\n`)\n } catch (error) {\n write(stderr, `${error instanceof Error ? error.message : String(error)}\\n`)\n }\n }\n } finally {\n rl.close()\n }\n}\n"],"mappings":"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","names":["aiChat"]}
@@ -69,7 +69,7 @@ import {
69
69
  semanticSearch,
70
70
  vecTableName,
71
71
  vecTableSchema
72
- } from "./chunk-H46CLFWK.mjs";
72
+ } from "./chunk-D6BRSG3V.mjs";
73
73
  import {
74
74
  CHATLAB_FORMAT_VERSION,
75
75
  DESENSITIZE_RULES_SCHEMA_VERSION,
@@ -98,7 +98,7 @@ import {
98
98
  withFileLock,
99
99
  writeConfigField,
100
100
  writeJsonFileAtomically
101
- } from "./chunk-HBAQPF6X.mjs";
101
+ } from "./chunk-NKSPJN6X.mjs";
102
102
  import {
103
103
  __export
104
104
  } from "./chunk-VSOWNKPA.mjs";
@@ -2232,4 +2232,4 @@ export {
2232
2232
  createSemanticIndexWorkerRuntimeClient,
2233
2233
  semantic_index_exports
2234
2234
  };
2235
- //# sourceMappingURL=chunk-F4HVCFZL.mjs.map
2235
+ //# sourceMappingURL=chunk-3K7F2SRZ.mjs.map
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  DataDirCompatibilityError,
12
12
  assertDataDirCompatible
13
- } from "./chunk-HBAQPF6X.mjs";
13
+ } from "./chunk-NKSPJN6X.mjs";
14
14
 
15
15
  // src/runtime-compat.ts
16
16
  function assertCliDataDirCompatible(pathProvider, kind, options) {
@@ -37,4 +37,4 @@ function formatCliDataDirCompatibilityError(error, runtime) {
37
37
  export {
38
38
  assertCliDataDirCompatible
39
39
  };
40
- //# sourceMappingURL=chunk-FCUUAGGC.mjs.map
40
+ //# sourceMappingURL=chunk-ARRFRJOH.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  createEmptyContactsDiagnostics,
10
10
  normalizeContactsTimeRangePreset,
11
11
  resolveContactsTimeRange
12
- } from "./chunk-EFX66A2O.mjs";
12
+ } from "./chunk-QP77JL6O.mjs";
13
13
  import {
14
14
  PEOPLE_RELATIONSHIPS_ALGORITHM_VERSION,
15
15
  buildPeopleRelationshipsNeighborhoodGraph,
@@ -18,7 +18,7 @@ import {
18
18
  computePeopleRelationshipsSnapshot,
19
19
  normalizePeopleRelationshipsTimeRangePreset,
20
20
  resolvePeopleRelationshipsTimeRange
21
- } from "./chunk-E6LCCPIB.mjs";
21
+ } from "./chunk-YPP3N2AX.mjs";
22
22
  import {
23
23
  ANNUAL_SUMMARY_ALGORITHM_VERSION,
24
24
  TIME_INVESTMENT_ALGORITHM_VERSION,
@@ -114,7 +114,7 @@ import {
114
114
  writeAuthProfile,
115
115
  writeParseResultToDb,
116
116
  writeTimeInvestmentSnapshot
117
- } from "./chunk-HBAQPF6X.mjs";
117
+ } from "./chunk-NKSPJN6X.mjs";
118
118
  import {
119
119
  __commonJS,
120
120
  __export,
@@ -18424,4 +18424,4 @@ export {
18424
18424
  hashImportBody,
18425
18425
  ImportIdempotencyCache
18426
18426
  };
18427
- //# sourceMappingURL=chunk-H46CLFWK.mjs.map
18427
+ //# sourceMappingURL=chunk-D6BRSG3V.mjs.map
@@ -8,14 +8,14 @@ import {
8
8
  formatPortInUseError,
9
9
  installCliLocalEmbeddingRuntime,
10
10
  isPortAvailable
11
- } from "./chunk-XQ6Z2KNN.mjs";
11
+ } from "./chunk-JWWWLW5G.mjs";
12
12
  import {
13
13
  analyzeAutoImport,
14
14
  autoImport
15
- } from "./chunk-HMVM7VCA.mjs";
15
+ } from "./chunk-NVW3ZCYD.mjs";
16
16
  import {
17
17
  assertCliDataDirCompatible
18
- } from "./chunk-FCUUAGGC.mjs";
18
+ } from "./chunk-ARRFRJOH.mjs";
19
19
  import {
20
20
  getVersion
21
21
  } from "./chunk-5ADKYYNA.mjs";
@@ -29,14 +29,14 @@ import {
29
29
  computeWordFrequency,
30
30
  getSystemLogsDir,
31
31
  hasPendingElectronDataWarning
32
- } from "./chunk-F4HVCFZL.mjs";
32
+ } from "./chunk-3K7F2SRZ.mjs";
33
33
  import {
34
34
  IMPORT_IN_PROGRESS_ERROR_KEY,
35
35
  detectFormat,
36
36
  logNativeParserStatus,
37
37
  owner_profile_service_exports,
38
38
  validateChatLabFile
39
- } from "./chunk-H46CLFWK.mjs";
39
+ } from "./chunk-D6BRSG3V.mjs";
40
40
  import {
41
41
  AIChatManager,
42
42
  ConfigSetError,
@@ -79,7 +79,7 @@ import {
79
79
  searchMessagesLike,
80
80
  setConfigField,
81
81
  verifyCliDataPath
82
- } from "./chunk-HBAQPF6X.mjs";
82
+ } from "./chunk-NKSPJN6X.mjs";
83
83
 
84
84
  // src/cli.ts
85
85
  import * as fs4 from "fs";
@@ -2314,7 +2314,7 @@ registerImportCommand(program);
2314
2314
  registerValidateCommand(program);
2315
2315
  registerRuntimeCommand(program);
2316
2316
  program.command("formats").description("List all supported chat history formats").action(async () => {
2317
- const { getSupportedFormats } = await import("./import-IAECQDKC.mjs");
2317
+ const { getSupportedFormats } = await import("./import-IALJQB7V.mjs");
2318
2318
  const formats = getSupportedFormats();
2319
2319
  console.log(`${formats.length} supported format(s):
2320
2320
  `);
@@ -2323,11 +2323,11 @@ program.command("formats").description("List all supported chat history formats"
2323
2323
  }
2324
2324
  });
2325
2325
  program.command("mcp").description("Start MCP Server (stdio transport, for ClaudeCode / Cursor / AI agents)").action(async () => {
2326
- const { startCliMcpServer } = await import("./mcp-XXSQJBGU.mjs");
2326
+ const { startCliMcpServer } = await import("./mcp-VNBL4WMM.mjs");
2327
2327
  await startCliMcpServer();
2328
2328
  });
2329
2329
  program.command("chat").description("Ask ChatLab AI about an imported chat session").option("--session-id <id>", "Source chat session ID").option("--ai-chat-id <id>", "Existing AI chat ID to continue").option("-q, --question <text>", "Question to ask").option("--json", "Output structured JSON").option("--include-events", "Include all agent stream chunks in JSON output").option("--no-stream", "Disable streaming output").option("--locale <locale>", "AI response locale", "zh-CN").action(async (options) => {
2330
- const { runChatCommand } = await import("./chat-command-G2EX7VHR.mjs");
2330
+ const { runChatCommand } = await import("./chat-command-DJKSQP6Y.mjs");
2331
2331
  const { dbManager, pathProvider } = initRuntime();
2332
2332
  const aiChatManager = new AIChatManager(pathProvider.getAiDataDir(), { nativeBinding: resolveNativeBinding() });
2333
2333
  try {
@@ -2367,7 +2367,7 @@ program.command("web").alias("start").description("Start ChatLab (HTTP API + Web
2367
2367
  });
2368
2368
  return;
2369
2369
  }
2370
- const { startHttpServer } = await import("./http-5BRVWAJR.mjs");
2370
+ const { startHttpServer } = await import("./http-O4AZUIOD.mjs");
2371
2371
  const port = parseInt(options.port, 10);
2372
2372
  let webRoot;
2373
2373
  if (!options.headless) {
@@ -2430,7 +2430,7 @@ Press Ctrl+C to stop.
2430
2430
  }
2431
2431
  const shutdown = async () => {
2432
2432
  console.log("\nShutting down...");
2433
- const { stopHttpServer } = await import("./http-5BRVWAJR.mjs");
2433
+ const { stopHttpServer } = await import("./http-O4AZUIOD.mjs");
2434
2434
  await stopHttpServer();
2435
2435
  process.exit(0);
2436
2436
  };
@@ -2523,4 +2523,4 @@ if (isDirectRun) {
2523
2523
  export {
2524
2524
  run
2525
2525
  };
2526
- //# sourceMappingURL=chunk-YI3EQYEG.mjs.map
2526
+ //# sourceMappingURL=chunk-DJ7QEJNO.mjs.map
@@ -6,7 +6,7 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  createLocalEmbeddingRuntimeManager
9
- } from "./chunk-H46CLFWK.mjs";
9
+ } from "./chunk-D6BRSG3V.mjs";
10
10
 
11
11
  // src/http/port.ts
12
12
  import * as fs from "fs/promises";
@@ -98,4 +98,4 @@ export {
98
98
  resolveCliLocalEmbeddingRuntimeConfig,
99
99
  installCliLocalEmbeddingRuntime
100
100
  };
101
- //# sourceMappingURL=chunk-XQ6Z2KNN.mjs.map
101
+ //# sourceMappingURL=chunk-JWWWLW5G.mjs.map