@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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -0
  3. package/dist/adapter.d.ts +36 -0
  4. package/dist/adapter.d.ts.map +1 -0
  5. package/dist/adapter.js +330 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/auto-onboard.d.ts +19 -0
  8. package/dist/auto-onboard.d.ts.map +1 -0
  9. package/dist/auto-onboard.js +35 -0
  10. package/dist/auto-onboard.js.map +1 -0
  11. package/dist/entry-example.d.ts +10 -0
  12. package/dist/entry-example.d.ts.map +1 -0
  13. package/dist/entry-example.js +10 -0
  14. package/dist/entry-example.js.map +1 -0
  15. package/dist/entry.d.ts +96 -0
  16. package/dist/entry.d.ts.map +1 -0
  17. package/dist/entry.js +228 -0
  18. package/dist/entry.js.map +1 -0
  19. package/dist/index.d.ts +14 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +14 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/json-schemas.d.ts +35 -0
  24. package/dist/json-schemas.d.ts.map +1 -0
  25. package/dist/json-schemas.js +432 -0
  26. package/dist/json-schemas.js.map +1 -0
  27. package/dist/list-intent-detector.d.ts +20 -0
  28. package/dist/list-intent-detector.d.ts.map +1 -0
  29. package/dist/list-intent-detector.js +50 -0
  30. package/dist/list-intent-detector.js.map +1 -0
  31. package/dist/llm-client.d.ts +29 -0
  32. package/dist/llm-client.d.ts.map +1 -0
  33. package/dist/llm-client.js +112 -0
  34. package/dist/llm-client.js.map +1 -0
  35. package/dist/maintenance-runtime.d.ts +31 -0
  36. package/dist/maintenance-runtime.d.ts.map +1 -0
  37. package/dist/maintenance-runtime.js +61 -0
  38. package/dist/maintenance-runtime.js.map +1 -0
  39. package/dist/memory-tools.d.ts +82 -0
  40. package/dist/memory-tools.d.ts.map +1 -0
  41. package/dist/memory-tools.js +237 -0
  42. package/dist/memory-tools.js.map +1 -0
  43. package/dist/plugin-entry.d.ts +98 -0
  44. package/dist/plugin-entry.d.ts.map +1 -0
  45. package/dist/plugin-entry.js +444 -0
  46. package/dist/plugin-entry.js.map +1 -0
  47. package/dist/prompt-builder.d.ts +48 -0
  48. package/dist/prompt-builder.d.ts.map +1 -0
  49. package/dist/prompt-builder.js +33 -0
  50. package/dist/prompt-builder.js.map +1 -0
  51. package/dist/types.d.ts +236 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +29 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/viewer-loader.d.ts +36 -0
  56. package/dist/viewer-loader.d.ts.map +1 -0
  57. package/dist/viewer-loader.js +45 -0
  58. package/dist/viewer-loader.js.map +1 -0
  59. package/openclaw.plugin.json +137 -0
  60. package/package.json +61 -0
  61. package/scripts/setup.mjs +231 -0
  62. package/scripts/sync-deps.mjs +247 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yang Yang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # Co-Engram
