chatlab-cli 0.36.0 → 0.36.2

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 (200) hide show
  1. package/README.md +7 -7
  2. package/dist/{chat-command-SXW67RF7.mjs → chat-command-SEV6N3AR.mjs} +10 -10
  3. package/dist/chat-command-SEV6N3AR.mjs.map +1 -0
  4. package/dist/{chunk-UNIKQFI5.mjs → chunk-6E46U4H2.mjs} +2 -2
  5. package/dist/{chunk-AAGDVTP2.mjs → chunk-6EZPD3XJ.mjs} +2 -2
  6. package/dist/{chunk-VDWI4A4U.mjs → chunk-CH5YAZ4Q.mjs} +2 -2
  7. package/dist/{chunk-JHON5FN7.mjs → chunk-HWIXK7SU.mjs} +8 -3
  8. package/dist/chunk-HWIXK7SU.mjs.map +1 -0
  9. package/dist/{chunk-U2NXHIJK.mjs → chunk-TJ3NOBVI.mjs} +3 -3
  10. package/dist/{chunk-OWOEWZIC.mjs → chunk-TRGR3KKJ.mjs} +84 -28
  11. package/dist/chunk-TRGR3KKJ.mjs.map +1 -0
  12. package/dist/{chunk-GVW3BDGZ.mjs → chunk-TWH422HC.mjs} +3 -3
  13. package/dist/{chunk-4YPNYQSP.mjs → chunk-VREVDZ4Q.mjs} +390 -96
  14. package/dist/chunk-VREVDZ4Q.mjs.map +1 -0
  15. package/dist/{chunk-XDF6PMVZ.mjs → chunk-VUYWUHWW.mjs} +2 -2
  16. package/dist/{chunk-BSGLH6G3.mjs → chunk-WJQOXOMR.mjs} +147 -80
  17. package/dist/chunk-WJQOXOMR.mjs.map +1 -0
  18. package/dist/{chunk-CNEWMCGX.mjs → chunk-WRBFV2GX.mjs} +57 -57
  19. package/dist/chunk-WRBFV2GX.mjs.map +1 -0
  20. package/dist/{chunk-LZGOIRLV.mjs → chunk-YUH3H3QW.mjs} +9 -5
  21. package/dist/chunk-YUH3H3QW.mjs.map +1 -0
  22. package/dist/cli.mjs +9 -9
  23. package/dist/contacts-worker.mjs +2 -2
  24. package/dist/global-insight-worker.mjs +1 -1
  25. package/dist/{http-LVOGJFDL.mjs → http-237XYNRT.mjs} +12 -12
  26. package/dist/{import-7OU57ZHM.mjs → import-R2E2TFAK.mjs} +7 -7
  27. package/dist/index.mjs +12 -12
  28. package/dist/{mcp-CUKHTTII.mjs → mcp-BED4AARV.mjs} +8 -8
  29. package/dist/people-relationships-worker.mjs +2 -2
  30. package/dist/semantic-index-worker.mjs +1 -1
  31. package/dist/{service-KZTHBDQ5.mjs → service-ZAHXRSFD.mjs} +6 -6
  32. package/dist/service-ZAHXRSFD.mjs.map +1 -0
  33. package/dist/{src-LORFXAUE.mjs → src-AYMALWU5.mjs} +10 -6
  34. package/dist/{stream-import-7YUWIAD6.mjs → stream-import-RXNSOOYH.mjs} +7 -7
  35. package/dist/{undici-MU5I3L6Q.mjs → undici-UGXDRJLV.mjs} +193 -193
  36. package/dist/undici-UGXDRJLV.mjs.map +1 -0
  37. package/dist/{update-checker-3N7HQEP2.mjs → update-checker-UL2FBLXH.mjs} +3 -5
  38. package/dist/{update-checker-3N7HQEP2.mjs.map → update-checker-UL2FBLXH.mjs.map} +1 -1
  39. package/dist/{worker-runtime-GQ5SY7E3.mjs → worker-runtime-JGAZU7MC.mjs} +5 -5
  40. package/dist-cli-web/assets/AISettingsTab-VgI7PiJd.js +1 -0
  41. package/dist-cli-web/assets/AboutTab-DCM1-glA.js +1 -0
  42. package/dist-cli-web/assets/ActionToolsPanel-BTGgwXVD.css +1 -0
  43. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-a7RMjjve.js +112 -0
  44. package/dist-cli-web/assets/{Alert-DJzXKcec.js → Alert-D-egBWcb.js} +1 -1
  45. package/dist-cli-web/assets/ApiSettingsTab-Co3LWf1f.js +2 -0
  46. package/dist-cli-web/assets/BatchManageTab-2LrckmQm.js +1 -0
  47. package/dist-cli-web/assets/{BufferResource-DY3P-dGs.js → BufferResource-BE2_2bZK.js} +1 -1
  48. package/dist-cli-web/assets/{CanvasRenderer-As2MJTWZ.js → CanvasRenderer-DDKdvEYQ.js} +1 -1
  49. package/dist-cli-web/assets/ChatRecordDrawer-DRhztqLG.js +1 -0
  50. package/dist-cli-web/assets/{ChatRecordWorkspace-CVDPBmcl.js → ChatRecordWorkspace-DqUI4QiU.js} +1 -1
  51. package/dist-cli-web/assets/{Checkbox-4F1WAuVF.js → Checkbox-EfpQmv4A.js} +1 -1
  52. package/dist-cli-web/assets/DataDirCleanupNotice-BYIiR58J.js +1 -0
  53. package/dist-cli-web/assets/DatePicker.vue_vue_type_script_setup_true_lang-sPDoPzZ9.js +1 -0
  54. package/dist-cli-web/assets/{DebugToolsPanel-BLU6SY8a.js → DebugToolsPanel-BIHA6jw4.js} +1 -1
  55. package/dist-cli-web/assets/EChart.vue_vue_type_script_setup_true_lang-DryMSoCz.js +1 -0
  56. package/dist-cli-web/assets/EChartBar.vue_vue_type_script_setup_true_lang-BdFW-hvt.js +1 -0
  57. package/dist-cli-web/assets/{EChartLine.vue_vue_type_script_setup_true_lang-BYhukELX.js → EChartLine.vue_vue_type_script_setup_true_lang-C69Kdw9X.js} +1 -1
  58. package/dist-cli-web/assets/{EChartWordcloud-C16xh7Tx.js → EChartWordcloud-DM7UEHdK.js} +1 -1
  59. package/dist-cli-web/assets/{Filter-BEtPORqF.js → Filter-kO4dIDJ2.js} +1 -1
  60. package/dist-cli-web/assets/GlobalTaskBar-BZS_h0zC.js +1 -0
  61. package/dist-cli-web/assets/GroupRelationshipGalaxyView--WIaHx_F.js +1 -0
  62. package/dist-cli-web/assets/{Label-Dgl3ghzT.js → Label-CIuDXyeM.js} +1 -1
  63. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-B_7VHxTx.js +1 -0
  64. package/dist-cli-web/assets/MessageExportModal-BQsIpyxv.js +1 -0
  65. package/dist-cli-web/assets/{PageHeader-CL9AFfvl.js → PageHeader-DxhQHF_0.js} +1 -1
  66. package/dist-cli-web/assets/{PageTabs.vue_vue_type_script_setup_true_lang-C22kOxIK.js → PageTabs.vue_vue_type_script_setup_true_lang-Cgungbjl.js} +1 -1
  67. package/dist-cli-web/assets/{RelationshipGalaxyCanvas-BnkcrIpk.js → RelationshipGalaxyCanvas-Cod1JX9m.js} +14 -14
  68. package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-CCasBcBQ.css +1 -0
  69. package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-CkefzeFJ.js +4168 -0
  70. package/dist-cli-web/assets/{RenderTargetSystem-CPwnC2X3.js → RenderTargetSystem-SuQ7cbze.js} +1 -1
  71. package/dist-cli-web/assets/RovingFocusItem-psoFYxrC.js +1 -0
  72. package/dist-cli-web/assets/{ScreenCaptureModal-ByKxzNQe.js → ScreenCaptureModal-D4r9ixKh.js} +1 -1
  73. package/dist-cli-web/assets/SectionTabs.vue_vue_type_script_setup_true_lang-v_7aRBgM.js +1 -0
  74. package/dist-cli-web/assets/{Select-jVtfc_xc.js → Select-CxurgslB.js} +1 -1
  75. package/dist-cli-web/assets/SettingsModal-BFkxzo0Y.css +1 -0
  76. package/dist-cli-web/assets/SettingsModal-DBZucuf6.js +2 -0
  77. package/dist-cli-web/assets/{StorageTab-QdcDqA6Q.js → StorageTab-DhSJ-0Ir.js} +1 -1
  78. package/dist-cli-web/assets/{Switch-DYHM64k9.js → Switch-3D81G6uV.js} +1 -1
  79. package/dist-cli-web/assets/Tabs-Bnm_Q7yW.js +1 -0
  80. package/dist-cli-web/assets/{Tabs-B6Nzq2NQ.js → Tabs-DB603EEu.js} +1 -1
  81. package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-Bsq7gpC0.js → ThemeCard.vue_vue_type_script_setup_true_lang-BDTdkH5i.js} +1 -1
  82. package/dist-cli-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-Cjz8Wpg-.js +1 -0
  83. package/dist-cli-web/assets/{VisuallyHiddenInput-IQpmK9yR.js → VisuallyHiddenInput-Bo_XwaLu.js} +1 -1
  84. package/dist-cli-web/assets/{WebGLRenderer-8JHbnkTc.js → WebGLRenderer-D1x9WZRj.js} +1 -1
  85. package/dist-cli-web/assets/{WebGPURenderer-CLWfB4CC.js → WebGPURenderer-37Nw-tLm.js} +1 -1
  86. package/dist-cli-web/assets/aiChat-BCzYQeZq.js +8 -0
  87. package/dist-cli-web/assets/{browserAll-Cin6ghNg.js → browserAll-CWrz_-4U.js} +1 -1
  88. package/dist-cli-web/assets/{cli-web-D7IBc3AX.js → cli-web-C-8N0CJh.js} +1 -1
  89. package/dist-cli-web/assets/{fetch-2QEQPA9q.js → fetch-6pcVxB9h.js} +1 -1
  90. package/dist-cli-web/assets/{fetch-CuUeyk0N.js → fetch-B69OkB6B.js} +1 -1
  91. package/dist-cli-web/assets/{fetch-1NiXh-_B.js → fetch-BGmCCyzz.js} +1 -1
  92. package/dist-cli-web/assets/{fetch-C8tTTsCm.js → fetch-CFpLXWTe.js} +1 -1
  93. package/dist-cli-web/assets/{fetch-B7kuohCt.js → fetch-CgA1peJD.js} +1 -1
  94. package/dist-cli-web/assets/{fetch-OnnCjzee.js → fetch-CkXgOxcu.js} +1 -1
  95. package/dist-cli-web/assets/{fetch-BR71C0K9.js → fetch-DPSWt6yX.js} +1 -1
  96. package/dist-cli-web/assets/{fetch-Bk-7vxHV.js → fetch-DZ6OF-xW.js} +1 -1
  97. package/dist-cli-web/assets/{fetch-_CN1EVMt.js → fetch-Du-wU0OO.js} +1 -1
  98. package/dist-cli-web/assets/fetch-Gu4qQjUB.js +1 -0
  99. package/dist-cli-web/assets/{fetch-B2agy1hy.js → fetch-qd2FgBWQ.js} +1 -1
  100. package/dist-cli-web/assets/{fetch-DPRDSI39.js → fetch-z9M9FcIC.js} +1 -1
  101. package/dist-cli-web/assets/host-CWsAWKgy.js +1 -0
  102. package/dist-cli-web/assets/host-D8zlA62K.js +1 -0
  103. package/dist-cli-web/assets/index-BGd4ZfhO.js +2 -0
  104. package/dist-cli-web/assets/index-BYZF1ngN.js +1 -0
  105. package/dist-cli-web/assets/index-BcuwlCin.css +1 -0
  106. package/dist-cli-web/assets/index-BnaLj2dx.css +1 -0
  107. package/dist-cli-web/assets/index-Bq5q3kSU.js +36 -0
  108. package/dist-cli-web/assets/index-CPR3jdC2.js +137 -0
  109. package/dist-cli-web/assets/index-D3AjvaOX.js +1 -0
  110. package/dist-cli-web/assets/index-DAitScUA.js +1 -0
  111. package/dist-cli-web/assets/index-DBSMWAJ0.js +1 -0
  112. package/dist-cli-web/assets/index-DTn9htw-.js +64 -0
  113. package/dist-cli-web/assets/index-DV_rWxcH.js +1 -0
  114. package/dist-cli-web/assets/index-DxhAGqYM.css +1 -0
  115. package/dist-cli-web/assets/{index-Colc58j-.js → index-Dy0fRMDf.js} +1 -1
  116. package/dist-cli-web/assets/index-Dz_ddyZS.css +1 -0
  117. package/dist-cli-web/assets/index-I0mIcDpE.css +1 -0
  118. package/dist-cli-web/assets/{index-BIHFuCJK.js → index-a7CT8DQm.js} +1 -1
  119. package/dist-cli-web/assets/index-onwNShRw.js +2 -0
  120. package/dist-cli-web/assets/index-v6DlL4ue.js +1 -0
  121. package/dist-cli-web/assets/{people-page-header-DNPjaSt4.js → people-page-header-Czt9e1jv.js} +1 -1
  122. package/dist-cli-web/assets/{prompt-BgywZQ_g.js → prompt-DGazz143.js} +1 -1
  123. package/dist-cli-web/assets/{semantic-index-config-builder-bji_UxYE.js → semantic-index-config-builder-BkFHzIUy.js} +1 -1
  124. package/dist-cli-web/assets/service-BMqwB74f.js +1 -0
  125. package/dist-cli-web/assets/{service-DpU9fa-l.js → service-CAp0YJoS.js} +1 -1
  126. package/dist-cli-web/assets/service-CUQ8iHdS.js +1 -0
  127. package/dist-cli-web/assets/{useFormControl-De24E2zT.js → useFormControl-DcSMUc2d.js} +1 -1
  128. package/dist-cli-web/assets/useTable-Clmq3sge.js +1 -0
  129. package/dist-cli-web/assets/useToast-YAHDkKDN.js +1 -0
  130. package/dist-cli-web/assets/{vendor-echarts-DfAMQxdr.js → vendor-echarts-hTLhTs52.js} +5 -5
  131. package/dist-cli-web/assets/{vendor-echarts-wordcloud-BsaEJTPY.js → vendor-echarts-wordcloud-B8CF_NgP.js} +1 -1
  132. package/dist-cli-web/assets/{vendor-zrender-PFmZe1EY.js → vendor-zrender-D8psf1AA.js} +2 -2
  133. package/dist-cli-web/assets/{webworkerAll-BRnv6GvJ.js → webworkerAll-CvSp2Y8j.js} +1 -1
  134. package/dist-cli-web/index.html +2 -2
  135. package/package.json +4 -4
  136. package/dist/chat-command-SXW67RF7.mjs.map +0 -1
  137. package/dist/chunk-4YPNYQSP.mjs.map +0 -1
  138. package/dist/chunk-BSGLH6G3.mjs.map +0 -1
  139. package/dist/chunk-CNEWMCGX.mjs.map +0 -1
  140. package/dist/chunk-JHON5FN7.mjs.map +0 -1
  141. package/dist/chunk-LZGOIRLV.mjs.map +0 -1
  142. package/dist/chunk-OWOEWZIC.mjs.map +0 -1
  143. package/dist/service-KZTHBDQ5.mjs.map +0 -1
  144. package/dist/undici-MU5I3L6Q.mjs.map +0 -1
  145. package/dist-cli-web/assets/AISettingsTab-BmhNcUEh.js +0 -1
  146. package/dist-cli-web/assets/AboutTab-CFklrZt8.js +0 -1
  147. package/dist-cli-web/assets/ActionToolsPanel-Dp-ojXjO.css +0 -1
  148. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-B-dIPvcs.js +0 -110
  149. package/dist-cli-web/assets/ApiSettingsTab-DvDm421U.js +0 -2
  150. package/dist-cli-web/assets/BatchManageTab-DhIDH3Q1.js +0 -1
  151. package/dist-cli-web/assets/ChatRecordDrawer-DHdas7Jp.js +0 -1
  152. package/dist-cli-web/assets/DataDirCleanupNotice-jebQ9il3.js +0 -1
  153. package/dist-cli-web/assets/DatePicker.vue_vue_type_script_setup_true_lang-Cal624eP.js +0 -1
  154. package/dist-cli-web/assets/EChart.vue_vue_type_script_setup_true_lang-CsgJ-Xn3.js +0 -1
  155. package/dist-cli-web/assets/GlobalTaskBar-BvNmFO7q.js +0 -1
  156. package/dist-cli-web/assets/GroupRelationshipGalaxyView-DEUIrvgz.js +0 -1
  157. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-CwDIA0UP.js +0 -1
  158. package/dist-cli-web/assets/MessageExportModal-DYjhBuzO.js +0 -1
  159. package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-CqdqveEJ.js +0 -4108
  160. package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-TYGOUDiv.css +0 -1
  161. package/dist-cli-web/assets/RovingFocusItem-j33Nsbbn.js +0 -1
  162. package/dist-cli-web/assets/SectionTabs.vue_vue_type_script_setup_true_lang-C6EHKB_i.js +0 -1
  163. package/dist-cli-web/assets/SettingsModal-CjVax3I6.css +0 -1
  164. package/dist-cli-web/assets/SettingsModal-Dg27piEO.js +0 -2
  165. package/dist-cli-web/assets/Tabs-CRZdCcU4.js +0 -1
  166. package/dist-cli-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-BLpQds4F.js +0 -1
  167. package/dist-cli-web/assets/aiChat-4JvxWGXZ.js +0 -8
  168. package/dist-cli-web/assets/base-D6fxqD_X.js +0 -1
  169. package/dist-cli-web/assets/dateFormat-Bu4-Ux3L.js +0 -1
  170. package/dist-cli-web/assets/index-B4J99zv3.css +0 -1
  171. package/dist-cli-web/assets/index-BBeqtL8d.css +0 -1
  172. package/dist-cli-web/assets/index-BCEk6ZpL.js +0 -64
  173. package/dist-cli-web/assets/index-BUz_Vl9U.js +0 -2
  174. package/dist-cli-web/assets/index-BWZIoPV3.css +0 -1
  175. package/dist-cli-web/assets/index-BYQV3OA5.js +0 -1
  176. package/dist-cli-web/assets/index-CVVv_6qu.js +0 -2
  177. package/dist-cli-web/assets/index-CacwXQL4.js +0 -1
  178. package/dist-cli-web/assets/index-DImo7TQN.js +0 -1
  179. package/dist-cli-web/assets/index-DV9zQVPV.js +0 -137
  180. package/dist-cli-web/assets/index-DXKS-q-w.css +0 -1
  181. package/dist-cli-web/assets/index-DZc5A4_J.js +0 -1
  182. package/dist-cli-web/assets/index-DkWTvE7d.js +0 -36
  183. package/dist-cli-web/assets/index-DmEn0PAI.js +0 -1
  184. package/dist-cli-web/assets/index-b9eEQeVt.js +0 -1
  185. package/dist-cli-web/assets/index-waDxab2e.css +0 -1
  186. package/dist-cli-web/assets/insight-time-range-MJxLEu6o.js +0 -1
  187. package/dist-cli-web/assets/useTable-C7BH94MF.js +0 -1
  188. package/dist-cli-web/assets/useToast-CxhJkhXK.js +0 -1
  189. /package/dist/{chunk-UNIKQFI5.mjs.map → chunk-6E46U4H2.mjs.map} +0 -0
  190. /package/dist/{chunk-AAGDVTP2.mjs.map → chunk-6EZPD3XJ.mjs.map} +0 -0
  191. /package/dist/{chunk-VDWI4A4U.mjs.map → chunk-CH5YAZ4Q.mjs.map} +0 -0
  192. /package/dist/{chunk-U2NXHIJK.mjs.map → chunk-TJ3NOBVI.mjs.map} +0 -0
  193. /package/dist/{chunk-GVW3BDGZ.mjs.map → chunk-TWH422HC.mjs.map} +0 -0
  194. /package/dist/{chunk-XDF6PMVZ.mjs.map → chunk-VUYWUHWW.mjs.map} +0 -0
  195. /package/dist/{http-LVOGJFDL.mjs.map → http-237XYNRT.mjs.map} +0 -0
  196. /package/dist/{import-7OU57ZHM.mjs.map → import-R2E2TFAK.mjs.map} +0 -0
  197. /package/dist/{mcp-CUKHTTII.mjs.map → mcp-BED4AARV.mjs.map} +0 -0
  198. /package/dist/{src-LORFXAUE.mjs.map → src-AYMALWU5.mjs.map} +0 -0
  199. /package/dist/{stream-import-7YUWIAD6.mjs.map → stream-import-RXNSOOYH.mjs.map} +0 -0
  200. /package/dist/{worker-runtime-GQ5SY7E3.mjs.map → worker-runtime-JGAZU7MC.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai/logger.ts","../src/ai/manager-factory.ts","../src/ai/tool-adapter.ts","../src/ai/assistant-loader.ts","../src/ai/agent.ts","../src/ai/agent-stream-runner.ts"],"sourcesContent":["/**\n * Server 端 AI 日志\n *\n * 复用 @openchatlab/node-runtime 的 AiLogger,\n * 在 startHttpServer() 中通过 initServerAiLogger() 初始化。\n */\n\nimport { AiLogger } from '@openchatlab/node-runtime'\n\nlet logger: AiLogger | null = null\n\nexport function initServerAiLogger(logsDir: string): AiLogger {\n if (!logger) {\n logger = new AiLogger(logsDir)\n }\n return logger\n}\n\nexport function getServerAiLogger(): AiLogger | null {\n return logger\n}\n\nexport function closeServerAiLogger(): void {\n if (logger) {\n logger.close()\n logger = null\n }\n}\n","/**\n * Factory functions for creating AssistantManager and SkillManagerCore instances.\n *\n * Server-side equivalent of the Electron adapter in electron/main/ai/assistant/manager.ts.\n * Uses Node.js fs directly (no Electron dependency).\n */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { createHash, randomUUID } from 'crypto'\nimport {\n appLogger,\n AssistantManager,\n DEFAULT_GENERAL_ASSISTANT_RAW_CONFIGS,\n LEGACY_GENERAL_ASSISTANT_DIGESTS,\n SkillManagerCore,\n type AssistantManagerFs,\n type SkillManagerFs,\n} from '@openchatlab/node-runtime'\n\nconst nodeFs: AssistantManagerFs & SkillManagerFs = {\n ensureDir(dir: string) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n },\n listFiles(dir: string, ext: string) {\n if (!fs.existsSync(dir)) return []\n return fs.readdirSync(dir).filter((f) => f.endsWith(ext))\n },\n readFile(filePath: string) {\n return fs.readFileSync(filePath, 'utf-8')\n },\n writeFile(filePath: string, content: string) {\n fs.writeFileSync(filePath, content, 'utf-8')\n },\n deleteFile(filePath: string) {\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath)\n },\n fileExists(filePath: string) {\n return fs.existsSync(filePath)\n },\n joinPath(...parts: string[]) {\n return path.join(...parts)\n },\n}\n\nconst managerCache = new Map<string, { assistant: AssistantManager; skill: SkillManagerCore }>()\n\nexport function getAssistantManager(aiDataDir: string): AssistantManager {\n let cached = managerCache.get(aiDataDir)\n if (!cached) {\n cached = {\n assistant: new AssistantManager({\n fs: nodeFs,\n assistantsDir: path.join(aiDataDir, 'assistants'),\n builtinRawConfigs: DEFAULT_GENERAL_ASSISTANT_RAW_CONFIGS,\n contentHash: (content: string) => createHash('sha256').update(content).digest('hex'),\n legacyBuiltinDigests: LEGACY_GENERAL_ASSISTANT_DIGESTS,\n generateId: () => `custom_${randomUUID().replace(/-/g, '').slice(0, 12)}`,\n logger: appLogger,\n }),\n skill: new SkillManagerCore({\n fs: nodeFs,\n skillsDir: path.join(aiDataDir, 'skills'),\n builtinRawSkills: [],\n contentHash: (content: string) => createHash('md5').update(content).digest('hex'),\n }),\n }\n managerCache.set(aiDataDir, cached)\n }\n return cached.assistant\n}\n\nexport function getSkillManagerCore(aiDataDir: string): SkillManagerCore {\n let cached = managerCache.get(aiDataDir)\n if (!cached) {\n getAssistantManager(aiDataDir)\n cached = managerCache.get(aiDataDir)!\n }\n return cached.skill\n}\n","/**\n * 工具适配层\n *\n * 将 @openchatlab/tools 的 ToolDefinition 适配为 @earendil-works/pi-agent-core 的 AgentTool 格式。\n * 消息类工具返回 rawMessages 时自动执行预处理管道(清洗、去噪、脱敏、截断、格式化)。\n */\n\nimport type {\n ToolDefinition,\n ToolExecutionContext,\n SemanticSearchToolService,\n RawMessage,\n ToolTimeRange,\n} from '@openchatlab/tools'\nimport { CoreDataProvider, executeToolForAgent, toAgentToolParameters } from '@openchatlab/tools'\nimport type { DatabaseAdapter } from '@openchatlab/core'\nimport {\n applyPreprocessingPipeline,\n batchSegmentWithFrequency,\n preprocessMessages,\n type AgentTool,\n type PreprocessableMessage,\n type PreprocessConfig,\n type TruncationStrategy,\n createChartSchemaGateState,\n wrapWithChartSchemaGate,\n} from '@openchatlab/node-runtime'\nimport { getServerAiLogger } from './logger'\n\nconst DEFAULT_MAX_TOOL_RESULT_TOKENS = 8000\n\nconst TOOL_TRUNCATION_STRATEGY: Record<string, TruncationStrategy> = {\n search_messages: 'keep_first',\n deep_search_messages: 'keep_first',\n get_recent_messages: 'keep_last',\n get_message_context: 'keep_last',\n get_segment_messages: 'keep_last',\n get_conversation_between: 'keep_last',\n}\n\nexport interface ServerToolContext {\n db: DatabaseAdapter\n sessionId: string\n locale?: string\n /** 语义检索窄接口(仅当前会话可检索时由 runner 注入) */\n semanticIndexService?: SemanticSearchToolService\n /** 预处理配置(脱敏/匿名化/清洗) */\n preprocessConfig?: Record<string, unknown>\n /** 当前用户平台 id(昵称匿名化 owner 识别) */\n ownerPlatformId?: string\n /** 会话时间范围筛选(来自请求参数,供证据类工具继承) */\n timeFilter?: ToolTimeRange\n /** 关键词搜索消息条数上限 */\n maxMessagesLimit?: number\n}\n\nexport interface AdaptToolsOptions {\n maxToolResultTokens?: number\n}\n\nexport function adaptToolsForAgent(\n tools: ToolDefinition[],\n getContext: () => ServerToolContext,\n options?: AdaptToolsOptions\n): AgentTool<any, any>[] {\n const tokenBudget = options?.maxToolResultTokens ?? DEFAULT_MAX_TOOL_RESULT_TOKENS\n const chartSchemaGateState = createChartSchemaGateState()\n\n return tools.map((tool) =>\n wrapWithChartSchemaGate(\n {\n name: tool.name,\n label: tool.name,\n description: tool.description,\n parameters: toAgentToolParameters(tool.inputSchema) as any,\n executionMode: tool.executionMode,\n async execute(_toolCallId: string, params: unknown, signal, onUpdate) {\n const ctx = getContext()\n const execCtx: ToolExecutionContext = {\n db: ctx.db,\n dataProvider: new CoreDataProvider(ctx.db),\n sessionId: ctx.sessionId,\n locale: ctx.locale,\n abortSignal: signal,\n reportProgress: (progress) => onUpdate?.({ content: [], details: { progress } }),\n semanticIndexService: ctx.semanticIndexService,\n preprocessConfig: ctx.preprocessConfig,\n ownerPlatformId: ctx.ownerPlatformId,\n timeFilter: ctx.timeFilter,\n maxMessagesLimit: ctx.maxMessagesLimit,\n maxToolResultTokens: tokenBudget,\n segmentText: (texts, locale, options) => batchSegmentWithFrequency(texts, locale as any, options as any),\n desensitizeMessages: (messages: RawMessage[]): RawMessage[] =>\n preprocessMessages(\n messages as PreprocessableMessage[],\n ctx.preprocessConfig as PreprocessConfig | undefined\n ) as RawMessage[],\n }\n const result = await executeToolForAgent(tool, params, execCtx)\n const details = result.details as Record<string, unknown> | null\n if (!Array.isArray(details?.rawMessages)) return result\n\n const { rawMessages, chart, charts, ...extraDetails } = details\n const preprocessCfg = ctx.preprocessConfig as PreprocessConfig | undefined\n const pipelineResult = applyPreprocessingPipeline({\n rawMessages: rawMessages as PreprocessableMessage[],\n preprocessConfig: preprocessCfg,\n anonymizeNames: preprocessCfg?.anonymizeNames ?? false,\n ownerPlatformId: ctx.ownerPlatformId,\n locale: ctx.locale,\n maxToolResultTokens: tokenBudget,\n truncationStrategy: TOOL_TRUNCATION_STRATEGY[tool.name] ?? 'keep_last',\n extraDetails,\n logger: getServerAiLogger() ?? undefined,\n })\n const chartDetails = { ...(chart ? { chart } : {}), ...(charts ? { charts } : {}) }\n return {\n content: [{ type: 'text', text: pipelineResult.text }],\n details: Object.keys(chartDetails).length > 0 ? chartDetails : null,\n }\n },\n },\n chartSchemaGateState\n )\n )\n}\n","/**\n * 助手配置加载器\n *\n * 通过共享 AssistantManager 加载配置,确保 standalone CLI 在首次使用时\n * 也会创建默认助手,而不是绕过初始化直接读取磁盘。\n */\n\nimport type { AssistantConfig } from '@openchatlab/node-runtime'\nimport { getAssistantManager } from './manager-factory'\n\nexport function loadAssistantConfig(aiDataDir: string, assistantId: string): AssistantConfig | null {\n return getAssistantManager(aiDataDir).getAssistantConfig(assistantId)\n}\n","/**\n * 服务端 Agent\n *\n * 使用 @openchatlab/node-runtime 的 runAgentCore 编排对话流程,\n * 通过 AgentEventHandler 输出与 Electron 端一致的流式事件。\n */\n\nimport {\n DEFAULT_MAX_TOOL_ROUNDS,\n DEFAULT_CONTEXT_COMPRESSION_CONFIG,\n buildPiModel,\n buildPlanGuidance,\n createAnalysisPlanner,\n createLlmRouteDecider,\n createPlanContentBlock,\n decideRequestRoute,\n runAgentCore,\n checkAndCompress,\n buildSystemPrompt,\n createAiTranslate,\n createCompressionLlmAdapter,\n AgentEventHandler,\n formatAIError,\n shouldUseChartCapabilityForMessage,\n getChartPlannerCapabilityForMessage,\n initTokenizer,\n type AgentStreamChunk,\n type PiMessage,\n type SimpleHistoryMessage,\n type AIChatManager,\n type AgentTool,\n type DataSnapshot,\n type AIServiceConfig,\n type OwnerInfo,\n type MentionedMember,\n} from '@openchatlab/node-runtime'\nimport type { ChartAutoMode } from '@openchatlab/shared-types'\n\nimport { getServerAiLogger } from './logger'\n\nexport type { AgentStreamChunk }\n\nexport interface RunAgentOptions {\n userMessage: string\n aiChatId: string\n historyLeafMessageId?: string | null\n chatType?: 'group' | 'private'\n locale?: string\n assistantSystemPrompt?: string\n skillMenu?: string | null\n skillDef?: { name: string; prompt: string }\n tools?: AgentTool[]\n llmConfig: AIServiceConfig | null\n aiChatManager: AIChatManager\n onEvent: (event: AgentStreamChunk) => void\n abortSignal?: AbortSignal\n ownerInfo?: OwnerInfo\n mentionedMembers?: MentionedMember[]\n dataSnapshot?: DataSnapshot\n thinkingLevel?: string\n chartAutoMode?: ChartAutoMode\n}\n\nexport async function runServerAgent(options: RunAgentOptions): Promise<void> {\n const {\n userMessage,\n aiChatId,\n historyLeafMessageId,\n chatType = 'group',\n locale = 'zh-CN',\n assistantSystemPrompt,\n skillMenu,\n skillDef,\n tools = [],\n llmConfig,\n aiChatManager,\n onEvent,\n abortSignal,\n ownerInfo,\n mentionedMembers,\n dataSnapshot,\n thinkingLevel,\n chartAutoMode = 'suggest',\n } = options\n\n const aiLogger = getServerAiLogger()\n\n // 确保 tokenizer rank 表已加载(compression + agent 路径均依赖)\n await initTokenizer()\n\n if (!llmConfig) {\n onEvent({ type: 'error', error: { name: 'ConfigError', message: 'LLM service not configured' } })\n onEvent({ type: 'done', isFinished: true })\n return\n }\n\n const piModel = buildPiModel(llmConfig)\n const t = createAiTranslate(locale)\n\n let skillCtx: { skillDef?: { name: string; prompt: string }; skillMenu?: string } | undefined\n if (skillDef) {\n skillCtx = { skillDef }\n } else if (skillMenu) {\n skillCtx = { skillMenu }\n }\n\n const systemPrompt = buildSystemPrompt({\n t,\n chatType,\n assistantSystemPrompt,\n ownerInfo,\n locale,\n skillCtx,\n mentionedMembers,\n dataSnapshot,\n })\n\n const handler = new AgentEventHandler({\n onChunk: onEvent,\n context: {},\n systemPrompt,\n })\n\n if (historyLeafMessageId === undefined) {\n const llmAdapter = createCompressionLlmAdapter({\n piModel,\n apiKey: llmConfig.apiKey,\n onCompressing: () => handler.emitStatus('compressing', []),\n })\n const compressionResult = await checkAndCompress(\n aiChatId,\n DEFAULT_CONTEXT_COMPRESSION_CONFIG,\n systemPrompt,\n llmAdapter,\n aiChatManager,\n aiLogger ?? undefined\n )\n if (compressionResult.compressed) {\n onEvent({\n type: 'compression_done',\n compressionResult: {\n summaryContent: compressionResult.summaryContent ?? '',\n tokensBefore: compressionResult.tokensBefore ?? 0,\n tokensAfter: compressionResult.tokensAfter ?? 0,\n timestamp: Date.now(),\n },\n })\n }\n } else {\n aiLogger?.info?.('Compression', 'Skipping compression for edited branch request', {\n aiChatId,\n historyLeafMessageId,\n })\n }\n\n if (abortSignal?.aborted) {\n handler.emitStatus('aborted', [], { force: true })\n onEvent({ type: 'done', isFinished: true, usage: handler.cloneUsage() })\n return\n }\n\n let history: SimpleHistoryMessage[] = []\n try {\n history = aiChatManager.getHistoryForAgent(aiChatId, undefined, historyLeafMessageId)\n } catch {\n // empty history on failure\n }\n\n handler.emitStatus('preparing', [], { pendingUserMessage: userMessage, force: true })\n\n const steerMessage = t('ai.agent.answerWithoutTools')\n let cachedMessages: PiMessage[] = []\n const effectiveTools =\n chartAutoMode === 'explicit' && !shouldUseChartCapabilityForMessage(userMessage)\n ? tools.filter((tool) => tool.name !== 'render_chart')\n : tools\n\n try {\n const routeInput = {\n userMessage,\n chatType,\n locale,\n dataSnapshot,\n availableTools: effectiveTools.map((tool) => tool.name),\n availableCapabilities: [\n getChartPlannerCapabilityForMessage({\n userMessage,\n locale,\n availableTools: effectiveTools.map((tool) => tool.name),\n chartAutoMode,\n }),\n ].filter((capability) => capability !== null),\n skillSummary: skillDef?.name ?? (skillMenu ? 'auto_skill_menu' : undefined),\n }\n const routeStartedAt = Date.now()\n const routeDecision = await decideRequestRoute(routeInput, {\n llmRouter: createLlmRouteDecider({\n piModel,\n apiKey: llmConfig.apiKey,\n abortSignal,\n }),\n })\n aiLogger?.info('Router', 'Shadow route decision', {\n ...routeDecision,\n elapsedMs: Date.now() - routeStartedAt,\n availableToolCount: tools.length,\n shadowOnly: true,\n })\n onEvent({ type: 'route', routeDecision })\n\n let effectiveSystemPrompt = systemPrompt\n if (routeDecision.route === 'planned_execution') {\n const planStartedAt = Date.now()\n const planner = createAnalysisPlanner({\n piModel,\n apiKey: llmConfig.apiKey,\n onPlanDelta: (delta) => onEvent({ type: 'plan_delta', planDelta: delta }),\n onThinkingDelta: (delta) => onEvent({ type: 'think', content: delta, thinkTag: 'thinking' }),\n onThinkingEnd: (durationMs) =>\n onEvent({ type: 'think', content: '', thinkTag: 'thinking', thinkDurationMs: durationMs }),\n onValidationDelta: (delta) => onEvent({ type: 'think', content: delta, thinkTag: 'plan_validation' }),\n onValidationEnd: (durationMs) =>\n onEvent({ type: 'think', content: '', thinkTag: 'plan_validation', thinkDurationMs: durationMs }),\n })\n const plan = await planner(routeInput, abortSignal)\n if (plan) {\n const planBlock = createPlanContentBlock(plan)\n onEvent({ type: 'plan', plan: planBlock })\n effectiveSystemPrompt = `${systemPrompt}\\n\\n${buildPlanGuidance(plan)}`\n aiLogger?.info('Planner', 'Plan generated', {\n title: plan.title,\n steps: plan.steps.length,\n successCriteria: plan.successCriteria.length,\n elapsedMs: Date.now() - planStartedAt,\n })\n } else {\n aiLogger?.warn('Planner', 'Plan generation skipped or failed', {\n elapsedMs: Date.now() - planStartedAt,\n route: routeDecision.route,\n })\n onEvent({ type: 'plan_skipped' })\n }\n }\n\n const result = await runAgentCore({\n piModel,\n apiKey: llmConfig.apiKey,\n systemPrompt: effectiveSystemPrompt,\n tools: effectiveTools,\n history,\n userMessage,\n maxToolRounds: DEFAULT_MAX_TOOL_ROUNDS,\n abortSignal,\n providerSessionId: aiChatId,\n steerMessage,\n thinkingLevel: thinkingLevel as import('@openchatlab/core').ThinkingLevel | undefined,\n onConvertToLlm: (filteredMessages) => {\n cachedMessages = filteredMessages as PiMessage[]\n },\n onEvent: (coreEvent) => handler.handleCoreEvent(coreEvent, cachedMessages),\n onDebugContext: (messages) => {\n try {\n aiChatManager.setPendingDebugContext(aiChatId, JSON.stringify(messages, null, 2))\n } catch {\n // silent\n }\n },\n })\n\n if (result.error) {\n const friendlyMessage = formatAIError(result.error)\n onEvent({ type: 'error', error: { name: 'AgentError', message: friendlyMessage } })\n }\n\n handler.emitStatus('completed', cachedMessages, { force: true })\n onEvent({ type: 'done', isFinished: true, usage: result.usage })\n } catch (error) {\n const friendlyMessage = formatAIError(error)\n aiLogger?.error('ServerAgent', 'Agent execution error', { error: String(error) })\n handler.emitStatus('error', cachedMessages, { force: true })\n onEvent({ type: 'error', error: { name: 'AgentError', message: friendlyMessage } })\n onEvent({ type: 'done', isFinished: true, usage: handler.cloneUsage() })\n }\n}\n","/**\n * CLI Agent stream runner — provides runAgentStream implementation\n * for the shared HTTP route context.\n */\n\nimport type {\n DatabaseManager,\n AIChatManager,\n AgentStreamChunk,\n LLMConfigStore,\n SemanticIndexRuntime,\n} from '@openchatlab/node-runtime'\nimport {\n CHART_CAPABILITY_CORE_TOOLS,\n DEFAULT_CONTEXT_COMPRESSION_CONFIG,\n SkillManager,\n buildPiModel,\n buildSkillMenuWithBuiltinChart,\n createLlmRuntimeStores,\n createActivateSkillTool,\n createDataSnapshotFromOverview,\n getAllowedBuiltinToolsForChartAutoSkill,\n getChartCapabilitySkill,\n getSkillConfigWithBuiltinChart,\n resolveChartRuntimeForRequest,\n} from '@openchatlab/node-runtime'\nimport { getChatOverview, normalizeBuiltinToolNames } from '@openchatlab/core'\nimport type { ChartAutoMode } from '@openchatlab/shared-types'\nimport type { DataSnapshot } from '@openchatlab/node-runtime'\nimport type { AgentStreamRequest } from '@openchatlab/http-routes'\nimport { AGENT_TOOL_REGISTRY, SEMANTIC_SEARCH_TOOL_NAME } from '@openchatlab/tools'\nimport { buildSemanticSearchGuidance } from '@openchatlab/node-runtime'\nimport { adaptToolsForAgent } from './tool-adapter'\nimport { loadAssistantConfig } from './assistant-loader'\nimport { runServerAgent } from './agent'\n\nfunction getAiDir(dbManager: DatabaseManager): string {\n const pathProvider = (dbManager as any)['pathProvider']\n if (!pathProvider) {\n throw Object.assign(new Error('PathProvider not available'), { statusCode: 500 })\n }\n return pathProvider.getAiDataDir()\n}\n\nconst RAW_SQL_TOOL_NAMES = new Set(['execute_sql'])\n\nexport function getAvailableToolDefs(isChartCapability: boolean, allowedToolSet: Set<string> | null) {\n if (isChartCapability) {\n const chartCoreTools = new Set<string>(CHART_CAPABILITY_CORE_TOOLS)\n return AGENT_TOOL_REGISTRY.filter(\n (tool) =>\n chartCoreTools.has(tool.name) ||\n (tool.category === 'analysis' && allowedToolSet?.has(tool.name) && !RAW_SQL_TOOL_NAMES.has(tool.name))\n )\n }\n\n return allowedToolSet\n ? AGENT_TOOL_REGISTRY.filter((tool) => tool.category !== 'analysis' || allowedToolSet.has(tool.name))\n : AGENT_TOOL_REGISTRY\n}\n\n// 区分“未配置白名单”和“配置为空白名单”:前者无限制,后者禁用 analysis 工具。\nexport function getAllowedToolSet(\n isChartCapability: boolean,\n allowedBuiltinTools?: readonly string[]\n): Set<string> | null {\n if (isChartCapability) {\n return new Set(normalizeBuiltinToolNames(allowedBuiltinTools ?? []))\n }\n return allowedBuiltinTools === undefined ? null : new Set(normalizeBuiltinToolNames(allowedBuiltinTools))\n}\n\nexport function createCliRunAgentStream(\n dbManager: DatabaseManager,\n aiChatManager: AIChatManager,\n options: {\n llmConfigStore?: LLMConfigStore\n semanticIndexService?: SemanticIndexRuntime\n } = {}\n): (params: AgentStreamRequest, onEvent: (chunk: AgentStreamChunk) => void, abortSignal: AbortSignal) => Promise<void> {\n const aiDataDir = getAiDir(dbManager)\n const llmConfigStore = options.llmConfigStore ?? createLlmRuntimeStores(aiDataDir).llmConfigStore\n const semanticIndexService = options.semanticIndexService\n\n return async (params, onEvent, abortSignal) => {\n const {\n userMessage,\n aiChatId,\n historyLeafMessageId,\n sessionId,\n chatType,\n locale,\n assistantId,\n skillId,\n enableAutoSkill,\n chartAutoMode,\n ownerInfo,\n mentionedMembers,\n thinkingLevel,\n } = params\n\n let assistantSystemPrompt: string | undefined\n let assistantAllowedTools: string[] | undefined\n if (assistantId) {\n const assistantConfig = loadAssistantConfig(aiDataDir, assistantId)\n if (assistantConfig?.systemPrompt) {\n assistantSystemPrompt = assistantConfig.systemPrompt\n }\n assistantAllowedTools = assistantConfig?.allowedBuiltinTools\n }\n\n const llmConfig = llmConfigStore.getDefaultAssistantConfig()\n const maxToolResultPercent = DEFAULT_CONTEXT_COMPRESSION_CONFIG.maxToolResultPercent ?? 50\n const contextWindow = llmConfig ? (buildPiModel(llmConfig).contextWindow ?? 128000) : 128000\n const maxToolResultTokens = Math.floor(contextWindow * (maxToolResultPercent / 100))\n\n const db = (dbManager as any).open?.(sessionId)\n const resolvedChartAutoMode: ChartAutoMode = chartAutoMode ?? 'suggest'\n const chartRuntime = resolveChartRuntimeForRequest({\n skillId,\n userMessage,\n locale,\n assistantAllowedTools,\n enableAutoDetection: enableAutoSkill === true,\n chartAutoMode: resolvedChartAutoMode,\n })\n const isChartCapability = chartRuntime.isChartCapability\n const autoSkillAllowedTools =\n !skillId && enableAutoSkill && resolvedChartAutoMode !== 'explicit'\n ? getAllowedBuiltinToolsForChartAutoSkill(assistantAllowedTools)\n : assistantAllowedTools\n const allowedToolSet = getAllowedToolSet(\n isChartCapability,\n isChartCapability ? chartRuntime.allowedBuiltinTools : autoSkillAllowedTools\n )\n const availableToolDefs = getAvailableToolDefs(isChartCapability, allowedToolSet)\n\n // 语义检索按需暴露:仅当前会话可检索时保留工具,否则从工具集中过滤掉以减少 schema token 与无效调用。\n const canSemanticSearch = !!db && !!semanticIndexService && (await semanticIndexService.canSearch(sessionId))\n const filteredToolDefs = canSemanticSearch\n ? availableToolDefs\n : availableToolDefs.filter((tool) => tool.name !== SEMANTIC_SEARCH_TOOL_NAME)\n\n const agentTools = db\n ? adaptToolsForAgent(\n filteredToolDefs,\n () => ({\n db,\n sessionId,\n locale,\n semanticIndexService,\n preprocessConfig: params.preprocessConfig,\n ownerPlatformId: ownerInfo?.platformId,\n timeFilter: params.timeFilter,\n maxMessagesLimit: params.maxMessagesLimit,\n }),\n { maxToolResultTokens }\n )\n : []\n\n // 工具可用时向 system prompt 加简短引导,提示何时调用语义检索。\n if (canSemanticSearch) {\n assistantSystemPrompt = [assistantSystemPrompt, buildSemanticSearchGuidance(locale)].filter(Boolean).join('\\n\\n')\n }\n\n const skillMgr = new SkillManager(aiDataDir)\n skillMgr.init()\n const toolNames = agentTools.map((t: { name: string }) => t.name)\n\n let resolvedSkillDef: { name: string; prompt: string } | undefined\n let resolvedSkillMenu: string | undefined\n if (isChartCapability) {\n const def = chartRuntime.skillDef ?? getChartCapabilitySkill(locale ?? 'zh-CN')\n resolvedSkillDef = { name: def.name, prompt: def.prompt }\n } else if (skillId) {\n const def = skillMgr.getSkillConfig(skillId)\n if (def) resolvedSkillDef = { name: def.name, prompt: def.prompt }\n } else if (enableAutoSkill) {\n const baseMenu = skillMgr.getSkillMenu(chatType ?? 'group', toolNames)\n const menu =\n resolvedChartAutoMode === 'aggressive' ? buildSkillMenuWithBuiltinChart(baseMenu, locale, toolNames) : baseMenu\n if (menu) resolvedSkillMenu = menu\n }\n\n if (resolvedSkillMenu) {\n const activateSkillTool = createActivateSkillTool({\n chatType: chatType ?? 'group',\n allowedTools: toolNames,\n coreToolNames: new Set<string>(CHART_CAPABILITY_CORE_TOOLS),\n locale,\n getSkillConfig: (id) =>\n resolvedChartAutoMode === 'aggressive'\n ? getSkillConfigWithBuiltinChart(id, locale, (skillConfigId) => skillMgr.getSkillConfig(skillConfigId))\n : skillMgr.getSkillConfig(id),\n })\n agentTools.push(activateSkillTool as any)\n }\n\n let dataSnapshot: DataSnapshot | undefined\n if (db) {\n try {\n dataSnapshot = createDataSnapshotFromOverview(getChatOverview(db, 10))\n } catch {\n // non-fatal\n }\n }\n\n await runServerAgent({\n userMessage,\n aiChatId,\n historyLeafMessageId,\n chatType,\n locale,\n assistantSystemPrompt,\n skillMenu: resolvedSkillMenu,\n skillDef: resolvedSkillDef,\n tools: agentTools,\n llmConfig,\n aiChatManager,\n onEvent,\n abortSignal,\n ownerInfo,\n mentionedMembers,\n dataSnapshot,\n thinkingLevel,\n chartAutoMode: resolvedChartAutoMode,\n })\n }\n}\n"],"mappings":"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","names":["options"]}
package/dist/cli.mjs CHANGED
@@ -6,19 +6,19 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  run
9
- } from "./chunk-CNEWMCGX.mjs";
10
- import "./chunk-UNIKQFI5.mjs";
9
+ } from "./chunk-WRBFV2GX.mjs";
10
+ import "./chunk-6E46U4H2.mjs";
11
11
  import "./chunk-5FGB42EQ.mjs";
