@te-river/opencode-team-mode 1.8.8 → 1.9.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/README.md CHANGED
@@ -346,6 +346,7 @@ Your own agents named `team` / `architect` / … always take precedence; the plu
346
346
  | `pruneProtectPatterns` | regex list (comma separated) | `""` | A message whose text matches ANY entry is never pruned; hits are counted (`prune_protect_matched`); an invalid entry is ignored; empty = off. |
347
347
  | `stateCard` | `on`/`off` | `on` | 任务状态卡 — ONE ≤300-token lead-only system entry: ledger counts + open items, this session's running children, a shortened board root, last round's offloaded count. Unchanged bytes write nothing. |
348
348
  | `dynamicTail` | `on`/`off` | `off` | Volatile context (state card / window entry / retry directive / split advice) merges into ONE message at the END of the request (`[Team 动态上下文]`, `### <name>` sections), so `system` stays prefix-cacheable; a reused array has its old tail stripped; empty sink writes nothing. **Defaults to `off`**: host 2.1.x persists the appended message as a real user message and replays it as the last user input (measured 2026-10-22); the feature stays, opt in only after confirming the host behaviour is safe. `off` = per-producer system entries. |
349
+ | `sessionInstructions` | `on`/`off` | `on` | Writer for the same four volatile sections as the host's **keyed session instructions** (`ctx.session.instructions.entry`, host 2.2.0+): an entry is added as a small update at the next step, so it does not break the prompt cache, survives compaction/rewind and starts no extra turn. Keys are `team-state` / `team-window` / `team-retry` / `team-advice`; a section whose sha256 is unchanged is not written, and one whose content disappeared is removed. A host without the seam (2.1.x) is reported as `fallback-system` and every producer stays on today's `system` path; a throwing `put` falls back to `system` for that round so nothing is lost. `off` = never register the layer. |
349
350
  | `splitAdvice` | `on`/`off` | `on` | Suggest splitting a brief that carries too many acceptance criteria. |
350
351
  | `splitBriefTokens` | number | `4000` | Brief token threshold for that hint. **Clamped ≥200.** |
351
352
  | `splitMaxCriteria` | number | `3` | More acceptance criteria than this is a split signal. |
package/README.zh-CN.md CHANGED
@@ -346,6 +346,7 @@ HTML 引擎在中国大陆**全部免 Key 可达**,且全部在种子域名白
346
346
  | `pruneProtectPatterns` | 正则列表(逗号分隔) | `""` | 修剪保护正则:命中任一条的消息**永不修剪**,命中条数计入 `prune_protect_matched`。无效正则被忽略(不连累邻居、不抛错);空串 = 关闭,与不带此键的行为逐字节一致。正则本身若含逗号无法表达——解析就是按 `,` 切分。 |
347
347
  | `stateCard` | `on`/`off` | `on` | 任务状态卡——lead 的请求上带**一条 ≤300 token** 的 system 条目:账本计数 + 未收口项(最旧先裁)、**本会话**运行中的子代理(空 sessionID 时整行省略)、缩短过的看板根、上轮离载条数。内容逐字节不变时一个字节都不写(比较用整串,`hash:` 行只是可见标记)。`off` = 该层不注册。 |
348
348
  | `dynamicTail` | `on`/`off` | `off` | 易变上下文(状态卡 / 窗口占用 / 重试指令 / 拆分建议)合并成**请求末尾的一条消息**(首行 `[Team 动态上下文]`,各段前一行 `### <段名>`,顺序固定 state → window → retry → advice),`system` 只留稳定内容——provider 的前缀缓存因此能命中。宿主跨请求复用消息数组时先剥掉旧尾部再重建(不累积);sink 为空时一个字节都不动。**默认 off**:宿主 2.1.x 会把它当作真实用户消息持久化并回放(实测 2026-10-22),故默认关闭,仅在确认宿主行为安全后手动开启。`off` = 旧行为:四个生产者各自注入 `system`,逐字节与改动前一致。 |
349
+ | `sessionInstructions` | `on`/`off` | `on` | 同样四段易变上下文的**首选通道**:写成宿主的 keyed session instructions(`ctx.session.instructions.entry`,宿主 2.2.0+)。官方口径是「下一步注入一条小更新」——不破 prompt cache、跨压缩/回退存活、不额外起一轮。四个 key 固定为 `team-state` / `team-window` / `team-retry` / `team-advice`;内容 sha256 没变的段一次都不写,内容消失的段 `remove` 掉(账本清空后旧卡不会挂成陈旧指令)。宿主没有这个缝(2.1.x)时实际值降级为 `fallback-system`,四个生产者走今天的 `system` 路径;`put` 抛错则当轮退回 `system.push`(内容不丢)并在下一轮重试。`off` = 该层不注册。 |
349
350
  | `splitAdvice` | `on`/`off` | `on` | 派工简报的验收标准过多时注入拆分建议。`off` 停掉这条提示(提示词纪律仍在)。 |
