@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.
- package/dist/bootstrap/classify.d.ts +67 -0
- package/dist/bootstrap/classify.d.ts.map +1 -0
- package/dist/bootstrap/classify.js +119 -0
- package/dist/bootstrap/classify.js.map +1 -0
- package/dist/bootstrap/index.d.ts +89 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +158 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/concepts/dictionary.d.ts +260 -0
- package/dist/concepts/dictionary.d.ts.map +1 -0
- package/dist/concepts/dictionary.js +253 -0
- package/dist/concepts/dictionary.js.map +1 -0
- package/dist/concepts/index.d.ts +11 -0
- package/dist/concepts/index.d.ts.map +1 -0
- package/dist/concepts/index.js +10 -0
- package/dist/concepts/index.js.map +1 -0
- package/dist/concepts/types.d.ts +65 -0
- package/dist/concepts/types.d.ts.map +1 -0
- package/dist/concepts/types.js +15 -0
- package/dist/concepts/types.js.map +1 -0
- package/dist/config/defaults.d.ts +32 -3
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +52 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +18 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +75 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts +10 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +10 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +97 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/contradiction/auto-degrade.d.ts +11 -2
- package/dist/contradiction/auto-degrade.d.ts.map +1 -1
- package/dist/contradiction/auto-degrade.js +22 -0
- package/dist/contradiction/auto-degrade.js.map +1 -1
- package/dist/contradiction/resolver.d.ts.map +1 -1
- package/dist/contradiction/resolver.js +7 -1
- package/dist/contradiction/resolver.js.map +1 -1
- package/dist/dreaming/index.d.ts +1 -0
- package/dist/dreaming/index.d.ts.map +1 -1
- package/dist/dreaming/index.js +1 -0
- package/dist/dreaming/index.js.map +1 -1
- package/dist/dreaming/llm-pattern-abstraction.d.ts +31 -0
- package/dist/dreaming/llm-pattern-abstraction.d.ts.map +1 -0
- package/dist/dreaming/llm-pattern-abstraction.js +70 -0
- package/dist/dreaming/llm-pattern-abstraction.js.map +1 -0
- package/dist/dreaming/rem.d.ts.map +1 -1
- package/dist/dreaming/rem.js +1 -0
- package/dist/dreaming/rem.js.map +1 -1
- package/dist/dreaming/scheduler.d.ts +13 -0
- package/dist/dreaming/scheduler.d.ts.map +1 -1
- package/dist/dreaming/scheduler.js +14 -2
- package/dist/dreaming/scheduler.js.map +1 -1
- package/dist/evolution/triggered.d.ts.map +1 -1
- package/dist/evolution/triggered.js +1 -0
- package/dist/evolution/triggered.js.map +1 -1
- package/dist/generative/hypothesis.d.ts.map +1 -1
- package/dist/generative/hypothesis.js +1 -0
- package/dist/generative/hypothesis.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1262 -32
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/index.d.ts +34 -1
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +36 -7
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/zh.d.ts +698 -32
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1267 -33
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index/graph-builder.js +3 -3
- package/dist/index/graph-builder.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/learning/loop.d.ts +9 -0
- package/dist/learning/loop.d.ts.map +1 -1
- package/dist/learning/loop.js +42 -1
- package/dist/learning/loop.js.map +1 -1
- package/dist/maintenance/types.d.ts +11 -0
- package/dist/maintenance/types.d.ts.map +1 -1
- package/dist/maintenance/types.js.map +1 -1
- package/dist/merge/synapse-merger.js +6 -0
- package/dist/merge/synapse-merger.js.map +1 -1
- package/dist/merge-driver.cjs +64 -5
- package/dist/observability/audit-log.d.ts +7 -1
- package/dist/observability/audit-log.d.ts.map +1 -1
- package/dist/observability/audit-log.js.map +1 -1
- package/dist/observability/necessity-evaluator.d.ts +29 -0
- package/dist/observability/necessity-evaluator.d.ts.map +1 -1
- package/dist/observability/necessity-evaluator.js +240 -13
- package/dist/observability/necessity-evaluator.js.map +1 -1
- package/dist/observability/proposal-engine.d.ts.map +1 -1
- package/dist/observability/proposal-engine.js +12 -0
- package/dist/observability/proposal-engine.js.map +1 -1
- package/dist/observability/runtime-description-check.d.ts +55 -0
- package/dist/observability/runtime-description-check.d.ts.map +1 -0
- package/dist/observability/runtime-description-check.js +63 -0
- package/dist/observability/runtime-description-check.js.map +1 -0
- package/dist/prompt-signals/cache.d.ts +73 -0
- package/dist/prompt-signals/cache.d.ts.map +1 -1
- package/dist/prompt-signals/cache.js +102 -0
- package/dist/prompt-signals/cache.js.map +1 -1
- package/dist/prompt-signals/event-bus.d.ts +82 -0
- package/dist/prompt-signals/event-bus.d.ts.map +1 -0
- package/dist/prompt-signals/event-bus.js +105 -0
- package/dist/prompt-signals/event-bus.js.map +1 -0
- package/dist/prompt-signals/index.d.ts +2 -1
- package/dist/prompt-signals/index.d.ts.map +1 -1
- package/dist/prompt-signals/index.js +2 -1
- package/dist/prompt-signals/index.js.map +1 -1
- package/dist/reinforcement/ltp.d.ts +15 -1
- package/dist/reinforcement/ltp.d.ts.map +1 -1
- package/dist/reinforcement/ltp.js +24 -5
- package/dist/reinforcement/ltp.js.map +1 -1
- package/dist/reinforcement/related.d.ts +31 -2
- package/dist/reinforcement/related.d.ts.map +1 -1
- package/dist/reinforcement/related.js +39 -3
- package/dist/reinforcement/related.js.map +1 -1
- package/dist/retrieval/filter.d.ts.map +1 -1
- package/dist/retrieval/filter.js +7 -0
- package/dist/retrieval/filter.js.map +1 -1
- package/dist/retrieval/fts.d.ts +6 -5
- package/dist/retrieval/fts.d.ts.map +1 -1
- package/dist/retrieval/fts.js +74 -22
- package/dist/retrieval/fts.js.map +1 -1
- package/dist/status/index.d.ts +7 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +7 -0
- package/dist/status/index.js.map +1 -0
- package/dist/status/status.d.ts +132 -0
- package/dist/status/status.d.ts.map +1 -0
- package/dist/status/status.js +437 -0
- package/dist/status/status.js.map +1 -0
- package/dist/storage/engram-store.d.ts.map +1 -1
- package/dist/storage/engram-store.js +17 -2
- package/dist/storage/engram-store.js.map +1 -1
- package/dist/storage/git.d.ts +168 -0
- package/dist/storage/git.d.ts.map +1 -1
- package/dist/storage/git.js +616 -33
- package/dist/storage/git.js.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/infra-doctor.d.ts +42 -0
- package/dist/storage/infra-doctor.d.ts.map +1 -0
- package/dist/storage/infra-doctor.js +92 -0
- package/dist/storage/infra-doctor.js.map +1 -0
- package/dist/storage/obsidian-links.d.ts +73 -0
- package/dist/storage/obsidian-links.d.ts.map +1 -0
- package/dist/storage/obsidian-links.js +177 -0
- package/dist/storage/obsidian-links.js.map +1 -0
- package/dist/storage/path.d.ts +24 -0
- package/dist/storage/path.d.ts.map +1 -1
- package/dist/storage/path.js +53 -0
- package/dist/storage/path.js.map +1 -1
- package/dist/storage/repository.d.ts +37 -1
- package/dist/storage/repository.d.ts.map +1 -1
- package/dist/storage/repository.js +235 -17
- package/dist/storage/repository.js.map +1 -1
- package/dist/storage/synapse-store.d.ts +7 -1
- package/dist/storage/synapse-store.d.ts.map +1 -1
- package/dist/storage/synapse-store.js +8 -0
- package/dist/storage/synapse-store.js.map +1 -1
- package/dist/tools/audit-query-tool.d.ts +53 -0
- package/dist/tools/audit-query-tool.d.ts.map +1 -0
- package/dist/tools/audit-query-tool.js +123 -0
- package/dist/tools/audit-query-tool.js.map +1 -0
- package/dist/tools/doctor-tools.d.ts +5 -0
- package/dist/tools/doctor-tools.d.ts.map +1 -1
- package/dist/tools/doctor-tools.js +11 -3
- package/dist/tools/doctor-tools.js.map +1 -1
- package/dist/tools/engram-tools.d.ts +13 -0
- package/dist/tools/engram-tools.d.ts.map +1 -1
- package/dist/tools/engram-tools.js +72 -8
- package/dist/tools/engram-tools.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/llm-descriptions.d.ts +28 -28
- package/dist/tools/llm-descriptions.d.ts.map +1 -1
- package/dist/tools/llm-descriptions.js +56 -489
- package/dist/tools/llm-descriptions.js.map +1 -1
- package/dist/tools/normalization.d.ts +43 -0
- package/dist/tools/normalization.d.ts.map +1 -0
- package/dist/tools/normalization.js +68 -0
- package/dist/tools/normalization.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +6 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/schemas.d.ts +67 -11
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +61 -6
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/skill-tools.js +1 -1
- package/dist/tools/skill-tools.js.map +1 -1
- package/dist/tools/synapse-tools.d.ts.map +1 -1
- package/dist/tools/synapse-tools.js +1 -0
- package/dist/tools/synapse-tools.js.map +1 -1
- package/dist/tools/sync-tools.d.ts +102 -0
- package/dist/tools/sync-tools.d.ts.map +1 -0
- package/dist/tools/sync-tools.js +309 -0
- package/dist/tools/sync-tools.js.map +1 -0
- package/dist/tools/synthesize-tools.d.ts +79 -0
- package/dist/tools/synthesize-tools.d.ts.map +1 -0
- package/dist/tools/synthesize-tools.js +297 -0
- package/dist/tools/synthesize-tools.js.map +1 -0
- package/dist/tools/tool-profile.d.ts +68 -0
- package/dist/tools/tool-profile.d.ts.map +1 -0
- package/dist/tools/tool-profile.js +174 -0
- package/dist/tools/tool-profile.js.map +1 -0
- package/dist/tools/tool.d.ts +24 -0
- package/dist/tools/tool.d.ts.map +1 -1
- package/dist/tools/tool.js.map +1 -1
- package/dist/types/disclosure.d.ts +7 -0
- package/dist/types/disclosure.d.ts.map +1 -1
- package/dist/types/repository-types.d.ts +17 -1
- package/dist/types/repository-types.d.ts.map +1 -1
- package/dist/types/synapse.d.ts +19 -1
- package/dist/types/synapse.d.ts.map +1 -1
- 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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"}
|
package/dist/tools/tool.d.ts
CHANGED
|
@@ -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 接口
|
package/dist/tools/tool.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/tools/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,WAAW;AACX,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,SAAS,GACT,MAAM,GACN,UAAU,CAAC;AAEf,wBAAwB;AACxB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,SAAS,YAAY,EAAE,CAAC;CACnD;AAED,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAElE,YAAY;AACZ,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"disclosure.d.ts","sourceRoot":"","sources":["../../src/types/disclosure.ts"],"names":[],"mappings":"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"}
|