chatlab-cli 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/{chat-command-IHRNO7J4.mjs → chat-command-XPY3WURC.mjs} +9 -9
  2. package/dist/{chunk-KWJ5FZ74.mjs → chunk-AQPDZAWB.mjs} +385 -248
  3. package/dist/chunk-AQPDZAWB.mjs.map +1 -0
  4. package/dist/{chunk-RHA534GU.mjs → chunk-BQ3QN4QT.mjs} +3 -3
  5. package/dist/{chunk-NHTOSDYI.mjs → chunk-DGF3S3TZ.mjs} +2 -2
  6. package/dist/{chunk-4V6UP7EW.mjs → chunk-IGEHMLHM.mjs} +2 -2
  7. package/dist/{chunk-NSWFHMBZ.mjs → chunk-IGK6UMN2.mjs} +11 -11
  8. package/dist/{chunk-U4F6BNGZ.mjs → chunk-ISRLGLUL.mjs} +2 -2
  9. package/dist/{chunk-HGV4MUIW.mjs → chunk-JCSPDTZL.mjs} +15 -62
  10. package/dist/chunk-JCSPDTZL.mjs.map +1 -0
  11. package/dist/{chunk-S7YPBKQ3.mjs → chunk-JTOHAMIW.mjs} +2 -2
  12. package/dist/{chunk-C3B7RXES.mjs → chunk-OLE2USEN.mjs} +626 -318
  13. package/dist/chunk-OLE2USEN.mjs.map +1 -0
  14. package/dist/{chunk-YAQLYL52.mjs → chunk-QZCNVAH6.mjs} +2 -2
  15. package/dist/{chunk-YAQLYL52.mjs.map → chunk-QZCNVAH6.mjs.map} +1 -1
  16. package/dist/{chunk-ZERQIKI4.mjs → chunk-S5NCEESV.mjs} +3 -3
  17. package/dist/{chunk-ZTMZ7S7T.mjs → chunk-UO2XVFY6.mjs} +31 -20
  18. package/dist/chunk-UO2XVFY6.mjs.map +1 -0
  19. package/dist/cli.mjs +9 -9
  20. package/dist/contacts-worker.mjs +2 -2
  21. package/dist/global-insight-worker.mjs +2 -2
  22. package/dist/{http-Y2WC2UK4.mjs → http-HV6XWU6X.mjs} +12 -12
  23. package/dist/{import-4HF2UNQI.mjs → import-DP2XLZ2H.mjs} +8 -8
  24. package/dist/index.mjs +12 -12
  25. package/dist/{mcp-DJPDRFTW.mjs → mcp-QDPFBPGW.mjs} +9 -9
  26. package/dist/people-relationships-worker.mjs +2 -2
  27. package/dist/semantic-index-worker.mjs +1 -1
  28. package/dist/{src-R7MZLKXQ.mjs → src-B3A2QHP5.mjs} +9 -7
  29. package/dist/{stream-import-DX57ANUL.mjs → stream-import-KEGNP3QK.mjs} +8 -8
  30. package/dist/{worker-runtime-QMN7OKOZ.mjs → worker-runtime-MDYKX3BW.mjs} +6 -6
  31. package/dist-cli-web/assets/{ActionToolsPanel.vue_vue_type_script_setup_true_lang-hwRVh048.js → ActionToolsPanel.vue_vue_type_script_setup_true_lang-JxPR2O6b.js} +5 -5
  32. package/dist-cli-web/assets/{BufferResource-DwfMBlAa.js → BufferResource--dSbJb0k.js} +1 -1
  33. package/dist-cli-web/assets/{CanvasRenderer-q312LRsp.js → CanvasRenderer-Cm_dmJXZ.js} +1 -1
  34. package/dist-cli-web/assets/{DataDirCleanupNotice--ee1dY0d.js → DataDirCleanupNotice-B0s5txX3.js} +1 -1
  35. package/dist-cli-web/assets/{EChartWordcloud-BaMgUl0Y.js → EChartWordcloud-CwMVJLBO.js} +1 -1
  36. package/dist-cli-web/assets/{Filter-BOb5cLBx.js → Filter-BjYScRpK.js} +1 -1
  37. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-BshQybD_.js +1 -0
  38. package/dist-cli-web/assets/{MessageExportModal-CFbovWh1.js → MessageExportModal-DAJW2mFj.js} +1 -1
  39. package/dist-cli-web/assets/{PageHeader-B3-W9mvh.js → PageHeader-BKAjCuqs.js} +1 -1
  40. package/dist-cli-web/assets/{RelationshipGalaxyCanvas-GEpsKHxV.js → RelationshipGalaxyCanvas-mlZs7k4L.js} +14 -14
  41. package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-BluPHjCR.css → RelationshipGalaxyThreeCanvas-CeYJABxI.css} +1 -1
  42. package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-DHOU66Gj.js → RelationshipGalaxyThreeCanvas-DgMG3jdU.js} +14 -14
  43. package/dist-cli-web/assets/{RenderTargetSystem-PEnnW2yb.js → RenderTargetSystem-D00Ex44y.js} +1 -1
  44. package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-sNw3hP4c.js → ThemeCard.vue_vue_type_script_setup_true_lang-Dsb6lzs-.js} +1 -1
  45. package/dist-cli-web/assets/{TimeSelect.vue_vue_type_script_setup_true_lang-BtUvMehe.js → TimeSelect.vue_vue_type_script_setup_true_lang-BfR3tlkz.js} +1 -1
  46. package/dist-cli-web/assets/{WebGLRenderer-BjP_1do7.js → WebGLRenderer-CTTusm2n.js} +1 -1
  47. package/dist-cli-web/assets/{WebGPURenderer-ldVv92u7.js → WebGPURenderer-pyv3EXor.js} +1 -1
  48. package/dist-cli-web/assets/{annual-summary-time-range-BHClzNvd.js → annual-summary-time-range-C_d1oZrj.js} +1 -1
  49. package/dist-cli-web/assets/{base-DBJ95yXf.js → base-D91aVUwM.js} +1 -1
  50. package/dist-cli-web/assets/{browserAll-CPoMOLKh.js → browserAll-C9fW936Y.js} +1 -1
  51. package/dist-cli-web/assets/{cli-web-B5VYO-Dh.js → cli-web-C7uGKz_E.js} +1 -1
  52. package/dist-cli-web/assets/{dateFormat-Cf2xuaE-.js → dateFormat-rY43adcv.js} +1 -1
  53. package/dist-cli-web/assets/{fetch-CtyVktRW.js → fetch-C6po4XYB.js} +1 -1
  54. package/dist-cli-web/assets/{fetch-J67jyI2k.js → fetch-CNy9OQ2g.js} +1 -1
  55. package/dist-cli-web/assets/{fetch-BuWxo6oK.js → fetch-CS3T-v-1.js} +1 -1
  56. package/dist-cli-web/assets/{fetch-C0HHT1Yn.js → fetch-CbnX5VoM.js} +1 -1
  57. package/dist-cli-web/assets/fetch-CrSz5KJy.js +1 -0
  58. package/dist-cli-web/assets/{fetch-CXIdj2-_.js → fetch-DG3AeEjW.js} +1 -1
  59. package/dist-cli-web/assets/{fetch-B1km2u3N.js → fetch-DYNgtIcU.js} +1 -1
  60. package/dist-cli-web/assets/{fetch-DGi_9my2.js → fetch-DZPC3D8R.js} +1 -1
  61. package/dist-cli-web/assets/{fetch-BFDKzf1P.js → fetch-Kk2knkEo.js} +1 -1
  62. package/dist-cli-web/assets/{fetch-Dr41uuXL.js → fetch-PLrI3V67.js} +1 -1
  63. package/dist-cli-web/assets/{index-BGiTw98l.js → index-2-OaYdzt.js} +1 -1
  64. package/dist-cli-web/assets/index-2S80bo1s.js +2 -0
  65. package/dist-cli-web/assets/index-3YO6RI5e.js +2 -0
  66. package/dist-cli-web/assets/index-BKo68Iu5.js +1 -0
  67. package/dist-cli-web/assets/{index-Bf3gFaid.js → index-BrkDgcJ6.js} +1 -1
  68. package/dist-cli-web/assets/{index-5UdyJtVU.js → index-CGI3Y8pq.js} +1 -1
  69. package/dist-cli-web/assets/index-CW9H_fBd.js +53 -0
  70. package/dist-cli-web/assets/{index-Ba21yU86.js → index-DA3Q0TGT.js} +1 -1
  71. package/dist-cli-web/assets/{index-B7R74Yp7.js → index-DFHYr_-u.js} +1 -1
  72. package/dist-cli-web/assets/index-DmwA85vG.js +173 -0
  73. package/dist-cli-web/assets/index-DrjoMv9s.css +1 -0
  74. package/dist-cli-web/assets/{index-DzQT-qXF.js → index-DsdMsKYT.js} +1 -1
  75. package/dist-cli-web/assets/{index-DtlTo3nt.js → index-JYfjMRb-.js} +1 -1
  76. package/dist-cli-web/assets/index-Jhwca9kg.css +1 -0
  77. package/dist-cli-web/assets/index-ZTgfCZvY.js +64 -0
  78. package/dist-cli-web/assets/index-vtF05fh7.css +1 -0
  79. package/dist-cli-web/assets/{people-page-header-BvQy1GQj.js → people-page-header-D-LWaEqn.js} +1 -1
  80. package/dist-cli-web/assets/{webworkerAll-DgKQKbNn.js → webworkerAll-CPOVECup.js} +1 -1
  81. package/dist-cli-web/index.html +2 -2
  82. package/package.json +1 -1
  83. package/dist/chunk-C3B7RXES.mjs.map +0 -1
  84. package/dist/chunk-HGV4MUIW.mjs.map +0 -1
  85. package/dist/chunk-KWJ5FZ74.mjs.map +0 -1
  86. package/dist/chunk-ZTMZ7S7T.mjs.map +0 -1
  87. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-DK2z0Jrh.js +0 -1
  88. package/dist-cli-web/assets/fetch-80O3EH4a.js +0 -1
  89. package/dist-cli-web/assets/index-7jm3YI9u.js +0 -53
  90. package/dist-cli-web/assets/index-ByQSR8Bj.js +0 -2
  91. package/dist-cli-web/assets/index-CPZYydbc.js +0 -2
  92. package/dist-cli-web/assets/index-D8Q3U-6e.js +0 -1
  93. package/dist-cli-web/assets/index-DGtDxRCd.js +0 -173
  94. package/dist-cli-web/assets/index-DTxnpQiv.css +0 -1
  95. package/dist-cli-web/assets/index-gpTDI3sq.js +0 -64
  96. package/dist-cli-web/assets/index-lwhCMqhd.css +0 -1
  97. package/dist-cli-web/assets/index-qsbWn8VP.css +0 -1
  98. /package/dist/{chat-command-IHRNO7J4.mjs.map → chat-command-XPY3WURC.mjs.map} +0 -0
  99. /package/dist/{chunk-RHA534GU.mjs.map → chunk-BQ3QN4QT.mjs.map} +0 -0
  100. /package/dist/{chunk-NHTOSDYI.mjs.map → chunk-DGF3S3TZ.mjs.map} +0 -0
  101. /package/dist/{chunk-4V6UP7EW.mjs.map → chunk-IGEHMLHM.mjs.map} +0 -0
  102. /package/dist/{chunk-NSWFHMBZ.mjs.map → chunk-IGK6UMN2.mjs.map} +0 -0
  103. /package/dist/{chunk-U4F6BNGZ.mjs.map → chunk-ISRLGLUL.mjs.map} +0 -0
  104. /package/dist/{chunk-S7YPBKQ3.mjs.map → chunk-JTOHAMIW.mjs.map} +0 -0
  105. /package/dist/{chunk-ZERQIKI4.mjs.map → chunk-S5NCEESV.mjs.map} +0 -0
  106. /package/dist/{http-Y2WC2UK4.mjs.map → http-HV6XWU6X.mjs.map} +0 -0
  107. /package/dist/{import-4HF2UNQI.mjs.map → import-DP2XLZ2H.mjs.map} +0 -0
  108. /package/dist/{mcp-DJPDRFTW.mjs.map → mcp-QDPFBPGW.mjs.map} +0 -0
  109. /package/dist/{src-R7MZLKXQ.mjs.map → src-B3A2QHP5.mjs.map} +0 -0
  110. /package/dist/{stream-import-DX57ANUL.mjs.map → stream-import-KEGNP3QK.mjs.map} +0 -0
  111. /package/dist/{worker-runtime-QMN7OKOZ.mjs.map → worker-runtime-MDYKX3BW.mjs.map} +0 -0
