ppxans-harness 2.4.0 → 3.2.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 +201 -201
- package/README.md +218 -265
- package/bin/ppx-channels.js +2 -2
- package/bin/ppx-serve.js +5 -5
- package/bin/ppx-setup.js +124 -0
- package/bin/ppx-web.js +140 -0
- package/bin/ppx.js +2 -2
- package/config/identity.md +6 -6
- package/config/ishiki.md +16 -16
- package/config/ppx.json +15 -151
- package/config/ppx.json.example +143 -0
- package/package.json +17 -10
- package/skills/.usage.json +6 -0
- package/skills/agent-professional-training/SKILL.md +94 -0
- package/skills/brainstorm/SKILL.md +24 -0
- package/skills/cupid-lover-comms/SKILL.md +37 -0
- package/skills/debug/SKILL.md +26 -0
- package/skills/plan/SKILL.md +25 -0
- package/skills/ponytail/SKILL.md +25 -0
- package/skills/ppx-memory/SKILL.md +91 -0
- package/skills/ppx-memory/scripts/cli.js +192 -0
- package/skills/ppx-memory/scripts/experience.js +133 -0
- package/skills/ppx-memory/scripts/fact-store.js +842 -0
- package/skills/ppx-memory/scripts/l0.js +52 -0
- package/skills/ppx-memory/scripts/l2.js +146 -0
- package/skills/ppx-memory/scripts/l3.js +112 -0
- package/skills/ppx-memory/scripts/memory-ticker.js +238 -0
- package/skills/ppx-memory/scripts/pii.js +42 -0
- package/skills/ppx-memory/scripts/schema.js +80 -0
- package/skills/ppx-memory/scripts/session.js +398 -0
- package/skills/ppx-memory/scripts/similarity.js +43 -0
- package/skills/ppx-memory/scripts/store.js +116 -0
- package/skills/ppx-memory/scripts/wal.js +38 -0
- package/skills/ppx-selfheal/SKILL.md +24 -0
- package/skills/ppx-selfheal/scripts/cli.js +80 -0
- package/skills/ppx-selfheal/scripts/healer.js +184 -0
- package/skills/ppx-selfheal/scripts/logger.js +17 -0
- package/skills/ppx-selfheal/scripts/store.js +116 -0
- package/skills/prompt-depth-kit/SKILL.md +28 -0
- package/skills/session-naming/SKILL.md +36 -0
- package/skills/verify/SKILL.md +25 -0
- package/src/agent/index.js +1340 -717
- package/src/agent/prompts.js +47 -3
- package/src/aml-server.js +197 -151
- package/src/ans/eviction.js +123 -143
- package/src/ans/guard.js +159 -120
- package/src/ans/lifecycle.js +96 -93
- package/src/ans/proactive.js +112 -129
- package/src/ans/reward.js +95 -111
- package/src/ans/values.js +15 -15
- package/src/audit/audit-chain.js +43 -7
- package/src/audit/verifier.js +157 -120
- package/src/bus/circuit-breaker.js +9 -1
- package/src/bus/runtime-bus.js +107 -93
- package/src/channels/base.js +57 -34
- package/src/channels/feishu.js +118 -126
- package/src/channels/http.js +1090 -592
- package/src/channels/index.js +111 -110
- package/src/channels/log.js +29 -29
- package/src/channels/wechat-crypto.js +73 -74
- package/src/channels/wechat.js +191 -197
- package/src/channels/workspace.js +94 -0
- package/src/channels-cli.js +126 -124
- package/src/cli.js +129 -120
- package/src/commands/index.js +142 -0
- package/src/config/channels.js +137 -170
- package/src/config/index.js +277 -224
- package/src/config/placeholder.js +31 -0
- package/src/config/providers.js +148 -188
- package/src/config/settings.js +156 -182
- package/src/core/policy.js +69 -18
- package/src/core/trace.js +8 -6
- package/src/edit/editblock.js +266 -0
- package/src/edit/snapshot.js +67 -0
- package/src/evidence/index.js +153 -0
- package/src/evolve/playbook.js +9 -10
- package/src/hooks/index.js +113 -0
- package/src/llm/client.js +188 -446
- package/src/llm/dsml.js +74 -74
- package/src/llm/embedder.js +41 -35
- package/src/llm/fence.js +52 -105
- package/src/llm/index.js +4 -4
- package/src/llm/local-embedder.js +94 -0
- package/src/llm/presets.js +113 -0
- package/src/llm/pricing.js +93 -0
- package/src/llm/retry.js +73 -73
- package/src/llm/router.js +92 -97
- package/src/mcp/admin.js +326 -0
- package/src/mcp/client.js +487 -375
- package/src/mcp/http.js +203 -0
- package/src/mcp/index.js +116 -116
- package/src/mcp/server.js +392 -0
- package/src/mcp/tasks.js +133 -0
- package/src/memory/asset-hub.js +6 -11
- package/src/memory/canvas.js +2 -5
- package/src/memory/compaction.js +28 -28
- package/src/memory/experience.js +133 -122
- package/src/memory/fact-store.js +914 -698
- package/src/memory/failure-episode.js +20 -11
- package/src/memory/fork.js +17 -8
- package/src/memory/index.js +8 -6
- package/src/memory/l0.js +53 -52
- package/src/memory/l2.js +145 -130
- package/src/memory/l3.js +111 -111
- package/src/memory/legion-board.js +71 -0
- package/src/memory/memory-ticker.js +239 -240
- package/src/memory/session.js +398 -397
- package/src/memory/sqlite-store.js +581 -0
- package/src/mode/blackboard.js +49 -49
- package/src/mode/graph.js +42 -41
- package/src/mode/index.js +64 -64
- package/src/mode/legion.js +54 -51
- package/src/mode/plan-exec.js +50 -50
- package/src/mode/router.js +28 -40
- package/src/orchestrator/agent-worker.js +69 -69
- package/src/orchestrator/dag.js +90 -83
- package/src/orchestrator/experts.js +76 -0
- package/src/orchestrator/index.js +1 -1
- package/src/orchestrator/legion.js +179 -187
- package/src/orchestrator/supervisor.js +6 -8
- package/src/permissions/index.js +378 -0
- package/src/persona/index.js +28 -29
- package/src/plugin/builtin.js +313 -212
- package/src/plugin/context.js +80 -79
- package/src/plugin/index.js +62 -62
- package/src/plugin/v3.js +73 -0
- package/src/protocol/index.js +148 -0
- package/src/repomap/index.js +309 -0
- package/src/review/index.js +393 -0
- package/src/seam/registry.js +3 -0
- package/src/seam/shell.js +55 -55
- package/src/security/injection.js +79 -0
- package/src/selfheal/evolve.js +67 -67
- package/src/selfheal/healer.js +184 -167
- package/src/selfheal/run.js +9 -9
- package/src/server.js +63 -60
- package/src/services/diagnose.js +180 -0
- package/src/services/learning-service.js +9 -0
- package/src/services/memory-health.js +34 -6
- package/src/services/memory-service.js +42 -9
- package/src/services/triage.js +138 -0
- package/src/session/parts.js +76 -0
- package/src/session/projection.js +73 -0
- package/src/session/rollout.js +54 -0
- package/src/session/turn.js +137 -0
- package/src/skills/lint.js +72 -0
- package/src/skills/loader.js +231 -150
- package/src/skills/search.js +58 -0
- package/src/skills/verify.js +95 -100
- package/src/tools/advanced.js +388 -352
- package/src/tools/builtin.js +384 -297
- package/src/tools/catalog.js +283 -159
- package/src/tools/command-guard.js +112 -112
- package/src/tools/custom.js +47 -47
- package/src/tools/delegate.js +383 -297
- package/src/tools/document.js +254 -253
- package/src/tools/git.js +151 -0
- package/src/tools/governance.js +47 -20
- package/src/tools/index.js +16 -11
- package/src/tools/methods.js +178 -178
- package/src/tools/ocr.js +59 -59
- package/src/tools/sandbox-worker.js +40 -0
- package/src/tools/sandbox.js +92 -0
- package/src/tools/seam.js +162 -125
- package/src/tools/selfmod.js +196 -176
- package/src/tools/v3.js +225 -0
- package/src/tools/vad.js +176 -0
- package/src/tools/voice.js +238 -0
- package/src/utils/async.js +14 -0
- package/src/utils/config-file.js +53 -0
- package/src/utils/crashguard.js +88 -0
- package/src/utils/http.js +53 -0
- package/src/utils/id.js +8 -0
- package/src/utils/json-state.js +33 -0
- package/src/utils/logger.js +17 -17
- package/src/utils/ndjson.js +25 -0
- package/src/utils/pii.js +42 -42
- package/src/utils/rate-limit.js +50 -0
- package/src/utils/schema.js +80 -0
- package/src/utils/similarity.js +43 -0
- package/src/utils/store.js +170 -108
- package/src/utils/text.js +15 -15
- package/src/utils/trace.js +153 -153
- package/src/utils/wal.js +39 -0
- package/src/utils/winutf8.js +16 -15
- package/src/wiki/index.js +170 -0
package/README.md
CHANGED
|
@@ -1,265 +1,218 @@
|
|
|
1
|
-
# 🦐 PPXANS-Harness
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
>
|
|
10
|
-
>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
|
23
|
-
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
>
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
#
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
#
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
##
|
|
180
|
-
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
##
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
-
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
npm run audit:verify -- --fix # 损坏则隔离并重建
|
|
220
|
-
npm run audit:verify -- --tail 20 # 附带最近 20 条
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
`config.audit.enabled: false` 可关闭(性能敏感场景)。未启用时工具调用路径零开销。
|
|
224
|
-
|
|
225
|
-
## 🩺 自我修复
|
|
226
|
-
|
|
227
|
-
- 启动体检: 补建缺失目录 / 修复损坏JSON(备份后重建)
|
|
228
|
-
- 崩溃恢复: 检测异常退出, 清理残留临时文件
|
|
229
|
-
- 数据一致性: integrity 标记, 干净退出/异常退出可感知
|
|
230
|
-
|
|
231
|
-
## 📂 目录结构
|
|
232
|
-
|
|
233
|
-
```
|
|
234
|
-
PPXANS-Harness/
|
|
235
|
-
├── config/ 配置 (ppx.json + identity/ishiki 人格)
|
|
236
|
-
├── src/
|
|
237
|
-
│ ├── agent/ Agent 引擎 (编排 + 工具循环 + 多模型回退)
|
|
238
|
-
│ ├── core/ 核心纯逻辑 (policy 工具循环策略 / trace 事件流 traceId 贯穿)
|
|
239
|
-
│ ├── services/ 业务服务 (memory-service 记忆协调 / learning-service 自我学习)
|
|
240
|
-
│ ├── memory/ 五层记忆 (L0-L4) + 会话事件日志 + 经验库 + 压缩层
|
|
241
|
-
│ ├── audit/ verifier 语义验证闸门 + audit-chain 防篡改哈希链
|
|
242
|
-
│ ├── ans/ ANS 神经系 (values/lifecycle/proactive/reward/eviction/guard)
|
|
243
|
-
│ ├── selfheal/ 自愈引擎
|
|
244
|
-
│ ├── tools/ 工具系统 (43个 + MCP 动态注册; governance.js 为治理工具)
|
|
245
|
-
│ ├── channels/ 通道 (http/feishu/wechat)
|
|
246
|
-
│ ├── orchestrator/ 军团编排器 (多进程)
|
|
247
|
-
│ ├── llm/ LLM 客户端
|
|
248
|
-
│ └── utils/ 基础设施
|
|
249
|
-
├── data/ 运行时数据 (不进 git)
|
|
250
|
-
├── references/ 第三方项目来源登记 (不含源码)
|
|
251
|
-
├── test/ 测试 (597 项 591 过 0 失败 6 跳过)
|
|
252
|
-
└── docs/ 文档
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
## 📄 License
|
|
256
|
-
|
|
257
|
-
Apache License 2.0
|
|
258
|
-
|
|
259
|
-
## 🙏 架构来源
|
|
260
|
-
|
|
261
|
-
- [openhanako (HanaAgent)](https://github.com/liliMozi/openhanako) — 记忆分层、自愈内核、人格系统
|
|
262
|
-
- [TencentDB-Agent-Memory](https://github.com/TencentCloud/TencentDB-Agent-Memory) — L0-L3 四层记忆架构
|
|
263
|
-
- [OpenClaw](https://openclaw.ai) — agent 运行时组织
|
|
264
|
-
- **ppx-v2 (ppx Harness)** — 审计哈希链、记忆治理(软删/回滚/版本链/TTL)、L4 程序性记忆、10 个治理工具
|
|
265
|
-
- [openai/codex](https://github.com/openai/codex)、[deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness) — 仅作架构参考,源码未纳入,见 [references/THIRD-PARTY-SOURCES.md](references/THIRD-PARTY-SOURCES.md)
|
|
1
|
+
# 🦐 PPXANS-Harness
|
|
2
|
+
|
|
3
|
+
**皮皮虾神经系(ANS)+ Harness 一体化智能体内核** —— 纯 Node.js、**零运行时依赖**的可审计自主智能体。
|
|
4
|
+
|
|
5
|
+
一个会自我修复、自我学习、可审计验证的超级 Agent:**85 内置工具 · L0–L4 五层记忆 + 事实有效期 · SHA-256 审计哈希链 · 标准 MCP 服务端+客户端 · 多模型路由 · 本地向量/ASR 可选 · 自愈 7/7 · 1014 测试全绿 · Web UI**。
|
|
6
|
+
|
|
7
|
+
自带标准 MCP 服务(`POST /mcp`),Claude Desktop / Cursor / 任何 MCP 客户端**开箱即用**;支持各大模型 API + 本地模型,自由回退。
|
|
8
|
+
|
|
9
|
+
> 🛡️ **自愈基准**:`node scripts/selfheal-bench.js` → **7/7 100%**(发布前门禁,`PPX_MIN_SELFHEAL` 可设阈值)
|
|
10
|
+
> 🔗 **审计哈希链**:`npm run audit:verify` —— append-only + SHA-256 链式防篡改,篡改/删除可定位到行
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## ✨ 核心特性
|
|
15
|
+
|
|
16
|
+
| 能力 | 说明 |
|
|
17
|
+
|------|------|
|
|
18
|
+
| 🧠 **五层记忆 L0–L4** | L0 对话 → L1 原子(高斯衰减)→ L2 场景 → L3 画像 → L4 程序性(技能/流程,衰减仅 L1 的 1/4) |
|
|
19
|
+
| 🧹 **记忆治理** | 软删可回滚 + 版本链 + TTL 归并 + 按层清理 + 导出/导入迁移 |
|
|
20
|
+
| 🔗 **审计哈希链** | 工具调用 append-only 账本 + SHA-256 链式防篡改,篡改/删除定位到行,可隔离重放 |
|
|
21
|
+
| 🛡️ **权限安全** | AskForApproval 四档审批 + SandboxPolicy 沙箱 + 命令守卫三层防线 + SSRF 防护 + fail-open 钩子栅栏 |
|
|
22
|
+
| 🩺 **自我修复** | 启动体检、损坏 JSON 修复、崩溃恢复、残留清理(自愈 7/7) |
|
|
23
|
+
| 📚 **自我学习** | 经验库 + 画像/人格提炼 + refine 失败轨迹闭环 + refineSkill 成功沉淀技能 |
|
|
24
|
+
| 🤖 **多 Agent 军团** | 多进程并行 + DAG 编排 + legion 模式 + spawn_agent 自主协作(并行/差异化视角/仲裁聚合/SDD 审查循环) |
|
|
25
|
+
| 🔌 **多渠道接入** | HTTP + 飞书 + 微信(加解密 + 主动推送 + 加密回包) |
|
|
26
|
+
| 📄 **文档 + RAG + OCR** | read_document(txt/md/pdf/html)+ ingest_document 分块入库 + ocr_image(本地 tesseract / 云回退) |
|
|
27
|
+
| 💬 **CLI 交互** | readline 历史 + /stop 中断 + /reset 清会话 + Ctrl+C 单次中断 |
|
|
28
|
+
| 🧩 **MCP 客户端 + 服务端** | 零依赖 MCP 客户端(stdio + HTTP Streamable)接外部工具;`POST /mcp` 暴露 85 工具 + 记忆/轨迹/统计/会话资源 + 方法型 prompts + ppx.* 管理工具 |
|
|
29
|
+
| ✅ **任务面板** | 任务队列 + 步骤状态推进 + 结果回填 + 技能模板 |
|
|
30
|
+
| ✅ **可观测** | 工具轨迹 JSONL + 结构化事件流(traceId 贯穿)+ tool call result 大摘要 |
|
|
31
|
+
| ✅ **场景系统** | 灵魂文件式场景,命中自动切换行为 |
|
|
32
|
+
| ✅ **流式输出** | SSE 逐字流式 + Web UI 实时渲染 |
|
|
33
|
+
| 🔐 **HTTP 认证** | Bearer Token,未配置自动生成随机 token 持久化 |
|
|
34
|
+
|
|
35
|
+
**85 内置工具**(运行时实测):
|
|
36
|
+
- **63 内置**:文件/命令(含 code_run 沙箱)/搜索/HTTP/定时/记忆(读图/检索/入库)/文档(加载/OCR/入库)/语音(ASR/TTS/VAD)/场景/技能(加载/创建/提炼)/重构 refine /子 agent spawn + 治理运维(repo_map/apply_patch/review_code/goal_board/audit_verify/persona/selfheal_run 等)
|
|
37
|
+
- **22 × ppx.**\***:** chat.send/stream、sessions.\*、providers.(list/add/update/delete/test/reorder)、settings.get/update、task.(templates/create/list/update/step/delete/run)、session.reset
|
|
38
|
+
|
|
39
|
+
> **工具渐进披露(上下文工程)**:59 个工具的完整 JSON schema 实测占 **6725 tok/请求**,
|
|
40
|
+
> 而单个任务通常只用 3–5 个 —— 这是上下文里最大的一笔浪费。现在只把 **20 个核心工具**的
|
|
41
|
+
> 完整 schema 发给 LLM,其余 39 个**只列名字**(约 240 tok);agent 需要时 `enable_capability`
|
|
42
|
+
> 加载,下一轮即可调用。未披露 ≠ 不可用(`catalog.call` 仍可调用任何已注册工具)。
|
|
43
|
+
> 实测固定开销 **8172 → 3357 tok/请求(-59%)**。配置:`tools.progressive` / `tools.core`,
|
|
44
|
+
> 设 `progressive: false` 恢复全量披露。用 `npm run bench:ctx` 可随时查看当前构成。
|
|
45
|
+
|
|
46
|
+
> **语音能力(ASR / TTS)**:`voice_transcribe`(语音转文本)与 `voice_speak`(文本转语音),
|
|
47
|
+
> 走 OpenAI 兼容端点(`/audio/transcriptions`、`/audio/speech`),multipart 用 Node 内置
|
|
48
|
+
> `FormData` + `Blob` —— **依然零运行时依赖**。配 `config/ppx.json` 的 `voice.asr` / `voice.tts`
|
|
49
|
+
> 即生效,兼容 OpenAI / 硅基流动 / 火山 / 智谱 / 本地 whisper.cpp server 等。
|
|
50
|
+
|
|
51
|
+
> **内嵌记忆数据库(可选)**:`config.memory.backend` 设为 `"sqlite"` 可把记忆库换成
|
|
52
|
+
> **Node 内置 `node:sqlite`**(Node ≥ 22.5)—— FTS5 全文索引 + WAL 事务,接口与 JSON 版完全对齐。
|
|
53
|
+
> 实测**写入快 18.7 倍**(JSON 版每次 add 都要全量重写 + 重建索引),并带来崩溃恢复与多进程并发安全。
|
|
54
|
+
> 默认仍是 JSON(零风险),环境不支持时自动回落。跑 `npm run bench:store` 看两后端对比。
|
|
55
|
+
|
|
56
|
+
> **本地向量记忆(v3.1, 可选依赖)**:`config.embedding = { backend: "local" }` 可把语义检索换成
|
|
57
|
+
> **本地 ONNX 向量模型**(transformers.js, `npm i @huggingface/transformers`)—— 离线可用、零 API 成本。
|
|
58
|
+
> 默认 `Xenova/multilingual-e5-small`(384 维多语言,中文稳),首次使用自动从 HF Hub 下载并缓存。
|
|
59
|
+
> 包未安装时自动降级(云端 embedding → BM25),主包依旧零运行时依赖。
|
|
60
|
+
|
|
61
|
+
> **事实有效期(v3.1, 吸收 Zep/Graphiti)**:每条记忆可带 `validFrom`/`validTo` 时间窗,
|
|
62
|
+
> 过期事实**默认不再被检索命中**(防"用户改主意后旧事实照常冒出来"),治理面仍可见可回溯。
|
|
63
|
+
> `add(..., { supersedeId })` 一键把被取代的旧事实收口到当前时刻 —— "曾经为真"与"现在为真"分开存。
|
|
64
|
+
|
|
65
|
+
> **内置 JS 沙箱 + VAD(v3.1, 零依赖)**:`code_run` 工具在 worker_threads + node:vm 双层隔离里
|
|
66
|
+
> 跑 JS 纯计算(死循环强杀、无网络/文件/进程访问),CodeAct 式精确计算回灌工具循环。
|
|
67
|
+
> `vad_detect` 语音活动检测:默认零依赖能量算法(16-bit PCM WAV),可选 Silero 神经网络后端
|
|
68
|
+
> (需 `onnxruntime-node` + 模型)。本地 ASR:`voice.asr = { backend: "local" }` 走 whisper.cpp
|
|
69
|
+
> 绑定(可选依赖 nodejs-whisper),离线转写零 API 成本。
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## v3.0 架构(codex 对齐)
|
|
74
|
+
|
|
75
|
+
v3.0 引入 codex 的 **SQ/EQ 双队列 + Turn 模型** 作为交互主轴,把权限、钩子、编辑、审查、证据能力**分层独立为可替换模块**,并重制零依赖 Web UI:
|
|
76
|
+
|
|
77
|
+
| 模块 | 出处 | 能力 |
|
|
78
|
+
|------|------|------|
|
|
79
|
+
| `protocol/` | codex | **SQ·EQ 双队列事件流**:SubmissionQueue 入队 + EventQueue(WAL) 结构化事件,通道层与内核解耦总线 |
|
|
80
|
+
| `permissions/` | codex + opencode + CASDK | **三合一权限引擎**:AskForApproval 四档 + SandboxPolicy 三档 + 通配符规则链(last-match-wins) + canUseTool 回调 + Bash/Edit/Plan 审批模板 |
|
|
81
|
+
| `hooks/` | claude-code | **六事件钩子链**:PreToolUse(可否决/改参) / PostToolUse / PreCompact / SessionStart/Stop / SubagentStop,超时熔断,纯 JS |
|
|
82
|
+
| `edit/` | aider | **SEARCH/REPLACE 编辑块**(多候选/空白容错/失败回灌修复)+ 编辑前快照逐文件回滚 |
|
|
83
|
+
| `repomap/` | aider | **仓库地图**:def/ref 提取 → 引用图 → PageRank → token 预算内渲染,缓存 30s |
|
|
84
|
+
| `review/` | 分级审查流水线 | plan→group→review→relocate→filter,输出 P0/P1/P2 静态规则报告 |
|
|
85
|
+
| `evidence/` | oh-my-hermes | **证据边界**:prepared/observed 双层标记 + handoff manifest(哈希) + 目标看板 |
|
|
86
|
+
| `commands/` | claude-code | **斜杠命令统一模型**:内置 /init /plan /review /compact /new /resume /model /status /memory /skills /goal,用户命令从 `.ppx/commands/*.md` 加载 |
|
|
87
|
+
|
|
88
|
+
> **集成现状**:上述 9 模块中 8 个已装配进运行时(`plugin/v3.js` + `tools/v3.js`,MCP 实测可调);`session/`(Turn/Rollout/Parts)为 standalone 模块随包保留、有完整单测,但尚未接入主链路,待 v3.1 集成。
|
|
89
|
+
|
|
90
|
+
**Web UI(codex 风格, `public/` 零依赖重制)**:三栏事件时间线(用户/agent/工具卡/审批卡/计划卡/diff卡)+ 斜杠命令面板 + 审批卡三类模板 + 工作区 Tab(文件树/目标看板/审查报告/设置)+ 子 agent 彩色徽标 + `@` 引用文件 + Esc 中断 + 亮暗主题。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 🚀 快速开始
|
|
95
|
+
|
|
96
|
+
### 本地开发 · 一键起 Web 应用(推荐)
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# 1. 配置模型 (config/ppx.json): 设 OPENAI_API_KEY / DEEPSEEK_API_KEY 等环境变量
|
|
100
|
+
# 或启动本地 LM Studio (默认 http://127.0.0.1:1234/v1) 走本地模型。
|
|
101
|
+
# 2. 一条命令起整个 Web 应用 (内核+界面同进程同端口, 自动开浏览器)
|
|
102
|
+
npm start # → http://127.0.0.1:8899
|
|
103
|
+
# 等价: node bin/ppx-web.js [--port 9000] [--host 0.0.0.0] [--no-open] [--root D:/ws]
|
|
104
|
+
|
|
105
|
+
# 3. 启动自愈体检
|
|
106
|
+
npm run selfheal
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**其他启动方式**
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm run chat # 终端对话 CLI (ppx / ppxans)
|
|
113
|
+
npm run serve # 仅 HTTP 接口 (无界面): http://127.0.0.1:8899
|
|
114
|
+
npm run web:check # Web UI 静态自检 (图标/DOM id/语法解析/静态资源)
|
|
115
|
+
npm test # 全量测试 (1014 项)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### MCP 标准端点 (Streamable HTTP)
|
|
119
|
+
|
|
120
|
+
`POST http://127.0.0.1:8899/mcp`(同 Bearer token 鉴权)。任何 MCP 客户端(Claude Desktop / Cursor / MCP Inspector 等)可直接接入:
|
|
121
|
+
|
|
122
|
+
- `tools/list` + `tools/call` — 85 工具全量暴露
|
|
123
|
+
- resources:`memory://` `traces://` `stats://` `sessions://`
|
|
124
|
+
- prompts:`humanize` / `plan` / `debug` / `verify` / `write_article`(方法型技能)
|
|
125
|
+
- `ppx.chat.send` / `ppx.chat.stream`(对话工具,驱动完整工具循环)
|
|
126
|
+
|
|
127
|
+
配置:`config/ppx.json` → `channels.http { port, auth_token }`
|
|
128
|
+
|
|
129
|
+
### 模型接入
|
|
130
|
+
|
|
131
|
+
任意 **OpenAI 兼容端点**,自动多 provider 回退:
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"providers": [
|
|
136
|
+
{ "id": "openai", "base_url": "https://api.openai.com/v1", "api_key_env": "OPENAI_API_KEY", "model": "gpt-4o-mini" },
|
|
137
|
+
{ "id": "deepseek", "base_url": "https://api.deepseek.com/v1", "api_key_env": "DEEPSEEK_API_KEY", "model": "deepseek-chat" },
|
|
138
|
+
{ "id": "dashscope", "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1", "api_key_env": "DASHSCOPE_API_KEY", "model": "qwen-turbo" },
|
|
139
|
+
{ "id": "lmstudio", "base_url": "http://127.0.0.1:1234/v1", "api_key": "lm-studio", "model": "<本地模型名>" }
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**回退机制**:路由层选主模型,运行时负责失败切换 —— 选中 provider 连不上自动切下一个直到成功。默认本地优先,配了云端 key 自动云端优先。
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 🧪 测试 / 评测 / CI
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
npm test # 全量 1014 项 (0 失败)
|
|
152
|
+
npm run eval # 本地能力评测 (7 项, 无需 LLM)
|
|
153
|
+
npm run eval -- --llm # LLM 端到端评测 (需 provider)
|
|
154
|
+
npm run bench # 并发/长会话吞吐压测
|
|
155
|
+
npm run audit:verify # 审计哈希链完整性校验
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**GitHub Actions CI**:push/PR 自动跑全量测试(Node 20/22 × Linux/Windows 矩阵)+ Web 静态自检 + 自愈基准 + 本地评测。要启用 LLM 回归,在 Settings → Secrets 配置 `PPX_E2E_BASE_URL` / `PPX_E2E_API_KEY` / `PPX_E2E_MODEL`。
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 🧠 记忆架构(L0 → L4)
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
对话 → L0 原始对话(会话日志) → L1 原子记忆(高斯衰减) → L2 场景(关键词聚类) → L3 画像(persona)
|
|
166
|
+
→ L4 程序性记忆(技能/流程, 慢遗忘)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
- **L0**:`data/sessions/*.jsonl` 全量承载 + MemoryTicker 滚动压缩
|
|
170
|
+
- **L1**:`facts.json`,score = score × exp(-λt²),命中加分(λ = `decay_per_day`)
|
|
171
|
+
- **L2**:`scenes.json` 相关记忆聚类
|
|
172
|
+
- **L3**:`user.persona.md` + `agent.persona.md`
|
|
173
|
+
- **L4**:技能/流程程序性记忆,衰减率 0.005 仅为 L1 的 1/4 —— 技能长期留存
|
|
174
|
+
|
|
175
|
+
**记忆治理(可回滚的遗忘)**:软删(`memory_forget`) + 回滚(`memory_restore`) + 复核(`memory_list_deleted`) + 版本链 + TTL 归并 + 按层清理 + 导出/导入迁移。容量保护仍是硬删(`_prune` 裁最弱项),治理管「想忘的」、`_prune` 管「装不下的」,两者分工不重叠。
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 📂 目录结构(v3.0)
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
PPXANS-Harness/
|
|
183
|
+
├── config/ 配置 (ppx.json + 人格)
|
|
184
|
+
├── src/
|
|
185
|
+
│ ├── agent/ Agent 引擎 (工具循环 + 多模型回退 + v3 插件装配)
|
|
186
|
+
│ ├── protocol/ [v3] SQ·EQ 双队列事件流 (WAL)
|
|
187
|
+
│ ├── session/ [v3] Turn 状态机 + rollout + parts (standalone, 待 v3.1)
|
|
188
|
+
│ ├── permissions/[v3] 审批 + 沙箱 + 规则链 + canUseTool
|
|
189
|
+
│ ├── hooks/ [v3] 六事件钩子链
|
|
190
|
+
│ ├── edit/ [v3] SR 编辑块 + 快照回滚
|
|
191
|
+
│ ├── repomap/ [v3] 仓库地图 (PageRank)
|
|
192
|
+
│ ├── review/ [v3] 分级审查流水线
|
|
193
|
+
│ ├── evidence/ [v3] 证据边界 + 目标看板 + manifest
|
|
194
|
+
│ ├── commands/ [v3] 斜杠命令统一模型
|
|
195
|
+
│ ├── plugin/ v3.js 五插件装配 (permissions/hooks/commands/evidence/protocol)
|
|
196
|
+
│ ├── tools/ 工具系统 (61 个 + v3 工具注册)
|
|
197
|
+
│ ├── core/ services/ memory/ audit/ ans/ selfheal/ channels/ orchestrator/ llm/ utils/
|
|
198
|
+
├── public/ 零依赖 Web UI (index.html/app.js/app.css, codex 风格)
|
|
199
|
+
├── bin/ ppx / ppxans / ppx-web / ppx-serve / ppx-channels 入口
|
|
200
|
+
├── data/ 运行时数据 (不进 git)
|
|
201
|
+
├── references/ 第三方项目来源登记
|
|
202
|
+
├── test/ 测试 (1014 项, v3 新模块全覆盖)
|
|
203
|
+
└── docs/ 文档 (ARCHITECTURE-V3 / QUICKSTART / web-launch 等)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 📄 License
|
|
209
|
+
|
|
210
|
+
Apache License 2.0
|
|
211
|
+
|
|
212
|
+
## 🙏 架构来源与致谢
|
|
213
|
+
|
|
214
|
+
- [openhanako (HanaAgent)](https://github.com/liliMozi/openhanako) — 记忆分层、自愈内核、人格系统
|
|
215
|
+
- [TencentDB-Agent-Memory](https://github.com/TencentCloud/TencentDB-Agent-Memory) — L0-L3 四层记忆架构
|
|
216
|
+
- **ppx-v2 (ppx Harness)** — 审计哈希链、记忆治理、L4 程序性记忆、治理工具
|
|
217
|
+
- [openai/codex](https://github.com/openai/codex) — v3.0 主轴架构参照 (SQ/EQ 队列、权限、仓库地图)
|
|
218
|
+
- [opencode](https://github.com/sst/opencode)、[claude-code](https://github.com/anthropics/claude-code)、[aider](https://aider.chat)、[OpenHands](https://github.com/All-Hands-AI/OpenHands)、[open-code-review](https://github.com/srikanth235/open-code-review)、[claude-agent-sdk-ts](https://github.com/anthropics/claude-agent-sdk-typescript)、[oh-my-hermes](https://github.com/wintermute-cell/oh-my-hermes) — v3.0 特性吸收来源(源码未直接纳,见 docs/ARCHITECTURE-V3.md 与 references/THIRD-PARTY-SOURCES.md)
|
package/bin/ppx-channels.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// bin/ppx-channels.js - `ppx-channels` npm bin 入口 (纯 shebang 包装, 真正逻辑在 src/channels-cli.js)
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// bin/ppx-channels.js - `ppx-channels` npm bin 入口 (纯 shebang 包装, 真正逻辑在 src/channels-cli.js)
|
|
3
3
|
import "../src/channels-cli.js";
|
package/bin/ppx-serve.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// bin/ppx-serve.js - `ppx-serve` npm bin 入口 (纯 shebang 包装, 真正逻辑在 src/server.js)
|
|
3
|
-
import { runServer } from "../src/server.js";
|
|
4
|
-
|
|
5
|
-
// 以当前目录为项目根, 端口可用环境变量 PPX_PORT 覆盖 (默认 8899)
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// bin/ppx-serve.js - `ppx-serve` npm bin 入口 (纯 shebang 包装, 真正逻辑在 src/server.js)
|
|
3
|
+
import { runServer } from "../src/server.js";
|
|
4
|
+
|
|
5
|
+
// 以当前目录为项目根, 端口可用环境变量 PPX_PORT 覆盖 (默认 8899)
|
|
6
6
|
await runServer({ root: process.cwd() });
|