350
351
  | `splitBriefTokens` | number | `4000` | 触发拆分建议的简报 token 阈值。**夹在 ≥200。** |
351
352
  | `splitMaxCriteria` | number | `3` | 验收标准多于这个数就是该拆的信号。 |
@@ -0,0 +1,120 @@
1
+ /**
2
+ * `sessionInstructions` — 把易变上下文写成宿主的 keyed session instructions.
3
+ *
4
+ * 2.2.0 新增 `ctx.session.instructions.entry.put/list/remove`。官方 changelog 说
5
+ * keyed 指令「added as a small update at the next step」:不破 prompt cache、跨压缩
6
+ * 与回退存活、也不额外起一轮。那正是 `dynamicTail` 想要的三件事,而 `dynamicTail`
7
+ * 在 2.1.x 上做不到(宿主把追加的 `role:"user"` 消息持久化并当真实输入回放,实测
8
+ * 2026-10-22,故默认 off)。所以易变上下文的**首选通道**是这里:
9
+ *
10
+ * 四个生产者(状态卡 / 窗口占用 / 重试指令 / 拆分建议)照旧写进同一个
11
+ * `DynamicSink`;本层把它 drain 成四个 key(`team-state` / `team-window` /
12
+ * `team-retry` / `team-advice`),只在**内容真的变了**的时候 put —— hash 相同
13
+ * 一个字节都不写。
14
+ *
15
+ * 三个失败面都落成数字或回退,而不是静默:
16
+ * - **宿主没有这个缝**(2.1.x):本层不注册,人格把 `sessionInstructions` 的实际
17
+ * 值降级成 `fallback-system`(`absent` 计数),生产者走今天的 system 路径;
18
+ * - **`put` 抛错**:该 key 当轮回退 `event.system.push`(保证不丢),`failed`
19
+ * 计数,且**不记 hash** ⇒ 下一轮重试 put(成功的下一轮会把那条兜底摘掉);
20
+ * - **`remove` 抛错**:`failed` 计数;内容已消失,没有可回退的东西。
21
+ *
22
+ * 幂等与重放:宿主在进程内重放同一个 `session.context` 事件对象(同一处实测,见
23
+ * v2-tail.ts 的注释),而 sink 已经被 drain 过 —— 若不拦住,第二次重放会把「空
24
+ * sink」读成「内容消失」并 remove 掉刚 put 的条目。所以同一个 event 对象只处理
25
+ * 一次(`replayed` 计数)。
26
+ *
27
+ * 边界(写在代码里而不是留给读者猜):hash 表是**进程内**的。宿主持久化的旧条目
28
+ * 在进程重启后仍在,所以每个会话在本进程的**第一个**请求会尽力 `list()` 一次,把
29
+ * 我们自己的 key 记成「hash 未知」——有内容就覆盖,没内容就摘掉。`list` 不可用或
30
+ * 抛错时按 `listFailed` 计数,此时旧条目只能等下一轮内容变化才被覆盖(本层不假装
31
+ * 这条路径是幂等的)。
32
+ */
33
+ import type { TeamScope } from "./v2-scope.js";
34
+ import { type DynamicSection, type DynamicSink } from "./v2-tail.js";
35
+ import type { V2Context, V2Registration } from "./v2-types.js";
36
+ /** 段 → 宿主 key. 顺序与 `DYNAMIC_SECTION_ORDER` 一致(state → window → retry → advice)。 */
37
+ export declare const INSTRUCTION_KEYS: Readonly<Record<DynamicSection, string>>;
38
+ /**
39
+ * `ctx.session.instructions.entry` 的可用面子集。**按字段逐个探测**(不是看到对象
40
+ * 就认):一个只挂了 `list` 的宿主不是「有 put 缝」。
41
+ */
42
+ export interface SessionInstructionsSeam {
43
+ put: (input: {
44
+ sessionID: string;
45
+ key: string;
46
+ value: string;
47
+ }) => Promise<unknown>;
48
+ remove: (input: {
49
+ sessionID: string;
50
+ key: string;
51
+ }) => Promise<unknown>;
52
+ list?: (input: {
53
+ sessionID: string;
54
+ }) => Promise<unknown>;
55
+ }
56
+ /**
57
+ * 从 plugin ctx 里取出这个缝。缺任何一个必需方法都返回 `null` —— 2.1.x 上
58
+ * `ctx.session.instructions` 整个是 undefined,这条路径就是它的证据。
59
+ *
60
+ * 每次调用都在调用点绑定接收者(`.call(entry, …)`),不丢 `this` —— 捕获函数引用
61
+ * 后再裸调用会丢接收者,这正是本仓 `tm_join` 在真机上踩过的那个坑。
62
+ */
63
+ export declare function sessionInstructionsSeamOf(ctx: V2Context | undefined): SessionInstructionsSeam | null;
64
+ /** `sessionInstructions: "off"` 关闭;注册表默认 on(缝不在时由人格降级成 fallback-system)。 */
65
+ export declare function resolveSessionInstructionsConfig(config?: {
66
+ sessionInstructions?: string;
67
+ }): {
68
+ enabled: boolean;
69
+ };
70
+ export interface SessionInstructionsReport {
71
+ /** 实际生效的通道:`on`(写宿主的 keyed 指令)/ `off`(配置关闭)/ `fallback-system`(宿主没有该缝)。 */
72
+ status: "on" | "off" | "fallback-system";
73
+ /** 缝缺失而被降级的次数(0 或 1:注册时就定局)。 */
74
+ absent: number;
75
+ /** 处理过的请求数。 */
76
+ requests: number;
77
+ /** put 成功的次数。 */
78
+ put: number;
79
+ /** remove 成功的次数。 */
80
+ removed: number;
81
+ /** 内容没变(hash 相同)而**没有调用**的次数。 */
82
+ skipped: number;
83
+ /** put/remove 抛错的次数(put 的那一轮已回退 system)。 */
84
+ failed: number;
85
+ /** `list()` 抛错(无效缝)——这时的旧条目可能残留,单独计数。 */
86
+ listFailed: number;
87
+ /** 同一个事件对象的重放——什么都不做。 */
88
+ replayed: number;
89
+ /** 没有 sessionID 的请求(无法给条目定 key)。 */
90
+ noSession: number;
91
+ /** scope 判定非 ours 的请求数(一个字节都不动)。 */
92
+ foreignSkipped: number;
93
+ /** hook 内部抛错(永不外溢,只计数)。 */
94
+ threw: number;
95
+ }
96
+ export interface SessionInstructionsInput {
97
+ /** `sessionInstructions: "off"` → 不注册该层。 */
98
+ enabled?: boolean;
99
+ sink: DynamicSink;
100
+ scope?: TeamScope;
101
+ /** 有变化时一行轨迹(`step_id:"v2-instructions"` 由人格侧提供)。 */
102
+ onEvent?: (row: Record<string, unknown>) => void;
103
+ }
104
+ export interface SessionInstructionsLayer {
105
+ registrations: V2Registration[];
106
+ report: SessionInstructionsReport;
107
+ /** 该层是否真的注册了(配置 on **且**宿主有缝)。 */
108
+ active: boolean;
109
+ }
110
+ /** `list()` 的返回可能是数组,也可能包在 `{data:[...]}` 里(两种都认,只取 key)。 */
111
+ export declare function knownKeysOf(result: unknown): string[];
112
+ /**
113
+ * 注册 keyed-instructions 层。必须注册在**所有生产者之后**:四个生产者按各自的
114
+ * hook 顺序把内容写进 sink,本层最后一个看到完整的一份。
115
+ *
116
+ * 与 `dynamicTail` 的关系:两者同时开启时本层先 drain,尾部层看到空 sink 一个
117
+ * 字节都不动——方向是「首选的通道先拿」,而不是谁先注册谁赢。
118
+ */
119
+ export declare function applyV2SessionInstructions(ctx: V2Context, input: SessionInstructionsInput): Promise<SessionInstructionsLayer>;
120
+ //# sourceMappingURL=v2-session-instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-session-instructions.d.ts","sourceRoot":"","sources":["../../src/host/v2-session-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAyB,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAoB,MAAM,eAAe,CAAA;AAEhF,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAKrE,CAAA;AAQD;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACnF,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACvE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC1D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,uBAAuB,GAAG,IAAI,CAcpG;AAID,4EAA4E;AAC5E,wBAAgB,gCAAgC,CAC9C,MAAM,GAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAoB,GACzD;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAEtB;AAED,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,iBAAiB,CAAA;IACxC,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,eAAe;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,oDAAoD;IACpD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACjD;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,MAAM,EAAE,yBAAyB,CAAA;IACjC,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAA;CAChB;AAKD,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAYrD;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,wBAAwB,CAAC,CAyKnC"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * `sessionInstructions` — 把易变上下文写成宿主的 keyed session instructions.
3
+ *
4
+ * 2.2.0 新增 `ctx.session.instructions.entry.put/list/remove`。官方 changelog 说
5
+ * keyed 指令「added as a small update at the next step」:不破 prompt cache、跨压缩
6
+ * 与回退存活、也不额外起一轮。那正是 `dynamicTail` 想要的三件事,而 `dynamicTail`
7
+ * 在 2.1.x 上做不到(宿主把追加的 `role:"user"` 消息持久化并当真实输入回放,实测
8
+ * 2026-10-22,故默认 off)。所以易变上下文的**首选通道**是这里:
9
+ *
10
+ * 四个生产者(状态卡 / 窗口占用 / 重试指令 / 拆分建议)照旧写进同一个
11
+ * `DynamicSink`;本层把它 drain 成四个 key(`team-state` / `team-window` /
12
+ * `team-retry` / `team-advice`),只在**内容真的变了**的时候 put —— hash 相同
13
+ * 一个字节都不写。
14
+ *
15
+ * 三个失败面都落成数字或回退,而不是静默:
16
+ * - **宿主没有这个缝**(2.1.x):本层不注册,人格把 `sessionInstructions` 的实际
17
+ * 值降级成 `fallback-system`(`absent` 计数),生产者走今天的 system 路径;
18
+ * - **`put` 抛错**:该 key 当轮回退 `event.system.push`(保证不丢),`failed`
19
+ * 计数,且**不记 hash** ⇒ 下一轮重试 put(成功的下一轮会把那条兜底摘掉);
20
+ * - **`remove` 抛错**:`failed` 计数;内容已消失,没有可回退的东西。
21
+ *
22
+ * 幂等与重放:宿主在进程内重放同一个 `session.context` 事件对象(同一处实测,见
23
+ * v2-tail.ts 的注释),而 sink 已经被 drain 过 —— 若不拦住,第二次重放会把「空
24
+ * sink」读成「内容消失」并 remove 掉刚 put 的条目。所以同一个 event 对象只处理
25
+ * 一次(`replayed` 计数)。
26
+ *
27
+ * 边界(写在代码里而不是留给读者猜):hash 表是**进程内**的。宿主持久化的旧条目
28
+ * 在进程重启后仍在,所以每个会话在本进程的**第一个**请求会尽力 `list()` 一次,把
29
+ * 我们自己的 key 记成「hash 未知」——有内容就覆盖,没内容就摘掉。`list` 不可用或
30
+ * 抛错时按 `listFailed` 计数,此时旧条目只能等下一轮内容变化才被覆盖(本层不假装
31
+ * 这条路径是幂等的)。
32
+ */
33
+ import { createHash } from "node:crypto";
34
+ import { resolveConfig } from "../tm/config.js";
35
+ import { DYNAMIC_SECTION_ORDER } from "./v2-tail.js";
36
+ /** 段 → 宿主 key. 顺序与 `DYNAMIC_SECTION_ORDER` 一致(state → window → retry → advice)。 */
37
+ export const INSTRUCTION_KEYS = {
38
+ state: "team-state",
39
+ window: "team-window",
40
+ retry: "team-retry",
41
+ advice: "team-advice",
42
+ };
43
+ /** 我们的 key 集合——`list()` 的清洗只认这四个,别人的 key 一个都不碰。 */
44
+ const OUR_KEYS = new Set(Object.values(INSTRUCTION_KEYS));
45
+ /** 「这个 key 在宿主里有,但本进程不知道它的内容 hash」的哨兵:永不等于真实 hash。 */
46
+ const UNKNOWN_HASH = "unknown";
47
+ /**
48
+ * 从 plugin ctx 里取出这个缝。缺任何一个必需方法都返回 `null` —— 2.1.x 上
49
+ * `ctx.session.instructions` 整个是 undefined,这条路径就是它的证据。
50
+ *
51
+ * 每次调用都在调用点绑定接收者(`.call(entry, …)`),不丢 `this` —— 捕获函数引用
52
+ * 后再裸调用会丢接收者,这正是本仓 `tm_join` 在真机上踩过的那个坑。
53
+ */
54
+ export function sessionInstructionsSeamOf(ctx) {
55
+ const instructions = ctx?.session?.instructions;
56
+ const entry = instructions?.entry;
57
+ if (!entry || typeof entry !== "object")
58
+ return null;
59
+ const candidate = entry;
60
+ if (typeof candidate.put !== "function" || typeof candidate.remove !== "function")
61
+ return null;
62
+ const put = candidate.put;
63
+ const remove = candidate.remove;
64
+ const list = candidate.list;
65
+ return {
66
+ put: (input) => put.call(entry, input),
67
+ remove: (input) => remove.call(entry, input),
68
+ ...(typeof list === "function" ? { list: (input) => list.call(entry, input) } : {}),
69
+ };
70
+ }
71
+ const isOff = (value) => typeof value === "string" && /^(off|0|false|no)$/i.test(value.trim());
72
+ /** `sessionInstructions: "off"` 关闭;注册表默认 on(缝不在时由人格降级成 fallback-system)。 */
73
+ export function resolveSessionInstructionsConfig(config = resolveConfig()) {
74
+ return { enabled: !isOff(config.sessionInstructions) };
75
+ }
76
+ const sha256 = (text) => createHash("sha256").update(text, "utf8").digest("hex");
77
+ const slotOf = (sessionID, key) => `${sessionID}\u0000${key}`;
78
+ /** `list()` 的返回可能是数组,也可能包在 `{data:[...]}` 里(两种都认,只取 key)。 */
79
+ export function knownKeysOf(result) {
80
+ const arr = Array.isArray(result)
81
+ ? result
82
+ : Array.isArray(result?.data)
83
+ ? (result.data)
84
+ : [];
85
+ const out = [];
86
+ for (const item of arr) {
87
+ const key = item?.key;
88
+ if (typeof key === "string" && key)
89
+ out.push(key);
90
+ }
91
+ return out;
92
+ }
93
+ /**
94
+ * 注册 keyed-instructions 层。必须注册在**所有生产者之后**:四个生产者按各自的
95
+ * hook 顺序把内容写进 sink,本层最后一个看到完整的一份。
96
+ *
97
+ * 与 `dynamicTail` 的关系:两者同时开启时本层先 drain,尾部层看到空 sink 一个
98
+ * 字节都不动——方向是「首选的通道先拿」,而不是谁先注册谁赢。
99
+ */
100
+ export async function applyV2SessionInstructions(ctx, input) {
101
+ const report = {
102
+ status: input.enabled === false ? "off" : "fallback-system",
103
+ absent: 0,
104
+ requests: 0,
105
+ put: 0,
106
+ removed: 0,
107
+ skipped: 0,
108
+ failed: 0,
109
+ listFailed: 0,
110
+ replayed: 0,
111
+ noSession: 0,
112
+ foreignSkipped: 0,
113
+ threw: 0,
114
+ };
115
+ const registrations = [];
116
+ if (input.enabled === false)
117
+ return { registrations, report, active: false };
118
+ const session = ctx.session;
119
+ if (!session || typeof session.hook !== "function") {
120
+ report.absent++;
121
+ return { registrations, report, active: false };
122
+ }
123
+ const seam = sessionInstructionsSeamOf(ctx);
124
+ if (!seam) {
125
+ // 2.1.x:没有这条路。人格把实际值报成 fallback-system,生产者留在 system 上。
126
+ report.absent++;
127
+ return { registrations, report, active: false };
128
+ }
129
+ report.status = "on";
130
+ /** `${sid}\0${key}` → 上一次成功 put 的内容 hash(`UNKNOWN_HASH` = 宿主里有、本进程没写)。 */
131
+ const hashes = new Map();
132
+ /** `${sid}\0${key}` → 因为 put 失败而临时推进 system 的那段正文(成功后会摘掉)。 */
133
+ const fallbacks = new Map();
134
+ /** 本进程已经尽力 list 过的会话(每个会话一次)。 */
135
+ const listed = new Set();
136
+ /** 重放判定:同一个事件对象只处理一次(进程级 = 本层实例级,不复制内容)。 */
137
+ const seenEvents = new WeakSet();
138
+ const emit = (row) => {
139
+ try {
140
+ input.onEvent?.(row);
141
+ }
142
+ catch {
143
+ /* 轨迹是附加物,不能成为请求失败的理由 */
144
+ }
145
+ };
146
+ /** 把上一轮 put 失败留下的 system 兜底摘掉:内容既然写进了宿主,就不该在 system 里留副本。 */
147
+ const dropFallback = (slot, system) => {
148
+ const text = fallbacks.get(slot);
149
+ if (text === undefined)
150
+ return;
151
+ fallbacks.delete(slot);
152
+ if (!system)
153
+ return;
154
+ for (let i = system.length - 1; i >= 0; i--) {
155
+ const part = system[i];
156
+ if (part && typeof part.text === "string" && part.text === text)
157
+ system.splice(i, 1);
158
+ }
159
+ };
160
+ registrations.push(await session.hook("context", async (event) => {
161
+ try {
162
+ // #22:不属于我们的会话一个字节都不动。
163
+ if (input.scope && input.scope.count(input.scope.decide(event)) !== "ours") {
164
+ report.foreignSkipped++;
165
+ return;
166
+ }
167
+ const sidRaw = event?.sessionID;
168
+ const sid = typeof sidRaw === "string" && sidRaw.trim() ? sidRaw.trim() : "";
169
+ if (!sid) {
170
+ report.noSession++;
171
+ return;
172
+ }
173
+ // 宿主会在进程内重放同一个事件对象;sink 已空 ⇒ 什么都不做(见文件头)。
174
+ if (event && typeof event === "object") {
175
+ if (seenEvents.has(event)) {
176
+ report.replayed++;
177
+ return;
178
+ }
179
+ seenEvents.add(event);
180
+ }
181
+ report.requests++;
182
+ const system = Array.isArray(event?.system)
183
+ ? (event.system)
184
+ : null;
185
+ // 本进程的第一个请求:尽力问一次宿主「我的四个 key 里哪些已经在?」
186
+ // 不知道 hash 的记成 UNKNOWN_HASH —— 有内容就覆盖,没内容就摘掉。
187
+ if (!listed.has(sid)) {
188
+ listed.add(sid);
189
+ if (seam.list) {
190
+ try {
191
+ for (const key of knownKeysOf(await seam.list({ sessionID: sid }))) {
192
+ if (!OUR_KEYS.has(key))
193
+ continue;
194
+ const slot = slotOf(sid, key);
195
+ if (!hashes.has(slot))
196
+ hashes.set(slot, UNKNOWN_HASH);
197
+ }
198
+ }
199
+ catch {
200
+ report.listFailed++;
201
+ }
202
+ }
203
+ }
204
+ const sections = input.sink.take(sid);
205
+ let putNow = 0;
206
+ let removedNow = 0;
207
+ let skippedNow = 0;
208
+ let failedNow = 0;
209
+ for (const section of DYNAMIC_SECTION_ORDER) {
210
+ const key = INSTRUCTION_KEYS[section];
211
+ const slot = slotOf(sid, key);
212
+ const body = (sections.get(section) ?? "").trim();
213
+ const prev = hashes.get(slot);
214
+ if (!body) {
215
+ // 内容消失:宿主里若还有这一条,摘掉(否则旧卡/旧指令会一直挂着)。
216
+ dropFallback(slot, system);
217
+ if (prev === undefined)
218
+ continue;
219
+ try {
220
+ await seam.remove({ sessionID: sid, key });
221
+ hashes.delete(slot);
222
+ report.removed++;
223
+ removedNow++;
224
+ }
225
+ catch {
226
+ report.failed++;
227
+ failedNow++;
228
+ }
229
+ continue;
230
+ }
231
+ const hash = sha256(body);
232
+ if (prev !== undefined && prev === hash) {
233
+ // 同一条内容:一个字节都不写(这就是省下来的 cache 与 token)。
234
+ dropFallback(slot, system);
235
+ report.skipped++;
236
+ skippedNow++;
237
+ continue;
238
+ }
239
+ try {
240
+ await seam.put({ sessionID: sid, key, value: body });
241
+ hashes.set(slot, hash);
242
+ dropFallback(slot, system);
243
+ report.put++;
244
+ putNow++;
245
+ }
246
+ catch {
247
+ // 保证不丢:这一轮改走 system,且**不记 hash**(下一轮重试 put)。
248
+ report.failed++;
249
+ failedNow++;
250
+ if (system) {
251
+ const already = system.some((p) => p?.text === body);
252
+ if (!already)
253
+ system.push({ type: "text", text: body });
254
+ fallbacks.set(slot, body);
255
+ }
256
+ }
257
+ }
258
+ // 节流:只在真的有变化(或有失败要看)时写一行。
259
+ if (putNow || removedNow || failedNow) {
260
+ emit({ event: "sync", put: putNow, removed: removedNow, skipped: skippedNow, failed: failedNow });
261
+ }
262
+ }
263
+ catch {
264
+ report.threw++;
265
+ }
266
+ }));
267
+ return { registrations, report, active: true };
268
+ }
269
+ //# sourceMappingURL=v2-session-instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-session-instructions.js","sourceRoot":"","sources":["../../src/host/v2-session-instructions.ts"],"names":[],"mappings":"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"}
@@ -215,12 +215,49 @@ export interface V2SessionDomain {
215
215
  delivery?: string;
216
216
  resume?: boolean;
217
217
  }) => Promise<unknown>;