@@ -14,10 +14,10 @@ import {
14
14
  incrementalImport,
15
15
  streamingImport,
16
16
  withDataDirImportLock
17
- } from "./chunk-KWJ5FZ74.mjs";
17
+ } from "./chunk-AQPDZAWB.mjs";
18
18
  import {
19
19
  DataDirCompatibilityError
20
- } from "./chunk-C3B7RXES.mjs";
20
+ } from "./chunk-OLE2USEN.mjs";
21
21
 
22
22
  // src/import/stream-import.ts
23
23
  import * as crypto from "crypto";
@@ -265,4 +265,4 @@ export {
265
265
  analyzeIncrementalImport2 as analyzeIncrementalImport,
266
266
  analyzeNewImport2 as analyzeNewImport
267
267
  };
268
- //# sourceMappingURL=chunk-RHA534GU.mjs.map
268
+ //# sourceMappingURL=chunk-BQ3QN4QT.mjs.map
@@ -28,7 +28,7 @@ import {
28
28
  getWeekdayActivity,
29
29
  queryMessages,
30
30
  searchMessagesByKeywords
31
- } from "./chunk-C3B7RXES.mjs";
31
+ } from "./chunk-OLE2USEN.mjs";
32
32
 
33
33
  // ../../packages/tools/src/utils/limits.ts
