@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
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"}
|
package/dist/adapter.js
ADDED
|
@@ -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"}
|