12
- import "./chunk-GVW3BDGZ.mjs";
13
- import "./chunk-VDWI4A4U.mjs";
12
+ import "./chunk-TWH422HC.mjs";
13
+ import "./chunk-CH5YAZ4Q.mjs";
14
14
  import "./chunk-5ADKYYNA.mjs";
15
15
  import "./chunk-FJ35V3TE.mjs";
16
- import "./chunk-U2NXHIJK.mjs";
17
- import "./chunk-4YPNYQSP.mjs";
18
- import "./chunk-XDF6PMVZ.mjs";
19
- import "./chunk-AAGDVTP2.mjs";
16
+ import "./chunk-TJ3NOBVI.mjs";
17
+ import "./chunk-VREVDZ4Q.mjs";
18
+ import "./chunk-VUYWUHWW.mjs";
19
+ import "./chunk-6EZPD3XJ.mjs";
20
20
  import "./chunk-YKMQLAVP.mjs";
21
- import "./chunk-OWOEWZIC.mjs";
21
+ import "./chunk-TRGR3KKJ.mjs";
22
22
  import "./chunk-VSOWNKPA.mjs";
23
23
  export {
24
24
  run
@@ -6,14 +6,14 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  computeContactsSnapshot
9
- } from "./chunk-XDF6PMVZ.mjs";
9
+ } from "./chunk-VUYWUHWW.mjs";
10
10
  import {
11
11
  DatabaseManager,
12
12
  StaticPathProvider,
13
13
  createDatabaseManagerAdapter,
14
14
  getContactsFactsCacheDir,
15
15
  initAppLogger
16
- } from "./chunk-OWOEWZIC.mjs";
16
+ } from "./chunk-TRGR3KKJ.mjs";
17
17
  import "./chunk-VSOWNKPA.mjs";