34
34
  function resolveMessageLimit(requestedLimit, defaultLimit, maxMessagesLimit) {
@@ -1927,4 +1927,4 @@ export {
1927
1927
  toAgentToolParameters,
1928
1928
  executeToolForAgent
1929
1929
  };
1930
- //# sourceMappingURL=chunk-NHTOSDYI.mjs.map
1930
+ //# sourceMappingURL=chunk-DGF3S3TZ.mjs.map
@@ -21,7 +21,7 @@ import {
21
21
  setCache,
22
22
  shouldEnableContactsEntry,
23
23
  shouldScopeContactToSession
24
- } from "./chunk-C3B7RXES.mjs";
24
+ } from "./chunk-OLE2USEN.mjs";
25
25
 
26
26
  // ../../packages/node-runtime/src/services/contacts/facts-cache.ts
27
27
  var CONTACTS_FACTS_FORMAT_VERSION = 1;
@@ -517,4 +517,4 @@ export {
517
517
  computeContactsSnapshot,
518
518
  createEmptyContactsDiagnostics
519
519
  };
520
- //# sourceMappingURL=chunk-4V6UP7EW.mjs.map
520
+ //# sourceMappingURL=chunk-IGEHMLHM.mjs.map
@@ -7,10 +7,10 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  analyzeAutoImport,
9
9
  autoImport
