@morlay/dsh-prompt-reminder 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -15,18 +15,19 @@ Teams 协作规则、harness 源码位置、Web GUI 说明都注册成系统提
15
15
 
16
16
  ## 行为
17
17
 
18
- | 环节 | 做什么 |
19
- | -------------------------------- | ------------------------------------------------------------------------------------ |
20
- | `system-prompt/assemble`(瀑布) | 保留 `keep` 名单内的 section;其余非空 section 从 assembly 移除,并按 order 捕获文本 |
21
- | `agent/pre-step` | 本轮文本与上一次送达的不同时,注入一条 user 消息,位置紧随已领取的这批消息之后 |
18
+ | 环节 | 做什么 |
19
+ | -------------------------------- | ------------------------------------------------------------------------------------------- |
20
+ | `system-prompt/assemble`(瀑布) | 保留 `keep` 名单内的 section;其余非空 section 从 assembly 移除,并按 order 捕获文本 |
21
+ | `agent/pre-step` | 会话 surface 上没有本轮文本的 reminder 时,注入一条 user 消息,位置紧随已领取的这批消息之后 |
22
22
 
23
23
  - **信封**:`<system-reminder>`,与工作区指令同一约定。首行声明系统提示词是刻意
24
24
  精简的、下面的内容仍属系统级规则、最新一条覆盖更早的 reminder。
25
- - **首步一次 + 变化增量**:文本不变时不重复注入;`plan:policy`、`tools:ptc-only`、
26
- `tools:sdk` 这类按模式渲染的 section 变化时追加一条新的**全量** reminder
27
- (靠首行的覆盖声明消歧,不试图只发差量)。
28
- - **幂等**:进程内按 agent 记最近送达文本;重启 / 恢复时扫会话 surface 上最近一条
29
- 本插件消息,文本相同就不再注入。
25
+ - **首步一次 + 变化增量**:surface 上有相同文本就不重复注入;`plan:policy`、
26
+ `tools:ptc-only`、`tools:sdk` 这类按模式渲染的 section 变化时追加一条新的**全量**
27
+ reminder(靠首行的覆盖声明消歧,不试图只发差量)。
28
+ - **幂等只认会话 surface**:最近一条本插件消息的文本相同就不再注入——稳态、重启 /
29
+ 恢复、以及 rewind(retry / 编辑 / 撤回)截断掉旧 reminder 后都走同一条判定,
30
+ 截断即补发;不进程内记账,回退不会留下"以为送过"的黑洞。
30
31
  - **转义**:正文里的 `</system-reminder>` 写成 `<\/system-reminder>`,避免提前闭合信封。
31
32
 
32
33
  ## 配置
@@ -73,7 +74,7 @@ profile 的依赖树必须能解析该包名(示例 app `apps/dsh-custom-next`
73
74
 
74
75
  - **reminder 仍是模型输入**:总 token 不减,只是不再占系统提示词的位置;要真正
75
76
  省 token 得把内容一起删掉。
76
- - **回退边缘**:rewind 掉旧 reminder 后,若当前文本与内存缓存仍相同,不会立即补
77
- 一条(重启或下次文本变化时恢复)。
77
+ - **稳态每步扫一次 surface**:注入判定倒序读 surface 节点,命中即停;会话很长又
78
+ 从未注入过(例如插件启用前的旧会话)时首次扫描走满,属可接受成本。
78
79
  - **顺序**:reminder 与工作区指令(`AGENTS.md`)都是 pre-step 注入的 user 消息,
79
80
  两者先后由 listener 注册顺序决定,语义上互不依赖。
package/dist/index.mjs CHANGED
@@ -66,7 +66,6 @@ function demote(sections, keep) {
66
66
  function apply(ctx, config) {
67
67
  const keep = new Set(config.keep ?? []);
68
68
  const captured = /* @__PURE__ */ new WeakMap();
69
- const delivered = /* @__PURE__ */ new WeakMap();
70
69
  ctx.on("system-prompt/assemble", async (_assembly, context, next) => {
71
70
  const result = await next();
72
71
  const { sections, texts } = demote(result.sections, keep);
@@ -84,12 +83,8 @@ function apply(ctx, config) {
84
83
  const decision = await next();
85
84
  if (decision.kind === "reject" || decision.messages.length === 0) return decision;
86
85
  const reminder = captured.get(agent);
87
- if (reminder === void 0 || delivered.get(agent) === reminder) return decision;
88
- if (latestReminderText(agent) === reminder) {
89
- delivered.set(agent, reminder);
90
- return decision;
91
- }
92
- delivered.set(agent, reminder);
86
+ if (reminder === void 0) return decision;
87
+ if (latestReminderText(agent) === reminder) return decision;
93
88
  const claimedEnd = decision.messages.findLastIndex((message) => messages.includes(message));
94
89
  return {
95
90
  ...decision,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morlay/dsh-prompt-reminder",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Demotes the system-prompt sections a reduced prompt leaves out into <system-reminder> user messages, so tool guidance stops diluting the system prompt while it stays in force.",
5
5
  "keywords": [
6
6
  "dsh",
@@ -37,7 +37,8 @@
37
37
  "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
38
38
  "@deepseek-ai/dsh-scope": "^0.1.5-rc.2",
39
39
  "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
40
- "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2"
40
+ "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
41
+ "@morlay/session-rdb": "^0.0.20"
41
42
  },
42
43
  "peerDependencies": {
43
44
  "@deepseek-ai/cordis": "^4.0.2",
package/src/index.ts CHANGED
@@ -57,8 +57,6 @@ export function apply(ctx: Context, config: Config): void {
57
57
  const keep = new Set(config.keep ?? []);
58
58
  // 本轮装配捕获的 reminder 文本,按 agent 区分(子 agent 各有自己的组合与 persona)。
59
59
  const captured = new WeakMap<Agent, string>();
60
- // 已知送达 surface 的文本,稳态下据此跳过 surface 扫描。
61
- const delivered = new WeakMap<Agent, string>();
62
60
 
63
61
  ctx.on("system-prompt/assemble", async (_assembly, context, next) => {
64
62
  const result = await next();
@@ -76,12 +74,11 @@ export function apply(ctx: Context, config: Config): void {
76
74
  // 没有进入模型的消息时不注入:空消息列表属于 no-step turn,下一轮再试。
77
75
  if (decision.kind === "reject" || decision.messages.length === 0) return decision;
78
76
  const reminder = captured.get(agent);
79
- if (reminder === undefined || delivered.get(agent) === reminder) return decision;
80
- if (latestReminderText(agent) === reminder) {
81
- delivered.set(agent, reminder);
82
- return decision;
83
- }
84
- delivered.set(agent, reminder);
77
+ if (reminder === undefined) return decision;
78
+ // 唯一真相是会话 surface:loop 把注入的消息落库,surface 上有同文本就
79
+ // 不再注入。不进程内记账——rewind(retry / 编辑 / 撤回)截断掉旧
80
+ // reminder 时,这里当场恢复,而不是等到文本变化或进程重启。
81
+ if (latestReminderText(agent) === reminder) return decision;
85
82
  // 贴近已领取的这批消息之后:直接输入在前,注入的上下文紧随其后。
86
83
  const claimedEnd = decision.messages.findLastIndex((message) => messages.includes(message));
87
84
  return {