@cicctencent/agent-core 1.0.16 → 1.0.18

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 (71) hide show
  1. package/dist/cjs/agent/compaction.d.ts +26 -0
  2. package/dist/cjs/agent/compaction.d.ts.map +1 -0
  3. package/dist/cjs/agent/compaction.js +95 -0
  4. package/dist/cjs/agent/compaction.js.map +1 -0
  5. package/dist/cjs/agent/engine.d.ts +8 -9
  6. package/dist/cjs/agent/engine.d.ts.map +1 -1
  7. package/dist/cjs/agent/engine.js +62 -78
  8. package/dist/cjs/agent/engine.js.map +1 -1
  9. package/dist/cjs/agent/history-manager.d.ts.map +1 -1
  10. package/dist/cjs/agent/history-manager.js +1 -4
  11. package/dist/cjs/agent/history-manager.js.map +1 -1
  12. package/dist/cjs/agent/types.d.ts +2 -0
  13. package/dist/cjs/agent/types.d.ts.map +1 -1
  14. package/dist/cjs/agent/types.js.map +1 -1
  15. package/dist/cjs/index.d.ts +3 -1
  16. package/dist/cjs/index.d.ts.map +1 -1
  17. package/dist/cjs/index.js +9 -4
  18. package/dist/cjs/index.js.map +1 -1
  19. package/dist/cjs/skill/frontmatter.d.ts +18 -0
  20. package/dist/cjs/skill/frontmatter.d.ts.map +1 -0
  21. package/dist/cjs/skill/frontmatter.js +332 -0
  22. package/dist/cjs/skill/frontmatter.js.map +1 -0
  23. package/dist/cjs/skill/manager.d.ts +33 -6
  24. package/dist/cjs/skill/manager.d.ts.map +1 -1
  25. package/dist/cjs/skill/manager.js +234 -81
  26. package/dist/cjs/skill/manager.js.map +1 -1
  27. package/dist/cjs/skill/types.d.ts +26 -0
  28. package/dist/cjs/skill/types.d.ts.map +1 -1
  29. package/dist/cjs/store/file-tool-result-store.d.ts +5 -0
  30. package/dist/cjs/store/file-tool-result-store.d.ts.map +1 -1
  31. package/dist/cjs/store/file-tool-result-store.js +14 -0
  32. package/dist/cjs/store/file-tool-result-store.js.map +1 -1
  33. package/dist/cjs/utils/token-counter.d.ts.map +1 -1
  34. package/dist/cjs/utils/token-counter.js +20 -16
  35. package/dist/cjs/utils/token-counter.js.map +1 -1
  36. package/dist/esm/agent/compaction.d.ts +26 -0
  37. package/dist/esm/agent/compaction.d.ts.map +1 -0
  38. package/dist/esm/agent/compaction.js +91 -0
  39. package/dist/esm/agent/compaction.js.map +1 -0
  40. package/dist/esm/agent/engine.d.ts +8 -9
  41. package/dist/esm/agent/engine.d.ts.map +1 -1
  42. package/dist/esm/agent/engine.js +61 -77
  43. package/dist/esm/agent/engine.js.map +1 -1
  44. package/dist/esm/agent/history-manager.d.ts.map +1 -1
  45. package/dist/esm/agent/history-manager.js +1 -4
  46. package/dist/esm/agent/history-manager.js.map +1 -1
  47. package/dist/esm/agent/types.d.ts +2 -0
  48. package/dist/esm/agent/types.d.ts.map +1 -1
  49. package/dist/esm/agent/types.js.map +1 -1
  50. package/dist/esm/index.d.ts +3 -1
  51. package/dist/esm/index.d.ts.map +1 -1
  52. package/dist/esm/index.js +1 -0
  53. package/dist/esm/index.js.map +1 -1
  54. package/dist/esm/skill/frontmatter.d.ts +18 -0
  55. package/dist/esm/skill/frontmatter.d.ts.map +1 -0
  56. package/dist/esm/skill/frontmatter.js +326 -0
  57. package/dist/esm/skill/frontmatter.js.map +1 -0
  58. package/dist/esm/skill/manager.d.ts +33 -6
  59. package/dist/esm/skill/manager.d.ts.map +1 -1
  60. package/dist/esm/skill/manager.js +234 -81
  61. package/dist/esm/skill/manager.js.map +1 -1
  62. package/dist/esm/skill/types.d.ts +26 -0
  63. package/dist/esm/skill/types.d.ts.map +1 -1
  64. package/dist/esm/store/file-tool-result-store.d.ts +5 -0
  65. package/dist/esm/store/file-tool-result-store.d.ts.map +1 -1
  66. package/dist/esm/store/file-tool-result-store.js +14 -0
  67. package/dist/esm/store/file-tool-result-store.js.map +1 -1
  68. package/dist/esm/utils/token-counter.d.ts.map +1 -1
  69. package/dist/esm/utils/token-counter.js +20 -16
  70. package/dist/esm/utils/token-counter.js.map +1 -1
  71. package/package.json +7 -4