218
+ /**
219
+ * Keyed session instructions — `ctx.session.instructions.entry.put/list/remove`,
220
+ * new on host 2.2.0 (ABSENT on 2.1.x, where `ctx.session.instructions` is
221
+ * `undefined`). The host's own changelog: an entry is "added as a small update at
222
+ * the next step" — it does not break the prompt cache, survives compaction and
223
+ * rewind, and does not start an extra turn. That is exactly the three properties
224
+ * `dynamicTail` could not get on 2.1.x, which is why `sessionInstructions` prefers
225
+ * this seam and falls back to `event.system` when the domain is missing.
226
+ *
227
+ * Declared from the official route inventory
228
+ * (`/api/experimental/session/{sessionID}/instructions/entries`, experimental) and
229
+ * the zero-token probe of 2.2.0; only `put`/`remove` are required for the seam to
230
+ * count as present — `list` is optional because nothing here depends on it.
231
+ */
232
+ readonly instructions?: V2SessionInstructionsDomain;
218
233
  readonly prompt?: (input: Record<string, unknown>) => Promise<unknown>;
219
234
  readonly wait?: (input: {
220
235
  sessionID: string;
221
236
  }) => Promise<unknown>;
222
237
  readonly [key: string]: unknown;
223
238
  }
239
+ export interface V2InstructionEntryInfo {
240
+ readonly sessionID?: string;
241
+ readonly key: string;
242
+ readonly value?: string;
243
+ readonly time?: unknown;
244
+ }
245
+ export interface V2SessionInstructionsDomain {
246
+ readonly entry: {
247
+ readonly put: (input: {
248
+ sessionID: string;
249
+ key: string;
250
+ value: string;
251
+ }) => Promise<unknown>;
252
+ readonly remove: (input: {
253
+ sessionID: string;
254
+ key: string;
255
+ }) => Promise<unknown>;
256
+ readonly list?: (input: {
257
+ sessionID: string;
258
+ }) => Promise<unknown>;
259
+ };
260
+ }
224
261
  /**
225
262
  * `ctx.model.list({})` measured on 2.0.23: `{location, data: […]}` where an item carries
226
263
  * `id, modelID, providerID, name, package, settings, capabilities, variants, time, cost,
@@ -1 +1 @@
1
- {"version":3,"file":"v2-types.d.ts","sourceRoot":"","sources":["../../src/host/v2-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v2-types.d.ts","sourceRoot":"","sources":["../../src/host/v2-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"v2.d.ts","sourceRoot":"","sources":["../../src/host/v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAoCH,OAAO,KAAK,EAA0B,QAAQ,EAA8B,MAAM,eAAe,CAAA;AAEjG;;;;;kEAKkE;AAClE,eAAO,MAAM,iBAAiB,QAGmB,CAAA;AASjD,eAAO,MAAM,aAAa,EAAE,QA+2C3B,CAAA"}
1
+ {"version":3,"file":"v2.d.ts","sourceRoot":"","sources":["../../src/host/v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAqCH,OAAO,KAAK,EAA0B,QAAQ,EAA8B,MAAM,eAAe,CAAA;AAEjG;;;;;kEAKkE;AAClE,eAAO,MAAM,iBAAiB,QAGmB,CAAA;AASjD,eAAO,MAAM,aAAa,EAAE,QAu5C3B,CAAA"}
package/dist/host/v2.js CHANGED
@@ -57,6 +57,7 @@ import { applyV2RetryGovernor, createRetryGovernor, resolveRetryConfig, roleOfSe
57
57
  import { applyV2ContextPrune, resolvePruneConfig } from "./v2-prune.js";
58
58
  import { applyV2StateCard } from "./v2-state.js";
59
59
  import { applyV2DynamicTail, createDynamicSink, resolveDynamicTailConfig } from "./v2-tail.js";
60
+ import { applyV2SessionInstructions, resolveSessionInstructionsConfig, sessionInstructionsSeamOf } from "./v2-session-instructions.js";
60
61
  import { checkDefaultAgentRole, globalConfigDir } from "./v2-default-agent.js";
61
62
  import { createStorageLedgerStore } from "../tm/ledger.js";
62
63
  import { createTeamScope } from "./v2-scope.js";
@@ -767,14 +768,23 @@ export const v2Personality = {
767
768
  const dynamicTailConfig = resolveDynamicTailConfig(cfg);
768
769
  const dynamicTailEnabled = dynamicTailConfig.enabled;
769
770
  const dynamicSink = createDynamicSink();
771
+ // 易变上下文的去处,优先级写成一条线(而不是三个各自为政的开关):
772
+ // ① 宿主的 keyed session instructions(2.2.0+,`sessionInstructions` 默认 on)——
773
+ // 官方承诺不破缓存、跨压缩存活、不额外起一轮,所以它是首选;
774
+ // ② `dynamicTail`(手动开启)——请求末尾一条消息;
775
+ // ③ 今天的 system 注入——两条缝都不在时的回退(`fallback-system`)。
776
+ // 生产者只认一件事:有没有 sink 可写。所以这里是**唯一**决定它们走哪条路的地方。
777
+ const sessionInstructionsConfig = resolveSessionInstructionsConfig(cfg);
778
+ const sessionInstructionsSeam = sessionInstructionsSeamOf(ctx);
779
+ const sessionInstructionsEnabled = sessionInstructionsConfig.enabled && sessionInstructionsSeam !== null;
780
+ const volatileSink = sessionInstructionsEnabled || dynamicTailEnabled ? dynamicSink : undefined;
770
781
  const session = await applyV2SessionLayer(ctx, {
771
782
  note,
772
783
  noteAgents: ["Team"],
773
784
  plan,
774
785
  scope,
775
- // `dynamicTail: "off"` hands `undefined` instead — the pre-1.9 system path,
776
- // byte for byte.
777
- sink: dynamicTailEnabled ? dynamicSink : undefined,
786
+ // `undefined` hands the producers the pre-1.9 system path, byte for byte.
787
+ sink: volatileSink,
778
788
  // #49 feature 4: 拆分任务. The layer owns no store, so the trajectory sink
779
789
  // is wired here — same shape as the retry governor's `onEvent`.
780
790
  split: resolveSplitConfig(cfg),
@@ -800,8 +810,8 @@ export const v2Personality = {
800
810
  enabled: cfg.stateCard !== "off",
801
811
  boardRoot,
802
812
  scope,
803
- // 状态卡与窗口条目进尾部滞留区(而不是 system)——同一实例,尾层最后统一落一条消息。
804
- sink: dynamicTailEnabled ? dynamicSink : undefined,
813
+ // 状态卡与窗口条目进易变上下文通道(keyed 指令或尾部滞留区,同一实例)——不走 system。
814
+ sink: volatileSink,
805
815
  loadLedger: (sid) => ledgerStore.load(sid),
806
816
  children: () => tmRuntime.hostChildren(),
807
817
  // The prune layer keeps a CUMULATIVE count; the card renders the delta since
@@ -863,7 +873,7 @@ export const v2Personality = {
863
873
  bindRedrive: (fn) => {
864
874
  redriveBound = fn;
865
875
  },
866
- sink: dynamicTailEnabled ? dynamicSink : undefined,
876
+ sink: volatileSink,
867
877
  })
868
878
  : { registrations: [], report: retryGovernor.report, cancelRedrive: () => { } };
869
879
  registrations.push(...retry.registrations);
@@ -925,6 +935,24 @@ export const v2Personality = {
925
935
  }
926
936
  },
927
937
  });
938
+ // `sessionInstructions` 层 — 生产者已经把四段易变上下文写进同一个 sink,本层把
939
+ // 它 drain 成宿主的 keyed 指令(`team-state` / `team-window` / `team-retry` /
940
+ // `team-advice`),只在内容真的变了时 put。先于尾层注册:两者同时开启时本层先
941
+ // 取走 sink,尾层看到空 sink 一个字节都不动(首选通道先拿,不是谁先注册谁赢)。
942
+ // 宿主没有这个缝时它**不注册**,并把实际值报成 `fallback-system`。
943
+ const sessionInstructions = await applyV2SessionInstructions(ctx, {
944
+ enabled: sessionInstructionsConfig.enabled,
945
+ sink: dynamicSink,
946
+ scope,
947
+ onEvent: (row) => {
948
+ try {
949
+ tmRuntime.pipelines.store.appendTrajectory({ tool: "host", step_id: "v2-instructions", api: 2, ...row });
950
+ }
951
+ catch {
952
+ /* a diagnostic that cannot be written never breaks the request it describes */
953
+ }
954
+ },
955
+ });
928
956
  // 易变注入的尾巴 — registered LAST, after the prune layer, so the message it