10
- } from "./chunk-RHA534GU.mjs";
10
+ } from "./chunk-BQ3QN4QT.mjs";
11
11
  import {
12
12
  assertCliDataDirCompatible
13
- } from "./chunk-U4F6BNGZ.mjs";
13
+ } from "./chunk-ISRLGLUL.mjs";
14
14
  import {
15
15
  getVersion
16
16
  } from "./chunk-5ADKYYNA.mjs";
@@ -20,7 +20,7 @@ import {
20
20
  applyPendingNodeDataDirMigrationIfNeeded,
21
21
  getSystemLogsDir,
22
22
  hasPendingElectronDataWarning
23
- } from "./chunk-ZERQIKI4.mjs";
23
+ } from "./chunk-S5NCEESV.mjs";
24
24
  import {
25
25
  AIChatManager,
26
26
  IMPORT_IN_PROGRESS_ERROR_KEY,
@@ -34,7 +34,7 @@ import {
34
34
  owner_profile_service_exports,
35
35
  preprocessMessages,
36
36
  validateChatLabFile
37
- } from "./chunk-KWJ5FZ74.mjs";
37
+ } from "./chunk-AQPDZAWB.mjs";
38
38
  import {
39
39
  resolveCliPath
40
40
  } from "./chunk-FJ35V3TE.mjs";
@@ -74,7 +74,7 @@ import {
74
74
  searchMessagesLike,
75
75
  setConfigField,
76
76
  verifyCliDataPath
77
- } from "./chunk-C3B7RXES.mjs";
77
+ } from "./chunk-OLE2USEN.mjs";
78
78
 