18
18
 
19
19
  // ../../packages/node-runtime/src/services/contacts/worker-entry.ts
@@ -26,7 +26,7 @@ import {
26
26
  initAppLogger,
27
27
  setCache,
28
28
  toAnnualSummaryRangeKey
29
- } from "./chunk-OWOEWZIC.mjs";
29
+ } from "./chunk-TRGR3KKJ.mjs";
30
30
  import "./chunk-VSOWNKPA.mjs";
31
31
 
32
32
  // ../../packages/node-runtime/src/services/global-insight/worker-entry.ts
@@ -9,21 +9,21 @@ import {
9
9
  registerWebRoutes,
10
10
  startHttpServer,
11
11
  stopHttpServer
12
- } from "./chunk-BSGLH6G3.mjs";
13
- import "./chunk-LZGOIRLV.mjs";
14
- import "./chunk-JHON5FN7.mjs";
15
- import "./chunk-UNIKQFI5.mjs";
12
+ } from "./chunk-WJQOXOMR.mjs";
13
+ import "./chunk-YUH3H3QW.mjs";
14
+ import "./chunk-HWIXK7SU.mjs";
15
+ import "./chunk-6E46U4H2.mjs";
16
16
  import "./chunk-5FGB42EQ.mjs";
17
- import "./chunk-GVW3BDGZ.mjs";
18
- import "./chunk-VDWI4A4U.mjs";
17
+ import "./chunk-TWH422HC.mjs";
18
+ import "./chunk-CH5YAZ4Q.mjs";
19
19
  import "./chunk-5ADKYYNA.mjs";
