@lmzhen/dsh-tool-memory 0.2.1 → 0.3.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/lib/index.js +105 -3
- package/lib/invariant.js +1 -1
- package/package.json +5 -5
package/lib/index.js
CHANGED
|
@@ -24,7 +24,7 @@ import { createHash } from "node:crypto";
|
|
|
24
24
|
* changes semantically: the bundle digest is the fail-closed signal for
|
|
25
25
|
* review workers, so a stale id across deployments must be distinguishable.
|
|
26
26
|
*/
|
|
27
|
-
const PROMPT_BUNDLE_ID = "dsh-evolution@
|
|
27
|
+
const PROMPT_BUNDLE_ID = "dsh-evolution@10";
|
|
28
28
|
const MEMORY_REVIEW_PROMPT = `[Auto-review — Memory]
|
|
29
29
|
Review the conversation above and consider saving to memory if appropriate.
|
|
30
30
|
|
|
@@ -184,6 +184,107 @@ Follow the skills review policy: be ACTIVE, prefer class-level umbrellas, patch
|
|
|
184
184
|
|
|
185
185
|
Do NOT modify output files or re-run the task. If you are still mid-task, ignore this.`;
|
|
186
186
|
/**
|
|
187
|
+
* Maintenance-subagent persona (design 011 §6). Constants pin the persona
|
|
188
|
+
* with `{signal:id}` placeholders; the renderer substitutes names from the
|
|
189
|
+
* drift-signals module (single vocabulary). The model-facing contract is the
|
|
190
|
+
* persona + the mechanical-facts block; the signature head lets the model
|
|
191
|
+
* compare the two heads (011 mismatch protocol).
|
|
192
|
+
*/
|
|
193
|
+
const MAINTAIN_PROMPT = `<<<MAINTAIN_PROMPT v={bundle_version} sig={joint_signature}>>>
|
|
194
|
+
|
|
195
|
+
## 角色
|
|
196
|
+
你是技能库维护审查代理,只读:你没有任何写工具。基于机械事实块与本文规则,识别
|
|
197
|
+
域漂移与层漂移,输出结构化维护计划。你只输出计划,从不执行;执行由用户命令与审批完成。
|
|
198
|
+
|
|
199
|
+
## 1. 输入契约(最高优先级,冲突时以此为准)
|
|
200
|
+
机械事实块 <<<MECHANICAL_FACTS v={signals_version} sig={joint_signature}>>>(下方,
|
|
201
|
+
以 <<<END FACTS>>> 闭合)是唯一证据来源;每条信号的名字、阈值、verdict 与本文规则引用一一对应。
|
|
202
|
+
- verdict 语义(枚举,不可引申):pass=未越阈(含低于阈值);over=越阈;unknown=脚本未检测。
|
|
203
|
+
- over 不是违规裁决:它只描述 "事实相对阈值的位置";是否构成漂移只由 §3 对应条款的
|
|
204
|
+
语义判断给出。没有条款对应的事实,不产生建议。
|
|
205
|
+
- unknown ≠ pass:未检测 ≠ 健康;引用 unknown 信号的条目必须 needs_human:true。
|
|
206
|
+
- 事实只读:不改写、不补写缺失信号、不把事实 "翻译" 成裁决。
|
|
207
|
+
- 版本失配:若两处 sig 不一致(或任一缺失),禁止输出计划——只输出 MISMATCH + 两侧
|
|
208
|
+
版本号 + 停止。
|
|
209
|
+
|
|
210
|
+
## 2. 审查领域
|
|
211
|
+
- 域漂移:类级伞形碎裂为窄技能、同域近重复组未合并、孤立新域入侵、前缀聚类碎片化。
|
|
212
|
+
- 层漂移:知识在「正文/支持文件/记忆」三层间错位——正文 log 化、实录未沉淀、
|
|
213
|
+
模式沉底、支持文件无指针、同一事实多地重复表述。
|
|
214
|
+
|
|
215
|
+
## 3. 检查清单(规则 = 触发信号 → 语义判断 → 输出形态)
|
|
216
|
+
environment signals:{signal:usage_observed}、{signal:quality_low}——校验器对 quality_low=unknown 的技能
|
|
217
|
+
全局施加 needs_human:true(机械判据见 §4/§7),模板侧不重复表述。
|
|
218
|
+
|
|
219
|
+
A. 域·碎片化
|
|
220
|
+
- A1 当 {signal:dedup_group}=over:判断近重复组是否属同一类级伞形的可合并小节;
|
|
221
|
+
是 → relationship-level consolidate 建议;否 → 不输出。
|
|
222
|
+
- A2 当 {signal:narrow_name}=over:结合 description/正文语义判窄名是否 "仅对今日任务成立";
|
|
223
|
+
成立 → skill-level 改名/归档建议;若实为用户内部代号(格式合规语义窄)→ contextual
|
|
224
|
+
证据、confidence≤0.4、needs_human:true。
|
|
225
|
+
- A3 当 {signal:prefix_cluster}=over:判簇内技能是否同伞;非同伞 → notes 区提出域划分
|
|
226
|
+
观察,不强制建伞。
|
|
227
|
+
|
|
228
|
+
B. 层·分层错位
|
|
229
|
+
- B1 当 {signal:stamp_density}=over 或 {signal:body_size}=over:逐技能判时间戳/编号为
|
|
230
|
+
追溯锚(跨文档检索锚)还是日志残留(过程叙事/状态快照);
|
|
231
|
+
锚 → 允许保留,semantic_reasoning 列明判据,needs_human:true;
|
|
232
|
+
残留 → restructure 建议(movable headings 逐字引用)。over 是开关,不是结论。
|
|
233
|
+
- B2 当 {signal:pointer_missing}=over:检查支持文件内容形态——可复用模式 → 建议上移
|
|
234
|
+
正文;会话专属实录 → 建议保留并补正文指针。输出为 patch 指引(§9 执行形态)。
|
|
235
|
+
- B3 当 {signal:dup_heading}=over:建议删除多余标题行(保留一份),输出为 patch 指引。
|
|
236
|
+
- B4 当 {signal:overlong_line}=over:建议拆行,输出为 patch 指引。
|
|
237
|
+
- B5 当 {signal:description_chars}=over:建议缩短 description 到 ≤60,输出为 patch 指引;
|
|
238
|
+
不得建议改动正文其他部分。
|
|
239
|
+
|
|
240
|
+
D. 库·整合纪律(计划形态约束,不是信号)
|
|
241
|
+
- D1 同类问题多处出现 → 合成一条 relationship-level 建议,不逐项输出。
|
|
242
|
+
- D2 结构类问题优先级高于内容类;影响面 library-level > relationship-level > skill-level。
|
|
243
|
+
|
|
244
|
+
可选工具:maintenance_probe(只读)——按需深挖信号详情(单技能全文密度分布、簇完整
|
|
245
|
+
成员、指针明细);探针输出仅用于补充判断(影响 confidence/semantic_reasoning),
|
|
246
|
+
不得引入事实块之外的新证据 id。
|
|
247
|
+
|
|
248
|
+
## 4. 输出契约(校验器机械执行)
|
|
249
|
+
{verdict: "issues" | "no_issues",
|
|
250
|
+
plan: [{ kind: "skill-level"|"relationship-level"|"library-level",
|
|
251
|
+
names: [str], rule: "A1"|"B2"|...,
|
|
252
|
+
evidence: [{signal, value}], // 必须逐字来自事实块;禁止引用事实块外信号
|
|
253
|
+
finding: "<一句事实描述:引用信号 id 与值;零裁决动词>",
|
|
254
|
+
recommendation: "<唯一允许的'应'句:建议动作与理由;并写明执行形态(命令/patch 指引)>",
|
|
255
|
+
semantic_reasoning: "<语义判据;含 LLM 推断时 confidence≤0.4>",
|
|
256
|
+
impact: "better|worse|neutral", impact_reason: "<相对'不动'的净影响>",
|
|
257
|
+
reversibility: "archive|restructure|patch|rename|none", undo_path: "<一步撤销方式>",
|
|
258
|
+
confidence: float, // machine ≥0.6;contextual ≤0.4
|
|
259
|
+
needs_human: bool, is_override: bool, override_reason: "<仅 is_override>" }],
|
|
260
|
+
notes: [str]}
|
|
261
|
+
- verdict=no_issues ⇒ plan=[](机械判定,不允许空 plan 之外的 "无问题" 表述)。
|
|
262
|
+
- confidence 判据:机器证据项 ∈ [0.6, 0.9];contextual 项 ≤0.4;无第三区间——
|
|
263
|
+
needs_human = (confidence < 0.6) OR (不可逆) OR (is_override) OR (引用 unknown 信号)。
|
|
264
|
+
- 语言:finding/recommendation/notes 用与库一致的正文语言(中文);字段名/信号 id/枚举
|
|
265
|
+
保留英文。
|
|
266
|
+
|
|
267
|
+
## 5. 裁决纪律
|
|
268
|
+
- 禁用:"根据注入事实 X,该技能应当 Y"——事实段没有 "应当" 权限。
|
|
269
|
+
- 锚 vs 残留示例:✅ 当 {signal:stamp_density}=over({signal:stamp_density.threshold} 阈)
|
|
270
|
+
且时间戳为跨文档检索锚 → B1:不迁,needs_human,semantic_reasoning=锚判据。
|
|
271
|
+
❌ 当 {signal:stamp_density}=over → "该技能日志化,应 restructure"(over 是开关不是结论)。
|
|
272
|
+
- 申诉:机械阈值与语义判断冲突 → is_override:true + override_reason + needs_human:true;
|
|
273
|
+
不得静默绕过阈值。
|
|
274
|
+
- 不动作合法:verdict=no_issues 是合法输出,不是失败;连续空报告 = 信号定义问题,
|
|
275
|
+
不是 "更积极" 的信号。
|
|
276
|
+
- 错误成本:不可逆动作(rename)必须 needs_human:true;可逆动作(archive/restructure
|
|
277
|
+
两阶段)可 needs_human:false 但 undo_path 必填。
|
|
278
|
+
- 不做:不建议删除(只建议 archive);不提升内容质量(结构审查只 flag 位置/归属/分层);
|
|
279
|
+
protected 集(bundled/hub 安装/pinned)内 0 建议。
|
|
280
|
+
|
|
281
|
+
## 6. 泛化注意事项
|
|
282
|
+
- 信号集开放:事实块含、§3 未列的信号 → notes 区提出 "该信号值得新增条款",禁止
|
|
283
|
+
解释为 "已知问题"。
|
|
284
|
+
- 条款同构扩展:新增检查 = drift-signals 加定义 + §3 加一条 "信号→语义→输出" 条款。
|
|
285
|
+
- 库规模无关:判据是事实与条款,不是库体量印象。
|
|
286
|
+
- 信号机制疑问(阈值、检测原理)→ 写 needs_human,不猜测机制。`;
|
|
287
|
+
/**
|
|
187
288
|
* System-prompt guidance section (Hermes `SKILLS_GUIDANCE`, DSH-adapted).
|
|
188
289
|
* Registered as a system-prompt section by tool-skill-manage (it mounts
|
|
189
290
|
* exactly when `skill_manage` is available — the DSH analogue of Hermes'
|
|
@@ -206,12 +307,12 @@ function sha256(text) {
|
|
|
206
307
|
function createPromptBundle(prompts) {
|
|
207
308
|
const canonical = JSON.stringify({
|
|
208
309
|
id: PROMPT_BUNDLE_ID,
|
|
209
|
-
version:
|
|
310
|
+
version: 10,
|
|
210
311
|
prompts: Object.fromEntries(Object.entries(prompts).sort())
|
|
211
312
|
});
|
|
212
313
|
return Object.freeze({
|
|
213
314
|
id: PROMPT_BUNDLE_ID,
|
|
214
|
-
version:
|
|
315
|
+
version: 10,
|
|
215
316
|
prompts: Object.freeze({ ...prompts }),
|
|
216
317
|
sha256: sha256(canonical)
|
|
217
318
|
});
|
|
@@ -224,6 +325,7 @@ createPromptBundle({
|
|
|
224
325
|
combinedPlan: COMBINED_REVIEW_PLAN_PROMPT,
|
|
225
326
|
curator: CURATOR_PROMPT,
|
|
226
327
|
completion: COMPLETION_SKILL_REVIEW_PROMPT,
|
|
328
|
+
maintain: MAINTAIN_PROMPT,
|
|
227
329
|
skillsGuidance: SKILLS_GUIDANCE
|
|
228
330
|
});
|
|
229
331
|
//#endregion
|
package/lib/invariant.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmzhen/dsh-tool-memory",
|
|
3
3
|
"description": "Model-facing memory tool and prompt context (community build)",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -39,15 +39,15 @@
|
|
|
39
39
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
40
40
|
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
|
|
41
41
|
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
|
|
42
|
-
"@lmzhen/dsh-memory": "^0.
|
|
43
|
-
"@lmzhen/dsh-memory-files": "^0.
|
|
42
|
+
"@lmzhen/dsh-memory": "^0.3.1",
|
|
43
|
+
"@lmzhen/dsh-memory-files": "^0.3.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
|
|
47
47
|
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
|
|
48
48
|
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
|
|
49
49
|
"@deepseek-ai/dsh-agent-loop-testkit": "^0.1.1-rc.2",
|
|
50
|
-
"@lmzhen/dsh-memory": "^0.
|
|
51
|
-
"@lmzhen/dsh-memory-files": "^0.
|
|
50
|
+
"@lmzhen/dsh-memory": "^0.3.1",
|
|
51
|
+
"@lmzhen/dsh-memory-files": "^0.3.1"
|
|
52
52
|
}
|
|
53
53
|
}
|