79
79
  // src/cli.ts
80
80
  import * as fs4 from "fs";
@@ -2320,7 +2320,7 @@ registerManifestCommand(program, getVersion());
2320
2320
  registerImportCommand(program);
2321
2321
  registerValidateCommand(program);
2322
2322
  program.command("formats").description("List all supported chat history formats").action(async () => {
2323
- const { getSupportedFormats } = await import("./import-4HF2UNQI.mjs");
2323
+ const { getSupportedFormats } = await import("./import-DP2XLZ2H.mjs");
2324
2324
  const formats = getSupportedFormats();
2325
2325
  console.log(`${formats.length} supported format(s):
2326
2326
  `);
@@ -2329,11 +2329,11 @@ program.command("formats").description("List all supported chat history formats"
2329
2329
  }
2330
2330
  });
2331
2331
  program.command("mcp").description("Start MCP Server (stdio transport, for ClaudeCode / Cursor / AI agents)").action(async () => {
2332
- const { startCliMcpServer } = await import("./mcp-DJPDRFTW.mjs");
2332
+ const { startCliMcpServer } = await import("./mcp-QDPFBPGW.mjs");
2333
2333
  await startCliMcpServer();
2334
2334
  });
2335
2335
  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) => {
2336
- const { runChatCommand } = await import("./chat-command-IHRNO7J4.mjs");
2336
+ const { runChatCommand } = await import("./chat-command-XPY3WURC.mjs");
2337
2337
  const { dbManager, pathProvider } = initRuntime();
2338
2338
  const aiChatManager = new AIChatManager(pathProvider.getAiDataDir(), { nativeBinding: resolveNativeBinding() });
2339
2339
  try {
@@ -2369,7 +2369,7 @@ program.command("start").description("Start ChatLab (HTTP API + Web UI)").option
2369
2369
  });
2370
2370
  return;
2371
2371
  }
2372
- const { startHttpServer } = await import("./http-Y2WC2UK4.mjs");
2372
+ const { startHttpServer } = await import("./http-HV6XWU6X.mjs");
2373
2373
  const port = parseInt(options.port, 10);
2374
2374
  let webRoot;
2375
2375
  if (!options.headless) {
@@ -2416,7 +2416,7 @@ Press Ctrl+C to stop.
2416
2416
  }
2417
2417
  const shutdown = async () => {
2418
2418
  console.log("\nShutting down...");
2419
- const { stopHttpServer } = await import("./http-Y2WC2UK4.mjs");
2419
+ const { stopHttpServer } = await import("./http-HV6XWU6X.mjs");
2420
2420
  await stopHttpServer();
2421
2421
  process.exit(0);
2422
2422
  };
@@ -2509,4 +2509,4 @@ if (isDirectRun) {
2509
2509
  export {
2510
2510
  run
2511
2511
  };
2512
- //# sourceMappingURL=chunk-NSWFHMBZ.mjs.map
2512
+ //# sourceMappingURL=chunk-IGK6UMN2.mjs.map
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  DataDirCompatibilityError,
12
12
  assertDataDirCompatible
13
- } from "./chunk-C3B7RXES.mjs";
13
+ } from "./chunk-OLE2USEN.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-U4F6BNGZ.mjs.map
40
+ //# sourceMappingURL=chunk-ISRLGLUL.mjs.map
@@ -10,7 +10,7 @@ import {
10
10
  SEMANTIC_SEARCH_TOOL_NAME,
11
11
  executeToolForAgent,
12
12
  toAgentToolParameters
13
- } from "./chunk-NHTOSDYI.mjs";
13
+ } from "./chunk-DGF3S3TZ.mjs";
14
14
  import {
15
15
  AgentEventHandler,
16
16
  AssistantManager,
@@ -34,6 +34,7 @@ import {
34
34
  createCompressionLlmAdapter,
35
35
  createDataSnapshotFromOverview,
36
36
  createLlmRouteDecider,
37
+ createLlmRuntimeStores,
37
38
  createPlanContentBlock,
38
39
  decideRequestRoute,
39
40
  formatAIError,
@@ -47,15 +48,14 @@ import {
47
48
  runAgentCore,
48
49
  shouldUseChartCapabilityForMessage,
49
50
  wrapWithChartSchemaGate
50
- } from "./chunk-KWJ5FZ74.mjs";
51
+ } from "./chunk-AQPDZAWB.mjs";
51
52
  import {
52
53
  AiLogger,
53
54
  appLogger,
54
55
  batchSegmentWithFrequency,
55
56
  getChatOverview,
56
- normalizeBuiltinToolNames,
57
- resolveApiKey
58
- } from "./chunk-C3B7RXES.mjs";
57
+ normalizeBuiltinToolNames
58
+ } from "./chunk-OLE2USEN.mjs";
59
59
 