20
20
  import "./chunk-FJ35V3TE.mjs";
21
- import "./chunk-U2NXHIJK.mjs";
22
- import "./chunk-4YPNYQSP.mjs";
23
- import "./chunk-XDF6PMVZ.mjs";
24
- import "./chunk-AAGDVTP2.mjs";
21
+ import "./chunk-TJ3NOBVI.mjs";
22
+ import "./chunk-VREVDZ4Q.mjs";
23
+ import "./chunk-VUYWUHWW.mjs";
24
+ import "./chunk-6EZPD3XJ.mjs";
25
25
  import "./chunk-YKMQLAVP.mjs";
26
- import "./chunk-OWOEWZIC.mjs";
26
+ import "./chunk-TRGR3KKJ.mjs";
27
27
  import "./chunk-VSOWNKPA.mjs";
28
28
  export {
29
29
  createServer,
@@ -31,4 +31,4 @@ export {
31
31
  startHttpServer,
32
32
  stopHttpServer
33
33
  };
34
- //# sourceMappingURL=http-LVOGJFDL.mjs.map
34
+ //# sourceMappingURL=http-237XYNRT.mjs.map
@@ -13,8 +13,8 @@ import {
13
13
  autoImportBatch,
14
14
  incrementalImport,
15
15
  streamImport
16
- } from "./chunk-GVW3BDGZ.mjs";
17
- import "./chunk-U2NXHIJK.mjs";
16
+ } from "./chunk-TWH422HC.mjs";
17
+ import "./chunk-TJ3NOBVI.mjs";
18
18
  import {
19
19
  detectAllFormats,
20
20
  detectFormat,
@@ -22,11 +22,11 @@ import {
22
22
  getFormatFeatureById,
23
23
  getSupportedFormats,
24
24
  scanMultiChatFile
25
- } from "./chunk-4YPNYQSP.mjs";
26
- import "./chunk-XDF6PMVZ.mjs";
27
- import "./chunk-AAGDVTP2.mjs";
25
+ } from "./chunk-VREVDZ4Q.mjs";
26
+ import "./chunk-VUYWUHWW.mjs";
27
+ import "./chunk-6EZPD3XJ.mjs";
28
28
  import "./chunk-YKMQLAVP.mjs";