929
957
  // appends is not a pruning candidate in the same request and every producer
930
958
  // has already written its section. `dynamicTail: "off"` registers nothing.
@@ -991,6 +1019,7 @@ export const v2Personality = {
991
1019
  registrations.push(...session.registrations);
992
1020
  registrations.push(...prune.registrations);
993
1021
  registrations.push(...stateCard.registrations);
1022
+ registrations.push(...sessionInstructions.registrations);
994
1023
  registrations.push(...dynamicTail.registrations);
995
1024
  if (!session.registrations.length) {
996
1025
  notes.push("ctx.session.hook 不存在:工具面裁剪、温度、黑板根目录三项请求层治理都没装上");
@@ -1097,6 +1126,13 @@ export const v2Personality = {
1097
1126
  dynamic_tail_foreign_skipped: dynamicTail.report.foreignSkipped,
1098
1127
  dynamic_tail_no_messages: dynamicTail.report.noMessages,
1099
1128
  dynamic_tail_threw: dynamicTail.report.threw,
1129
+ // `sessionInstructions`(2.2.0 keyed 指令):实际生效的通道 + 三个计数。
1130
+ // `instructions` 是三条路的选择结果:on / off / fallback-system(宿主没有该缝)。
1131
+ instructions: sessionInstructions.report.status,
1132
+ instructions_put: sessionInstructions.report.put,
1133
+ instructions_removed: sessionInstructions.report.removed,
1134
+ instructions_failed: sessionInstructions.report.failed,
1135
+ instructions_absent: sessionInstructions.report.absent,
1100
1136
  // #49 Context Pruning — the history-shrinking half of the budget work.
1101
1137
  prune_enabled: prune.report.enabled,
1102
1138
  prune_at_percent: prune.report.atPercent,
@@ -1373,6 +1409,12 @@ export const v2Personality = {
1373
1409
  dynamic_tail_foreign_skipped: dynamicTail.report.foreignSkipped,
1374
1410
  dynamic_tail_no_messages: dynamicTail.report.noMessages,
1375
1411
  dynamic_tail_threw: dynamicTail.report.threw,
1412
+ // `sessionInstructions`: 与 surface 行同一口径(两处必须一致)。
1413
+ instructions: sessionInstructions.report.status,
1414
+ instructions_put: sessionInstructions.report.put,
1415
+ instructions_removed: sessionInstructions.report.removed,
1416
+ instructions_failed: sessionInstructions.report.failed,
1417
+ instructions_absent: sessionInstructions.report.absent,
1376
1418
  // #49 feature 3: 错峰重试 — the same counter set as the surface row.
1377
1419
  retry_enabled: retry.report.enabled,
1378
1420
  retry_quota_seen: retry.report.quotaSeen,