ppxans-harness 2.6.0 → 3.2.1
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 +195 -195
- 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 +6 -124
- package/config/ppx.json.example +143 -0
- package/package.json +16 -6
- package/skills/.usage.json +6 -0
- package/skills/agent-professional-training/SKILL.md +94 -0
- package/skills/agent-professional-training/trajectories/2026-09-11-dpo-pairs.jsonl +2 -0
- package/skills/agent-professional-training/trajectories/2026-09-11-round2-trajectory.json +15 -0
- package/skills/agent-professional-training/trajectories/2026-09-13-first-run-trajectory.json +17 -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 +1352 -717
- package/src/agent/prompts.js +46 -2
- 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 -651
- 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 -182
- 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 +4 -3
- package/src/llm/dsml.js +74 -74
- package/src/llm/embedder.js +41 -35
- package/src/llm/fence.js +52 -52
- 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 -89
- package/src/mcp/admin.js +44 -10
- package/src/mcp/client.js +487 -477
- package/src/mcp/http.js +23 -37
- package/src/mcp/index.js +116 -116
- package/src/mcp/server.js +23 -18
- package/src/mcp/tasks.js +9 -14
- 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 -215
- 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/src/memory/experience.js
CHANGED
|
@@ -1,122 +1,133 @@
|
|
|
1
|
-
// src/memory/experience.js - 经验库 (自学习)
|
|
2
|
-
// 从每次任务结果中提炼经验, 供后续任务参考 (参考 openhanako experience)
|
|
3
|
-
// 跨 agent 共享: 支持全局经验目录 (globalDataDir), 写入用文件锁防并发覆盖
|
|
4
|
-
// v1.0.7: 同义经验相似合并 (bigram overlap, 词序/措辞变体命中合并而非新增)
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { ensureDir, readJson, writeJson, nowISO, withFileLock } from "../utils/store.js";
|
|
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
|
-
const
|
|
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
|
-
}
|
|
1
|
+
// src/memory/experience.js - 经验库 (自学习)
|
|
2
|
+
// 从每次任务结果中提炼经验, 供后续任务参考 (参考 openhanako experience)
|
|
3
|
+
// 跨 agent 共享: 支持全局经验目录 (globalDataDir), 写入用文件锁防并发覆盖
|
|
4
|
+
// v1.0.7: 同义经验相似合并 (bigram overlap, 词序/措辞变体命中合并而非新增)
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { ensureDir, readJson, writeJson, nowISO, withFileLock } from "../utils/store.js";
|
|
7
|
+
import { overlapCoefficient } from "../utils/similarity.js";
|
|
8
|
+
|
|
9
|
+
// 同义合并阈值: 经验 lesson 的 bigram overlap 达到此值视为同一条
|
|
10
|
+
// 用真实生产变体校准: 同义改写 0.50-0.55, 相关但不同 0.29, 不相关 0.0 → 0.5 能抓同义不误伤
|
|
11
|
+
const SIM_THRESHOLD = 0.5;
|
|
12
|
+
|
|
13
|
+
// overlap 系数 (交集 / 较短者): 对词序变化容忍, 实现收敛到 utils/similarity
|
|
14
|
+
// (与 FactStore._overlap 同思路, 但分词/阈值各自独立)
|
|
15
|
+
export const lessonOverlap = overlapCoefficient;
|
|
16
|
+
|
|
17
|
+
// 模板句判定: 去掉数字后完全相同 (如 "A 经验教训 0" vs "A 经验教训 1")
|
|
18
|
+
// 这类"仅编号不同"的条目是不同内容, 不参与同义合并 (防误伤)
|
|
19
|
+
function _isTemplateLike(a, b) {
|
|
20
|
+
return String(a).replace(/\d+/g, "#") === String(b).replace(/\d+/g, "#");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class Experience {
|
|
24
|
+
constructor(dataDir) {
|
|
25
|
+
this.dir = path.join(dataDir, "experience");
|
|
26
|
+
ensureDir(this.dir);
|
|
27
|
+
this.file = path.join(this.dir, "lessons.json");
|
|
28
|
+
this.lessons = readJson(this.file, []);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
learn({ task, outcome, lesson, tags = [] }) {
|
|
32
|
+
const entry = {
|
|
33
|
+
id: "e_" + Math.random().toString(36).slice(2, 10),
|
|
34
|
+
task: String(task || "").slice(0, 300),
|
|
35
|
+
outcome: String(outcome || "").slice(0, 300),
|
|
36
|
+
lesson: String(lesson || "").slice(0, 500),
|
|
37
|
+
tags,
|
|
38
|
+
ts: nowISO(),
|
|
39
|
+
uses: 0,
|
|
40
|
+
};
|
|
41
|
+
if (!entry.lesson || entry.lesson.length < 5) return null;
|
|
42
|
+
// 内容去重: 同一 lesson 已存在则命中加分 (uses+1) 而非新增, 防高频学习路径写放大
|
|
43
|
+
// 归一化: 去首尾空白 + 折叠连续空白 (与 FactStore._norm 同策略)
|
|
44
|
+
const normKey = String(lesson).trim().replace(/\s+/g, " ");
|
|
45
|
+
// 锁内读-改-写: 防止多 agent 共享经验库时并发覆盖
|
|
46
|
+
return withFileLock(this.file, () => {
|
|
47
|
+
this.lessons = readJson(this.file, []);
|
|
48
|
+
const existing = this.lessons.find((l) => String(l.lesson || "").trim().replace(/\s+/g, " ") === normKey);
|
|
49
|
+
if (existing) {
|
|
50
|
+
existing.uses += 1;
|
|
51
|
+
existing.ts = nowISO(); // 刷新时间, 让近期命中经验排到 context 前面
|
|
52
|
+
writeJson(this.file, this.lessons);
|
|
53
|
+
return existing;
|
|
54
|
+
}
|
|
55
|
+
// 同义合并 (v1.0.7): 措辞/词序不同的变体 (逃过精确去重) 语义相似时合并, 防同义经验堆积
|
|
56
|
+
// 排除"仅编号不同"的模板句 (如 A 经验教训 0/1 → 视为不同条目)
|
|
57
|
+
const similar = this.lessons.find((l) => {
|
|
58
|
+
const la = String(l.lesson || "");
|
|
59
|
+
if (_isTemplateLike(la, entry.lesson)) return false;
|
|
60
|
+
return lessonOverlap(la, entry.lesson) >= SIM_THRESHOLD;
|
|
61
|
+
});
|
|
62
|
+
if (similar) {
|
|
63
|
+
similar.uses += 1;
|
|
64
|
+
similar.ts = nowISO();
|
|
65
|
+
writeJson(this.file, this.lessons);
|
|
66
|
+
return similar;
|
|
67
|
+
}
|
|
68
|
+
this.lessons.push(entry);
|
|
69
|
+
this._prune();
|
|
70
|
+
writeJson(this.file, this.lessons);
|
|
71
|
+
return entry;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
recall(taskDesc) {
|
|
76
|
+
const q = String(taskDesc || "").toLowerCase();
|
|
77
|
+
const scored = this.lessons
|
|
78
|
+
.map((l) => {
|
|
79
|
+
let s = 0;
|
|
80
|
+
const hay = (l.lesson + " " + l.task + " " + l.tags.join(" ")).toLowerCase();
|
|
81
|
+
if (q && hay.includes(q)) s += 10;
|
|
82
|
+
if (l.uses > 0) s += Math.min(l.uses, 5);
|
|
83
|
+
return { ...l, score: s };
|
|
84
|
+
})
|
|
85
|
+
.filter((l) => l.score > 0)
|
|
86
|
+
.sort((a, b) => b.score - a.score);
|
|
87
|
+
return scored.slice(0, 5);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
use(id) {
|
|
91
|
+
withFileLock(this.file, () => {
|
|
92
|
+
this.lessons = readJson(this.file, []);
|
|
93
|
+
const l = this.lessons.find((x) => x.id === id);
|
|
94
|
+
if (l) { l.uses += 1; writeJson(this.file, this.lessons); }
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 经验清单 (公开读 API): 默认按命中次数降序, 同次数按时间新→旧
|
|
99
|
+
// 供 fork 快照 / 外部观测使用 (调用方无需触碰 this.lessons 内部数组)
|
|
100
|
+
list({ limit = 0, sort = "uses" } = {}) {
|
|
101
|
+
const all = [...this.lessons];
|
|
102
|
+
if (sort === "uses") {
|
|
103
|
+
all.sort((a, b) => (b.uses || 0) - (a.uses || 0) || new Date(b.ts || 0) - new Date(a.ts || 0));
|
|
104
|
+
} else if (sort === "ts") {
|
|
105
|
+
all.sort((a, b) => new Date(b.ts || 0) - new Date(a.ts || 0));
|
|
106
|
+
}
|
|
107
|
+
const n = Number(limit) || 0;
|
|
108
|
+
return n > 0 ? all.slice(0, n) : all;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 条目数 (可观测)
|
|
112
|
+
count() {
|
|
113
|
+
return this.lessons.length;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
_prune() {
|
|
117
|
+
// 最多保留 200 条
|
|
118
|
+
if (this.lessons.length > 200) {
|
|
119
|
+
this.lessons.sort((a, b) => b.uses - a.uses);
|
|
120
|
+
this.lessons = this.lessons.slice(0, 200);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
context() {
|
|
125
|
+
// 优先命中次数 (高频教训浮上来, 让反复发生的硬拒绝/跨会话坑真正影响行为),
|
|
126
|
+
// 同次数按时间新→旧 (近期教训仍可见)。蒸馏接缝: B3 auto-self-review 教训 uses 随复发上涨,
|
|
127
|
+
// 从而在上下文里越来越突出, 形成「经验→长期准则」的浮升链路。
|
|
128
|
+
const picked = [...this.lessons]
|
|
129
|
+
.sort((a, b) => (b.uses || 0) - (a.uses || 0) || new Date(b.ts || 0) - new Date(a.ts || 0))
|
|
130
|
+
.slice(0, 5);
|
|
131
|
+
return picked.map((l) => `- 经验: ${l.lesson}`).join("\n") || "(暂无经验)";
|
|
132
|
+
}
|
|
133
|
+
}
|