29
- import "./chunk-OWOEWZIC.mjs";
29
+ import "./chunk-TRGR3KKJ.mjs";
30
30
  import "./chunk-VSOWNKPA.mjs";
31
31
  export {
32
32
  analyzeAutoImport,
@@ -43,4 +43,4 @@ export {
43
43
  scanMultiChatFile,
44
44
  streamImport
45
45
  };
46
- //# sourceMappingURL=import-7OU57ZHM.mjs.map
46
+ //# sourceMappingURL=import-R2E2TFAK.mjs.map
package/dist/index.mjs CHANGED
@@ -7,24 +7,24 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  startHttpServer,
9
9
  stopHttpServer
10
- } from "./chunk-BSGLH6G3.mjs";
11
- import "./chunk-LZGOIRLV.mjs";
12
- import "./chunk-JHON5FN7.mjs";
10
+ } from "./chunk-WJQOXOMR.mjs";
11
+ import "./chunk-YUH3H3QW.mjs";
12
+ import "./chunk-HWIXK7SU.mjs";
13
13
  import {
14
14
  run
15
- } from "./chunk-CNEWMCGX.mjs";
16
- import "./chunk-UNIKQFI5.mjs";
15
+ } from "./chunk-WRBFV2GX.mjs";
16
+ import "./chunk-6E46U4H2.mjs";
17
17
  import "./chunk-5FGB42EQ.mjs";
