@co-engram/openclaw 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/adapter.d.ts +36 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +330 -0
- package/dist/adapter.js.map +1 -0
- package/dist/auto-onboard.d.ts +19 -0
- package/dist/auto-onboard.d.ts.map +1 -0
- package/dist/auto-onboard.js +35 -0
- package/dist/auto-onboard.js.map +1 -0
- package/dist/entry-example.d.ts +10 -0
- package/dist/entry-example.d.ts.map +1 -0
- package/dist/entry-example.js +10 -0
- package/dist/entry-example.js.map +1 -0
- package/dist/entry.d.ts +96 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +228 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/json-schemas.d.ts +35 -0
- package/dist/json-schemas.d.ts.map +1 -0
- package/dist/json-schemas.js +432 -0
- package/dist/json-schemas.js.map +1 -0
- package/dist/list-intent-detector.d.ts +20 -0
- package/dist/list-intent-detector.d.ts.map +1 -0
- package/dist/list-intent-detector.js +50 -0
- package/dist/list-intent-detector.js.map +1 -0
- package/dist/llm-client.d.ts +29 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +112 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/maintenance-runtime.d.ts +31 -0
- package/dist/maintenance-runtime.d.ts.map +1 -0
- package/dist/maintenance-runtime.js +61 -0
- package/dist/maintenance-runtime.js.map +1 -0
- package/dist/memory-tools.d.ts +82 -0
- package/dist/memory-tools.d.ts.map +1 -0
- package/dist/memory-tools.js +237 -0
- package/dist/memory-tools.js.map +1 -0
- package/dist/plugin-entry.d.ts +98 -0
- package/dist/plugin-entry.d.ts.map +1 -0
- package/dist/plugin-entry.js +444 -0
- package/dist/plugin-entry.js.map +1 -0
- package/dist/prompt-builder.d.ts +48 -0
- package/dist/prompt-builder.d.ts.map +1 -0
- package/dist/prompt-builder.js +33 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/types.d.ts +236 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/dist/viewer-loader.d.ts +36 -0
- package/dist/viewer-loader.d.ts.map +1 -0
- package/dist/viewer-loader.js +45 -0
- package/dist/viewer-loader.js.map +1 -0
- package/openclaw.plugin.json +137 -0
- package/package.json +61 -0
- package/scripts/setup.mjs +231 -0
- package/scripts/sync-deps.mjs +247 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw 插件注册入口
|
|
3
|
+
*
|
|
4
|
+
* 用户在 openclaw 项目里通过如下方式使用:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { definePluginEntry } from 'openclaw/plugin-sdk/plugin-entry'
|
|
8
|
+
* import { registerCoEngramTools } from '@co-engram/openclaw'
|
|
9
|
+
* import { join } from 'node:path'
|
|
10
|
+
*
|
|
11
|
+
* export default definePluginEntry({
|
|
12
|
+
* id: 'co-engram',
|
|
13
|
+
* name: 'Co-Engram',
|
|
14
|
+
* description: 'Team memory with neuroscience-inspired plasticity',
|
|
15
|
+
* register(api) {
|
|
16
|
+
* registerCoEngramTools(api, {
|
|
17
|
+
* dataRoot: join(process.env.HOME!, 'team-memory'),
|
|
18
|
+
* })
|
|
19
|
+
* },
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module @co-engram/openclaw
|
|
24
|
+
*/
|
|
25
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
26
|
+
import { EngramRepository, SearchOrchestrator, AuditLog, EffectivenessTracker, ProposalEngine, LlmNecessityEvaluator, DEFAULT_HASHER_EMBEDDER, createToolRegistry, createDefaultSignalSink, wrapAllToolsWithSignalSink, translatePrompt, pluralSuffix, detectGitAuthor, collectDigestLines, DEFAULT_LANGUAGE, } from "@co-engram/core";
|
|
27
|
+
import { DEFAULT_CONFIG } from "./types.js";
|
|
28
|
+
import { adaptAllTools } from "./adapter.js";
|
|
29
|
+
import { startMaintenanceRuntime } from "./maintenance-runtime.js";
|
|
30
|
+
import { startViewerForOpenClaw } from "./viewer-loader.js";
|
|
31
|
+
import { createMemoryTools } from "./memory-tools.js";
|
|
32
|
+
import { createCoEngramPromptBuilder, } from "./prompt-builder.js";
|
|
33
|
+
import { isListMemoryIntent } from "./list-intent-detector.js";
|
|
34
|
+
import { createOpenAiCompatibleLlmClient, loadOpenClawFallbackLlmConfig, } from "./llm-client.js";
|
|
35
|
+
import { autoOnboardMergeDriver, findInstalledMergeDriverBundle, } from "./auto-onboard.js";
|
|
36
|
+
/**
|
|
37
|
+
* 构建 ToolContext(含 repository / searchOrchestrator / signalSink + 可选 observability)
|
|
38
|
+
*
|
|
39
|
+
* P4: 新增 signalSink 注入(默认 FileSignalSink 写入 dataRoot/.co-engram/signals.jsonl)。
|
|
40
|
+
* M1: 新增 auditLog / effectivenessTracker / proposalEngine 注入。
|
|
41
|
+
*/
|
|
42
|
+
export function createCoEngramContext(config = {}) {
|
|
43
|
+
// 当用户未在 plugin config 显式配置 defaultCreatedBy 时,尝试从本机 git 身份探测,
|
|
44
|
+
// 让默认作者绑定到当前 git 用户而非硬编码 'openclaw'。
|
|
45
|
+
// 解析链:plugin config.defaultCreatedBy(用户显式)> git user.name/email > DEFAULT_CONFIG.defaultCreatedBy('openclaw')
|
|
46
|
+
const userSpecifiedCreatedBy = typeof config.defaultCreatedBy === "string"
|
|
47
|
+
? config.defaultCreatedBy
|
|
48
|
+
: undefined;
|
|
49
|
+
const gitAuthor = detectGitAuthor();
|
|
50
|
+
const fullConfig = {
|
|
51
|
+
...DEFAULT_CONFIG,
|
|
52
|
+
...config,
|
|
53
|
+
...((userSpecifiedCreatedBy ?? gitAuthor)
|
|
54
|
+
? { defaultCreatedBy: userSpecifiedCreatedBy ?? gitAuthor }
|
|
55
|
+
: {}),
|
|
56
|
+
};
|
|
57
|
+
if (!existsSync(fullConfig.dataRoot)) {
|
|
58
|
+
mkdirSync(fullConfig.dataRoot, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
const repository = new EngramRepository({
|
|
61
|
+
rootPath: fullConfig.dataRoot,
|
|
62
|
+
...(fullConfig.language ? { language: fullConfig.language } : {}),
|
|
63
|
+
});
|
|
64
|
+
// 启动迁移:首次启动或语言切换时,把所有文件重写为目标格式。
|
|
65
|
+
// 迁移是幂等的(已是目标格式则跳过),因此每次启动都跑也无副作用。
|
|
66
|
+
if (fullConfig.language) {
|
|
67
|
+
const migrateResult = repository.migrateFormat(fullConfig.language);
|
|
68
|
+
if (migrateResult.migrated > 0 || migrateResult.errors.length > 0) {
|
|
69
|
+
// OpenClaw 插件无 stderr 直通,通过 console.warn 输出诊断
|
|
70
|
+
// eslint-disable-next-line no-console
|
|
71
|
+
console.warn(`[co-engram] Migration to ${fullConfig.language}: migrated=${migrateResult.migrated} skipped=${migrateResult.skipped} errors=${migrateResult.errors.length}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const searchOrchestrator = new SearchOrchestrator();
|
|
75
|
+
// P0: 启动时从现有数据构建索引;P1 改为增量
|
|
76
|
+
rebuildSearchIndex(searchOrchestrator, repository);
|
|
77
|
+
// P4: 创建 signal sink(默认 FileSignalSink,写 dataRoot/.co-engram/signals.jsonl)
|
|
78
|
+
const signalSink = createDefaultSignalSink(fullConfig.dataRoot);
|
|
79
|
+
// M1: 按需构造 observability
|
|
80
|
+
const auditLog = fullConfig.auditEnabled
|
|
81
|
+
? new AuditLog(fullConfig.dataRoot)
|
|
82
|
+
: undefined;
|
|
83
|
+
const effectivenessTracker = fullConfig.effectivenessEnabled && auditLog
|
|
84
|
+
? new EffectivenessTracker(fullConfig.dataRoot, auditLog)
|
|
85
|
+
: undefined;
|
|
86
|
+
const proposalEngine = fullConfig.proposalEnabled && auditLog
|
|
87
|
+
? new ProposalEngine({
|
|
88
|
+
repository,
|
|
89
|
+
embedder: DEFAULT_HASHER_EMBEDDER,
|
|
90
|
+
auditLog,
|
|
91
|
+
dataRoot: fullConfig.dataRoot,
|
|
92
|
+
...(config.proposalConfig ? { config: config.proposalConfig } : {}),
|
|
93
|
+
necessityEvaluator: resolveNecessityEvaluator(config),
|
|
94
|
+
})
|
|
95
|
+
: undefined;
|
|
96
|
+
const ctx = {
|
|
97
|
+
repository,
|
|
98
|
+
searchOrchestrator,
|
|
99
|
+
signalSink,
|
|
100
|
+
...(auditLog ? { auditLog } : {}),
|
|
101
|
+
...(effectivenessTracker ? { effectivenessTracker } : {}),
|
|
102
|
+
...(proposalEngine ? { proposalEngine } : {}),
|
|
103
|
+
...(fullConfig.defaultCreatedBy
|
|
104
|
+
? { defaultCreatedBy: fullConfig.defaultCreatedBy }
|
|
105
|
+
: {}),
|
|
106
|
+
};
|
|
107
|
+
return ctx;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 解析必要性评估器
|
|
111
|
+
*
|
|
112
|
+
* 优先级:
|
|
113
|
+
* 1. config.necessityEvaluator(宿主直接注入实例)
|
|
114
|
+
* 2. config.necessityLlm(显式配置 endpoint/key/model)
|
|
115
|
+
* 3. ~/.openclaw/openclaw.json fallback(OpenClaw native model)
|
|
116
|
+
* 4. undefined → ProposalEngine 内部默认 RuleBasedNecessityEvaluator
|
|
117
|
+
*
|
|
118
|
+
* 失败(如配置不全)不抛错,返回 undefined 让 ProposalEngine 用规则版兜底。
|
|
119
|
+
*/
|
|
120
|
+
function resolveNecessityEvaluator(config) {
|
|
121
|
+
// 1. 宿主直接注入
|
|
122
|
+
if (config.necessityEvaluator)
|
|
123
|
+
return config.necessityEvaluator;
|
|
124
|
+
// 2. 显式配置 + 3. OpenClaw fallback
|
|
125
|
+
const llmConfig = config.necessityLlm ?? loadOpenClawFallbackLlmConfig();
|
|
126
|
+
if (!llmConfig)
|
|
127
|
+
return undefined;
|
|
128
|
+
try {
|
|
129
|
+
const client = createOpenAiCompatibleLlmClient(llmConfig);
|
|
130
|
+
return new LlmNecessityEvaluator(client);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// 配置错误不阻塞 plugin 启动;规则版兜底
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 重建搜索索引(全量)
|
|
139
|
+
*
|
|
140
|
+
* 用 collectDigestLines 取真实 DigestLine[](含 importance / decayHalfLifeDays /
|
|
141
|
+
* retrievalCount / reinforcementScore 等),让 SearchOrchestrator 的三因子打分
|
|
142
|
+
* (α·relevance + β·recency + γ·importance)能用真实数据,而不是全部默认 0.5。
|
|
143
|
+
*
|
|
144
|
+
* 这直接影响搜索质量:之前所有 engram importance 都被 stub 成 0.5,导致
|
|
145
|
+
* importance 因子对排名无贡献,高重要性 engram 没法浮上来。
|
|
146
|
+
*/
|
|
147
|
+
export function rebuildSearchIndex(search, repo) {
|
|
148
|
+
search.build(collectDigestLines(repo));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 渲染 co-engram 记忆库 catalog 为可直接消费的 markdown 列表
|
|
152
|
+
*
|
|
153
|
+
* 用于 before_prompt_build hook 的 appendSystemContext:
|
|
154
|
+
* 当用户问"我有哪些记忆 / 列出记忆"时,直接把 catalog 内容塞 system prompt
|
|
155
|
+
* 末尾——agent 拿到现成答案,不需要再调任何工具。
|
|
156
|
+
*
|
|
157
|
+
* 设计权衡:
|
|
158
|
+
* - 早期版本只给"短引导 + 工具调用指令",但 agent(Qwen 等)在长 prompt
|
|
159
|
+
* 下注意力丢失,继续按习惯调 read workspace/memory/*.md(stock 残留)
|
|
160
|
+
* - 现在直接给前 N 条 catalog,agent 拿到现成列表即回答;catalog 没显示
|
|
161
|
+
* 的部分通过 "调 engram_list 翻页" 引导
|
|
162
|
+
* - prompt cache 失效可接受:列举意图只占少量 prompt,且用户问"我有
|
|
163
|
+
* 哪些记忆"本就期待看到实际内容
|
|
164
|
+
*
|
|
165
|
+
* 与 workspace MEMORY.md 共存:workspace MEMORY.md 是个人/项目笔记,
|
|
166
|
+
* co-engram 是团队系统化记忆;两者职责不同,agent 可同时引用。
|
|
167
|
+
*
|
|
168
|
+
* 记忆库为空返回 null(不注入)。
|
|
169
|
+
*/
|
|
170
|
+
function renderMemoryCatalogMarkdown(ctx, _language) {
|
|
171
|
+
const entries = ctx.repository.listEngrams();
|
|
172
|
+
if (entries.length === 0)
|
|
173
|
+
return null;
|
|
174
|
+
// 按 title 排序,限长避免撑爆 prompt
|
|
175
|
+
const sorted = [...entries].sort((a, b) => a.title.localeCompare(b.title, "zh-CN"));
|
|
176
|
+
const LIMIT = 30;
|
|
177
|
+
const limited = sorted.slice(0, LIMIT);
|
|
178
|
+
const lines = [];
|
|
179
|
+
lines.push(`## co-engram 团队记忆(共 ${entries.length} 条,展示前 ${limited.length} 条)`);
|
|
180
|
+
lines.push("");
|
|
181
|
+
lines.push('用户问"我有哪些记忆 / 列出记忆"——以下就是答案,直接基于此列表回答。');
|
|
182
|
+
lines.push("注意:workspace/memory/ 下的日期文件是 stock memory-core 残留,不要调 read 工具去读它们。");
|
|
183
|
+
lines.push("");
|
|
184
|
+
for (let i = 0; i < limited.length; i++) {
|
|
185
|
+
const e = limited[i];
|
|
186
|
+
const tags = e.domainTags.length > 0 ? e.domainTags.join(", ") : "(无 tags)";
|
|
187
|
+
lines.push(`${i + 1}. **${e.title}** \`${e.kind}\``);
|
|
188
|
+
lines.push(` - id: \`${e.id}\``);
|
|
189
|
+
lines.push(` - tags: ${tags}`);
|
|
190
|
+
}
|
|
191
|
+
if (entries.length > LIMIT) {
|
|
192
|
+
lines.push("");
|
|
193
|
+
lines.push(`(还有 ${entries.length - LIMIT} 条未展示;调 \`engram_list\` 工具查看完整分页列表)`);
|
|
194
|
+
}
|
|
195
|
+
lines.push("");
|
|
196
|
+
lines.push("**后续操作:**");
|
|
197
|
+
lines.push("- 看某条细节 → 调 `engram_get(id)`");
|
|
198
|
+
lines.push('- 按关键词找 → 调 `engram_search(query="关键词")`');
|
|
199
|
+
return lines.join("\n");
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* 注册所有 Co-Engram 工具到 OpenClaw 插件 API
|
|
203
|
+
*
|
|
204
|
+
* P4 新增:
|
|
205
|
+
* - 工具通过 wrapAllToolsWithSignalSink 包装,自动 append ToolCallEvent
|
|
206
|
+
* - 可选 startMaintenance=true 时启动 MaintenanceEngine(默认 false,需宿主显式开启)
|
|
207
|
+
*
|
|
208
|
+
* M3b 新增:
|
|
209
|
+
* - 如果 ctx.proposalEngine 存在 + api 提供 registerHook + enqueueNextTurnInjection,
|
|
210
|
+
* 注册 session 'new' hook,在会话开始时把候选提示注入下一轮 agent context
|
|
211
|
+
*
|
|
212
|
+
* @param api OpenClaw 插件 API(只需暴露 registerTool)
|
|
213
|
+
* @param config 配置(数据根路径等)
|
|
214
|
+
* @returns ctx + 可选的 maintenance stop 函数
|
|
215
|
+
*/
|
|
216
|
+
export function registerCoEngramTools(api, config = {}) {
|
|
217
|
+
if (config.enabled === false) {
|
|
218
|
+
// 禁用时不注册任何工具
|
|
219
|
+
return createCoEngramContext(config);
|
|
220
|
+
}
|
|
221
|
+
const ctx = createCoEngramContext(config);
|
|
222
|
+
const language = config.language ?? DEFAULT_LANGUAGE;
|
|
223
|
+
const registry = createToolRegistry();
|
|
224
|
+
// P4: 包装工具以自动收集行为信号
|
|
225
|
+
const wrappedTools = wrapAllToolsWithSignalSink(registry.list());
|
|
226
|
+
const descriptors = adaptAllTools(wrappedTools, ctx, language);
|
|
227
|
+
for (const desc of descriptors) {
|
|
228
|
+
api.registerTool(desc, { name: desc.name });
|
|
229
|
+
}
|
|
230
|
+
// 注册 OpenClaw 兼容的 memory_search / memory_get 工具
|
|
231
|
+
// 触发 OpenClaw 核心的 memory section 系统提示注入
|
|
232
|
+
const memoryTools = createMemoryTools(ctx, language);
|
|
233
|
+
for (const tool of memoryTools) {
|
|
234
|
+
api.registerTool(tool, { name: tool.name });
|
|
235
|
+
}
|
|
236
|
+
// 注册 memory capability(promptBuilder)
|
|
237
|
+
// co-engram 作为 kind: "memory" 主要插件,提供引导文字
|
|
238
|
+
if (api.registerMemoryCapability) {
|
|
239
|
+
const proposalEngine = ctx.proposalEngine;
|
|
240
|
+
const promptBuilder = createCoEngramPromptBuilder({
|
|
241
|
+
language,
|
|
242
|
+
signals: config.promptSignals,
|
|
243
|
+
proposalCountProvider: () => proposalEngine?.listPending().length ?? 0,
|
|
244
|
+
});
|
|
245
|
+
api.registerMemoryCapability({ promptBuilder });
|
|
246
|
+
}
|
|
247
|
+
// 注册 before_prompt_build hook:列举意图兜底
|
|
248
|
+
//
|
|
249
|
+
// 背景:OpenClaw core 无条件把 ~/.openclaw/workspace/MEMORY.md 注入到
|
|
250
|
+
// base system prompt。workspace/memory/ 目录里有 stock memory-core 残留
|
|
251
|
+
// 的日期文件,agent 习惯调 read 工具去读它们(ENOENT 失败)。
|
|
252
|
+
//
|
|
253
|
+
// 这个 hook 检测 prompt 是否为"我有哪些记忆 / 列出所有记忆"等列举意图,
|
|
254
|
+
// 是则通过 appendSystemContext 把 co-engram 实际记忆列表(catalog)以
|
|
255
|
+
// markdown 形式直接注入到 base system prompt 末尾——agent 拿到现成答案,
|
|
256
|
+
// 不需要再调 read 工具去访问 workspace/memory/。
|
|
257
|
+
//
|
|
258
|
+
// 与 workspace MEMORY.md 共存:MEMORY.md 是个人/项目笔记,co-engram 是
|
|
259
|
+
// 团队系统化记忆,两者职责不同。其他场景不触发,避免污染 prompt cache。
|
|
260
|
+
if (api.on) {
|
|
261
|
+
api.on("before_prompt_build", (event) => {
|
|
262
|
+
try {
|
|
263
|
+
if (!isListMemoryIntent(event.prompt ?? ""))
|
|
264
|
+
return;
|
|
265
|
+
const markdown = renderMemoryCatalogMarkdown(ctx, language);
|
|
266
|
+
if (!markdown)
|
|
267
|
+
return;
|
|
268
|
+
return { appendSystemContext: markdown };
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
// P4 + M1: 可选启动 maintenance runtime(透传 effectivenessTracker + dataRoot)
|
|
276
|
+
let stopMaintenance;
|
|
277
|
+
if (config.startMaintenance === true && ctx.signalSink) {
|
|
278
|
+
const runtime = startMaintenanceRuntime({
|
|
279
|
+
repository: ctx.repository,
|
|
280
|
+
signalSink: ctx.signalSink,
|
|
281
|
+
...(ctx.effectivenessTracker
|
|
282
|
+
? { effectivenessTracker: ctx.effectivenessTracker }
|
|
283
|
+
: {}),
|
|
284
|
+
// dataRoot 用于 light stage 写 prompt-signals.json(自进化提示词)
|
|
285
|
+
dataRoot: config.dataRoot ?? DEFAULT_CONFIG.dataRoot,
|
|
286
|
+
}, config.maintenanceConfig ?? {});
|
|
287
|
+
stopMaintenance = runtime.stop;
|
|
288
|
+
}
|
|
289
|
+
// P2.7: 自动 onboard git merge driver(默认开启,匹配零手动步骤原则)
|
|
290
|
+
//
|
|
291
|
+
// 启动时检测 dataRoot 所在 git repo,自动装好 merge driver bundle /
|
|
292
|
+
// .gitattributes / .git/config。这样用户 clone 团队记忆仓库后第一次启动
|
|
293
|
+
// co-engram 就立刻具备结构化 merge 能力,不需要手动跑 `co-engram git enable`。
|
|
294
|
+
//
|
|
295
|
+
// 失败不阻塞 plugin —— 通过 stderr 输出诊断信息即可。
|
|
296
|
+
if (config.autoOnboardMergeDriver !== false) {
|
|
297
|
+
const bundleSource = findInstalledMergeDriverBundle();
|
|
298
|
+
if (bundleSource) {
|
|
299
|
+
const dataRoot = config.dataRoot ?? DEFAULT_CONFIG.dataRoot;
|
|
300
|
+
const result = autoOnboardMergeDriver({
|
|
301
|
+
dataRoot,
|
|
302
|
+
bundleSourcePath: bundleSource,
|
|
303
|
+
});
|
|
304
|
+
if (result.attempted && result.error) {
|
|
305
|
+
process.stderr.write(`[co-engram] Auto-onboard merge driver failed: ${result.error}\n`);
|
|
306
|
+
}
|
|
307
|
+
else if (result.attempted && result.bundleUpgraded) {
|
|
308
|
+
process.stderr.write(`[co-engram] Merge driver installed in ${result.repoRoot}\n`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
process.stderr.write(`[co-engram] Auto-onboard skipped: merge-driver bundle not found\n`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// M3b: 可选 system prompt 注入(需 proposal engine + host 支持)
|
|
316
|
+
if (ctx.proposalEngine && api.registerHook && api.enqueueNextTurnInjection) {
|
|
317
|
+
const proposalEngine = ctx.proposalEngine;
|
|
318
|
+
const enqueue = api.enqueueNextTurnInjection;
|
|
319
|
+
api.registerHook("session", async (event) => {
|
|
320
|
+
if (event.action !== "new")
|
|
321
|
+
return;
|
|
322
|
+
try {
|
|
323
|
+
const pending = proposalEngine.listPending();
|
|
324
|
+
if (pending.length === 0)
|
|
325
|
+
return;
|
|
326
|
+
const text = buildProposalPrompt(pending.length, language);
|
|
327
|
+
await enqueue({
|
|
328
|
+
sessionKey: event.sessionKey,
|
|
329
|
+
text,
|
|
330
|
+
placement: "prepend_context",
|
|
331
|
+
idempotencyKey: `co-engram-proposals-${event.sessionKey}`,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// 注入失败不阻塞会话
|
|
336
|
+
}
|
|
337
|
+
}, { name: "co-engram-session-inject" });
|
|
338
|
+
}
|
|
339
|
+
// M3c: 对话流自动观察(需 proposal engine + host 提供 registerHook)
|
|
340
|
+
//
|
|
341
|
+
// 监听 OpenClaw 的 llm_input / llm_output 事件,把用户输入和 assistant 输出
|
|
342
|
+
// 喂给 proposalEngine.observe(),驱动跨会话的话题聚类和 proposal 生成。
|
|
343
|
+
//
|
|
344
|
+
// 设计:
|
|
345
|
+
// - llm_input.prompt → role: 'user'
|
|
346
|
+
// - llm_output.assistantTexts → role: 'assistant'(多段拼接)
|
|
347
|
+
// - observe 内部已做长度过滤和 embedder 异常吞掉,这里只需 fire-and-forget
|
|
348
|
+
// - 事件类型用 unknown 窄化,避免把 OpenClaw 的全部 hook 类型拉进 co-engram 类型定义
|
|
349
|
+
if (ctx.proposalEngine && api.registerHook) {
|
|
350
|
+
const proposalEngine = ctx.proposalEngine;
|
|
351
|
+
// OpenClaw registerHook 要求 opts.name(否则抛"hook registration missing name"),
|
|
352
|
+
// 必须提供唯一 name 让 hook 真正注册到 registry。
|
|
353
|
+
api.registerHook(["llm_input", "llm_output"], async (event) => {
|
|
354
|
+
try {
|
|
355
|
+
const e = event;
|
|
356
|
+
if (typeof e.prompt === "string" && e.prompt.trim().length > 0) {
|
|
357
|
+
void proposalEngine.observe({ role: "user", content: e.prompt });
|
|
358
|
+
}
|
|
359
|
+
if (Array.isArray(e.assistantTexts) && e.assistantTexts.length > 0) {
|
|
360
|
+
const content = e.assistantTexts
|
|
361
|
+
.filter((s) => typeof s === "string" && s.length > 0)
|
|
362
|
+
.join("\n\n");
|
|
363
|
+
if (content.trim().length > 0) {
|
|
364
|
+
void proposalEngine.observe({ role: "assistant", content });
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// observe 失败不能影响 OpenClaw 主流程
|
|
370
|
+
}
|
|
371
|
+
}, { name: "co-engram-observe-llm" });
|
|
372
|
+
}
|
|
373
|
+
// 启动跨进程 index watcher — OpenClaw plugin 与外部 MCP server / 其他 host
|
|
374
|
+
// 共享同一 dataRoot 时,确保各进程的 indexCache 在外部写入后立即失效。
|
|
375
|
+
// listener:watcher 触发时同步重建 SearchOrchestrator 的 ftsIndex,
|
|
376
|
+
// 否则 plugin 进程写入后,mcp 进程的 search 还是查旧索引(P0 缺陷)。
|
|
377
|
+
ctx.repository.startWatching();
|
|
378
|
+
ctx.repository.addInvalidateListener(() => {
|
|
379
|
+
rebuildSearchIndex(ctx.searchOrchestrator, ctx.repository);
|
|
380
|
+
});
|
|
381
|
+
return {
|
|
382
|
+
...ctx,
|
|
383
|
+
stopMaintenance,
|
|
384
|
+
stopIndexWatcher: () => ctx.repository.stopWatching(),
|
|
385
|
+
language,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 异步启动 viewer
|
|
390
|
+
*
|
|
391
|
+
* 与 registerCoEngramTools 分离,因为 viewer 启动是异步的且需要 @co-engram/claude-code。
|
|
392
|
+
* 失败不抛到外层,只记 stderr——plugin 仍正常工作。
|
|
393
|
+
*
|
|
394
|
+
* @returns stop 函数;viewer 未启动时返回 undefined
|
|
395
|
+
*/
|
|
396
|
+
export async function startCoEngramViewer(ctx, config = {}) {
|
|
397
|
+
if (config.startViewer !== true)
|
|
398
|
+
return {};
|
|
399
|
+
try {
|
|
400
|
+
const language = ctx.language ?? config.language ?? DEFAULT_LANGUAGE;
|
|
401
|
+
// P3-fixup: 透传 dataRoot,让 viewer 能读取 persisted config
|
|
402
|
+
// 否则 viewer 只看到 viewerConfig{port,token},/api/config 的 persisted/runtime
|
|
403
|
+
// maintenanceEnabled/viewerEnabled 全部读不到。
|
|
404
|
+
const dataRoot = config.dataRoot ?? `${process.env.HOME ?? "/tmp"}/team-memory`;
|
|
405
|
+
const runtime = await startViewerForOpenClaw(ctx, {
|
|
406
|
+
...config.viewerConfig,
|
|
407
|
+
...(dataRoot ? { dataRoot } : {}),
|
|
408
|
+
language,
|
|
409
|
+
});
|
|
410
|
+
process.stderr.write(`[co-engram] Viewer listening on http://127.0.0.1:${runtime.port}\n`);
|
|
411
|
+
return {
|
|
412
|
+
stopViewer: () => runtime.stop(),
|
|
413
|
+
viewerPort: runtime.port,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
catch (err) {
|
|
417
|
+
process.stderr.write(`[co-engram] Viewer failed to start: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
418
|
+
return {};
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* 构造候选提示文本(OpenClaw 注入用)
|
|
423
|
+
*
|
|
424
|
+
* 与 MCP 侧保持一致,均走 i18n 字典。
|
|
425
|
+
*/
|
|
426
|
+
export function buildProposalPrompt(count, language = DEFAULT_LANGUAGE) {
|
|
427
|
+
const plural = pluralSuffix(language, count);
|
|
428
|
+
return translatePrompt(language, "prompt.proposal_prompt", { count, plural });
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* 仅供测试/独立使用:构建一个内存中的 ctx + 注册结果
|
|
432
|
+
*/
|
|
433
|
+
export function createCoEngramTools(config = {}) {
|
|
434
|
+
const ctx = createCoEngramContext(config);
|
|
435
|
+
const registry = createToolRegistry();
|
|
436
|
+
const wrappedTools = wrapAllToolsWithSignalSink(registry.list());
|
|
437
|
+
return {
|
|
438
|
+
ctx,
|
|
439
|
+
tools: adaptAllTools(wrappedTools, ctx),
|
|
440
|
+
rebuild: () => rebuildSearchIndex(ctx.searchOrchestrator, ctx.repository),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
export { DEFAULT_CONFIG };
|
|
444
|
+
//# sourceMappingURL=plugin-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-entry.js","sourceRoot":"","sources":["../src/plugin-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw adapter for the shared prompt builder
|
|
3
|
+
*
|
|
4
|
+
* 实际逻辑在 @co-engram/core/prompt-builder。
|
|
5
|
+
* 本文件只做两件事:
|
|
6
|
+
* 1. re-export core 的 host-agnostic API(向后兼容)
|
|
7
|
+
* 2. 提供 OpenClaw 协议特定的类型适配(MemoryPromptBuilderParams / MemoryPromptBuilder)
|
|
8
|
+
*
|
|
9
|
+
* @module @co-engram/openclaw
|
|
10
|
+
*/
|
|
11
|
+
import { buildCoEngramMemoryPrompt as coreBuildPrompt, type BuildPromptInput, type PromptSignals } from "@co-engram/core";
|
|
12
|
+
import type { Language } from "@co-engram/core";
|
|
13
|
+
export { coreBuildPrompt as buildCoEngramMemoryPrompt };
|
|
14
|
+
export type { BuildPromptInput, PromptSignals } from "@co-engram/core";
|
|
15
|
+
/**
|
|
16
|
+
* OpenClaw `registerMemoryCapability.promptBuilder` 的参数协议
|
|
17
|
+
*
|
|
18
|
+
* availableTools + citationsMode 是 OpenClaw 协议字段;
|
|
19
|
+
* 宿主调用时传入,adapter 把它适配成 core 的 BuildPromptInput。
|
|
20
|
+
*/
|
|
21
|
+
export interface MemoryPromptBuilderParams {
|
|
22
|
+
readonly availableTools: ReadonlySet<string>;
|
|
23
|
+
readonly citationsMode?: "off" | "compact" | "full";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* OpenClaw promptBuilder 协议签名
|
|
27
|
+
*/
|
|
28
|
+
export type MemoryPromptBuilder = (params: MemoryPromptBuilderParams) => readonly string[];
|
|
29
|
+
/**
|
|
30
|
+
* 旧的 BuildPromptInput alias(向后兼容)
|
|
31
|
+
*
|
|
32
|
+
* @deprecated 直接使用 `BuildPromptInput` from `@co-engram/core`。
|
|
33
|
+
*/
|
|
34
|
+
export type BuildPromptInputLegacy = BuildPromptInput;
|
|
35
|
+
/**
|
|
36
|
+
* 工厂:创建符合 OpenClaw MemoryPromptBuilder 协议的函数
|
|
37
|
+
*
|
|
38
|
+
* 额外参数通过闭包注入:
|
|
39
|
+
* - language:固定(plugin 注册时确定)
|
|
40
|
+
* - signals:固定 snapshot(plugin 注册时读取,下次重启刷新)
|
|
41
|
+
* - proposalCount:动态(每次 promptBuilder 调用时从 proposalEngine 获取)
|
|
42
|
+
*/
|
|
43
|
+
export declare function createCoEngramPromptBuilder(options: {
|
|
44
|
+
readonly language?: Language;
|
|
45
|
+
readonly signals?: PromptSignals;
|
|
46
|
+
readonly proposalCountProvider?: () => number;
|
|
47
|
+
}): MemoryPromptBuilder;
|
|
48
|
+
//# sourceMappingURL=prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,yBAAyB,IAAI,eAAe,EAE5C,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,eAAe,IAAI,yBAAyB,EAAE,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE,yBAAyB,KAC9B,SAAS,MAAM,EAAE,CAAC;AAEvB;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAC;CAC/C,GAAG,mBAAmB,CAYtB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw adapter for the shared prompt builder
|
|
3
|
+
*
|
|
4
|
+
* 实际逻辑在 @co-engram/core/prompt-builder。
|
|
5
|
+
* 本文件只做两件事:
|
|
6
|
+
* 1. re-export core 的 host-agnostic API(向后兼容)
|
|
7
|
+
* 2. 提供 OpenClaw 协议特定的类型适配(MemoryPromptBuilderParams / MemoryPromptBuilder)
|
|
8
|
+
*
|
|
9
|
+
* @module @co-engram/openclaw
|
|
10
|
+
*/
|
|
11
|
+
import { buildCoEngramMemoryPrompt as coreBuildPrompt, createPromptBuilder as coreCreateBuilder, } from "@co-engram/core";
|
|
12
|
+
// Re-export 共享 API(向后兼容旧 import)
|
|
13
|
+
export { coreBuildPrompt as buildCoEngramMemoryPrompt };
|
|
14
|
+
/**
|
|
15
|
+
* 工厂:创建符合 OpenClaw MemoryPromptBuilder 协议的函数
|
|
16
|
+
*
|
|
17
|
+
* 额外参数通过闭包注入:
|
|
18
|
+
* - language:固定(plugin 注册时确定)
|
|
19
|
+
* - signals:固定 snapshot(plugin 注册时读取,下次重启刷新)
|
|
20
|
+
* - proposalCount:动态(每次 promptBuilder 调用时从 proposalEngine 获取)
|
|
21
|
+
*/
|
|
22
|
+
export function createCoEngramPromptBuilder(options) {
|
|
23
|
+
const coreBuilder = coreCreateBuilder({
|
|
24
|
+
language: options.language,
|
|
25
|
+
signals: options.signals,
|
|
26
|
+
proposalCountProvider: options.proposalCountProvider,
|
|
27
|
+
});
|
|
28
|
+
return (params) => coreBuilder({
|
|
29
|
+
availableTools: params.availableTools,
|
|
30
|
+
citationsMode: params.citationsMode,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,yBAAyB,IAAI,eAAe,EAC5C,mBAAmB,IAAI,iBAAiB,GAGzC,MAAM,iBAAiB,CAAC;AAGzB,iCAAiC;AACjC,OAAO,EAAE,eAAe,IAAI,yBAAyB,EAAE,CAAC;AA4BxD;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAI3C;IACC,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;KACrD,CAAC,CAAC;IAEH,OAAO,CAAC,MAAiC,EAAE,EAAE,CAC3C,WAAW,CAAC;QACV,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;AACP,CAAC"}
|