@co-engram/core 0.1.1 → 0.1.3

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 (227) hide show
  1. package/dist/bootstrap/classify.d.ts +67 -0
  2. package/dist/bootstrap/classify.d.ts.map +1 -0
  3. package/dist/bootstrap/classify.js +119 -0
  4. package/dist/bootstrap/classify.js.map +1 -0
  5. package/dist/bootstrap/index.d.ts +89 -0
  6. package/dist/bootstrap/index.d.ts.map +1 -0
  7. package/dist/bootstrap/index.js +158 -0
  8. package/dist/bootstrap/index.js.map +1 -0
  9. package/dist/concepts/dictionary.d.ts +260 -0
  10. package/dist/concepts/dictionary.d.ts.map +1 -0
  11. package/dist/concepts/dictionary.js +253 -0
  12. package/dist/concepts/dictionary.js.map +1 -0
  13. package/dist/concepts/index.d.ts +11 -0
  14. package/dist/concepts/index.d.ts.map +1 -0
  15. package/dist/concepts/index.js +10 -0
  16. package/dist/concepts/index.js.map +1 -0
  17. package/dist/concepts/types.d.ts +65 -0
  18. package/dist/concepts/types.d.ts.map +1 -0
  19. package/dist/concepts/types.js +15 -0
  20. package/dist/concepts/types.js.map +1 -0
  21. package/dist/config/defaults.d.ts +32 -3
  22. package/dist/config/defaults.d.ts.map +1 -1
  23. package/dist/config/defaults.js +52 -2
  24. package/dist/config/defaults.js.map +1 -1
  25. package/dist/config/index.d.ts +18 -1
  26. package/dist/config/index.d.ts.map +1 -1
  27. package/dist/config/index.js +75 -3
  28. package/dist/config/index.js.map +1 -1
  29. package/dist/config/loader.d.ts +10 -0
  30. package/dist/config/loader.d.ts.map +1 -0
  31. package/dist/config/loader.js +10 -0
  32. package/dist/config/loader.js.map +1 -0
  33. package/dist/config/types.d.ts +97 -1
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/contradiction/auto-degrade.d.ts +11 -2
  36. package/dist/contradiction/auto-degrade.d.ts.map +1 -1
  37. package/dist/contradiction/auto-degrade.js +22 -0
  38. package/dist/contradiction/auto-degrade.js.map +1 -1
  39. package/dist/contradiction/resolver.d.ts.map +1 -1
  40. package/dist/contradiction/resolver.js +7 -1
  41. package/dist/contradiction/resolver.js.map +1 -1
  42. package/dist/dreaming/index.d.ts +1 -0
  43. package/dist/dreaming/index.d.ts.map +1 -1
  44. package/dist/dreaming/index.js +1 -0
  45. package/dist/dreaming/index.js.map +1 -1
  46. package/dist/dreaming/llm-pattern-abstraction.d.ts +31 -0
  47. package/dist/dreaming/llm-pattern-abstraction.d.ts.map +1 -0
  48. package/dist/dreaming/llm-pattern-abstraction.js +70 -0
  49. package/dist/dreaming/llm-pattern-abstraction.js.map +1 -0
  50. package/dist/dreaming/rem.d.ts.map +1 -1
  51. package/dist/dreaming/rem.js +1 -0
  52. package/dist/dreaming/rem.js.map +1 -1
  53. package/dist/dreaming/scheduler.d.ts +13 -0
  54. package/dist/dreaming/scheduler.d.ts.map +1 -1
  55. package/dist/dreaming/scheduler.js +14 -2
  56. package/dist/dreaming/scheduler.js.map +1 -1
  57. package/dist/evolution/triggered.d.ts.map +1 -1
  58. package/dist/evolution/triggered.js +1 -0
  59. package/dist/evolution/triggered.js.map +1 -1
  60. package/dist/generative/hypothesis.d.ts.map +1 -1
  61. package/dist/generative/hypothesis.js +1 -0
  62. package/dist/generative/hypothesis.js.map +1 -1
  63. package/dist/i18n/en.d.ts.map +1 -1
  64. package/dist/i18n/en.js +1262 -32
  65. package/dist/i18n/en.js.map +1 -1
  66. package/dist/i18n/index.d.ts +34 -1
  67. package/dist/i18n/index.d.ts.map +1 -1
  68. package/dist/i18n/index.js +36 -7
  69. package/dist/i18n/index.js.map +1 -1
  70. package/dist/i18n/zh.d.ts +698 -32
  71. package/dist/i18n/zh.d.ts.map +1 -1
  72. package/dist/i18n/zh.js +1267 -33
  73. package/dist/i18n/zh.js.map +1 -1
  74. package/dist/index/graph-builder.js +3 -3
  75. package/dist/index/graph-builder.js.map +1 -1
  76. package/dist/index.d.ts +3 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +3 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/learning/loop.d.ts +9 -0
  81. package/dist/learning/loop.d.ts.map +1 -1
  82. package/dist/learning/loop.js +42 -1
  83. package/dist/learning/loop.js.map +1 -1
  84. package/dist/maintenance/types.d.ts +11 -0
  85. package/dist/maintenance/types.d.ts.map +1 -1
  86. package/dist/maintenance/types.js.map +1 -1
  87. package/dist/merge/synapse-merger.js +6 -0
  88. package/dist/merge/synapse-merger.js.map +1 -1
  89. package/dist/merge-driver.cjs +64 -5
  90. package/dist/observability/audit-log.d.ts +7 -1
  91. package/dist/observability/audit-log.d.ts.map +1 -1
  92. package/dist/observability/audit-log.js.map +1 -1
  93. package/dist/observability/necessity-evaluator.d.ts +29 -0
  94. package/dist/observability/necessity-evaluator.d.ts.map +1 -1
  95. package/dist/observability/necessity-evaluator.js +240 -13
  96. package/dist/observability/necessity-evaluator.js.map +1 -1
  97. package/dist/observability/proposal-engine.d.ts.map +1 -1
  98. package/dist/observability/proposal-engine.js +12 -0
  99. package/dist/observability/proposal-engine.js.map +1 -1
  100. package/dist/observability/runtime-description-check.d.ts +55 -0
  101. package/dist/observability/runtime-description-check.d.ts.map +1 -0
  102. package/dist/observability/runtime-description-check.js +63 -0
  103. package/dist/observability/runtime-description-check.js.map +1 -0
  104. package/dist/prompt-signals/cache.d.ts +73 -0
  105. package/dist/prompt-signals/cache.d.ts.map +1 -1
  106. package/dist/prompt-signals/cache.js +102 -0
  107. package/dist/prompt-signals/cache.js.map +1 -1
  108. package/dist/prompt-signals/event-bus.d.ts +82 -0
  109. package/dist/prompt-signals/event-bus.d.ts.map +1 -0
  110. package/dist/prompt-signals/event-bus.js +105 -0
  111. package/dist/prompt-signals/event-bus.js.map +1 -0
  112. package/dist/prompt-signals/index.d.ts +2 -1
  113. package/dist/prompt-signals/index.d.ts.map +1 -1
  114. package/dist/prompt-signals/index.js +2 -1
  115. package/dist/prompt-signals/index.js.map +1 -1
  116. package/dist/reinforcement/ltp.d.ts +15 -1
  117. package/dist/reinforcement/ltp.d.ts.map +1 -1
  118. package/dist/reinforcement/ltp.js +24 -5
  119. package/dist/reinforcement/ltp.js.map +1 -1
  120. package/dist/reinforcement/related.d.ts +31 -2
  121. package/dist/reinforcement/related.d.ts.map +1 -1
  122. package/dist/reinforcement/related.js +39 -3
  123. package/dist/reinforcement/related.js.map +1 -1
  124. package/dist/retrieval/filter.d.ts.map +1 -1
  125. package/dist/retrieval/filter.js +7 -0
  126. package/dist/retrieval/filter.js.map +1 -1
  127. package/dist/retrieval/fts.d.ts +6 -5
  128. package/dist/retrieval/fts.d.ts.map +1 -1
  129. package/dist/retrieval/fts.js +74 -22
  130. package/dist/retrieval/fts.js.map +1 -1
  131. package/dist/status/index.d.ts +7 -0
  132. package/dist/status/index.d.ts.map +1 -0
  133. package/dist/status/index.js +7 -0
  134. package/dist/status/index.js.map +1 -0
  135. package/dist/status/status.d.ts +132 -0
  136. package/dist/status/status.d.ts.map +1 -0
  137. package/dist/status/status.js +437 -0
  138. package/dist/status/status.js.map +1 -0
  139. package/dist/storage/engram-store.d.ts.map +1 -1
  140. package/dist/storage/engram-store.js +17 -2
  141. package/dist/storage/engram-store.js.map +1 -1
  142. package/dist/storage/git.d.ts +168 -0
  143. package/dist/storage/git.d.ts.map +1 -1
  144. package/dist/storage/git.js +616 -33
  145. package/dist/storage/git.js.map +1 -1
  146. package/dist/storage/index.d.ts +1 -0
  147. package/dist/storage/index.d.ts.map +1 -1
  148. package/dist/storage/index.js +1 -0
  149. package/dist/storage/index.js.map +1 -1
  150. package/dist/storage/infra-doctor.d.ts +42 -0
  151. package/dist/storage/infra-doctor.d.ts.map +1 -0
  152. package/dist/storage/infra-doctor.js +92 -0
  153. package/dist/storage/infra-doctor.js.map +1 -0
  154. package/dist/storage/obsidian-links.d.ts +73 -0
  155. package/dist/storage/obsidian-links.d.ts.map +1 -0
  156. package/dist/storage/obsidian-links.js +177 -0
  157. package/dist/storage/obsidian-links.js.map +1 -0
  158. package/dist/storage/path.d.ts +24 -0
  159. package/dist/storage/path.d.ts.map +1 -1
  160. package/dist/storage/path.js +53 -0
  161. package/dist/storage/path.js.map +1 -1
  162. package/dist/storage/repository.d.ts +37 -1
  163. package/dist/storage/repository.d.ts.map +1 -1
  164. package/dist/storage/repository.js +235 -17
  165. package/dist/storage/repository.js.map +1 -1
  166. package/dist/storage/synapse-store.d.ts +7 -1
  167. package/dist/storage/synapse-store.d.ts.map +1 -1
  168. package/dist/storage/synapse-store.js +8 -0
  169. package/dist/storage/synapse-store.js.map +1 -1
  170. package/dist/tools/audit-query-tool.d.ts +53 -0
  171. package/dist/tools/audit-query-tool.d.ts.map +1 -0
  172. package/dist/tools/audit-query-tool.js +123 -0
  173. package/dist/tools/audit-query-tool.js.map +1 -0
  174. package/dist/tools/doctor-tools.d.ts +5 -0
  175. package/dist/tools/doctor-tools.d.ts.map +1 -1
  176. package/dist/tools/doctor-tools.js +11 -3
  177. package/dist/tools/doctor-tools.js.map +1 -1
  178. package/dist/tools/engram-tools.d.ts +13 -0
  179. package/dist/tools/engram-tools.d.ts.map +1 -1
  180. package/dist/tools/engram-tools.js +72 -8
  181. package/dist/tools/engram-tools.js.map +1 -1
  182. package/dist/tools/index.d.ts +3 -0
  183. package/dist/tools/index.d.ts.map +1 -1
  184. package/dist/tools/index.js +3 -0
  185. package/dist/tools/index.js.map +1 -1
  186. package/dist/tools/llm-descriptions.d.ts +28 -28
  187. package/dist/tools/llm-descriptions.d.ts.map +1 -1
  188. package/dist/tools/llm-descriptions.js +56 -489
  189. package/dist/tools/llm-descriptions.js.map +1 -1
  190. package/dist/tools/normalization.d.ts +43 -0
  191. package/dist/tools/normalization.d.ts.map +1 -0
  192. package/dist/tools/normalization.js +68 -0
  193. package/dist/tools/normalization.js.map +1 -0
  194. package/dist/tools/registry.d.ts.map +1 -1
  195. package/dist/tools/registry.js +6 -0
  196. package/dist/tools/registry.js.map +1 -1
  197. package/dist/tools/schemas.d.ts +67 -11
  198. package/dist/tools/schemas.d.ts.map +1 -1
  199. package/dist/tools/schemas.js +61 -6
  200. package/dist/tools/schemas.js.map +1 -1
  201. package/dist/tools/skill-tools.js +1 -1
  202. package/dist/tools/skill-tools.js.map +1 -1
  203. package/dist/tools/synapse-tools.d.ts.map +1 -1
  204. package/dist/tools/synapse-tools.js +1 -0
  205. package/dist/tools/synapse-tools.js.map +1 -1
  206. package/dist/tools/sync-tools.d.ts +102 -0
  207. package/dist/tools/sync-tools.d.ts.map +1 -0
  208. package/dist/tools/sync-tools.js +309 -0
  209. package/dist/tools/sync-tools.js.map +1 -0
  210. package/dist/tools/synthesize-tools.d.ts +79 -0
  211. package/dist/tools/synthesize-tools.d.ts.map +1 -0
  212. package/dist/tools/synthesize-tools.js +297 -0
  213. package/dist/tools/synthesize-tools.js.map +1 -0
  214. package/dist/tools/tool-profile.d.ts +68 -0
  215. package/dist/tools/tool-profile.d.ts.map +1 -0
  216. package/dist/tools/tool-profile.js +174 -0
  217. package/dist/tools/tool-profile.js.map +1 -0
  218. package/dist/tools/tool.d.ts +24 -0
  219. package/dist/tools/tool.d.ts.map +1 -1
  220. package/dist/tools/tool.js.map +1 -1
  221. package/dist/types/disclosure.d.ts +7 -0
  222. package/dist/types/disclosure.d.ts.map +1 -1
  223. package/dist/types/repository-types.d.ts +17 -1
  224. package/dist/types/repository-types.d.ts.map +1 -1
  225. package/dist/types/synapse.d.ts +19 -1
  226. package/dist/types/synapse.d.ts.map +1 -1
  227. package/package.json +9 -9