18
- import "./chunk-GVW3BDGZ.mjs";
19
- import "./chunk-VDWI4A4U.mjs";
18
+ import "./chunk-TWH422HC.mjs";
19
+ import "./chunk-CH5YAZ4Q.mjs";
20
20
  import "./chunk-5ADKYYNA.mjs";
21
21
  import "./chunk-FJ35V3TE.mjs";
22
- import "./chunk-U2NXHIJK.mjs";
23
- import "./chunk-4YPNYQSP.mjs";
24
- import "./chunk-XDF6PMVZ.mjs";
25
- import "./chunk-AAGDVTP2.mjs";
22
+ import "./chunk-TJ3NOBVI.mjs";
23
+ import "./chunk-VREVDZ4Q.mjs";
24
+ import "./chunk-VUYWUHWW.mjs";
25
+ import "./chunk-6EZPD3XJ.mjs";
26
26
  import "./chunk-YKMQLAVP.mjs";
27
- import "./chunk-OWOEWZIC.mjs";
27
+ import "./chunk-TRGR3KKJ.mjs";
28
28
  import "./chunk-VSOWNKPA.mjs";
29
29
  export {
30
30
  run,
@@ -7,10 +7,10 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  CoreDataProvider,
9
9
  MCP_TOOL_REGISTRY
10
- } from "./chunk-JHON5FN7.mjs";
10
+ } from "./chunk-HWIXK7SU.mjs";
11
11
  import {
12
12
  assertCliDataDirCompatible
13
- } from "./chunk-VDWI4A4U.mjs";
13
+ } from "./chunk-CH5YAZ4Q.mjs";
14
14
  import {
15
15
  getVersion
16
16
  } from "./chunk-5ADKYYNA.mjs";