60
60
  // src/ai/logger.ts
61
61
  var logger = null;
@@ -204,54 +204,6 @@ function adaptToolsForAgent(tools, getContext, options) {
204
204
  );
205
205
  }
206
206
 
207
- // src/ai/llm-config.ts
208
- import * as fs2 from "fs";
209
- import * as path2 from "path";
210
- function loadLlmConfig(aiDataDir) {
211
- const configPath = path2.join(aiDataDir, "llm-config.json");
212
- if (!fs2.existsSync(configPath)) {
213
- return { configs: [], defaultAssistant: null, fastModel: null };
214
- }
215
- try {
216
- const data = JSON.parse(fs2.readFileSync(configPath, "utf-8"));
217
- const configs = (data.configs || []).map((c) => {
218
- const provider = c.provider || "";
219
- const authProfile = c.authProfile;
220
- const profileKey = resolveApiKey(provider, authProfile);
221
- const rawKey = c.apiKey || "";
222
- const fallbackKey = rawKey.startsWith("enc:") ? "" : rawKey;
223
- return {
224
- ...c,
225
- apiKey: profileKey || fallbackKey
226
- };
227
- });
228
- return {
229
- configs,
230
- defaultAssistant: data.defaultAssistant ?? null,
231
- fastModel: data.fastModel ?? null
232
- };
233
- } catch {
234
- return { configs: [], defaultAssistant: null, fastModel: null };
235
- }
236
- }
237
- function resolveSlot(slot, configs) {
238
- if (slot && configs.some((c) => c.id === slot.configId)) return slot;
239
- const fallback = configs[0];
240
- if (!fallback) return null;
241
- return { configId: fallback.id, modelId: fallback.model };
242
- }
243
- function getDefaultAssistantConfig(aiDataDir) {
244
- const store = loadLlmConfig(aiDataDir);
245
- const slot = resolveSlot(store.defaultAssistant, store.configs);
246
- if (!slot) return null;
247
- const config = store.configs.find((c) => c.id === slot.configId);
248
- if (!config) return null;
249
- return { ...config, model: slot.modelId || config.model };
250
- }
251
- function buildPiModel2(config) {
252
- return buildPiModel(config);
253
- }
254
-
255
207
  // src/ai/assistant-loader.ts