@@ -0,0 +1,297 @@
1
+ /**
2
+ * engram_synthesize 工具(Feature 1:手工触发 REM)
3
+ *
4
+ * 接受一组 engram id,调 LLM 综合形成 pattern engram,并对每个源 engram 创建
5
+ * `derives_from` synapse(pattern → source)。
6
+ *
7
+ * 与 REM dreaming 的关系:
8
+ * - REM 是自动聚类 + 启发式抽象,后台定时跑
9
+ * - 本工具是用户/agent 显式触发,语义层 LLM 抽象,精确度高
10
+ * - Feature 2 会把 REM dreaming 的 abstractionProvider 替换为同等 LLM 路径
11
+ *
12
+ * 与 proposal-engine 的区别:
13
+ * - proposal-engine 监听对话流自动累积 cluster → promotion
14
+ * - 本工具不依赖 proposal-engine,直接由调用方提供源 engram id 列表
15
+ *
16
+ * @module @co-engram/core/tools
17
+ */
18
+ import { randomUUID } from "node:crypto";
19
+ import { validateInput } from "./tool.js";
20
+ import { EngramSynthesizeInputSchema, } from "./schemas.js";
21
+ // ============================================================
22
+ // Prompt 模板(共享:engram_synthesize 工具 + REM LlmPatternAbstraction)
23
+ // ============================================================
24
+ export const SYNTHESIS_PROMPT = `You are synthesizing a team memory pattern from a set of related engrams.
25
+
26
+ A "pattern" is a higher-order insight that connects or abstracts multiple specific memories into a reusable lesson, principle, or design rationale. It should be more than a summary — it should reveal what these memories have in common at a level that will help future conversations.
27
+
28
+ Below are ${"<SAMPLE_COUNT>"} source engrams:
29
+
30
+ ${"<SAMPLES_BLOCK>"}
31
+
32
+ ${"<HINTS_BLOCK>"}
33
+
34
+ Synthesize them into ONE pattern. Return STRICT JSON only (no markdown, no prose) with this shape:
35
+
36
+ {
37
+ "title": "<4-10 word pattern title, must NOT just copy any source title>",
38
+ "summary": "<1-2 sentence plain-language summary of the pattern>",
39
+ "content": "<full pattern body in markdown, 100-500 words; explain the insight, evidence from sources, and how to apply it>",
40
+ "domainTags": ["<3-6 lowercase tags>"],
41
+ "confidence": <number 0..1 — how confident this is a real pattern vs cherry-picked coincidence>,
42
+ "reason": "<one sentence on why these sources support this pattern>"
43
+ }
44
+
45
+ STRICT rules:
46
+ 1. The pattern must be NON-TRIVIAL — if the sources are too unrelated, set confidence < 0.4 and explain why in reason.
47
+ 2. Title must be different from every source title; reuse is a failure mode.
48
+ 3. Content must reference specific details from sources (not generic platitudes).
49
+ 4. domainTags should be the shared vocabulary across sources, not a union of all tags.
50
+ 5. If any source is clearly off-topic from the others, exclude it mentally but list it in reason.`;
51
+ // ============================================================
52
+ // 辅助:解析 LLM 输出
53
+ // ============================================================
54
+ /**
55
+ * 解析 LLM 综合输出
56
+ *
57
+ * 容忍 markdown fence / 前后 prose / 嵌套 JSON 等不规范输出。
58
+ * 返回 null 表示无法解析,调用方 fallback / 抛错。
59
+ */
60
+ export function parseSynthesisOutput(raw) {
61
+ let text = raw.trim();
62
+ // 剥 markdown fence
63
+ const fenceMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
64
+ if (fenceMatch) {
65
+ text = fenceMatch[1].trim();
66
+ }
67
+ // 抽取最外层 { ... }
68
+ const start = text.indexOf("{");
69
+ const end = text.lastIndexOf("}");
70
+ if (start === -1 || end === -1 || end <= start)
71
+ return null;
72
+ const jsonStr = text.slice(start, end + 1);
73
+ let obj;
74
+ try {
75
+ obj = JSON.parse(jsonStr);
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ const title = typeof obj.title === "string" && obj.title.trim().length > 0
81
+ ? obj.title.trim().slice(0, 200)
82
+ : null;
83
+ const content = typeof obj.content === "string" && obj.content.trim().length > 0
84
+ ? obj.content.trim()
85
+ : null;
86
+ if (!title || !content)
87
+ return null;
88
+ const summary = typeof obj.summary === "string" && obj.summary.trim().length > 0
89
+ ? obj.summary.trim().slice(0, 300)
90
+ : content.slice(0, 200);
91
+ const domainTags = Array.isArray(obj.domainTags)
92
+ ? obj.domainTags
93
+ .filter((t) => typeof t === "string" && t.trim().length > 0)
94
+ .map((t) => t.trim().toLowerCase().slice(0, 50))
95
+ .slice(0, 5)
96
+ : [];
97
+ const confidence = typeof obj.confidence === "number" &&
98
+ Number.isFinite(obj.confidence) &&
99
+ obj.confidence >= 0 &&
100
+ obj.confidence <= 1
101
+ ? obj.confidence
102
+ : 0.5;
103
+ const reason = typeof obj.reason === "string" && obj.reason.trim().length > 0
104
+ ? obj.reason.trim().slice(0, 500)
105
+ : "LLM synthesis";
106
+ return { title, content, summary, domainTags, confidence, reason };
107
+ }
108
+ function loadAndValidateSources(repo, ids) {
109
+ const seen = new Set();
110
+ const sources = [];
111
+ const missing = [];
112
+ for (const id of ids) {
113
+ if (seen.has(id))
114
+ continue; // 自动去重
115
+ seen.add(id);
116
+ if (!repo.exists(id)) {
117
+ missing.push(id);
118
+ continue;
119
+ }
120
+ const e = repo.readEngram(id);
121
+ sources.push({
122
+ id: e.id,
123
+ title: e.title,
124
+ content: e.content,
125
+ summary: e.summary,
126
+ domainTags: [...e.domainTags],
127
+ });
128
+ }
129
+ return { sources, missing };
130
+ }
131
+ /** 构造给 LLM 的样本块(共享:engram_synthesize 工具 + REM LlmPatternAbstraction) */
132
+ export function buildSamplesBlock(sources) {
133
+ return sources
134
+ .map((s, i) => {
135
+ const tags = s.domainTags.length > 0 ? s.domainTags.join(", ") : "(none)";
136
+ const body = s.content.length > 1500
137
+ ? `${s.content.slice(0, 1500)}...(truncated)`
138
+ : s.content;
139
+ return `--- Source [${i + 1}] id=${s.id} ---
140
+ title: ${s.title}
141
+ tags: ${tags}
142
+ summary: ${s.summary}
143
+ content:
144
+ ${body}`;
145
+ })
146
+ .join("\n\n");
147
+ }
148
+ // ============================================================
149
+ // 工具实现
150
+ // ============================================================
151
+ /**
152
+ * engram_synthesize 工具
153
+ *
154
+ * 输入:ids + 可选 createdBy/domainTags/synthesisHints/dryRun
155
+ * 输出:patternEngramId + synapseIds + sourceIds + draft
156
+ *
157
+ * 副作用:创建 pattern engram(kind=pattern, sourceType=inferred) +
158
+ * 对每个源创建 derives_from synapse + append audit。
159
+ *
160
+ * 失败模式:
161
+ * - ctx.llmClient 缺失 → 抛错带安装指引
162
+ * - 源 engram 部分不存在 → 抛错列出缺失的 id(不部分执行)
163
+ * - LLM 返回非 JSON → 抛错(不创建 engram,避免垃圾数据)
164
+ * - LLM 调用抛错 → 透传(由调用方决定重试 / fallback)
165
+ */
166
+ export const engramSynthesizeTool = {
167
+ name: "engram_synthesize",
168
+ description: '综合多条已有 engram 形成一条 pattern(模式)记忆。需要 ToolContext.llmClient(claude-code-mcp 默认从 ANTHROPIC_API_KEY 解析;openclaw-plugin 从 necessityLlm 配置或 ~/.openclaw/openclaw.json 解析)。流程:读源 → LLM 综合 → 创建 kind="pattern" engram → 对每个源连 derives_from synapse。dryRun=true 只返回草稿不创建。源 id 重复自动去重,源不存在抛错(不部分执行)。',
169
+ inputSchema: EngramSynthesizeInputSchema,
170
+ async execute(input, ctx) {
171
+ const parsed = validateInput(EngramSynthesizeInputSchema, input);
172
+ const llmClient = ctx.llmClient;
173
+ if (!llmClient) {
174
+ throw new Error("engram_synthesize requires LLM client. " +
175
+ "Configure necessityLlm in plugin config (MCP: persistedConfig.necessityLlm or ANTHROPIC_API_KEY env; " +
176
+ "OpenClaw: config.necessityLlm or ~/.openclaw/openclaw.json).");
177
+ }
178
+ // 1. 加载并校验源
179
+ const { sources, missing } = loadAndValidateSources(ctx.repository, parsed.ids);
180
+ if (missing.length > 0) {
181
+ throw new Error(`Source engrams not found: ${missing.join(", ")}. ` +
182
+ `Synthesis aborted (no partial execution).`);
183
+ }
184
+ if (sources.length < 2) {
185
+ throw new Error(`At least 2 unique source engrams required for synthesis (got ${sources.length}).`);
186
+ }
187
+ // 2. 调 LLM 综合
188
+ const samplesBlock = buildSamplesBlock(sources);
189
+ const hintsBlock = parsed.synthesisHints
190
+ ? `Additional guidance from caller:\n${parsed.synthesisHints}`
191
+ : "";
192
+ const prompt = SYNTHESIS_PROMPT.replace("<SAMPLE_COUNT>", String(sources.length))
193
+ .replace("<SAMPLES_BLOCK>", samplesBlock)
194
+ .replace("<HINTS_BLOCK>", hintsBlock);
195
+ let raw;
196
+ try {
197
+ // maxTokens 4000 留足 content body 长度 + reasoning 模型预算
198
+ raw = await llmClient.complete(prompt, {
199
+ maxTokens: 4000,
200
+ temperature: 0.3,
201
+ timeoutMs: 60_000,
202
+ });
203
+ }
204
+ catch (err) {
205
+ throw new Error(`LLM synthesis call failed: ${err instanceof Error ? err.message : String(err)}`);
206
+ }
207
+ if (typeof raw !== "string" || raw.length === 0) {
208
+ throw new Error(`LLM returned non-string output (type=${typeof raw}); synthesis aborted.`);
209
+ }
210
+ const draft = parseSynthesisOutput(raw);
211
+ if (!draft) {
212
+ throw new Error(`Failed to parse LLM synthesis output as JSON. ` +
213
+ `First 200 chars: ${raw.slice(0, 200)}...`);
214
+ }
215
+ // 3. dry-run 模式:只返回草稿,不创建
216
+ if (parsed.dryRun === true) {
217
+ return {
218
+ synapseIds: [],
219
+ sourceIds: sources.map((s) => s.id),
220
+ draft,
221
+ dryRun: true,
222
+ };
223
+ }
224
+ // 4. 创建 pattern engram
225
+ const createdBy = parsed.createdBy ?? ctx.defaultCreatedBy ?? "unknown";
226
+ // 用户显式 domainTags 优先;否则用 LLM 推断的;再 fallback 到源 tags 的并集
227
+ const domainTags = parsed.domainTags && parsed.domainTags.length > 0
228
+ ? parsed.domainTags
229
+ : draft.domainTags.length > 0
230
+ ? draft.domainTags
231
+ : Array.from(new Set(sources.flatMap((s) => s.domainTags))).slice(0, 5);
232
+ const patternEngram = ctx.repository.createEngram({
233
+ title: draft.title,
234
+ content: draft.content,
235
+ summary: draft.summary,
236
+ kind: "pattern",
237
+ domainTags,
238
+ importance: 0.7,
239
+ confidence: draft.confidence,
240
+ sourceType: "inferred",
241
+ createdBy,
242
+ });
243
+ // 5. 创建 derives_from synapse(pattern → source)
244
+ const synapseIds = [];
245
+ const timestamp = patternEngram.createdAt;
246
+ for (const source of sources) {
247
+ const synapse = {
248
+ id: randomUUID(),
249
+ from: patternEngram.id,
250
+ to: source.id,
251
+ kind: "derives_from",
252
+ weight: 0.8,
253
+ direction: "directional",
254
+ evidence: [
255
+ {
256
+ description: `Pattern synthesized from ${sources.length} sources via engram_synthesize`,
257
+ source: "llm-synthesis",
258
+ confidence: draft.confidence,
259
+ addedAt: timestamp,
260
+ addedBy: createdBy,
261
+ },
262
+ ],
263
+ createdBy,
264
+ createdAt: timestamp,
265
+ updatedAt: timestamp,
266
+ retrievalWeight: 0.8,
267
+ visibility: "public",
268
+ };
269
+ const stored = ctx.repository.addOutgoingSynapse(patternEngram.id, synapse);
270
+ synapseIds.push(stored.id);
271
+ }
272
+ // 6. audit + markDirty
273
+ ctx.auditLog?.append({
274
+ actor: "user",
275
+ action: "create",
276
+ engramId: patternEngram.id,
277
+ metadata: {
278
+ target: "pattern-via-synthesis",
279
+ sourceIds: sources.map((s) => s.id),
280
+ synapseIds,
281
+ title: draft.title,
282
+ confidence: draft.confidence,
283
+ createdBy,
284
+ },
285
+ });
286
+ ctx.markDirty?.();
287
+ return {
288
+ patternEngramId: patternEngram.id,
289
+ synapseIds,
290
+ sourceIds: sources.map((s) => s.id),
291
+ draft,
292
+ dryRun: false,
293
+ };
294
+ },
295
+ };
296
+ export const ALL_SYNTHESIZE_TOOLS = [engramSynthesizeTool];
297
+ //# sourceMappingURL=synthesize-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesize-tools.js","sourceRoot":"","sources":["../../src/tools/synthesize-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 工具暴露 profile(host-agnostic 单一源)
3
+ *
4
+ * 15 轮拉通分析的元2「双宿主无契约」修复:
5
+ * 此前 PROFILE_TOOL_SETS / PROFILE_TOOL_COUNTS 只存在于 claude-code-mcp,
6
+ * openclaw-plugin 完全没有 profile 选择机制。R13 实证 PROFILE_TOOL_COUNTS
7
+ * 三档全错(minimal 写 11 实际 12,standard 写 17 实际 18,full 写 28 实际 29)。
8
+ *
9
+ * 修复方向:host-agnostic 概念应放 core 单一源,两宿主 re-export 引用,
10
+ * 契约测试 trivially 满足(同一份对象引用)。PROFILE_TOOL_COUNTS 用 .size
11
+ * 自动算,永久防回归。
12
+ *
13
+ * @module @co-engram/core/tools
14
+ */
15
+ import type { Tool } from "./tool.js";
16
+ /**
17
+ * 三档 profile
18
+ */
19
+ export type ToolProfile = "minimal" | "standard" | "full";
20
+ /**
21
+ * 每档 profile 包含的工具名集合
22
+ *
23
+ * minimal: 12 个 —— 核心读写 + proposal 处理三件套 + engram_sync
24
+ * proposal 工具进 minimal 的原因:维护引擎默认在后台运行,会持续产生
25
+ * proposals。若 minimal 暴露了"待审核候选 N 条"提示却不容许处理,会形成
26
+ * "看得到但处理不了"的体验断裂。把 list/accept/dismiss 提供到 minimal,
27
+ * 让 agent 在任何 profile 下都能闭环处理 proposal。
28
+ * engram_sync 进 minimal:让所有 profile 都能主动掌控提交时机。
29
+ *
30
+ * standard: 19 个 = minimal 12 + 学习回路 + contradiction + 数据管理 +
31
+ * 自愈/路径树 + engram_synthesize + engram_audit_query
32
+ *
33
+ * full: 29 个 = 全部 native 工具(包含隐藏的管理类工具,调试用),
34
+ * 但不含 skill_invoke —— 它是 P0 stub(Task 3.2 移除,等 P1 真正实现再放回)
35
+ */
36
+ export declare const PROFILE_TOOL_SETS: Record<ToolProfile, ReadonlySet<string>>;
37
+ /**
38
+ * 解析 profile
39
+ *
40
+ * 优先级:
41
+ * 1. env.COA_ENGRAM_TOOLS_PROFILE / CO_ENGRAM_TOOLS_PROFILE
42
+ * 2. persistedConfig.toolsProfile
43
+ * 3. 默认 'standard'
44
+ *
45
+ * 未知值降级为默认 + 记录警告(调用方决定如何 logging)
46
+ */
47
+ export declare function resolveProfile(env: Record<string, string | undefined>, persistedConfig?: {
48
+ readonly toolsProfile?: string;
49
+ }): {
50
+ profile: ToolProfile;
51
+ source: "env" | "persisted" | "default";
52
+ warned?: string;
53
+ };
54
+ /**
55
+ * 按 profile 过滤工具列表
56
+ *
57
+ * full profile 不过滤(返回原数组)。
58
+ * minimal / standard 用 Set.has() 过滤。
59
+ */
60
+ export declare function filterToolsByProfile(tools: readonly Tool[], profile: ToolProfile): readonly Tool[];
61
+ /**
62
+ * 暴露给测试 / 日志:每档 profile 的工具数量
63
+ *
64
+ * 15 轮拉通 R13 实证:此前硬编码 11/17/28 全错(实际 12/18/29)。
65
+ * 改用 .size 自动算,永久防回归。
66
+ */
67
+ export declare const PROFILE_TOOL_COUNTS: Record<ToolProfile, number>;
68
+ //# sourceMappingURL=tool-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-profile.d.ts","sourceRoot":"","sources":["../../src/tools/tool-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CA+EtE,CAAC;AAaF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,eAAe,CAAC,EAAE;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAwBA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,OAAO,EAAE,WAAW,GACnB,SAAS,IAAI,EAAE,CAIjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAI3D,CAAC"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * 工具暴露 profile(host-agnostic 单一源)
3
+ *
4
+ * 15 轮拉通分析的元2「双宿主无契约」修复:
5
+ * 此前 PROFILE_TOOL_SETS / PROFILE_TOOL_COUNTS 只存在于 claude-code-mcp,
6
+ * openclaw-plugin 完全没有 profile 选择机制。R13 实证 PROFILE_TOOL_COUNTS
7
+ * 三档全错(minimal 写 11 实际 12,standard 写 17 实际 18,full 写 28 实际 29)。
8
+ *
9
+ * 修复方向:host-agnostic 概念应放 core 单一源,两宿主 re-export 引用,
10
+ * 契约测试 trivially 满足(同一份对象引用)。PROFILE_TOOL_COUNTS 用 .size
11
+ * 自动算,永久防回归。
12
+ *
13
+ * @module @co-engram/core/tools
14
+ */
15
+ /**
16
+ * 每档 profile 包含的工具名集合
17
+ *
18
+ * minimal: 12 个 —— 核心读写 + proposal 处理三件套 + engram_sync
19
+ * proposal 工具进 minimal 的原因:维护引擎默认在后台运行,会持续产生
20
+ * proposals。若 minimal 暴露了"待审核候选 N 条"提示却不容许处理,会形成
21
+ * "看得到但处理不了"的体验断裂。把 list/accept/dismiss 提供到 minimal,
22
+ * 让 agent 在任何 profile 下都能闭环处理 proposal。
23
+ * engram_sync 进 minimal:让所有 profile 都能主动掌控提交时机。
24
+ *
25
+ * standard: 19 个 = minimal 12 + 学习回路 + contradiction + 数据管理 +
26
+ * 自愈/路径树 + engram_synthesize + engram_audit_query
27
+ *
28
+ * full: 29 个 = 全部 native 工具(包含隐藏的管理类工具,调试用),
29
+ * 但不含 skill_invoke —— 它是 P0 stub(Task 3.2 移除,等 P1 真正实现再放回)
30
+ */
31
+ export const PROFILE_TOOL_SETS = {
32
+ minimal: new Set([
33
+ "engram_search",
34
+ "engram_get",
35
+ "engram_create",
36
+ "engram_update",
37
+ "engram_list",
38
+ "synapse_create",
39
+ "engram_reinforce",
40
+ "engram_report_failure",
41
+ // proposal 处理三件套(避免后台 proposal 累积但无法闭环)
42
+ "engram_list_proposals",
43
+ "engram_accept_proposal",
44
+ "engram_dismiss_proposal",
45
+ // 手动 pull/commit/push(让所有 profile 都能主动掌控提交时机)
46
+ "engram_sync",
47
+ ]),
48
+ standard: new Set([
49
+ // minimal 12
50
+ "engram_search",
51
+ "engram_get",
52
+ "engram_create",
53
+ "engram_update",
54
+ "engram_list",
55
+ "synapse_create",
56
+ "engram_reinforce",
57
+ "engram_report_failure",
58
+ "engram_list_proposals",
59
+ "engram_accept_proposal",
60
+ "engram_dismiss_proposal",
61
+ "engram_sync",
62
+ // 学习回路 + contradiction + 数据管理
63
+ "engram_delete",
64
+ "close_learning_loop",
65
+ "contradiction_resolve",
66
+ // 仓库健康工具(自愈扫描 + 渐进式披露,面向所有用户)
67
+ "engram_doctor",
68
+ "engram_list_paths",
69
+ // LLM 综合(手工触发 REM,需 llmClient 注入)
70
+ "engram_synthesize",
71
+ // 审计查询(让挑剔用户不开 viewer 也能查事件历史)
72
+ "engram_audit_query",
73
+ ]),
74
+ full: new Set([
75
+ // 全部 native 工具(含自愈/路径树等高级工具)
76
+ "engram_create",
77
+ "engram_get",
78
+ "engram_update",
79
+ "engram_delete",
80
+ "engram_search",
81
+ "engram_list",
82
+ "engram_reinforce",
83
+ "engram_report_failure",
84
+ "engram_archive",
85
+ "engram_restore",
86
+ "engram_forget",
87
+ "engram_recompute_importance",
88
+ "synapse_create",
89
+ "synapse_get",
90
+ "synapse_list",
91
+ "synapse_delete",
92
+ "skill_get",
93
+ "close_learning_loop",
94
+ "contradiction_resolve",
95
+ "get_evolution_lineage",
96
+ "upgrade_verification",
97
+ "engram_list_proposals",
98
+ "engram_accept_proposal",
99
+ "engram_dismiss_proposal",
100
+ // 仓库健康工具(full-only)
101
+ "engram_doctor",
102
+ "engram_list_paths",
103
+ // LLM 综合
104
+ "engram_synthesize",
105
+ // 审计查询(让挑剔用户不开 viewer 也能查事件历史)
106
+ "engram_audit_query",
107
+ // 手动 pull/commit/push
108
+ "engram_sync",
109
+ ]),
110
+ };
111
+ const DEFAULT_PROFILE = "standard";
112
+ /**
113
+ * 已知的 profile 值(用于验证)
114
+ */
115
+ const KNOWN_PROFILES = new Set([
116
+ "minimal",
117
+ "standard",
118
+ "full",
119
+ ]);
120
+ /**
121
+ * 解析 profile
122
+ *
123
+ * 优先级:
124
+ * 1. env.COA_ENGRAM_TOOLS_PROFILE / CO_ENGRAM_TOOLS_PROFILE
125
+ * 2. persistedConfig.toolsProfile
126
+ * 3. 默认 'standard'
127
+ *
128
+ * 未知值降级为默认 + 记录警告(调用方决定如何 logging)
129
+ */
130
+ export function resolveProfile(env, persistedConfig) {
131
+ const envValue = env.CO_ENGRAM_TOOLS_PROFILE ?? env.COA_ENGRAM_TOOLS_PROFILE;
132
+ if (envValue !== undefined && envValue !== "") {
133
+ if (KNOWN_PROFILES.has(envValue)) {
134
+ return { profile: envValue, source: "env" };
135
+ }
136
+ return {
137
+ profile: DEFAULT_PROFILE,
138
+ source: "env",
139
+ warned: `Unknown CO_ENGRAM_TOOLS_PROFILE="${envValue}" (valid: minimal | standard | full), falling back to "${DEFAULT_PROFILE}"`,
140
+ };
141
+ }
142
+ if (persistedConfig?.toolsProfile &&
143
+ KNOWN_PROFILES.has(persistedConfig.toolsProfile)) {
144
+ return {
145
+ profile: persistedConfig.toolsProfile,
146
+ source: "persisted",
147
+ };
148
+ }
149
+ return { profile: DEFAULT_PROFILE, source: "default" };
150
+ }
151
+ /**
152
+ * 按 profile 过滤工具列表
153
+ *
154
+ * full profile 不过滤(返回原数组)。
155
+ * minimal / standard 用 Set.has() 过滤。
156
+ */
157
+ export function filterToolsByProfile(tools, profile) {
158
+ if (profile === "full")
159
+ return tools;
160
+ const set = PROFILE_TOOL_SETS[profile];
161
+ return tools.filter((t) => set.has(t.name));
162
+ }
163
+ /**
164
+ * 暴露给测试 / 日志:每档 profile 的工具数量
165
+ *
166
+ * 15 轮拉通 R13 实证:此前硬编码 11/17/28 全错(实际 12/18/29)。
167
+ * 改用 .size 自动算,永久防回归。
168
+ */
169
+ export const PROFILE_TOOL_COUNTS = {
170
+ minimal: PROFILE_TOOL_SETS.minimal.size,
171
+ standard: PROFILE_TOOL_SETS.standard.size,
172
+ full: PROFILE_TOOL_SETS.full.size,
173
+ };
174
+ //# sourceMappingURL=tool-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-profile.js","sourceRoot":"","sources":["../../src/tools/tool-profile.ts"],"names":[],"mappings":"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"}
@@ -69,6 +69,30 @@ export interface ToolContext {
69
69
  * OpenClaw 适配器从 plugin config.defaultCreatedBy 读取。
70
70
  */
71
71
  readonly defaultCreatedBy?: string;
72
+ /**
73
+ * LLM 客户端(可选,用于 engram_synthesize 等需要语义综合的工具)。
74
+ *
75
+ * host adapter 注入;claude-code-mcp 走 Anthropic API,
76
+ * openclaw-plugin 走 OpenAI-compatible endpoint。
77
+ * 不注入时,engram_synthesize 等工具会拒绝调用并给出明确错误。
78
+ */
79
+ readonly llmClient?: import("../observability/necessity-evaluator.js").LlmClient;
80
+ /**
81
+ * 标记仓库脏(记忆内容发生变化)。
82
+ *
83
+ * 写操作工具在成功执行后调用此回调。
84
+ * 宿主在会话结束后据此判断是否需要 git commit。
85
+ */
86
+ markDirty?: () => void;
87
+ /**
88
+ * 宿主标识(P0-4:双宿主契约不一致修复)。
89
+ *
90
+ * 由 host adapter 在构造 ToolContext 时注入(claude-code-mcp 或 openclaw-plugin)。
91
+ * 工具在 auditLog.append 时透传,让 AuditEntry.host 字段记录来源宿主,
92
+ * 便于跨宿主行为审计与归因。未注入时 audit entry 的 host 字段为 undefined
93
+ * (向后兼容:旧调用路径不强制要求)。
94
+ */
95
+ readonly host?: "claude-code-mcp" | "openclaw-plugin" | string;
72
96
  }
73
97
  /**
74
98
  * 统一 Tool 接口
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,0BAA0B,EAAE,gBAAgB,CAAC;IACzE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,0BAA0B,EAAE,iBAAiB,CAAC;IAClF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,8BAA8B,EAAE,kBAAkB,CAAC;IACxF,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,sBAAsB,EAAE,cAAc,CAAC;IACxE;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,qBAAqB,EAAE,UAAU,CAAC;IAC/D;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,QAAQ,CAAC;IACrE;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,2CAA2C,EAAE,oBAAoB,CAAC;IACzG;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,qCAAqC,EAAE,cAAc,CAAC;IACvF;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,QAAQ;IAC9D,mBAAmB;IACnB,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,CASpE"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,0BAA0B,EAAE,gBAAgB,CAAC;IACzE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,0BAA0B,EAAE,iBAAiB,CAAC;IAClF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,8BAA8B,EAAE,kBAAkB,CAAC;IACxF,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,sBAAsB,EAAE,cAAc,CAAC;IACxE;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,qBAAqB,EAAE,UAAU,CAAC;IAC/D;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,QAAQ,CAAC;IACrE;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,2CAA2C,EAAE,oBAAoB,CAAC;IACzG;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,qCAAqC,EAAE,cAAc,CAAC;IACvF;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,yCAAyC,EAAE,SAAS,CAAC;IACjF;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,QAAQ;IAC9D,mBAAmB;IACnB,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,CASpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6EH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAI,MAAkB,EAAE,GAAY;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,CAAC,IAAS,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqGH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAI,MAAkB,EAAE,GAAY;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,CAAC,IAAS,CAAC;AAC1B,CAAC"}
@@ -52,6 +52,13 @@ export interface SearchFilter {
52
52
  readonly createdAfter?: string;
53
53
  readonly createdBefore?: string;
54
54
  readonly minImportance?: number;
55
+ /**
56
+ * 情境标签过滤(P0-3 修复:此前 interface / Zod schema / matchesFilter 三方都缺
57
+ * contextTags 字段,Zod 默认 strip unknown keys 导致用户传入被静默吞,所有
58
+ * engram 都通过 filter)。语义:engram.contextTags 与 filter.contextTags 有
59
+ * 交集则通过(与 domainTags 同语义)。
60
+ */
61
+ readonly contextTags?: readonly string[];
55
62
  }
56
63
  /** 检索请求 */
57
64
  export interface SearchRequest {
@@ -1 +1 @@
1
- {"version":3,"file":"disclosure.d.ts","sourceRoot":"","sources":["../../src/types/disclosure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"disclosure.d.ts","sourceRoot":"","sources":["../../src/types/disclosure.ts"],"names":[],"mappings":"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"}