@@ -20,10 +20,10 @@ import {
20
20
  import {
21
21
  NodePathProvider,
22
22
  hasPendingElectronDataWarning
23
- } from "./chunk-U2NXHIJK.mjs";
24
- import "./chunk-4YPNYQSP.mjs";
25
- import "./chunk-XDF6PMVZ.mjs";
26
- import "./chunk-AAGDVTP2.mjs";
23
+ } from "./chunk-TJ3NOBVI.mjs";
24
+ import "./chunk-VREVDZ4Q.mjs";
25
+ import "./chunk-VUYWUHWW.mjs";
26
+ import "./chunk-6EZPD3XJ.mjs";
27
27
  import "./chunk-YKMQLAVP.mjs";
28
28
  import {
29
29
  DatabaseManager,
@@ -32,7 +32,7 @@ import {
32
32
  getSessionOverview,
33
33
  loadConfig,
34
34
  verifyCliDataPath
35
- } from "./chunk-OWOEWZIC.mjs";
35
+ } from "./chunk-TRGR3KKJ.mjs";
36
36
  import "./chunk-VSOWNKPA.mjs";
37
37
 
38
38
  // src/mcp.ts
@@ -416,4 +416,4 @@ export {
416
416
  initMcpRuntime,
417
417
  startCliMcpServer
418
418
  };
419
- //# sourceMappingURL=mcp-CUKHTTII.mjs.map
419
+ //# sourceMappingURL=mcp-BED4AARV.mjs.map
@@ -6,14 +6,14 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  computePeopleRelationshipsSnapshot
9
- } from "./chunk-AAGDVTP2.mjs";
9
+ } from "./chunk-6EZPD3XJ.mjs";
10
10
  import {
11
11
  DatabaseManager,
12
12
  StaticPathProvider,
13
13
  createDatabaseManagerAdapter,
14
14
  getPeopleRelationshipsFactsCacheDir,
15
15
  initAppLogger
16
- } from "./chunk-OWOEWZIC.mjs";
16
+ } from "./chunk-TRGR3KKJ.mjs";
17
17
  import "./chunk-VSOWNKPA.mjs";
18
18
 
19
19
  // ../../packages/node-runtime/src/services/people/relationships/worker-entry.ts
@@ -9,7 +9,7 @@ const __dirname = __pathDirname(__filename);
9
9
  import { parentPort, workerData } from "worker_threads";
10
10
  var startup = workerData;
11
11
  async function main() {
12
- const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-GQ5SY7E3.mjs");
12
+ const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-JGAZU7MC.mjs");
13
13
  const runtime = createSemanticIndexWorkerRuntime({
14
14
  serviceFactory: createSemanticIndexWorkerServiceFactory(startup)
15
15
  });
@@ -43,7 +43,7 @@ function buildPlist(options) {
43
43
  const port = options.port ?? 3110;
44
44
  const host = options.host ?? "127.0.0.1";
45
45
  const cliEntry = resolveCliPath("bin/chatlab.mjs");
46
- const args = ["start", "--no-open", "--port", String(port), "--host", host];
46
+ const args = ["web", "--no-open", "--port", String(port), "--host", host];
47
47
  if (options.token) args.push("--token", options.token);
48
48
  if (options.headless) args.push("--headless");
49
49
  if (options.requireAuth) args.push("--require-auth");
@@ -111,7 +111,7 @@ ChatLab is now running as a system service`);
111
111
  console.log(` Logs: ${LOG_FILE}`);
112
112
  console.log(` Service: ${SERVICE_LABEL} (launchd)`);
113
113
  console.log(`
114
- Auto-starts on login. Use \`chatlab stop\` to remove.
114
+ Auto-starts on login. Use \`clb stop\` to remove.
115
115
  `);
116
116
  }
117
117
  function uninstallMacos() {
@@ -147,7 +147,7 @@ function buildUnit(options) {
147
147
  const port = options.port ?? 3110;
148
148
  const host = options.host ?? "127.0.0.1";
149
149
  const cliEntry = resolveCliPath("bin/chatlab.mjs");
150
- const args = ["start", "--no-open", "--port", String(port), "--host", host];
150
+ const args = ["web", "--no-open", "--port", String(port), "--host", host];
151
151
  if (options.token) args.push("--token", options.token);
152
152
  if (options.headless) args.push("--headless");
153
153
  if (options.requireAuth) args.push("--require-auth");
@@ -186,7 +186,7 @@ ChatLab is now running as a system service`);
186
186
  console.log(` Logs: ${LOG_FILE}`);
187
187
  console.log(` Unit: ${SYSTEMD_SERVICE} (systemd)`);
188
188
  console.log(`
189
- Auto-starts on login. Use \`chatlab stop\` to remove.
189
+ Auto-starts on login. Use \`clb stop\` to remove.
190
190
  `);
191
191
  }
192
192
  function uninstallLinux() {
@@ -227,7 +227,7 @@ function serviceInstall(options) {
227
227
  return installLinux(options);
228
228
  default:
229
229
  console.error("Windows is not yet supported for daemon mode.");
230
- console.error("Please use `chatlab start` to run in the foreground instead.");
230
+ console.error("Please use `clb web` to run in the foreground instead.");
231
231
  process.exit(1);
232
232
  }
233
233
  }
@@ -257,4 +257,4 @@ export {
257
257
  serviceInstall,
258
258
  serviceUninstall
259
259
  };