@@ -0,0 +1,26 @@
1
+ import type { ToolDefinition } from '../tool/types.js';
2
+ /**
3
+ * 生成工具调用的简短摘要(用于历史摘要)。
4
+ * 保留工具名和关键参数,让 LLM 在后续轮次中能复用之前的调用参数。
5
+ *
6
+ * @param name 工具名
7
+ * @param args 工具参数
8
+ */
9
+ export declare function summarizeToolCall(name: string, args: Record<string, unknown>): string;
10
+ /** 工具定义摘要选项 */
11
+ export interface SummarizeToolDefOptions {
12
+ /** 摘要范围:'mcp'=仅 MCP 工具摘要, 'all'=所有传入工具摘要, null=保持原样 */
13
+ scope: 'mcp' | 'all' | null;
14
+ /** 最大描述长度(默认 100) */
15
+ maxDesc?: number;
16
+ /** 判断工具分类的回调(由调用方注入 ToolRegistry 依赖,保持此处无硬依赖) */
17
+ getCategory?: (name: string) => string | undefined;
18
+ }
19
+ /**
20
+ * 将工具定义转为摘要形式(截断 description + 清空 parameters)。
21
+ *
22
+ * @param def 原始工具定义
23
+ * @param options 摘要选项(含 category 查询注入)
24
+ */
25
+ export declare function summarizeToolDef(def: ToolDefinition, options: SummarizeToolDefOptions): ToolDefinition;
26
+ //# sourceMappingURL=compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/agent/compaction.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkBvD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA0BrF;AAED,eAAe;AACf,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC5B,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACpD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,uBAAuB,GAC/B,cAAc,CAoBhB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // Compaction — 历史压缩纯逻辑(从 engine.ts 抽离)
4
+ // ============================================================
5
+ //
6
+ // 本文件承载 AgentEngine 历史压缩相关的「纯函数」部分,与运行时/LLM 调用解耦,
7
+ // 以便独立单元测试。拆分目标:在重构 engine.ts(~2000 行)前,先锁定这些
8
+ // 可被精确断言的纯逻辑行为,避免拆分引入隐性回归。
9
+ //
10
+ // 依赖说明:
11
+ // - summarizeToolCall: 无外部依赖,纯字符串变换
12
+ // - summarizeToolDef: 需要 ToolRegistry 判断 category(保留轻量依赖)
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.summarizeToolCall = summarizeToolCall;
15
+ exports.summarizeToolDef = summarizeToolDef;
16
+ /**
17
+ * 安全序列化值为字符串(处理 JSON.stringify 的边界情况)。
18
+ * - undefined / function / Symbol → String(v)
19
+ * - 循环引用 → '[Circular]'
20
+ */
21
+ function safeSerialize(v) {
22
+ if (v === undefined || typeof v === 'function' || typeof v === 'symbol') {
23
+ return String(v);
24
+ }
25
+ try {
26
+ return JSON.stringify(v) ?? String(v);
27
+ }
28
+ catch {
29
+ return '[Circular]';
30
+ }
31
+ }
32
+ /**
33
+ * 生成工具调用的简短摘要(用于历史摘要)。
34
+ * 保留工具名和关键参数,让 LLM 在后续轮次中能复用之前的调用参数。
35
+ *
36
+ * @param name 工具名
37
+ * @param args 工具参数
38
+ */
39
+ function summarizeToolCall(name, args) {
40
+ switch (name) {
41
+ case 'delegate_task': {
42
+ const agent = args.agent || '';
43
+ const task = typeof args.task === 'string' ? args.task.slice(0, 80) : '';
44
+ return `delegate_task(agent=${agent}, task="${task}...")`;
45
+ }
46
+ case 'create_report':
47
+ case 'create_presentation':
48
+ case 'create_document':
49
+ case 'create_pdf':
50
+ case 'save_artifact': {
51
+ const filename = (args.filename || args.title || '').slice(0, 60);
52
+ return `${name}(filename="${filename}")`;
53
+ }
54
+ default: {
55
+ // 通用:展示前 3 个参数的键名和值摘要
56
+ const keys = Object.keys(args).slice(0, 3);
57
+ const parts = keys.map(k => {
58
+ const v = args[k];
59
+ const s = typeof v === 'string' ? v.slice(0, 50) : safeSerialize(v).slice(0, 50);
60
+ return `${k}=${s}`;
61
+ });
62
+ return `${name}(${parts.join(', ')})`;
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * 将工具定义转为摘要形式(截断 description + 清空 parameters)。
68
+ *
69
+ * @param def 原始工具定义
70
+ * @param options 摘要选项(含 category 查询注入)
71
+ */
72
+ function summarizeToolDef(def, options) {
73
+ const { scope, maxDesc = 100, getCategory } = options;
74
+ if (scope === null)
75
+ return def;
76
+ if (scope === 'mcp' && getCategory?.(def.function.name) !== 'mcp')
77
+ return def;
78
+ const desc = def.function.description.length > maxDesc
79
+ ? def.function.description.slice(0, maxDesc) + '...'
80
+ : def.function.description;
81
+ return {
82
+ ...def,
83
+ type: 'function',
84
+ function: {
85
+ name: def.function.name,
86
+ description: desc + ` (use read_tool_doc to get full schema before calling; use read_tool_doc(tool_name="list") to see all available tools)`,
87
+ parameters: {
88
+ type: 'object',
89
+ properties: {},
90
+ required: [],
91
+ },
92
+ },
93
+ };
94
+ }
95
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/agent/compaction.ts"],"names":[],"mappings":"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"}
@@ -140,8 +140,7 @@ export declare class AgentEngine {
140
140
  private resolveToolDefs;
141
141
  /**
142
142
  * 将工具定义转为摘要形式(截断 description + 清空 parameters)。
143
- * @param def 原始工具定义
144
- * @param scope 摘要范围:'mcp'=仅MCP工具摘要, 'all'=所有传入工具摘要, null=保持原样
143
+ * 实现抽离至 ./compaction.ts,保持单一来源。
145
144
  */
146
145
  private summarizeToolDef;
147
146
  /** 构建 ToolContext */
@@ -167,16 +166,16 @@ export declare class AgentEngine {
167
166
  * - 且这些调用**全部失败** → 最终产出的数据必然来自模型记忆(真实历史或编造,执行层无法区分);
168
167
  * - → 追加「未经实时核验」声明。
169
168
  *
170
- * 不触发(正确放行):
171
- * - 从未调用外部数据工具(纯本地/推理任务)→ 无需水印;
172
- * - 外部数据工具**有成功** → 数据已核验,无需水印。
173
- *
174
- * @returns 需要追加的声明文本;无需水印时返回空串
175
- */
176
- private buildProvenanceNotice;
177
169
  /**
178
170
  * 对最终回复应用数据出处水印(幂等)。
179
171
  * 仅当有实际文本内容、需要水印、且尚未包含水印标记时追加。
172
+ *
173
+ * 触发(添加水印):
174
+ * - 本轮调用过外部数据获取工具且全部失败 → 最终回复中的数据必然来自记忆 → 需要声明;
175
+ *
176
+ * 不触发(正确放行):
177
+ * - 从未调用外部数据工具(纯本地/推理任务)→ 无需水印;
178
+ * - 外部数据工具**有成功** → 数据已核验,无需水印。
180
179
  */
181
180
  private applyProvenanceNotice;
182
181
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/agent/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/agent/engine.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ const llm_caller_ts_1 = require("./llm-caller.js");
12
12
  const tool_executor_ts_1 = require("./tool-executor.js");
13
13
  const logger_ts_1 = require("../observability/logger.js");
14
14
  const rate_limit_manager_ts_1 = require("./rate-limit-manager.js");
15
+ const compaction_ts_1 = require("./compaction.js");
15
16
  /** 默认系统提示词 */
16
17
  const DEFAULT_BASE_PROMPT = `You are a helpful AI assistant with access to tools. Use tools when needed to accomplish tasks. Always explain your actions clearly.`;
17
18
  /**
@@ -49,7 +50,7 @@ When using tools, you MUST provide brief visible narration for the user:
49
50
  - When the task is complete, always end with a clear summary of what was accomplished.
50
51
  - DO NOT output tool calls without accompanying text narration.
51
52
  - **delegate_task / sub-agent output**: When a delegated sub-agent completes, its full output has ALREADY been streamed to the user in real-time. Do NOT repeat or re-output the sub-agent's content. Only write ONE brief sentence summarizing the outcome, then continue with next steps or conclude.
52
- - **Reusing delegate_task results**: When you need data from a previous delegate_task call in later turns, use \`read_tool_result(call_id="...")\` to retrieve the saved result instead of re-running delegate_task. Re-running delegate_task is expensive (a full sub-agent execution) and may produce inconsistent results. The call_id is the tool_call_id of the delegate_task's tool result message. If the result has been compressed to a placeholder or offload tag, the call_id is included in the tag text.
53
+ - **Reusing delegate_task results (CRITICAL)**: When the conversation history contains a section marked "[delegate_task 完整分析结果]", **use that data directly** — do NOT re-run delegate_task. Re-running delegate_task is expensive (a full sub-agent execution), may produce inconsistent results, and is strictly prohibited when the analysis data is already available in the conversation history. If the result has been compressed to a placeholder, use \`read_tool_result(call_id="...")\` to retrieve it.
53
54
  `;
54
55
  /** 数据出处水印标记(隐藏 HTML 注释,用于幂等判定,避免重复注入) */
55
56
  const PROVENANCE_MARKER = '<!--provenance-unverified-->';
@@ -71,42 +72,27 @@ function buildSkillCatalog(skillManager) {
71
72
  const manifests = skillManager.getAllManifests();
72
73
  if (manifests.length === 0)
73
74
  return null;
75
+ let hasResources = false;
74
76
  const lines = manifests.map(m => {
75
77
  const aliases = m.aliases?.length ? ` (also known as: ${m.aliases.join(', ')})` : '';
76
- return `- \`${m.id}\`: ${m.name}${aliases} — ${m.description || '(no description)'}`;
78
+ // 标注标准目录包资源(脚本/参考文档/静态资源),引导 agent 按需访问
79
+ const res = m.resources;
80
+ const badges = [];
81
+ if (res?.scripts?.length)
82
+ badges.push(`${res.scripts.length} scripts`);
83
+ if (res?.references?.length)
84
+ badges.push(`${res.references.length} refs`);
85
+ if (res?.assets?.length)
86
+ badges.push(`${res.assets.length} assets`);
87
+ if (badges.length)
88
+ hasResources = true;
89
+ const resBadge = badges.length ? ` [resources: ${badges.join(', ')}]` : '';
90
+ return `- \`${m.id}\`: ${m.name}${aliases} — ${m.description || '(no description)'}${resBadge}`;
77
91
  });
78
- return `## Available Skills\n\nYou have access to the following skills. **Before using any tools, ALWAYS check if the user's request matches one of these skills first.** If a skill is relevant, call \`load_skill(skill_id="<id>")\` to load its full instructions, then follow those instructions. Skill names and aliases may not exactly match the user's wording - use semantic judgment to identify matches.\n\n${lines.join('\n')}`;
79
- }
80
- /**
81
- * 生成工具调用的简短摘要(用于历史摘要)。
82
- * 保留工具名和关键参数,让 LLM 在后续轮次中能复用之前的调用参数。
83
- */
84
- function summarizeToolCall(name, args) {
85
- switch (name) {
86
- case 'delegate_task': {
87
- const agent = args.agent || '';
88
- const task = typeof args.task === 'string' ? args.task.slice(0, 80) : '';
89
- return `delegate_task(agent=${agent}, task="${task}...")`;
90
- }
91
- case 'create_report':
92
- case 'create_presentation':
93
- case 'create_document':
94
- case 'create_pdf':
95
- case 'save_artifact': {
96
- const filename = (args.filename || args.title || '').slice(0, 60);
97
- return `${name}(filename="${filename}")`;
98
- }
99
- default: {
100
- // 通用:展示前 3 个参数的键名和值摘要
101
- const keys = Object.keys(args).slice(0, 3);
102
- const parts = keys.map(k => {
103
- const v = args[k];
104
- const s = typeof v === 'string' ? v.slice(0, 50) : JSON.stringify(v)?.slice(0, 50);
105
- return `${k}=${s}`;
106
- });
107
- return `${name}(${parts.join(', ')})`;
108
- }
109
- }
92
+ const resourceGuide = hasResources
93
+ ? `\n\nSkills marked with [resources: ...] are standard packages bundling docs and scripts. After loading such a skill with load_skill, read bundled reference docs on demand via \`read_skill_reference(skill_id, path)\` and execute bundled scripts via \`run_skill_script(skill_id, script, args)\` — do NOT read all resources upfront.`
94
+ : '';
95
+ return `## Available Skills\n\nYou have access to the following skills. **Before using any tools, ALWAYS check if the user's request matches one of these skills first.** If a skill is relevant, call \`load_skill(skill_id="<id>")\` to load its full instructions, then follow those instructions. Skill names and aliases may not exactly match the user's wording - use semantic judgment to identify matches.\n\n${lines.join('\n')}${resourceGuide}`;
110
96
  }
111
97
  class AgentEngine {
112
98
  config;
@@ -514,6 +500,8 @@ class AgentEngine {
514
500
  }
515
501
  if (effectiveHistory.length === 0)
516
502
  return [];
503
+ // 收集 delegate_task 完整结果(在 800 字摘要之外单独追加,避免被截断)
504
+ const delegateTaskResults = [];
517
505
  // 提取纯文本用于摘要(包含工具调用和工具结果,否则 LLM 丢失关键上下文)
518
506
  const textHistory = effectiveHistory
519
507
  .map(m => {
@@ -525,9 +513,23 @@ class AgentEngine {
525
513
  // 保留 artifact URL(关键!否则后续引用已生成的报告/文件时丢失链接)
526
514
  const urlMatch = text.match(/(?:URL|url|artifact)[::]\s*(\/api\/[^\s"']+)/i);
527
515
  const urlInfo = urlMatch ? ` [artifact_url: ${urlMatch[1]}]` : '';
528
- // delegate_task 结果保留更多上下文(500 字符),因为重新生成成本极高,
529
- // 摘要中保留更多分析数据可减少 LLM 因"看不到数据"而重跑 delegate_task 的倾向
530
516
  const toolName = history_manager_ts_1.HistoryManager.findToolNameForCallId(m.tool_call_id || '', effectiveHistory);
517
+ const callIdMatch = text.match(/\[call_id:\s*"([^"]+)"\]/);
518
+ const extractedCallId = callIdMatch?.[1] || m.tool_call_id || '';
519
+ // delegate_task 结果:在 textHistory 中仅保留短占位符,
520
+ // 完整结果在摘要构建后单独追加(不受 800 字摘要截断影响)
521
+ if (toolName === 'delegate_task' && extractedCallId && this.config.toolResultStore) {
522
+ const fullResult = this.config.toolResultStore.read(extractedCallId);
523
+ if (fullResult) {
524
+ const MAX_DELEGATE_INJECT = 4000;
525
+ const injected = fullResult.length > MAX_DELEGATE_INJECT
526
+ ? fullResult.slice(0, MAX_DELEGATE_INJECT) + '\n...(已截断,完整结果可用 read_tool_result 检索)'
527
+ : fullResult;
528
+ delegateTaskResults.push(`[delegate_task 完整分析结果]:\n${injected}`);
529
+ return `[工具结果] [delegate_task] 分析完成,完整结果见下方 [delegate_task 完整分析结果] 部分`;
530
+ }
531
+ }
532
+ // 其他工具结果保留截断摘要
531
533
  const toolResultLimit = toolName === 'delegate_task' ? 500 : 150;
532
534
  const truncated = text.length > toolResultLimit
533
535
  ? text.slice(0, toolResultLimit) + '...' + urlInfo
@@ -546,7 +548,7 @@ class AgentEngine {
546
548
  args = JSON.parse(tc.function.arguments);
547
549
  }
548
550
  catch { /* ignore */ }
549
- return summarizeToolCall(tc.function.name, args);
551
+ return (0, compaction_ts_1.summarizeToolCall)(tc.function.name, args);
550
552
  });
551
553
  toolInfo = ` [调用: ${callSummaries.join('; ')}]`;
552
554
  }
@@ -586,6 +588,12 @@ class AgentEngine {
586
588
  }
587
589
  }
588
590
  }
591
+ // 在 800 字摘要之后追加 delegate_task 完整分析结果(不受摘要截断影响)。
592
+ // 这是确保后续轮次能直接复用分析数据的关键机制,
593
+ // 避免 LLM 因"看不到数据"而重新调用 delegate_task。
594
+ if (delegateTaskResults.length > 0) {
595
+ summary += `\n\n${delegateTaskResults.join('\n\n---\n\n')}`;
596
+ }
589
597
  // 确保 delegate_task 的 call_id 始终可见(不受摘要截断/LLM压缩影响)。
590
598
  // 从 effectiveHistory 的 tool 消息中直接提取 tool_call_id(OpenAI 元数据,始终存在),
591
599
  // 不依赖 processToolOutput 的 [call_id:...] 前缀或摘要保留。
@@ -707,31 +715,14 @@ ${textHistory.join('\n')}`;
707
715
  }
708
716
  /**
709
717
  * 将工具定义转为摘要形式(截断 description + 清空 parameters)。
710
- * @param def 原始工具定义
711
- * @param scope 摘要范围:'mcp'=仅MCP工具摘要, 'all'=所有传入工具摘要, null=保持原样
718
+ * 实现抽离至 ./compaction.ts,保持单一来源。
712
719
  */
713
720
  summarizeToolDef(def, scope) {
714
- if (scope === null)
715
- return def;
716
- const tool = this.config.toolRegistry.get(def.function.name);
717
- if (scope === 'mcp' && tool?.category !== 'mcp')
718
- return def;
719
- const maxDesc = this.config.toolSummaryMaxDesc ?? 100;
720
- const desc = def.function.description.length > maxDesc
721
- ? def.function.description.slice(0, maxDesc) + '...'
722
- : def.function.description;
723
- return {
724
- type: 'function',
725
- function: {
726
- name: def.function.name,
727
- description: desc + ` (use read_tool_doc to get full schema before calling; use read_tool_doc(tool_name="list") to see all available tools)`,
728
- parameters: {
729
- type: 'object',
730
- properties: {},
731
- required: [],
732
- },
733
- },
734
- };
721
+ return (0, compaction_ts_1.summarizeToolDef)(def, {
722
+ scope,
723
+ maxDesc: this.config.toolSummaryMaxDesc ?? 100,
724
+ getCategory: (name) => this.config.toolRegistry.get(name)?.category,
725
+ });
735
726
  }
736
727
  // ---- 准备阶段(续) ----
737
728
  /** 构建 ToolContext */
@@ -1164,32 +1155,25 @@ ${textHistory.join('\n')}`;
1164
1155
  * - 且这些调用**全部失败** → 最终产出的数据必然来自模型记忆(真实历史或编造,执行层无法区分);
1165
1156
  * - → 追加「未经实时核验」声明。
1166
1157
  *
1167
- * 不触发(正确放行):
1168
- * - 从未调用外部数据工具(纯本地/推理任务)→ 无需水印;
1169
- * - 外部数据工具**有成功** → 数据已核验,无需水印。
1170
- *
1171
- * @returns 需要追加的声明文本;无需水印时返回空串
1172
- */
1173
- buildProvenanceNotice(state) {
1174
- const externalCalls = state.toolCallRecords.filter(r => this.externalDataFetchTools.has(r.tool));
1175
- if (externalCalls.length === 0)
1176
- return ''; // 未尝试外部数据源 → 不判定
1177
- if (externalCalls.some(r => !r.isError))
1178
- return ''; // 有成功获取 → 视为已核验
1179
- return PROVENANCE_UNVERIFIED_NOTICE; // 尝试过但全失败 → 数据来自记忆
1180
- }
1181
1158
  /**
1182
1159
  * 对最终回复应用数据出处水印(幂等)。
1183
1160
  * 仅当有实际文本内容、需要水印、且尚未包含水印标记时追加。
1161
+ *
1162
+ * 触发(添加水印):
1163
+ * - 本轮调用过外部数据获取工具且全部失败 → 最终回复中的数据必然来自记忆 → 需要声明;
1164
+ *
1165
+ * 不触发(正确放行):
1166
+ * - 从未调用外部数据工具(纯本地/推理任务)→ 无需水印;
1167
+ * - 外部数据工具**有成功** → 数据已核验,无需水印。
1184
1168
  */
1185
1169
  applyProvenanceNotice(state, content) {
1186
1170
  if (!content || content.includes(PROVENANCE_MARKER))
1187
1171
  return content;
1188
- const notice = this.buildProvenanceNotice(state);
1189
- if (!notice)
1172
+ const externalCalls = state.toolCallRecords.filter(r => this.externalDataFetchTools.has(r.tool));
1173
+ if (externalCalls.length === 0 || externalCalls.some(r => !r.isError))
1190
1174
  return content;
1191
- (0, logger_ts_1.logEvent)({ event: 'engine.provenance_notice', sessionId: state.sessionId, level: 'warn', data: { iteration: state.iteration, externalCalls: state.toolCallRecords.filter(r => this.externalDataFetchTools.has(r.tool)).length } });
1192
- return content + notice;
1175
+ (0, logger_ts_1.logEvent)({ event: 'engine.provenance_notice', sessionId: state.sessionId, level: 'warn', data: { iteration: state.iteration, externalCalls: externalCalls.length } });
1176
+ return content + PROVENANCE_UNVERIFIED_NOTICE;
1193
1177
  }
1194
1178
  /**
1195
1179
  * 生成兜底总结(当 LLM 调用失败或无内容输出时使用)。