chatlab-cli 0.33.0 → 0.34.1
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.
- package/dist/{chat-command-IHRNO7J4.mjs → chat-command-OWKJJ736.mjs} +9 -9
- package/dist/{chunk-C3B7RXES.mjs → chunk-3RWYALUP.mjs} +629 -319
- package/dist/chunk-3RWYALUP.mjs.map +1 -0
- package/dist/{chunk-4V6UP7EW.mjs → chunk-GHZFNAMF.mjs} +2 -2
- package/dist/{chunk-NHTOSDYI.mjs → chunk-J7HAIT3T.mjs} +15 -9
- package/dist/chunk-J7HAIT3T.mjs.map +1 -0
- package/dist/{chunk-HGV4MUIW.mjs → chunk-MPHFZYB7.mjs} +15 -62
- package/dist/chunk-MPHFZYB7.mjs.map +1 -0
- package/dist/{chunk-U4F6BNGZ.mjs → chunk-OHFVX2HH.mjs} +2 -2
- package/dist/{chunk-YAQLYL52.mjs → chunk-QZCNVAH6.mjs} +2 -2
- package/dist/{chunk-YAQLYL52.mjs.map → chunk-QZCNVAH6.mjs.map} +1 -1
- package/dist/{chunk-ZTMZ7S7T.mjs → chunk-RMW3524R.mjs} +46 -66
- package/dist/chunk-RMW3524R.mjs.map +1 -0
- package/dist/{chunk-KWJ5FZ74.mjs → chunk-RRC6U56Y.mjs} +640 -296
- package/dist/chunk-RRC6U56Y.mjs.map +1 -0
- package/dist/{chunk-NSWFHMBZ.mjs → chunk-VTCZM2JS.mjs} +11 -11
- package/dist/{chunk-S7YPBKQ3.mjs → chunk-XEGEOU2D.mjs} +2 -2
- package/dist/{chunk-RHA534GU.mjs → chunk-YRCFDZ5Q.mjs} +3 -3
- package/dist/{chunk-ZERQIKI4.mjs → chunk-ZM5DSHFF.mjs} +95 -5
- package/dist/chunk-ZM5DSHFF.mjs.map +1 -0
- package/dist/cli.mjs +9 -9
- package/dist/contacts-worker.mjs +2 -2
- package/dist/global-insight-worker.mjs +2 -2
- package/dist/{http-Y2WC2UK4.mjs → http-X55S6MTO.mjs} +12 -12
- package/dist/{import-4HF2UNQI.mjs → import-4AX6IX57.mjs} +8 -8
- package/dist/index.mjs +12 -12
- package/dist/{mcp-DJPDRFTW.mjs → mcp-GWC52AWE.mjs} +9 -9
- package/dist/people-relationships-worker.mjs +2 -2
- package/dist/semantic-index-worker.mjs +1 -1
- package/dist/{src-R7MZLKXQ.mjs → src-DLLM4SEO.mjs} +11 -7
- package/dist/{stream-import-DX57ANUL.mjs → stream-import-K24HWAAZ.mjs} +8 -8
- package/dist/{worker-runtime-QMN7OKOZ.mjs → worker-runtime-6KKR55TD.mjs} +6 -6
- package/dist-cli-web/assets/{ActionToolsPanel.vue_vue_type_script_setup_true_lang-hwRVh048.js → ActionToolsPanel.vue_vue_type_script_setup_true_lang-D1BiZuQL.js} +5 -5
- package/dist-cli-web/assets/{BufferResource-DwfMBlAa.js → BufferResource-IPkSmPao.js} +1 -1
- package/dist-cli-web/assets/{CanvasRenderer-q312LRsp.js → CanvasRenderer-OAQy65em.js} +1 -1
- package/dist-cli-web/assets/{DataDirCleanupNotice--ee1dY0d.js → DataDirCleanupNotice-jEI-YjFp.js} +1 -1
- package/dist-cli-web/assets/{EChartWordcloud-BaMgUl0Y.js → EChartWordcloud-Pi48JdN2.js} +1 -1
- package/dist-cli-web/assets/{Filter-BOb5cLBx.js → Filter-FQD30cRE.js} +1 -1
- package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-CCK5yTju.js +1 -0
- package/dist-cli-web/assets/{MessageExportModal-CFbovWh1.js → MessageExportModal-CZn3LbeY.js} +1 -1
- package/dist-cli-web/assets/{PageHeader-B3-W9mvh.js → PageHeader-B9B9K9by.js} +1 -1
- package/dist-cli-web/assets/{RelationshipGalaxyCanvas-GEpsKHxV.js → RelationshipGalaxyCanvas-CbTmpnZ6.js} +14 -14
- package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-BluPHjCR.css → RelationshipGalaxyThreeCanvas-CeYJABxI.css} +1 -1
- package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-DHOU66Gj.js → RelationshipGalaxyThreeCanvas-Cu6NmKOq.js} +14 -14
- package/dist-cli-web/assets/{RenderTargetSystem-PEnnW2yb.js → RenderTargetSystem-DnptJCQ0.js} +1 -1
- package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-sNw3hP4c.js → ThemeCard.vue_vue_type_script_setup_true_lang-JXMFY6aD.js} +1 -1
- package/dist-cli-web/assets/{TimeSelect.vue_vue_type_script_setup_true_lang-BtUvMehe.js → TimeSelect.vue_vue_type_script_setup_true_lang-QAZFwx5S.js} +1 -1
- package/dist-cli-web/assets/{WebGLRenderer-BjP_1do7.js → WebGLRenderer-BmjIF5se.js} +1 -1
- package/dist-cli-web/assets/{WebGPURenderer-ldVv92u7.js → WebGPURenderer-DkNcKkqj.js} +1 -1
- package/dist-cli-web/assets/{annual-summary-time-range-BHClzNvd.js → annual-summary-time-range-DJ0HWI_t.js} +1 -1
- package/dist-cli-web/assets/{base-DBJ95yXf.js → base-CnuE0ss0.js} +1 -1
- package/dist-cli-web/assets/{browserAll-CPoMOLKh.js → browserAll-C_NnyNBz.js} +1 -1
- package/dist-cli-web/assets/{cli-web-B5VYO-Dh.js → cli-web-t1gabACJ.js} +1 -1
- package/dist-cli-web/assets/{dateFormat-Cf2xuaE-.js → dateFormat-p6nibkgt.js} +1 -1
- package/dist-cli-web/assets/{fetch-J67jyI2k.js → fetch-BBUvWvOM.js} +1 -1
- package/dist-cli-web/assets/{fetch-BuWxo6oK.js → fetch-BfYranz7.js} +1 -1
- package/dist-cli-web/assets/{fetch-CXIdj2-_.js → fetch-Bsm5YQ_7.js} +1 -1
- package/dist-cli-web/assets/{fetch-Dr41uuXL.js → fetch-C4KJ7tGz.js} +1 -1
- package/dist-cli-web/assets/fetch-CMhV3TYQ.js +1 -0
- package/dist-cli-web/assets/{fetch-C0HHT1Yn.js → fetch-Ch4IMKin.js} +1 -1
- package/dist-cli-web/assets/{fetch-B1km2u3N.js → fetch-DajjPQtq.js} +1 -1
- package/dist-cli-web/assets/{fetch-BFDKzf1P.js → fetch-WElo3Vix.js} +1 -1
- package/dist-cli-web/assets/{fetch-DGi_9my2.js → fetch-WIOgRPd9.js} +1 -1
- package/dist-cli-web/assets/{fetch-CtyVktRW.js → fetch-_Hb-KRSr.js} +3 -3
- package/dist-cli-web/assets/index-B8I5Pax_.js +2 -0
- package/dist-cli-web/assets/index-BE4nd1aX.js +1 -0
- package/dist-cli-web/assets/{index-B7R74Yp7.js → index-Bb6EtLMB.js} +1 -1
- package/dist-cli-web/assets/{index-DzQT-qXF.js → index-BcWaPFz7.js} +1 -1
- package/dist-cli-web/assets/index-CKkIHbie.js +64 -0
- package/dist-cli-web/assets/index-CbacXZN3.js +2 -0
- package/dist-cli-web/assets/{index-DtlTo3nt.js → index-CjoTcSEc.js} +1 -1
- package/dist-cli-web/assets/index-CsX1Wt8l.js +173 -0
- package/dist-cli-web/assets/{index-BGiTw98l.js → index-CsyURmWU.js} +1 -1
- package/dist-cli-web/assets/{index-5UdyJtVU.js → index-DLnlRLCx.js} +1 -1
- package/dist-cli-web/assets/index-DrjoMv9s.css +1 -0
- package/dist-cli-web/assets/index-Jhwca9kg.css +1 -0
- package/dist-cli-web/assets/index-YzfjPohq.js +53 -0
- package/dist-cli-web/assets/{index-Bf3gFaid.js → index-dObiAHg6.js} +1 -1
- package/dist-cli-web/assets/index-vtF05fh7.css +1 -0
- package/dist-cli-web/assets/{index-Ba21yU86.js → index-x74lBtei.js} +1 -1
- package/dist-cli-web/assets/{people-page-header-BvQy1GQj.js → people-page-header-BW5cNPl7.js} +1 -1
- package/dist-cli-web/assets/{webworkerAll-DgKQKbNn.js → webworkerAll-8AFsQkH1.js} +1 -1
- package/dist-cli-web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-C3B7RXES.mjs.map +0 -1
- package/dist/chunk-HGV4MUIW.mjs.map +0 -1
- package/dist/chunk-KWJ5FZ74.mjs.map +0 -1
- package/dist/chunk-NHTOSDYI.mjs.map +0 -1
- package/dist/chunk-ZERQIKI4.mjs.map +0 -1
- package/dist/chunk-ZTMZ7S7T.mjs.map +0 -1
- package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-DK2z0Jrh.js +0 -1
- package/dist-cli-web/assets/fetch-80O3EH4a.js +0 -1
- package/dist-cli-web/assets/index-7jm3YI9u.js +0 -53
- package/dist-cli-web/assets/index-ByQSR8Bj.js +0 -2
- package/dist-cli-web/assets/index-CPZYydbc.js +0 -2
- package/dist-cli-web/assets/index-D8Q3U-6e.js +0 -1
- package/dist-cli-web/assets/index-DGtDxRCd.js +0 -173
- package/dist-cli-web/assets/index-DTxnpQiv.css +0 -1
- package/dist-cli-web/assets/index-gpTDI3sq.js +0 -64
- package/dist-cli-web/assets/index-lwhCMqhd.css +0 -1
- package/dist-cli-web/assets/index-qsbWn8VP.css +0 -1
- /package/dist/{chat-command-IHRNO7J4.mjs.map → chat-command-OWKJJ736.mjs.map} +0 -0
- /package/dist/{chunk-4V6UP7EW.mjs.map → chunk-GHZFNAMF.mjs.map} +0 -0
- /package/dist/{chunk-U4F6BNGZ.mjs.map → chunk-OHFVX2HH.mjs.map} +0 -0
- /package/dist/{chunk-NSWFHMBZ.mjs.map → chunk-VTCZM2JS.mjs.map} +0 -0
- /package/dist/{chunk-S7YPBKQ3.mjs.map → chunk-XEGEOU2D.mjs.map} +0 -0
- /package/dist/{chunk-RHA534GU.mjs.map → chunk-YRCFDZ5Q.mjs.map} +0 -0
- /package/dist/{http-Y2WC2UK4.mjs.map → http-X55S6MTO.mjs.map} +0 -0
- /package/dist/{import-4HF2UNQI.mjs.map → import-4AX6IX57.mjs.map} +0 -0
- /package/dist/{mcp-DJPDRFTW.mjs.map → mcp-GWC52AWE.mjs.map} +0 -0
- /package/dist/{src-R7MZLKXQ.mjs.map → src-DLLM4SEO.mjs.map} +0 -0
- /package/dist/{stream-import-DX57ANUL.mjs.map → stream-import-K24HWAAZ.mjs.map} +0 -0
- /package/dist/{worker-runtime-QMN7OKOZ.mjs.map → worker-runtime-6KKR55TD.mjs.map} +0 -0
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
SEMANTIC_SEARCH_TOOL_NAME,
|
|
11
11
|
executeToolForAgent,
|
|
12
12
|
toAgentToolParameters
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-J7HAIT3T.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-
|
|
51
|
+
} from "./chunk-RRC6U56Y.mjs";
|
|
51
52
|
import {
|
|
52
53
|
AiLogger,
|
|
53
54
|
appLogger,
|
|
54
55
|
batchSegmentWithFrequency,
|
|
55
56
|
getChatOverview,
|
|
56
|
-
normalizeBuiltinToolNames
|
|
57
|
-
|
|
58
|
-
} from "./chunk-C3B7RXES.mjs";
|
|
57
|
+
normalizeBuiltinToolNames
|
|
58
|
+
} from "./chunk-3RWYALUP.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
|
-
|
|
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 =
|
|
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,
|
|
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(
|
|
466
|
+
const llmConfig = llmConfigStore.getDefaultAssistantConfig();
|
|
514
467
|
const maxToolResultPercent = compressionConfig?.maxToolResultPercent ?? 50;
|
|
515
|
-
const contextWindow = llmConfig ?
|
|
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
|
-
|
|
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-
|
|
577
|
+
//# sourceMappingURL=chunk-MPHFZYB7.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"]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
DataDirCompatibilityError,
|
|
12
12
|
assertDataDirCompatible
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-3RWYALUP.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-
|
|
40
|
+
//# sourceMappingURL=chunk-OHFVX2HH.mjs.map
|
|
@@ -6,9 +6,9 @@ const __filename = __fileURLToPath(import.meta.url);
|
|
|
6
6
|
const __dirname = __pathDirname(__filename);
|
|
7
7
|
|
|
8
8
|
// ../../packages/node-runtime/src/services/global-insight/types.ts
|
|
9
|
-
var ANNUAL_SUMMARY_ALGORITHM_VERSION = "annual-summary-
|
|
9
|
+
var ANNUAL_SUMMARY_ALGORITHM_VERSION = "annual-summary-v2";
|
|
10
10
|
|
|
11
11
|
export {
|
|
12
12
|
ANNUAL_SUMMARY_ALGORITHM_VERSION
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=chunk-
|
|
14
|
+
//# sourceMappingURL=chunk-QZCNVAH6.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/node-runtime/src/services/global-insight/types.ts"],"sourcesContent":["import type {\n AnnualSummaryCoverage,\n AnnualSummaryMetrics,\n AnnualSummaryRange,\n AnnualSummaryTextLength,\n} from '@openchatlab/shared-types'\n\nexport const ANNUAL_SUMMARY_ALGORITHM_VERSION = 'annual-summary-
|
|
1
|
+
{"version":3,"sources":["../../../packages/node-runtime/src/services/global-insight/types.ts"],"sourcesContent":["import type {\n AnnualSummaryCoverage,\n AnnualSummaryMetrics,\n AnnualSummaryRange,\n AnnualSummaryTextLength,\n} from '@openchatlab/shared-types'\n\nexport const ANNUAL_SUMMARY_ALGORITHM_VERSION = 'annual-summary-v2'\n\nexport interface AnnualSummaryWorkerStats {\n durationMs: number\n totalSessions: number\n processedSessions: number\n cacheHits: number\n cacheMisses: number\n}\n\nexport interface AnnualSummarySnapshot {\n algorithmVersion: string\n signature: string\n computedAt: number\n range: AnnualSummaryRange\n availableDataYears: number[]\n latestDataYear: number | null\n metrics: AnnualSummaryMetrics\n monthlyActivity: Array<{ month: string; messageCount: number }>\n monthlyDirectContacts: Array<{ month: string; contactCount: number }>\n dailyActivity: Array<{ date: string; messageCount: number }>\n messageTypes: Array<{ type: number; count: number }>\n textLength: AnnualSummaryTextLength\n coverage: AnnualSummaryCoverage\n workerStats: AnnualSummaryWorkerStats\n}\n\nexport interface AnnualSummaryComputeProgress {\n processedSessions: number\n totalSessions: number\n currentSessionId?: string\n}\n"],"mappings":";;;;;;;;AAOO,IAAM,mCAAmC;","names":[]}
|
|
@@ -11,21 +11,21 @@ import {
|
|
|
11
11
|
getServerAiLogger,
|
|
12
12
|
getSkillManagerCore,
|
|
13
13
|
initServerAiLogger
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-MPHFZYB7.mjs";
|
|
15
15
|
import {
|
|
16
16
|
AGENT_TOOL_REGISTRY,
|
|
17
17
|
CoreDataProvider
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-J7HAIT3T.mjs";
|
|
19
19
|
import {
|
|
20
20
|
analyzeIncrementalImport,
|
|
21
21
|
analyzeNewImport,
|
|
22
22
|
autoImport,
|
|
23
23
|
incrementalImport,
|
|
24
24
|
streamImport
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-YRCFDZ5Q.mjs";
|
|
26
26
|
import {
|
|
27
27
|
assertCliDataDirCompatible
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-OHFVX2HH.mjs";
|
|
29
29
|
import {
|
|
30
30
|
getVersion
|
|
31
31
|
} from "./chunk-5ADKYYNA.mjs";
|
|
@@ -45,14 +45,13 @@ import {
|
|
|
45
45
|
getPendingDataDirCleanups,
|
|
46
46
|
getPendingNodeDataDirMigration,
|
|
47
47
|
hasPendingElectronDataWarning,
|
|
48
|
+
importDemoSessions,
|
|
48
49
|
serializeChatLabToJsonl
|
|
49
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-ZM5DSHFF.mjs";
|
|
50
51
|
import {
|
|
51
52
|
AIChatManager,
|
|
52
53
|
ArchiveImportError,
|
|
53
54
|
ArchiveImportSourceManager,
|
|
54
|
-
CustomModelStore,
|
|
55
|
-
CustomProviderStore,
|
|
56
55
|
IMPORT_IN_PROGRESS_ERROR_KEY,
|
|
57
56
|
ImportIdempotencyCache,
|
|
58
57
|
ImportInProgressError,
|
|
@@ -63,11 +62,10 @@ import {
|
|
|
63
62
|
buildPiModel,
|
|
64
63
|
computeWordFrequency,
|
|
65
64
|
countMessagesTokens,
|
|
66
|
-
createAuthProfileLlmConfigStore,
|
|
67
65
|
createChatLabTempDir,
|
|
68
66
|
createContactsService,
|
|
69
|
-
createFileConfigStorage,
|
|
70
67
|
createGlobalInsightService,
|
|
68
|
+
createLlmRuntimeStores,
|
|
71
69
|
createPeopleRelationshipsService,
|
|
72
70
|
deleteDict,
|
|
73
71
|
detectAllFormats,
|
|
@@ -101,7 +99,7 @@ import {
|
|
|
101
99
|
streamParseFileInfo,
|
|
102
100
|
summary_service_exports,
|
|
103
101
|
validateApiKey
|
|
104
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-RRC6U56Y.mjs";
|
|
105
103
|
import {
|
|
106
104
|
resolveCliPath
|
|
107
105
|
} from "./chunk-FJ35V3TE.mjs";
|
|
@@ -130,6 +128,7 @@ import {
|
|
|
130
128
|
getDivingAnalysis,
|
|
131
129
|
getDragonKingAnalysis,
|
|
132
130
|
getHourlyActivity,
|
|
131
|
+
getJourneyStats,
|
|
133
132
|
getLanguagePreferenceAnalysis,
|
|
134
133
|
getLastPlatformMessageId,
|
|
135
134
|
getLaughAnalysis,
|
|
@@ -164,7 +163,7 @@ import {
|
|
|
164
163
|
stripAvatarFields,
|
|
165
164
|
verifyCliDataPath,
|
|
166
165
|
writeConfigField
|
|
167
|
-
} from "./chunk-
|
|
166
|
+
} from "./chunk-3RWYALUP.mjs";
|
|
168
167
|
|
|
169
168
|
// src/http/index.ts
|
|
170
169
|
import * as fs11 from "fs";
|
|
@@ -1647,6 +1646,14 @@ function registerAnalyticsRoutes(server2, ctx) {
|
|
|
1647
1646
|
return cached("relationship", id, { ...filter }, () => getRelationshipStats(adapter.ensureReadonly(id), filter));
|
|
1648
1647
|
}
|
|
1649
1648
|
);
|
|
1649
|
+
server2.get(
|
|
1650
|
+
"/_web/sessions/:id/analytics/journey",
|
|
1651
|
+
async (request) => {
|
|
1652
|
+
const id = request.params.id;
|
|
1653
|
+
const filter = parseTimeFilter(request.query);
|
|
1654
|
+
return cached("journey", id, { ...filter }, () => getJourneyStats(adapter.ensureReadonly(id), filter));
|
|
1655
|
+
}
|
|
1656
|
+
);
|
|
1650
1657
|
server2.get(
|
|
1651
1658
|
"/_web/sessions/:id/analytics/catchphrase",
|
|
1652
1659
|
async (request) => {
|
|
@@ -2622,7 +2629,8 @@ function registerPeopleRelationshipsRoutes(server2, ctx) {
|
|
|
2622
2629
|
async (request) => {
|
|
2623
2630
|
return service.getNeighborhood(request.params.key, {
|
|
2624
2631
|
acceptStale: isTruthy3(request.query.acceptStale),
|
|
2625
|
-
timeRangePreset: parseContactsTimeRangePreset2(request.query.timeRange)
|
|
2632
|
+
timeRangePreset: parseContactsTimeRangePreset2(request.query.timeRange),
|
|
2633
|
+
graphScope: parsePeopleRelationshipsGraphScope(request.query.scope)
|
|
2626
2634
|
});
|
|
2627
2635
|
}
|
|
2628
2636
|
);
|
|
@@ -3039,7 +3047,6 @@ function resolveNativeBinding() {
|
|
|
3039
3047
|
}
|
|
3040
3048
|
|
|
3041
3049
|
// src/http/routes/web/import.ts
|
|
3042
|
-
var DEMO_BASE_URL = "https://chatlab.fun/assets/demo";
|
|
3043
3050
|
var ARCHIVE_UPLOAD_LIMIT = 50 * 1024 * 1024 * 1024;
|
|
3044
3051
|
function cleanupTemp(...paths) {
|
|
3045
3052
|
for (const p of paths) {
|
|
@@ -3361,16 +3368,10 @@ data: ${JSON.stringify(eventData)}
|
|
|
3361
3368
|
cleanupTemp(tmpPath, tmpDir);
|
|
3362
3369
|
}
|
|
3363
3370
|
});
|
|
3364
|
-
const DEMO_FILES = [
|
|
3365
|
-
"demo-group.json",
|
|
3366
|
-
"demo-private-A-cuilan.json",
|
|
3367
|
-
"demo-private-B-wukong.json",
|
|
3368
|
-
"demo-private-C-spider.json"
|
|
3369
|
-
];
|
|
3370
3371
|
server2.post("/_web/demo/import", async (request, reply) => {
|
|
3371
|
-
const locale = request.body?.locale
|
|
3372
|
+
const locale = request.body?.locale === "cn" ? "cn" : "en";
|
|
3373
|
+
const targetTimeZone = typeof request.body?.timeZone === "string" ? request.body.timeZone : void 0;
|
|
3372
3374
|
const nativeBinding = resolveNativeBinding();
|
|
3373
|
-
const total = DEMO_FILES.length;
|
|
3374
3375
|
reply.raw.writeHead(200, {
|
|
3375
3376
|
"Content-Type": "text/event-stream",
|
|
3376
3377
|
"Cache-Control": "no-cache",
|
|
@@ -3382,43 +3383,18 @@ data: ${JSON.stringify(eventData)}
|
|
|
3382
3383
|
|
|
3383
3384
|
`);
|
|
3384
3385
|
}
|
|
3385
|
-
const
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
|
|
3389
|
-
|
|
3390
|
-
|
|
3391
|
-
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
}
|
|
3398
|
-
sendEvent("progress", { stage: "importing", current: 1, total });
|
|
3399
|
-
const groupResult = await streamImport(dbManager2, localPaths[0], { nativeBinding });
|
|
3400
|
-
if (!groupResult.success) throw new Error(groupResult.error || "Failed to import group demo");
|
|
3401
|
-
const privateSessionIds = [];
|
|
3402
|
-
for (let i = 1; i < localPaths.length; i++) {
|
|
3403
|
-
sendEvent("progress", { stage: "importing", current: i + 1, total });
|
|
3404
|
-
const result = await streamImport(dbManager2, localPaths[i], { nativeBinding });
|
|
3405
|
-
if (!result.success) throw new Error(result.error || `Failed to import private demo: ${DEMO_FILES[i]}`);
|
|
3406
|
-
if (result.sessionId) privateSessionIds.push(result.sessionId);
|
|
3407
|
-
}
|
|
3408
|
-
sendEvent("progress", { stage: "done", current: total, total });
|
|
3409
|
-
sendEvent("result", {
|
|
3410
|
-
success: true,
|
|
3411
|
-
groupSessionId: groupResult.sessionId,
|
|
3412
|
-
privateSessionIds
|
|
3413
|
-
});
|
|
3414
|
-
} catch (err) {
|
|
3415
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
3416
|
-
sendEvent("progress", { stage: "error", current: 0, total, message });
|
|
3417
|
-
sendEvent("result", { success: false, error: message });
|
|
3418
|
-
} finally {
|
|
3419
|
-
reply.raw.end();
|
|
3420
|
-
cleanupTemp(tmpDir);
|
|
3421
|
-
}
|
|
3386
|
+
const result = await importDemoSessions({
|
|
3387
|
+
locale,
|
|
3388
|
+
tempPrefix: "cli-demo-",
|
|
3389
|
+
targetTimeZone,
|
|
3390
|
+
importFile: (filePath) => streamImport(dbManager2, filePath, { nativeBinding }),
|
|
3391
|
+
deleteSession: (sessionId) => {
|
|
3392
|
+
dbManager2.deleteSessionDatabaseFiles(sessionId);
|
|
3393
|
+
},
|
|
3394
|
+
onProgress: (progress) => sendEvent("progress", progress)
|
|
3395
|
+
});
|
|
3396
|
+
sendEvent("result", result);
|
|
3397
|
+
reply.raw.end();
|
|
3422
3398
|
});
|
|
3423
3399
|
}
|
|
3424
3400
|
|
|
@@ -3488,10 +3464,10 @@ function registerWebRoutes2(server2, dbManager2, options) {
|
|
|
3488
3464
|
const resolvedPathProvider = options?.pathProvider ?? fallbackPathProvider;
|
|
3489
3465
|
const ai = options?.aiContext;
|
|
3490
3466
|
const cliStreamImport = async (dm, filePath) => {
|
|
3491
|
-
const { streamImport: streamImport2 } = await import("./stream-import-
|
|
3467
|
+
const { streamImport: streamImport2 } = await import("./stream-import-K24HWAAZ.mjs");
|
|
3492
3468
|
const result = await streamImport2(dm, filePath);
|
|
3493
3469
|
if (!result.success) {
|
|
3494
|
-
const { IMPORT_IN_PROGRESS_ERROR_KEY: IMPORT_IN_PROGRESS_ERROR_KEY2, ImportInProgressError: ImportInProgressError2 } = await import("./src-
|
|
3470
|
+
const { IMPORT_IN_PROGRESS_ERROR_KEY: IMPORT_IN_PROGRESS_ERROR_KEY2, ImportInProgressError: ImportInProgressError2 } = await import("./src-DLLM4SEO.mjs");
|
|
3495
3471
|
if (result.error === IMPORT_IN_PROGRESS_ERROR_KEY2) throw new ImportInProgressError2();
|
|
3496
3472
|
throw new Error(result.error || "Import failed");
|
|
3497
3473
|
}
|
|
@@ -4572,10 +4548,11 @@ async function startHttpServer(options) {
|
|
|
4572
4548
|
aiChatManager = new AIChatManager(aiDataDir, { nativeBinding });
|
|
4573
4549
|
const assistantManager = getAssistantManager(aiDataDir);
|
|
4574
4550
|
const skillManagerCore = getSkillManagerCore(aiDataDir);
|
|
4575
|
-
const
|
|
4576
|
-
const llmConfigStore =
|
|
4551
|
+
const llmRuntimeStores = createLlmRuntimeStores(aiDataDir);
|
|
4552
|
+
const { llmConfigStore, customProviderStore, customModelStore } = llmRuntimeStores;
|
|
4577
4553
|
initAppLogger(pathProvider.getLogsDir());
|
|
4578
4554
|
initServerAiLogger(pathProvider.getLogsDir());
|
|
4555
|
+
appLogger.info("ai-config", "Shared LLM configuration store initialized", { aiDataDir });
|
|
4579
4556
|
appLogger.info("temp-workspace", "Temporary workspace initialized", { root: pathProvider.getTempDir() });
|
|
4580
4557
|
appLogger.info("server", `HTTP server starting on ${host}:${port}`);
|
|
4581
4558
|
logNativeParserStatus();
|
|
@@ -4611,9 +4588,12 @@ async function startHttpServer(options) {
|
|
|
4611
4588
|
assistantManager,
|
|
4612
4589
|
skillManagerCore,
|
|
4613
4590
|
llmConfigStore,
|
|
4614
|
-
customProviderStore
|
|
4615
|
-
customModelStore
|
|
4616
|
-
runAgentStream: createCliRunAgentStream(dbManager, aiChatManager,
|
|
4591
|
+
customProviderStore,
|
|
4592
|
+
customModelStore,
|
|
4593
|
+
runAgentStream: createCliRunAgentStream(dbManager, aiChatManager, {
|
|
4594
|
+
llmConfigStore,
|
|
4595
|
+
semanticIndexService
|
|
4596
|
+
})
|
|
4617
4597
|
}
|
|
4618
4598
|
});
|
|
4619
4599
|
initSync(server, dbManager, pathProvider, { port, host, token });
|
|
@@ -4658,4 +4638,4 @@ export {
|
|
|
4658
4638
|
startHttpServer,
|
|
4659
4639
|
stopHttpServer
|
|
4660
4640
|
};
|
|
4661
|
-
//# sourceMappingURL=chunk-
|
|
4641
|
+
//# sourceMappingURL=chunk-RMW3524R.mjs.map
|