260
- //# sourceMappingURL=service-KZTHBDQ5.mjs.map
260
+ //# sourceMappingURL=service-ZAHXRSFD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daemon/service.ts"],"sourcesContent":["/**\n * System service management — register ChatLab as a launchd (macOS) or\n * systemd --user (Linux) service for auto-start on login and crash recovery.\n *\n * macOS : ~/Library/LaunchAgents/fun.chatlab.daemon.plist\n * Linux : ~/.config/systemd/user/chatlab.service\n * Meta : ~/.chatlab/daemon.json { port, host, installedAt }\n */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\nimport { execSync } from 'child_process'\nimport { resolveCliPath } from '../paths'\n\nconst SERVICE_LABEL = 'fun.chatlab.daemon'\nconst PLIST_PATH = path.join(os.homedir(), 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`)\nconst SYSTEMD_DIR = path.join(os.homedir(), '.config', 'systemd', 'user')\nconst SYSTEMD_SERVICE = path.join(SYSTEMD_DIR, 'chatlab.service')\nconst SYSTEM_DIR = path.join(os.homedir(), '.chatlab')\nconst LOG_FILE = path.join(SYSTEM_DIR, 'logs', 'daemon.log')\nconst META_FILE = path.join(SYSTEM_DIR, 'daemon.json')\n\ninterface DaemonMeta {\n port: number\n host: string\n installedAt: string\n}\n\nfunction writeMeta(meta: DaemonMeta): void {\n fs.mkdirSync(SYSTEM_DIR, { recursive: true })\n fs.writeFileSync(META_FILE, JSON.stringify(meta, null, 2))\n}\n\nfunction readMeta(): DaemonMeta | null {\n try {\n if (!fs.existsSync(META_FILE)) return null\n return JSON.parse(fs.readFileSync(META_FILE, 'utf-8')) as DaemonMeta\n } catch {\n return null\n }\n}\n\nfunction removeMeta(): void {\n try {\n fs.unlinkSync(META_FILE)\n } catch {\n // already removed, ignore\n }\n}\n\n// ── Public types ──────────────────────────────────────────────────────\n\nexport interface ServiceInstallOptions {\n port?: number\n host?: string\n token?: string\n headless?: boolean\n requireAuth?: boolean\n}\n\nexport interface ServiceStatus {\n installed: boolean\n running: boolean\n port?: number\n host?: string\n}\n\n// ── macOS (launchd) ───────────────────────────────────────────────────\n\nfunction buildPlist(options: ServiceInstallOptions): string {\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n const cliEntry = resolveCliPath('bin/chatlab.mjs')\n const args = ['web', '--no-open', '--port', String(port), '--host', host]\n if (options.token) args.push('--token', options.token)\n if (options.headless) args.push('--headless')\n if (options.requireAuth) args.push('--require-auth')\n\n const programArgs = [process.execPath, cliEntry, ...args].map((a) => ` <string>${a}</string>`).join('\\n')\n\n fs.mkdirSync(path.join(SYSTEM_DIR, 'logs'), { recursive: true })\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${SERVICE_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n${programArgs}\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${LOG_FILE}</string>\n <key>StandardErrorPath</key>\n <string>${LOG_FILE}</string>\n</dict>\n</plist>\n`\n}\n\nfunction getUid(): string {\n return execSync('id -u', { encoding: 'utf-8' }).trim()\n}\n\nfunction launchctlLoad(plistPath: string): void {\n try {\n execSync(`launchctl bootstrap gui/${getUid()} \"${plistPath}\"`, { stdio: 'pipe' })\n } catch {\n try {\n execSync(`launchctl load \"${plistPath}\"`, { stdio: 'pipe' })\n } catch (err) {\n throw new Error(`launchctl load failed: ${err instanceof Error ? err.message : err}`)\n }\n }\n}\n\nfunction launchctlUnload(plistPath: string): void {\n try {\n execSync(`launchctl bootout gui/${getUid()}/${SERVICE_LABEL}`, { stdio: 'pipe' })\n } catch {\n try {\n execSync(`launchctl unload \"${plistPath}\"`, { stdio: 'pipe' })\n } catch {\n // already unloaded, ignore\n }\n }\n}\n\nfunction installMacos(options: ServiceInstallOptions): void {\n fs.mkdirSync(path.dirname(PLIST_PATH), { recursive: true })\n\n if (fs.existsSync(PLIST_PATH)) {\n launchctlUnload(PLIST_PATH)\n }\n\n fs.writeFileSync(PLIST_PATH, buildPlist(options))\n launchctlLoad(PLIST_PATH)\n\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n writeMeta({ port, host, installedAt: new Date().toISOString() })\n\n console.log(`\\nChatLab is now running as a system service`)\n console.log(` API: http://${host}:${port}`)\n console.log(` Logs: ${LOG_FILE}`)\n console.log(` Service: ${SERVICE_LABEL} (launchd)`)\n console.log(`\\nAuto-starts on login. Use \\`clb stop\\` to remove.\\n`)\n}\n\nfunction uninstallMacos(): void {\n if (!fs.existsSync(PLIST_PATH)) {\n console.log('No system service found.')\n removeMeta()\n return\n }\n launchctlUnload(PLIST_PATH)\n fs.unlinkSync(PLIST_PATH)\n removeMeta()\n console.log(`ChatLab system service removed.`)\n}\n\nfunction statusMacos(): ServiceStatus {\n if (!fs.existsSync(PLIST_PATH)) return { installed: false, running: false }\n let running = false\n try {\n const out = execSync(`launchctl list | grep ${SERVICE_LABEL}`, {\n encoding: 'utf-8',\n stdio: 'pipe',\n }).trim()\n // launchctl list: PID Status Label — PID is '-' when not running\n running = out.length > 0 && !out.startsWith('-')\n } catch {\n running = false\n }\n const meta = readMeta()\n return { installed: true, running, port: meta?.port, host: meta?.host }\n}\n\n// ── Linux (systemd --user) ────────────────────────────────────────────\n\nfunction escapeSystemdArg(arg: string): string {\n return '\"' + arg.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') + '\"'\n}\n\nfunction buildUnit(options: ServiceInstallOptions): string {\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n const cliEntry = resolveCliPath('bin/chatlab.mjs')\n const args = ['web', '--no-open', '--port', String(port), '--host', host]\n if (options.token) args.push('--token', options.token)\n if (options.headless) args.push('--headless')\n if (options.requireAuth) args.push('--require-auth')\n const execStart = [process.execPath, cliEntry, ...args].map(escapeSystemdArg).join(' ')\n\n return `[Unit]\nDescription=ChatLab daemon\nAfter=network.target\n\n[Service]\nExecStart=${execStart}\nRestart=always\nRestartSec=5\nStandardOutput=append:${LOG_FILE}\nStandardError=append:${LOG_FILE}\n\n[Install]\nWantedBy=default.target\n`\n}\n\nfunction installLinux(options: ServiceInstallOptions): void {\n fs.mkdirSync(SYSTEMD_DIR, { recursive: true })\n fs.mkdirSync(path.join(SYSTEM_DIR, 'logs'), { recursive: true })\n\n fs.writeFileSync(SYSTEMD_SERVICE, buildUnit(options))\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' })\n execSync('systemctl --user enable --now chatlab.service', { stdio: 'pipe' })\n } catch (err) {\n throw new Error(`systemctl failed: ${err instanceof Error ? err.message : err}`)\n }\n\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n writeMeta({ port, host, installedAt: new Date().toISOString() })\n\n console.log(`\\nChatLab is now running as a system service`)\n console.log(` API: http://${host}:${port}`)\n console.log(` Logs: ${LOG_FILE}`)\n console.log(` Unit: ${SYSTEMD_SERVICE} (systemd)`)\n console.log(`\\nAuto-starts on login. Use \\`clb stop\\` to remove.\\n`)\n}\n\nfunction uninstallLinux(): void {\n if (!fs.existsSync(SYSTEMD_SERVICE)) {\n console.log('No system service found.')\n removeMeta()\n return\n }\n try {\n execSync('systemctl --user disable --now chatlab.service', { stdio: 'pipe' })\n } catch {\n // already stopped\n }\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' })\n } catch {\n // ignore\n }\n fs.unlinkSync(SYSTEMD_SERVICE)\n removeMeta()\n console.log(`ChatLab system service removed.`)\n}\n\nfunction statusLinux(): ServiceStatus {\n if (!fs.existsSync(SYSTEMD_SERVICE)) return { installed: false, running: false }\n let running = false\n try {\n execSync('systemctl --user is-active --quiet chatlab.service', { stdio: 'pipe' })\n running = true\n } catch {\n running = false\n }\n const meta = readMeta()\n return { installed: true, running, port: meta?.port, host: meta?.host }\n}\n\n// ── Public API ────────────────────────────────────────────────────────\n\nexport function serviceInstall(options: ServiceInstallOptions): void {\n switch (process.platform) {\n case 'darwin':\n return installMacos(options)\n case 'linux':\n return installLinux(options)\n default:\n console.error('Windows is not yet supported for daemon mode.')\n console.error('Please use `clb web` to run in the foreground instead.')\n process.exit(1)\n }\n}\n\nexport function serviceUninstall(): void {\n switch (process.platform) {\n case 'darwin':\n return uninstallMacos()\n case 'linux':\n return uninstallLinux()\n default:\n console.error('Windows is not yet supported for daemon mode.')\n process.exit(1)\n }\n}\n\nexport function getServiceStatus(): ServiceStatus {\n switch (process.platform) {\n case 'darwin':\n return statusMacos()\n case 'linux':\n return statusLinux()\n default:\n return { installed: false, running: false }\n }\n}\n"],"mappings":"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","names":[]}
@@ -49,7 +49,7 @@ import {
49
49
  segmentText,
50
50
  semantic_index_exports,
51
51
  serializeChatLabToJsonl
52
- } from "./chunk-U2NXHIJK.mjs";
52
+ } from "./chunk-TJ3NOBVI.mjs";
53
53
  import {
54
54
  ArchiveImportError,
55
55
  ArchiveImportSourceManager,
@@ -64,6 +64,7 @@ import {
64
64
  MESSAGE_INSERT_MAX_ROWS,
65
65
  MergeSessionCache,
66
66
  MessageBatchInserter,
67
+ NavigationLayoutValidationError,
67
68
  SEMANTIC_INDEX_CONFIG_FILE,
68
69
  SemanticIndexConfigStore,
69
70
  SemanticIndexService,
@@ -83,6 +84,7 @@ import {
83
84
  createGlobalInsightService,
84
85
  createImportPerfLogger,
85
86
  createLocalEmbeddingRuntimeManager,
87
+ createNavigationLayoutService,
86
88
  createPeopleRelationshipsService,
87
89
  createSemanticIndexService,
88
90
  createTimeInvestmentService,
@@ -130,13 +132,13 @@ import {
130
132
  summary_service_exports,
131
133
  validateArchiveEntryName,
132
134
  withDataDirImportLock
133
- } from "./chunk-4YPNYQSP.mjs";
135
+ } from "./chunk-VREVDZ4Q.mjs";
134
136
  import {
135
137
  CONTACTS_ALGORITHM_VERSION
136
- } from "./chunk-XDF6PMVZ.mjs";
138
+ } from "./chunk-VUYWUHWW.mjs";
137
139
  import {
138
140
  PEOPLE_RELATIONSHIPS_ALGORITHM_VERSION
139
- } from "./chunk-AAGDVTP2.mjs";
141
+ } from "./chunk-6EZPD3XJ.mjs";
140
142
  import {
141
143
  ANNUAL_SUMMARY_ALGORITHM_VERSION,
142
144
  TIME_INVESTMENT_ALGORITHM_VERSION
@@ -273,7 +275,7 @@ import {
273
275
  wasElectronUsed,
274
276
  wrapWithChartSchemaGate,
275
277
  writeParseResultToDb
276
- } from "./chunk-OWOEWZIC.mjs";
278
+ } from "./chunk-TRGR3KKJ.mjs";
277
279
  import "./chunk-VSOWNKPA.mjs";
278
280
  export {
279
281
  AIChatManager,
@@ -317,6 +319,7 @@ export {
317
319
  MESSAGE_INSERT_MAX_ROWS,
318
320
  MergeSessionCache,
319
321
  MessageBatchInserter,
322
+ NavigationLayoutValidationError,
320
323
  NodePathProvider,
321
324
  PEOPLE_RELATIONSHIPS_ALGORITHM_VERSION,
322
325
  PreferencesManager,
@@ -387,6 +390,7 @@ export {
387
390
  createLlmRouteDecider,
388
391
  createLlmRuntimeStores,
389
392
  createLocalEmbeddingRuntimeManager,
393
+ createNavigationLayoutService,
390
394
  createNodeDataDirSwitch,
391
395
  createPendingDataDirMigration,
392
396
  createPeopleRelationshipsService,
@@ -536,4 +540,4 @@ export {
536
540
  wrapWithChartSchemaGate,
537
541
  writeParseResultToDb
538
542
  };
539
- //# sourceMappingURL=src-LORFXAUE.mjs.map
543
+ //# sourceMappingURL=src-AYMALWU5.mjs.map
@@ -12,8 +12,8 @@ import {
12
12
  autoImportBatch,
13
13
  incrementalImport,
14
14
  streamImport
15
- } from "./chunk-GVW3BDGZ.mjs";
16
- import "./chunk-U2NXHIJK.mjs";
15
+ } from "./chunk-TWH422HC.mjs";
16
+ import "./chunk-TJ3NOBVI.mjs";
17
17
  import {
18
18
  detectAllFormats,
19
19
  detectFormat,
@@ -21,11 +21,11 @@ import {
21
21
  getFormatFeatureById,
22
22
  getSupportedFormats,
23
23
  scanMultiChatFile
24
- } from "./chunk-4YPNYQSP.mjs";
25
- import "./chunk-XDF6PMVZ.mjs";
26
- import "./chunk-AAGDVTP2.mjs";
24
+ } from "./chunk-VREVDZ4Q.mjs";
25
+ import "./chunk-VUYWUHWW.mjs";
26
+ import "./chunk-6EZPD3XJ.mjs";
27
27
  import "./chunk-YKMQLAVP.mjs";
28
- import "./chunk-OWOEWZIC.mjs";
28
+ import "./chunk-TRGR3KKJ.mjs";
29
29
  import "./chunk-VSOWNKPA.mjs";
30
30
  export {
31
31
  analyzeAutoImport,
@@ -42,4 +42,4 @@ export {
42
42
  scanMultiChatFile,
43
43
  streamImport
44
44
  };
45
- //# sourceMappingURL=stream-import-7YUWIAD6.mjs.map
45
+ //# sourceMappingURL=stream-import-RXNSOOYH.mjs.map