2
+
3
+ **Team memory with neuroscience-inspired plasticity.**
4
+ English | [中文](./README.zh-CN.md)
5
+
6
+ Co-Engram is a self-evolving memory system for AI agents and teams. Unlike traditional vector stores that only retrieve, Co-Engram models memory after the brain: engrams strengthen with use, weaken when they fail, consolidate during sleep, and verify themselves through metacognition.
7
+
8
+ Works with **Claude Code** (via MCP) and **OpenClaw** (via plugin SDK), with a host-agnostic TypeScript core you can embed anywhere.
9
+
10
+ ## Why Co-Engram
11
+
12
+ | Differentiator | What it means |
13
+ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
14
+ | **Three-file separation** | Every memory is split into `content.md` / `meta.yaml` / `synapses.yaml` so content diffs stay clean in Git while metadata evolves independently. |
15
+ | **Self-maintaining** | A maintenance engine runs `light` (RPE-based reinforcement), `deep` (consolidation), and `rem` (metacognition upgrade/refute) stages automatically — no manual tagging required. |
16
+ | **Host-agnostic core** | `@co-engram/core` has zero host dependencies. Same memory, same tools, whether you use Claude Code, OpenClaw, or your own agent. |
17
+
18
+ ## Quickstart
19
+
20
+ Three commands to get Co-Engram working inside Claude Code:
21
+
22
+ ```bash
23
+ # 1. Install the MCP server globally
24
+ npm install -g @co-engram/claude-code
25
+
26
+ # 2. Initialize the data repo (a separate Git repo, not inside this project)
27
+ mkdir -p ~/team-memory && cd ~/team-memory && git init
28
+
29
+ # 3. Wire into Claude Code
30
+ claude mcp add co-engram \
31
+ -e CO_ENGRAM_DATA_ROOT=$HOME/team-memory \
32
+ -e CO_ENGRAM_MAINTENANCE=1 \
33
+ --scope user \
34
+ -- co-engram-mcp
35
+ ```
36
+
37
+ Restart Claude Code, run `/mcp` in a new session, and you should see 25 `co-engram` tools loaded.
38
+
39
+ **Zero-install alternative** (skip step 1): replace `co-engram-mcp` in step 3 with `npx -y @co-engram/claude-code`.
40
+
41
+ For OpenClaw integration, see [docs/host-openclaw.md](./docs/host-openclaw.md).
42
+
43
+ ## Architecture
44
+
45
+ ```mermaid
46
+ flowchart TB
47
+ subgraph Host["Host layer"]
48
+ CC["Claude Code"]
49
+ OC["OpenClaw"]
50
+ end
51
+
52
+ subgraph Adapter["Adapter layer"]
53
+ A1["@co-engram/claude-code<br/>(MCP server, stdio)"]
54
+ A2["@co-engram/openclaw<br/>(plugin SDK)"]
55
+ end
56
+
57
+ subgraph Core["@co-engram/core<br/>(host-agnostic)"]
58
+ Tools["25 tools<br/>engrams · synapses · skills"]
59
+ Engine["Maintenance engine<br/>light · deep · rem"]
60
+ Retrieval["FTS + graph retrieval"]
61
+ end
62
+
63
+ subgraph Data["Data layer (separate Git repo)"]
64
+ Engrams["engrams/{content,meta,synapses}"]
65
+ Skills["skills/"]
66
+ end
67
+
68
+ subgraph Cache["Cache layer (gitignored)"]
69
+ Derived[".co-engram/<br/>FTS index · vectors"]
70
+ end
71
+
72
+ CC --> A1
73
+ OC --> A2
74
+ A1 --> Tools
75
+ A2 --> Tools
76
+ Tools --> Engine
77
+ Tools --> Retrieval
78
+ Retrieval --> Derived
79
+ Engine --> Data
80
+ Tools --> Data
81
+ ```
82
+
83
+ ## Packages
84
+
85
+ | Package | What it does | Install |
86
+ | ------------------------------------------------------ | ----------------------------------------------------------- | ------------------------------------ |
87
+ | [`@co-engram/core`](./packages/core) | Host-agnostic memory engine + 25 tools + maintenance engine | `npm install @co-engram/core` |
88
+ | [`@co-engram/claude-code`](./packages/claude-code-mcp) | MCP server adapter for Claude Code | `npm install @co-engram/claude-code` |
89
+ | [`@co-engram/openclaw`](./packages/openclaw-plugin) | Plugin SDK adapter for OpenClaw | `npm install @co-engram/openclaw` |
90
+ | [`@co-engram/e2e`](./packages/e2e) | Cross-host end-to-end tests (private, not published) | workspace only |
91
+
92
+ ## Tool Catalog
93
+
94
+ Co-Engram exposes **25 native tools** grouped into five concerns, plus 2 OpenClaw-compatible `memory_*` wrappers (registered only under `@co-engram/openclaw`).
95
+
96
+ **Engrams** (12) — the core memory units
97
+ `engram_create` · `engram_get` · `engram_update` · `engram_delete` · `engram_search` · `engram_list` · `engram_reinforce` · `engram_report_failure` · `engram_archive` · `engram_restore` · `engram_forget` · `engram_recompute_importance`
98
+
99
+ **Synapses** (4) — typed connections between engrams
100
+ `synapse_create` · `synapse_get` · `synapse_list` · `synapse_delete`
101
+
102
+ **Skills** (2) — procedural memory
103
+ `skill_get` · `skill_invoke`
104
+
105
+ **Learning loop** (4) — verification, contradiction, evolution
106
+ `close_learning_loop` · `contradiction_resolve` · `upgrade_verification` · `get_evolution_lineage`
107
+
108
+ **Memory proposals** (3) — implicit capture from conversations
109
+ `engram_list_proposals` · `engram_accept_proposal` · `engram_dismiss_proposal`
110
+
111
+ **OpenClaw memory protocol** (2) — host-compatible wrappers, registered only under `@co-engram/openclaw`
112
+ `memory_search` · `memory_get`
113
+
114
+ > The `memory_*` tools declare `kind: "memory"` in `openclaw.plugin.json` so OpenClaw treats Co-Engram as the primary memory plugin (mutually exclusive with `memory-core`). They are thin adapters over `engram_search` / `engram_get` that hide Co-Engram internal terminology and inject a self-evolving prompt section via `registerMemoryCapability.promptBuilder`.
115
+
116
+ For full signatures, inputs, and examples, see [docs/tool-reference.md](./docs/tool-reference.md).
117
+
118
+ ## Configuration
119
+
120
+ ### Environment variables (Claude Code MCP server)
121
+
122
+ All optional. Set them in `claude mcp add -e KEY=value` or your shell.
123
+
124
+ | Variable | Default | Purpose |
125
+ | ----------------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
126
+ | `CO_ENGRAM_DATA_ROOT` | `$HOME/team-memory` | Absolute path to the data Git repo |
127
+ | `CO_ENGRAM_DEFAULT_CREATED_BY` | `unknown` | Default author for new engrams |
128
+ | `CO_ENGRAM_LANGUAGE` | `en` | Language for tool descriptions / viewer UI / prompts (`en` \| `zh`). Falls back to `~/team-memory/.co-engram/config.json` if unset. |
129
+ | `CO_ENGRAM_MAINTENANCE` | `0` | Set to `1` to start the maintenance engine |
130
+ | `CO_ENGRAM_MAINTENANCE_ENABLED_STAGES` | `light,deep,rem` | Comma-separated stage list |
131
+ | `CO_ENGRAM_MAINTENANCE_LIGHT_INTERVAL_MS` | `300000` (5 min) | Light stage interval |
132
+ | `CO_ENGRAM_MAINTENANCE_DEEP_INTERVAL_MS` | `3600000` (1 hour) | Deep stage interval |
133
+ | `CO_ENGRAM_MAINTENANCE_REM_INTERVAL_MS` | `604800000` (7 days) | REM stage interval |
134
+ | `CO_ENGRAM_MAINTENANCE_LEARNING_RATE` | `0.1` | RPE learning rate |
135
+
136
+ ### OpenClaw manifest config
137
+
138
+ For OpenClaw, configuration goes in the plugin manifest. See [docs/host-openclaw.md](./docs/host-openclaw.md) for the full schema.
139
+
140
+ ### One-shot setup for OpenClaw hosts
141
+
142
+ After installing the plugin into a co-claw / OpenClaw gateway, run the bundled setup
143
+ script to merge recommended defaults into `~/.openclaw/openclaw.json` and claim the
144
+ `memory` exclusive slot:
145
+
146
+ ```bash
147
+ # Dry-run: prints the planned diff, no writes
148
+ pnpm --filter @co-engram/openclaw apply:openclaw
149
+
150
+ # Apply (writes config + timestamped backup)
151
+ pnpm --filter @co-engram/openclaw apply:openclaw --yes
152
+
153
+ # Apply + restart gateway
154
+ pnpm --filter @co-engram/openclaw apply:openclaw --yes --restart
155
+
156
+ # Via the published bin (no checkout needed)
157
+ npx @co-engram/openclaw setup --yes --restart
158
+ ```
159
+
160
+ The merge is idempotent and only fills fields the user has not set explicitly —
161
+ existing values (including `false`) are preserved. Recommended defaults:
162
+
163
+ | Field | Value | Why |
164
+ | ------------------ | ------ | -------------------------------------- |
165
+ | `language` | `"zh"` | Tool descriptions / viewer UI language |
166
+ | `startMaintenance` | `true` | Run light/deep/rem auto-maintenance |
167
+ | `startViewer` | `true` | HTTP viewer on `127.0.0.1:18799` |
168
+ | `auditEnabled` | `true` | Persist `.co-engram/audit.jsonl` |
169
+
170
+ Note: `startMaintenance` / `startViewer` / `auditEnabled` already default to
171
+ `true` in the manifest configSchema (so zero-config installs get them for free).
172
+ This script forces them on even for hosts that already shipped with older
173
+ defaults, and additionally claims `plugins.slots.memory` (which manifest cannot
174
+ do alone — it requires the host to record the slot).
175
+
176
+ ## Comparisons
177
+
178
+ | Feature | Co-Engram | mem0 | Letta | LangChain Memory |
179
+ | -------------------- | ------------------------- | ------------------ | ---------------- | ------------------ |
180
+ | Storage model | 3-file Git-friendly | Vector + graph | Vector + state | Vector / key-value |
181
+ | Plasticity (LTP/LTD) | Yes (RPE-driven) | Manual API | Manual API | Manual API |
182
+ | Auto maintenance | Yes (light/deep/rem) | No | No | No |
183
+ | Metacognition | Yes (5-dim truth score) | No | No | No |
184
+ | Host coupling | None (host-agnostic core) | Tight (Python SDK) | Tight (REST API) | Tight (Python SDK) |
185
+ | License | MIT | Apache-2.0 | Apache-2.0 | MIT |
186
+
187
+ ## Roadmap
188
+
189
+ See [GitHub Issues](https://github.com/co-engram/co-engram/issues) for the live roadmap. Highlights:
190
+
191
+ - **TypeDoc-generated tool reference** — replace hand-written `docs/tool-reference.md` with auto-generated API docs
192
+ - **Provider-backed abstraction layer** — LLM-driven REM stage for narrative abstraction
193
+ - **Web UI** — browse engrams, inspect synapse graph, trigger maintenance manually
194
+ - **More host adapters** — Continue.dev, Cursor, Aider
195
+ - **1.0 release** — once API is stable and we have real production users
196
+
197
+ ## Contributing
198
+
199
+ Contributions are welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for development setup, test commands, and PR conventions. For security reports, see [SECURITY.md](./SECURITY.md).
200
+
201
+ ## License
202
+
203
+ [MIT](./LICENSE) — © 2026 Yang Yang
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Adapter:把 host-agnostic 的 Co-Engram Tool 转为 OpenClaw ToolDescriptor
3
+ *
4
+ * @module @co-engram/openclaw
5
+ */
6
+ import { type Tool, type ToolContext, type Language } from "@co-engram/core";
7
+ import type { OpenClawToolDescriptor, ToolExecuteResult } from "./types.js";
8
+ /**
9
+ * 把任意值包装为 OpenClaw tool execute 的返回结构
10
+ *
11
+ * 对常见的列表型返回(engram_list / engram_search / memory_search 等),渲染为
12
+ * markdown 文本而不是 JSON——OpenClaw 收到 type:'json' 时会把数组渲染成"图表",
13
+ * 让 LLM 误判为不可读。改用 type:'text' + markdown,LLM 一眼就能解析。
14
+ */
15
+ /**
16
+ * 把任意值包装为 OpenClaw tool execute 的返回结构
17
+ *
18
+ * 对常见的列表型返回(engram_list / engram_search / memory_search 等),渲染为
19
+ * markdown 文本而不是 JSON——OpenClaw 收到 type:'json' 时会把数组渲染成"图表",
20
+ * 让 LLM 误判为不可读。改用 type:'text' + markdown,LLM 一眼就能解析。
21
+ *
22
+ * 同时识别 engram_get / memory_get 的非列表形状,避免 OpenClaw UI 把单条 engram
23
+ * 数据渲染成"卡片/图表",让 agent 误以为"图片没显示"。
24
+ */
25
+ export declare function toToolResult(data: unknown, ctx: ToolContext): ToolExecuteResult;
26
+ /**
27
+ * 把单个 Co-Engram Tool 转为 OpenClaw ToolDescriptor
28
+ *
29
+ * @param language 工具描述本地化语言(默认英文)
30
+ */
31
+ export declare function adaptTool(tool: Tool, ctx: ToolContext, language?: Language): OpenClawToolDescriptor;
32
+ /**
33
+ * 批量适配所有工具
34
+ */
35
+ export declare function adaptAllTools(tools: readonly Tool[], ctx: ToolContext, language?: Language): readonly OpenClawToolDescriptor[];
36
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAGpB;;;;;;GAMG;AACH;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,GACf,iBAAiB,CAiBnB;AAkSD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,WAAW,EAChB,QAAQ,GAAE,QAA2B,GACpC,sBAAsB,CAwBxB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,GAAG,EAAE,WAAW,EAChB,QAAQ,GAAE,QAA2B,GACpC,SAAS,sBAAsB,EAAE,CAEnC"}
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Adapter:把 host-agnostic 的 Co-Engram Tool 转为 OpenClaw ToolDescriptor
3
+ *
4
+ * @module @co-engram/openclaw
5
+ */
6
+ import { localizeToolDescription, resolveLlmDescription, DEFAULT_LANGUAGE, } from "@co-engram/core";
7
+ import { TOOL_JSON_SCHEMAS } from "./json-schemas.js";
8
+ /**
9
+ * 把任意值包装为 OpenClaw tool execute 的返回结构
10
+ *
11
+ * 对常见的列表型返回(engram_list / engram_search / memory_search 等),渲染为
12
+ * markdown 文本而不是 JSON——OpenClaw 收到 type:'json' 时会把数组渲染成"图表",
13
+ * 让 LLM 误判为不可读。改用 type:'text' + markdown,LLM 一眼就能解析。
14
+ */
15
+ /**
16
+ * 把任意值包装为 OpenClaw tool execute 的返回结构
17
+ *
18
+ * 对常见的列表型返回(engram_list / engram_search / memory_search 等),渲染为
19
+ * markdown 文本而不是 JSON——OpenClaw 收到 type:'json' 时会把数组渲染成"图表",
20
+ * 让 LLM 误判为不可读。改用 type:'text' + markdown,LLM 一眼就能解析。
21
+ *
22
+ * 同时识别 engram_get / memory_get 的非列表形状,避免 OpenClaw UI 把单条 engram
23
+ * 数据渲染成"卡片/图表",让 agent 误以为"图片没显示"。
24
+ */
25
+ export function toToolResult(data, ctx) {
26
+ const text = renderForLlm(data, ctx);
27
+ if (text !== null) {
28
+ return {
29
+ content: [{ type: "text", text }],
30
+ details: { ok: true },
31
+ };
32
+ }
33
+ return {
34
+ content: [
35
+ {
36
+ type: "json",
37
+ data,
38
+ },
39
+ ],
40
+ details: { ok: true },
41
+ };
42
+ }
43
+ /**
44
+ * 把工具返回值渲染为 LLM 友好的 markdown 文本
45
+ *
46
+ * 已识别模式(全部渲染为 type:'text',避免 OpenClaw UI 把 JSON 渲染成
47
+ * 图表卡片让 agent 误判为"图片没显示"):
48
+ *
49
+ * 1. { results: [...], total } — engram_list / engram_search / memory_search
50
+ * 2. { tier: 'catalog'|'digest'|'content'|'meta'|'synapses', ... } — engram_get
51
+ * 3. { id, content, metadata, relatedIds } — memory_get
52
+ *
53
+ * summary 处理:catalog 级结果(engram_list)本身不带 summary,这里通过
54
+ * ctx.repository.readDigest(id) 在 adapter 层附加,保持 core 工具的返回类型不变。
55
+ * 检索类工具(engram_search/memory_search)结果可能自带 summary,优先用自带的。
56
+ *
57
+ * 不识别的返回 null(调用方回退到 JSON)。
58
+ */
59
+ function renderForLlm(data, ctx) {
60
+ if (!data || typeof data !== "object")
61
+ return null;
62
+ const obj = data;
63
+ // 模式 1:列表型
64
+ if (Array.isArray(obj["results"])) {
65
+ return renderListResult(obj, ctx);
66
+ }
67
+ // 模式 2:engram_get(tier-based) — tier 是已知字符串即识别
68
+ // catalog/digest/content/meta 都有 entry;synapses 只有 bundle(无 entry)
69
+ const tier = obj["tier"];
70
+ if (typeof tier === "string" &&
71
+ /^(catalog|digest|content|meta|synapses)$/.test(tier)) {
72
+ return renderEngramGetResult(obj);
73
+ }
74
+ // 模式 3:memory_get(id + content + metadata + relatedIds)
75
+ if (typeof obj["id"] === "string" &&
76
+ typeof obj["content"] === "string" &&
77
+ typeof obj["metadata"] === "object") {
78
+ return renderMemoryGetResult(obj);
79
+ }
80
+ return null;
81
+ }
82
+ /** 渲染列表型结果(engram_list / engram_search / memory_search) */
83
+ function renderListResult(obj, ctx) {
84
+ const results = obj["results"];
85
+ const lines = [];
86
+ const total = typeof obj["total"] === "number"
87
+ ? obj["total"]
88
+ : results.length;
89
+ lines.push(`共 ${total} 条记忆(展示前 ${results.length} 条):`);
90
+ lines.push("");
91
+ for (let i = 0; i < results.length; i++) {
92
+ const item = results[i];
93
+ if (!item || typeof item !== "object")
94
+ continue;
95
+ const id = String(item["id"] ?? "?");
96
+ const title = String(item["title"] ?? "(无标题)");
97
+ const explicitSummary = item["summary"] ? String(item["summary"]) : "";
98
+ const summary = explicitSummary || (id !== "?" ? safeReadDigestSummary(ctx, id) : "");
99
+ // kind / tags 兼容两种形状:
100
+ // - engram_list/engram_search: item.kind, item.domainTags(顶层)
101
+ // - memory_search: item.metadata.kind, item.metadata.tags(嵌套 metadata)
102
+ const meta = typeof item["metadata"] === "object"
103
+ ? item["metadata"]
104
+ : {};
105
+ const kind = item["kind"]
106
+ ? String(item["kind"])
107
+ : meta["kind"]
108
+ ? String(meta["kind"])
109
+ : "";
110
+ const rawTags = Array.isArray(item["domainTags"])
111
+ ? item["domainTags"]
112
+ : Array.isArray(meta["tags"])
113
+ ? meta["tags"]
114
+ : [];
115
+ const tags = rawTags.map(String).join(", ");
116
+ const score = typeof item["score"] === "number"
117
+ ? ` (score: ${item["score"].toFixed(2)})`
118
+ : "";
119
+ lines.push(`${i + 1}. **${title}**${score}`);
120
+ lines.push(` - id: \`${id}\``);
121
+ if (kind)
122
+ lines.push(` - kind: ${kind}`);
123
+ if (tags)
124
+ lines.push(` - tags: ${tags}`);
125
+ if (summary)
126
+ lines.push(` - summary: ${summary}`);
127
+ }
128
+ lines.push("");
129
+ lines.push("用户想看某条的完整内容时,根据 id 调 engram_get 或 memory_get。");
130
+ return lines.join("\n");
131
+ }
132
+ /** 渲染 engram_get 各 tier 结果 */
133
+ function renderEngramGetResult(obj) {
134
+ const tier = String(obj["tier"] ?? "");
135
+ const entry = obj["entry"];
136
+ const lines = [];
137
+ // synapses tier 没有 entry,但有 bundle — 直接走突触渲染
138
+ if (tier === "synapses") {
139
+ return renderSynapsesBundle(obj);
140
+ }
141
+ if (entry) {
142
+ const title = String(entry["title"] ?? "(无标题)");
143
+ const id = String(entry["id"] ?? "?");
144
+ const kind = entry["kind"] ? String(entry["kind"]) : "";
145
+ const tags = Array.isArray(entry["domainTags"])
146
+ ? entry["domainTags"].map(String).join(", ")
147
+ : "";
148
+ lines.push(`## ${title}`);
149
+ lines.push("");
150
+ lines.push(`- id: \`${id}\``);
151
+ if (kind)
152
+ lines.push(`- kind: ${kind}`);
153
+ if (tags)
154
+ lines.push(`- tags: ${tags}`);
155
+ lines.push("");
156
+ }
157
+ if (tier === "content" && typeof obj["content"] === "string") {
158
+ lines.push("### 内容");
159
+ lines.push("");
160
+ lines.push(obj["content"]);
161
+ return lines.join("\n");
162
+ }
163
+ if (tier === "digest") {
164
+ const digest = obj["digest"];
165
+ if (digest) {
166
+ lines.push("### 摘要");
167
+ lines.push("");
168
+ if (typeof digest["summary"] === "string" && digest["summary"]) {
169
+ lines.push(String(digest["summary"]));
170
+ }
171
+ if (typeof digest["importance"] === "number") {
172
+ lines.push(``);
173
+ lines.push(`importance: ${digest["importance"]}`);
174
+ }
175
+ lines.push(``);
176
+ lines.push(`(digest tier — 要完整内容调 \`engram_get(id, tier="content")\`)`);
177
+ }
178
+ return lines.join("\n");
179
+ }
180
+ if (tier === "meta") {
181
+ const meta = obj["meta"];
182
+ if (meta) {
183
+ lines.push("### 元数据");
184
+ lines.push("");
185
+ for (const [k, v] of Object.entries(meta)) {
186
+ if (k === "content")
187
+ continue;
188
+ lines.push(`- ${k}: ${formatMetaValue(v)}`);
189
+ }
190
+ }
191
+ return lines.join("\n");
192
+ }
193
+ if (tier === "catalog") {
194
+ lines.push(`(catalog tier — 只有元数据;要完整内容调 \`engram_get(id, tier="content")\`)`);
195
+ return lines.join("\n");
196
+ }
197
+ if (tier === "synapses") {
198
+ return renderSynapsesBundle(obj);
199
+ }
200
+ return lines.join("\n");
201
+ }
202
+ /** 渲染 synapses bundle(engram_get synapses tier) */
203
+ function renderSynapsesBundle(obj) {
204
+ const bundle = obj["bundle"];
205
+ const lines = [];
206
+ if (!bundle)
207
+ return "(无 synapses)";
208
+ lines.push("### 突触(synapses)");
209
+ lines.push("");
210
+ const outgoing = Array.isArray(bundle["outgoing"]) ? bundle["outgoing"] : [];
211
+ const incoming = Array.isArray(bundle["incoming"]) ? bundle["incoming"] : [];
212
+ if (outgoing.length > 0) {
213
+ lines.push(`**Outgoing (${outgoing.length}):**`);
214
+ for (const s of outgoing) {
215
+ const to = String(s["to"] ?? "?");
216
+ const kind = String(s["kind"] ?? "?");
217
+ const weight = typeof s["weight"] === "number" ? s["weight"] : "";
218
+ lines.push(`- → \`${to}\` (${kind}${weight !== "" ? `, w=${weight}` : ""})`);
219
+ }
220
+ lines.push("");
221
+ }
222
+ if (incoming.length > 0) {
223
+ lines.push(`**Incoming (${incoming.length}):**`);
224
+ for (const s of incoming) {
225
+ const from = String(s["from"] ?? "?");
226
+ const kind = String(s["kind"] ?? "?");
227
+ const weight = typeof s["weight"] === "number" ? s["weight"] : "";
228
+ lines.push(`- ← \`${from}\` (${kind}${weight !== "" ? `, w=${weight}` : ""})`);
229
+ }
230
+ }
231
+ if (outgoing.length === 0 && incoming.length === 0) {
232
+ lines.push("(无 synapses)");
233
+ }
234
+ return lines.join("\n");
235
+ }
236
+ /** 渲染 memory_get 结果(OpenClaw 兼容包装) */
237
+ function renderMemoryGetResult(obj) {
238
+ const id = String(obj["id"] ?? "?");
239
+ const content = String(obj["content"] ?? "");
240
+ const metadata = obj["metadata"];
241
+ const relatedIds = Array.isArray(obj["relatedIds"])
242
+ ? obj["relatedIds"]
243
+ : [];
244
+ const lines = [];
245
+ lines.push(`## Memory \`${id}\``);
246
+ lines.push("");
247
+ if (metadata) {
248
+ lines.push("### 元数据");
249
+ lines.push("");
250
+ for (const [k, v] of Object.entries(metadata)) {
251
+ lines.push(`- ${k}: ${formatMetaValue(v)}`);
252
+ }
253
+ lines.push("");
254
+ }
255
+ lines.push("### 内容");
256
+ lines.push("");
257
+ lines.push(content);
258
+ if (relatedIds.length > 0) {
259
+ lines.push("");
260
+ lines.push("### 相关记忆");
261
+ lines.push("");
262
+ for (const rid of relatedIds) {
263
+ lines.push(`- \`${String(rid)}\``);
264
+ }
265
+ }
266
+ return lines.join("\n");
267
+ }
268
+ /** 元数据值的紧凑展示 */
269
+ function formatMetaValue(v) {
270
+ if (v === null || v === undefined)
271
+ return "(无)";
272
+ if (Array.isArray(v))
273
+ return v.map(String).join(", ");
274
+ if (typeof v === "object")
275
+ return JSON.stringify(v);
276
+ return String(v);
277
+ }
278
+ /**
279
+ * 安全读取 digest 的 summary,失败返回空字符串
280
+ *
281
+ * 用于给 catalog 级结果(engram_list)在 adapter 层补 summary。
282
+ */
283
+ function safeReadDigestSummary(ctx, id) {
284
+ try {
285
+ return ctx.repository.readDigest(id)?.summary ?? "";
286
+ }
287
+ catch {
288
+ return "";
289
+ }
290
+ }
291
+ function toErrorResult(error) {
292
+ const message = error instanceof Error ? error.message : String(error);
293
+ return {
294
+ content: [{ type: "text", text: `Error: ${message}` }],
295
+ details: { ok: false, error: message },
296
+ };
297
+ }
298
+ /**
299
+ * 把单个 Co-Engram Tool 转为 OpenClaw ToolDescriptor
300
+ *
301
+ * @param language 工具描述本地化语言(默认英文)
302
+ */
303
+ export function adaptTool(tool, ctx, language = DEFAULT_LANGUAGE) {
304
+ const jsonSchema = TOOL_JSON_SCHEMAS[tool.name] ?? {
305
+ type: "object",
306
+ additionalProperties: true,
307
+ };
308
+ return {
309
+ name: tool.name,
310
+ label: tool.name,
311
+ description: resolveLlmDescription(tool, language, localizeToolDescription(tool.name, language, tool.description)),
312
+ parameters: jsonSchema,
313
+ async execute(_toolCallId, params, _signal) {
314
+ try {
315
+ const result = await tool.execute(params ?? {}, ctx);
316
+ return toToolResult(result, ctx);
317
+ }
318
+ catch (error) {
319
+ return toErrorResult(error);
320
+ }
321
+ },
322
+ };
323
+ }
324
+ /**
325
+ * 批量适配所有工具
326
+ */
327
+ export function adaptAllTools(tools, ctx, language = DEFAULT_LANGUAGE) {
328
+ return tools.map((t) => adaptTool(t, ctx, language));
329
+ }
330
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * OpenClaw 插件专属:auto-onboard bundle 路径解析。
3
+ *
4
+ * 核心逻辑(findGitRepoRoot / autoOnboardMergeDriver 等)在 `@co-engram/core/merge/auto-onboard`,
5
+ * 这里只保留 host-specific 的 bundle 定位(取决于 host 的 node_modules 布局)。
6
+ *
7
+ * @module @co-engram/openclaw
8
+ */
9
+ export { resolveMergeDriverBundle, findGitRepoRoot, autoOnboardMergeDriver, type AutoOnboardResult, } from "@co-engram/core";
10
+ /**
11
+ * 自动定位已安装的 `@co-engram/core` 中的 merge-driver bundle。
12
+ *
13
+ * 通过 `createRequire` 解析 `@co-engram/core/types` 子路径,exports 字段已暴露。
14
+ * 该子路径只能 import 不能 require,所以显式传 `conditions: ['import','default']`。
15
+ *
16
+ * 失败(如 bundle 未构建 / 解析不到)返回 null,不抛错 —— auto-onboard 按跳过处理。
17
+ */
18
+ export declare function findInstalledMergeDriverBundle(): string | null;
19
+ //# sourceMappingURL=auto-onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-onboard.d.ts","sourceRoot":"","sources":["../src/auto-onboard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,GAAG,IAAI,CAe9D"}