256
208
  function loadAssistantConfig(aiDataDir, assistantId) {
257
209
  return getAssistantManager(aiDataDir).getAssistantConfig(assistantId);
@@ -270,7 +222,7 @@ async function runServerAgent(options) {
270
222
  skillDef,
271
223
  compressionConfig,
272
224
  tools = [],
273
- aiDataDir,
225
+ llmConfig,
274
226
  aiChatManager,
275
227
  onEvent,
276
228
  abortSignal,
@@ -282,13 +234,12 @@ async function runServerAgent(options) {
282
234
  } = options;
283
235
  const aiLogger = getServerAiLogger();
284
236
  await initTokenizer();
285
- const llmConfig = getDefaultAssistantConfig(aiDataDir);
286
237
  if (!llmConfig) {
287
238
  onEvent({ type: "error", error: { name: "ConfigError", message: "LLM service not configured" } });
288
239
  onEvent({ type: "done", isFinished: true });
289
240
  return;
290
241
  }
291
- const piModel = buildPiModel2(llmConfig);
242
+ const piModel = buildPiModel(llmConfig);
292
243
  const t = createAiTranslate(locale);
293
244
  let skillCtx;
294
245
  if (skillDef) {
@@ -482,7 +433,10 @@ function getAllowedToolSet(isChartCapability, allowedBuiltinTools) {
482
433
  }
483
434
  return allowedBuiltinTools === void 0 ? null : new Set(normalizeBuiltinToolNames(allowedBuiltinTools));
484
435
  }
485
- function createCliRunAgentStream(dbManager, aiChatManager, semanticIndexService) {
436
+ function createCliRunAgentStream(dbManager, aiChatManager, options = {}) {
437
+ const aiDataDir = getAiDir(dbManager);
438
+ const llmConfigStore = options.llmConfigStore ?? createLlmRuntimeStores(aiDataDir).llmConfigStore;
439
+ const semanticIndexService = options.semanticIndexService;
486
440
  return async (params, onEvent, abortSignal) => {
487
441
  const {
488
442
  userMessage,
@@ -500,7 +454,6 @@ function createCliRunAgentStream(dbManager, aiChatManager, semanticIndexService)
500
454
  mentionedMembers,
501
455
  thinkingLevel
502
456
  } = params;
503
- const aiDataDir = getAiDir(dbManager);
504
457
  let assistantSystemPrompt;
505
458
  let assistantAllowedTools;
506
459
  if (assistantId) {
@@ -510,9 +463,9 @@ function createCliRunAgentStream(dbManager, aiChatManager, semanticIndexService)
510
463
  }
511
464
  assistantAllowedTools = assistantConfig?.allowedBuiltinTools;
512
465
  }
513
- const llmConfig = getDefaultAssistantConfig(aiDataDir);
466
+ const llmConfig = llmConfigStore.getDefaultAssistantConfig();
514
467
  const maxToolResultPercent = compressionConfig?.maxToolResultPercent ?? 50;
515
- const contextWindow = llmConfig ? buildPiModel2(llmConfig).contextWindow ?? 128e3 : 128e3;
468
+ const contextWindow = llmConfig ? buildPiModel(llmConfig).contextWindow ?? 128e3 : 128e3;
516
469
  const maxToolResultTokens = Math.floor(contextWindow * (maxToolResultPercent / 100));
517
470
  const db = dbManager.open?.(sessionId);
518
471
  const resolvedChartAutoMode = chartAutoMode ?? "suggest";
@@ -600,7 +553,7 @@ function createCliRunAgentStream(dbManager, aiChatManager, semanticIndexService)
600
553
  skillDef: resolvedSkillDef,
601
554
  compressionConfig: resolvedCompression,
602
555
  tools: agentTools,
603
- aiDataDir,
556
+ llmConfig,
604
557
  aiChatManager,
605
558
  onEvent,
606
559
  abortSignal,
@@ -621,4 +574,4 @@ export {
621
574
  getSkillManagerCore,
622
575
  createCliRunAgentStream
623
576
  };
624
- //# sourceMappingURL=chunk-HGV4MUIW.mjs.map
577
+ //# sourceMappingURL=chunk-JCSPDTZL.mjs.map
@@ -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 async execute(_toolCallId: string, params: unknown) {\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 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 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 CompressionConfig,\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 compressionConfig?: CompressionConfig\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 compressionConfig,\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 (compressionConfig?.enabled && 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 compressionConfig,\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 if (compressionConfig?.enabled && historyLeafMessageId !== undefined) {\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 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 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 compressionConfig,\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 = compressionConfig?.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 const resolvedCompression = compressionConfig?.enabled\n ? {\n enabled: true as const,\n tokenThresholdPercent: compressionConfig.tokenThresholdPercent ?? 75,\n bufferSizePercent: compressionConfig.bufferSizePercent ?? 20,\n maxToolResultPercent: compressionConfig.maxToolResultPercent,\n }\n : undefined\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 compressionConfig: resolvedCompression,\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"]}
@@ -21,7 +21,7 @@ import {
21
21
  resolveOwnerMember,
22
22
  setCache,
23
23
  shouldScopeContactToSession
24
- } from "./chunk-C3B7RXES.mjs";
24
+ } from "./chunk-OLE2USEN.mjs";
25
25
 
26
26
  // ../../packages/node-runtime/src/services/people/relationships/facts-cache.ts
27
27
  var PEOPLE_RELATIONSHIPS_FACTS_FORMAT_VERSION = 3;
@@ -1326,4 +1326,4 @@ export {
1326
1326
  compareNodes,
1327
1327
  compareEdges
1328
1328
  };
1329
- //# sourceMappingURL=chunk-S7YPBKQ3.mjs.map
1329
+ //# sourceMappingURL=chunk-JTOHAMIW.mjs.map