fix(ptc): name persisted producer attribution ptc-mode

The producer-source refactor introduced the unreleased V4 discriminator
code-mode even though this source identifies images deferred from successful
PTC subcalls. Name it ptc-mode before V4 ships so persisted attribution
matches the producer and does not freeze obsolete terminology into new logs.

Keep the live writer, V3-to-V4 migration output, collision guard, and reserved
producer policy aligned. Both released tools-code-mode and tools-ptc plugin
lookup keys map to ptc-mode. Preserve those historical keys, opaque message
text and IDs, all frozen V0-to-V3 generations, and recorded Session inputs.

Update the owning tests, producer documentation, current catalog, and V4
acknowledgement. The canonical schema audit identifies exactly three changed
roots; reversing only the source literal restores each prior digest. The
large generated JSON diff comes from graph ordering, with 61 roots and 572
types retained.

Validation: the seven-file focused run passed 298 tests and exposed four
stale current-output expectations in two migration files. After correcting
those expectations, both files passed all 23 tests. All 41 documentation
gates and full lint passed; frozen generations and recorded inputs are
unchanged.
This commit is contained in:
Tianyi Cui committed 2026-09-18 19:07:12 +08:00
1 parent fb79a944f5
commit b88afa8a72
24 files changed
+24445 -24435

No files matched your search

@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-09-09-producer-owned-message-sources.md
2026-09-09-producer-owned-message-sources.md: 9bc3e57ff2a2fa251bc72a72f9ea9e39060a0912
2026-09-09-producer-owned-message-sources.zh.md: f587aee39828535f284c9698c8fc5d2948f28ddc
2026-09-09-producer-owned-message-sources.md: 484a082607a02d469c63e17d66dc7726b3a5453a
2026-09-09-producer-owned-message-sources.zh.md: 4fc80b66b9f1c918a52e03d636224d363edefb1b
@@ -10,7 +10,7 @@ Released V3 writers stamped every plugin-produced message with the shared wrappe
## Decision
Message sources are producer-owned: the producer identity is the `kind` itself, declared per plugin through `MessageSourceMap` augmentation, and the released `plugin` field no longer exists in current rows. The V3-to-V4 migration rewrites released plugin attribution onto producer kinds with a frozen rename table in `packages/session/session-format-v3-to-v4/src/sources.ts`: `@deepseek-ai/dsh-system-prompt` becomes `system-prompt` for system-role messages and `runtime-context` otherwise; `compact` becomes `compact-checkpoint`; `tools-code-mode` and `tools-ptc` become `code-mode`; `dsh-compaction-basic` becomes `compact-basic`; any other plugin string keeps its own name as the kind. The wrapper drops without losing identity, context-form fields survive, and tool results lift from released user-role wrapper rows into first-class tool-role messages in the same migration. Rename lookup uses only own keys, and reconstruction preserves every own JSON metadata property, including `__proto__`; legal external producer names cannot resolve to JavaScript prototype members.
Message sources are producer-owned: the producer identity is the `kind` itself, declared per plugin through `MessageSourceMap` augmentation, and the released `plugin` field no longer exists in current rows. The V3-to-V4 migration rewrites released plugin attribution onto producer kinds with a frozen rename table in `packages/session/session-format-v3-to-v4/src/sources.ts`: `@deepseek-ai/dsh-system-prompt` becomes `system-prompt` for system-role messages and `runtime-context` otherwise; `compact` becomes `compact-checkpoint`; `tools-code-mode` and `tools-ptc` become `ptc-mode`; `dsh-compaction-basic` becomes `compact-basic`; any other plugin string keeps its own name as the kind. The wrapper drops without losing identity, context-form fields survive, and tool results lift from released user-role wrapper rows into first-class tool-role messages in the same migration. Rename lookup uses only own keys, and reconstruction preserves every own JSON metadata property, including `__proto__`; legal external producer names cannot resolve to JavaScript prototype members.
Native V4 source admission rejects the retired `kind: 'plugin'` wrapper in every declared durable message slot, including inbox and title-request messages. This refusal applies before recoverable scanning can discard a suffix. Complete source-slot validation runs in the shared known-event pass used by both the format catalog and native JSONL scanner, before either exposes a restored artifact or handle. Unknown nonempty attribution kinds and their extra JSON fields survive without their producer installed. Native compaction and title relationship checks use the producer kinds directly; the [mandatory validation decision](2026-09-17-native-v4-read-validation.md) owns common lifecycle rules.
@@ -10,7 +10,7 @@ Status: implemented
## Decision
消息源是生产者归属的:生产者身份就是 `kind` 本身,由各插件通过 `MessageSourceMap` 声明合并,当前行中不再存在已发布的 `plugin` 字段。V3→V4 迁移用 `packages/session/session-format-v3-to-v4/src/sources.ts`中的冻结重命名表把已发布 plugin 归属改写到生产者 kind:`@deepseek-ai/dsh-system-prompt` 在 system-role 消息上变成 `system-prompt`,否则变成 `runtime-context`;`compact` 变成 `compact-checkpoint`;`tools-code-mode` 与 `tools-ptc` 变成 `code-mode`;`dsh-compaction-basic` 变成 `compact-basic`;其它 plugin 字符串保留自身名字作为 kind。包装丢弃时不丢失身份,上下文形态字段保留,工具结果在同一迁移中从已发布的 user-role 包装行提升为一等 tool-role 消息。重命名查找只读取自有键,重建时保留所有自有 JSON 元数据属性,包括 `__proto__`;合法的外部生产者名字不会被解析为 JavaScript 原型成员。
消息源是生产者归属的:生产者身份就是 `kind` 本身,由各插件通过 `MessageSourceMap` 声明合并,当前行中不再存在已发布的 `plugin` 字段。V3→V4 迁移用 `packages/session/session-format-v3-to-v4/src/sources.ts`中的冻结重命名表把已发布 plugin 归属改写到生产者 kind:`@deepseek-ai/dsh-system-prompt` 在 system-role 消息上变成 `system-prompt`,否则变成 `runtime-context`;`compact` 变成 `compact-checkpoint`;`tools-code-mode` 与 `tools-ptc` 变成 `ptc-mode`;`dsh-compaction-basic` 变成 `compact-basic`;其它 plugin 字符串保留自身名字作为 kind。包装丢弃时不丢失身份,上下文形态字段保留,工具结果在同一迁移中从已发布的 user-role 包装行提升为一等 tool-role 消息。重命名查找只读取自有键,重建时保留所有自有 JSON 元数据属性,包括 `__proto__`;合法的外部生产者名字不会被解析为 JavaScript 原型成员。
原生 V4 消息源准入在每个声明的持久化消息槽位拒绝退役的 `kind: 'plugin'` 包装,包括 inbox 和标题请求消息。可恢复扫描丢弃后缀之前就会执行此拒绝。完整消息源槽位校验在格式目录和原生 JSONL 扫描器共用的已知事件校验中执行,先于两者公开恢复产物或句柄。即使生产者未安装,未知的非空归属 kind 及额外 JSON 字段仍原样保留。原生压缩和标题关系校验直接使用生产者 kind;[强制校验决策](2026-09-17-native-v4-read-validation.zh.md)负责通用生命周期规则。
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/persistence-catalog.md
persistence-catalog.md: 0d97fb37b921effbab4988770af6e93efc360be6
persistence-catalog.zh.md: ea5d1c8dd1691549159bcd24def1116719f0176c
persistence-catalog.md: 94bac3e3478ce021d43a0a000e8c5b59697d95a3
persistence-catalog.zh.md: 608980a2eff2a446e95c94011b3615a247f6e66e
+53 -53
View File
@@ -21,7 +21,7 @@ The [format references](persistence-changes/historical-formats/README.md) cover
| `JsonlHeaderLine` | header | `18ee62b8900a4c3d046700f05d7a4d49d6cab2a660a020c87481d1603dd8bd4f` | [`HeaderLine`](#persistence-type-sha256-18ee62b8900a4c3d046700f05d7a4d49d6cab2a660a020c87481d1603dd8bd4f) |
| `SessionEventEnvelope` | envelope | `5776e5553ff2dfe3f5bc202dbb1e7c9f93e35a531aebb7764c23b2b6153b2ccc` | [`union (3 variants)`](#persistence-type-sha256-5776e5553ff2dfe3f5bc202dbb1e7c9f93e35a531aebb7764c23b2b6153b2ccc) |
| `event:agent-preset/selected` | event | `a10c17474eaf2ddab7095a099e0fe3d046fc18e56c3e344fc8894c05ff9ef97b` | [`{ type: "agent-preset/selected" }`](#persistence-type-sha256-a10c17474eaf2ddab7095a099e0fe3d046fc18e56c3e344fc8894c05ff9ef97b) |
| `event:agent/inbox/spliced` | event | `ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f` | [`{ type: "agent/inbox/spliced" }`](#persistence-type-sha256-ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f) |
| `event:agent/inbox/spliced` | event | `3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367` | [`{ type: "agent/inbox/spliced" }`](#persistence-type-sha256-3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367) |
| `event:approval/asked` | event | `3bfeb47b58606f4661904bc723da612782214c463d01e6d61cd6d6193d7374e1` | [`{ type: "approval/asked" }`](#persistence-type-sha256-3bfeb47b58606f4661904bc723da612782214c463d01e6d61cd6d6193d7374e1) |
| `event:approval/decided` | event | `bb1ab3d08f49a9f3b265f844cd78d5c49813062a7b34b54904b426f85d0ff6e3` | [`{ type: "approval/decided" }`](#persistence-type-sha256-bb1ab3d08f49a9f3b265f844cd78d5c49813062a7b34b54904b426f85d0ff6e3) |
| `event:approval/policy` | event | `26718e15e7e395bce9642dba5bbe09b3b1a4ce2213d20d566cd9207d7fc5fb78` | [`{ type: "approval/policy" }`](#persistence-type-sha256-26718e15e7e395bce9642dba5bbe09b3b1a4ce2213d20d566cd9207d7fc5fb78) |
@@ -53,7 +53,7 @@ The [format references](persistence-changes/historical-formats/README.md) cover
| `event:session-log-deepseek/delivery-accepted` | event | `d63b8b8ffad9c02fd80c43a17df4f240c1fe8118ecca9de34f9d5871838ab5b9` | [`{ type: "session-log-deepseek/delivery-accepted" }`](#persistence-type-sha256-d63b8b8ffad9c02fd80c43a17df4f240c1fe8118ecca9de34f9d5871838ab5b9) |
| `event:session/end-seed` | event | `5e6db6e24948d4a853c71cb9fabd252ad051ce93d4672c1266cf837c1c17b84e` | [`{ type: "session/end-seed" }`](#persistence-type-sha256-5e6db6e24948d4a853c71cb9fabd252ad051ce93d4672c1266cf837c1c17b84e) |
| `event:session/title` | event | `1b912703e2d64f91c99c675b8f805b01076c8325b905c1218ad81ef0b24909d5` | [`{ type: "session/title" }`](#persistence-type-sha256-1b912703e2d64f91c99c675b8f805b01076c8325b905c1218ad81ef0b24909d5) |
| `event:session/title-llm-request` | event | `eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f` | [`{ type: "session/title-llm-request" }`](#persistence-type-sha256-eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f) |
| `event:session/title-llm-request` | event | `4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19` | [`{ type: "session/title-llm-request" }`](#persistence-type-sha256-4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19) |
| `event:step/end` | event | `e0a787e6ec76c7c94fecbc501b489164ab0293db05bc947914077ad01e674f05` | [`{ type: "step/end" }`](#persistence-type-sha256-e0a787e6ec76c7c94fecbc501b489164ab0293db05bc947914077ad01e674f05) |
| `event:step/start` | event | `4513e088d43e6c68425be30451b9f961cc264fe7318ca62681c41d4d78615986` | [`{ type: "step/start" }`](#persistence-type-sha256-4513e088d43e6c68425be30451b9f961cc264fe7318ca62681c41d4d78615986) |
| `event:subagent/catalog` | event | `ae1f7110feeec697b8cab42b68f7709aa7b3279764099dfb53c25890d2e5c871` | [`{ type: "subagent/catalog" }`](#persistence-type-sha256-ae1f7110feeec697b8cab42b68f7709aa7b3279764099dfb53c25890d2e5c871) |
@@ -75,7 +75,7 @@ The [format references](persistence-changes/historical-formats/README.md) cover
| `event:tool/result` | event | `f4c6f3eae6607f412a9023406c8c3bd351a02451848bb78c2436f409447dd60c` | [`{ type: "tool/result" }`](#persistence-type-sha256-f4c6f3eae6607f412a9023406c8c3bd351a02451848bb78c2436f409447dd60c) |
| `event:turn/end` | event | `0f8512903d94f57a4748fa1a2092e64342856796684e6b8343db685b192745ce` | [`{ type: "turn/end" }`](#persistence-type-sha256-0f8512903d94f57a4748fa1a2092e64342856796684e6b8343db685b192745ce) |
| `event:turn/start` | event | `aa0957eca50aeb28bcd2e6930b95809926edacb550c8c340ba526ba6b861b3d8` | [`{ type: "turn/start" }`](#persistence-type-sha256-aa0957eca50aeb28bcd2e6930b95809926edacb550c8c340ba526ba6b861b3d8) |
| `event:user/message` | event | `46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95` | [`{ type: "user/message" }`](#persistence-type-sha256-46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95) |
| `event:user/message` | event | `c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836` | [`{ type: "user/message" }`](#persistence-type-sha256-c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836) |
| `event:web/deepseek-search-llm-request` | event | `cf6e3aaf1e2de6480aa0157730a41b9a492108a55304100b0f7e112711dd4331` | [`{ type: "web/deepseek-search-llm-request" }`](#persistence-type-sha256-cf6e3aaf1e2de6480aa0157730a41b9a492108a55304100b0f7e112711dd4331) |
| `event:workspace/changes` | event | `e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72` | [`{ type: "workspace/changes" }`](#persistence-type-sha256-e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72) |
@@ -1496,14 +1496,6 @@ SHA-256: `e7e154d47d5fbc5366330fb4dade1f108c6dfe4335044d21ded14b7bf1dce084`
`"clear"`
<a id="persistence-type-sha256-1443074511c1f99aaac262e60f81282cd4f2790e7c7ca0d11499bbe7c1e769bf"></a>
### `"code-mode"`
SHA-256: `1443074511c1f99aaac262e60f81282cd4f2790e7c7ca0d11499bbe7c1e769bf`
`"code-mode"`
<a id="persistence-type-sha256-15495614ccfa9cbdeefb0ec2abd76406435f4c6ff3dae42acae8e09ef42025c9"></a>
### `"codex"`
@@ -2142,6 +2134,14 @@ SHA-256: `871bfd6f7bb91061246768d3377f3fd58d6b8ea7c31f44c714ae7ab215650d62`
`"provisioning"`
<a id="persistence-type-sha256-4edec1b770e8ec4ce1220bf42edc5ac46713a1b48d4caa778dcfc98bad1f28a3"></a>
### `"ptc-mode"`
SHA-256: `4edec1b770e8ec4ce1220bf42edc5ac46713a1b48d4caa778dcfc98bad1f28a3`
`"ptc-mode"`
<a id="persistence-type-sha256-12a0cfa619ac4a5fc6c3e8e359c8dae15769edc61497a575935c78d5842f8e42"></a>
### `"read-only"`
@@ -3724,7 +3724,7 @@ Sources: [`packages/llm/llm-retry/src/types.ts:43`](../packages/llm/llm-retry/sr
| `step` | required | `number` |
| `turn` | required | `number` |
<a id="persistence-type-sha256-cc2968a9a0a95309a7d3218dcb0c55d153fe7b8c03b5648ea6fcc69d91a64a7f"></a>
<a id="persistence-type-sha256-5d2c092b195b5319447d2daa9fef91291b937763c946f38a070e1c630b3aafe1"></a>
<a id="persistence-type-message"></a>
@@ -3732,14 +3732,14 @@ Sources: [`packages/llm/llm-retry/src/types.ts:43`](../packages/llm/llm-retry/sr
### `Message`
SHA-256: `cc2968a9a0a95309a7d3218dcb0c55d153fe7b8c03b5648ea6fcc69d91a64a7f`
SHA-256: `5d2c092b195b5319447d2daa9fef91291b937763c946f38a070e1c630b3aafe1`
Sources: [`packages/llm/llm/src/message.ts:190`](../packages/llm/llm/src/message.ts)
One of:
- [`ToolResultMessage`](#persistence-type-sha256-8a8b1c3cf223fe58bbe45ea57f0b80eb262a653066dfe5683a648390ed91c13c)
- [`UserMessage`](#persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95)
- [`UserMessage`](#persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb)
- [`AssistantMessage`](#persistence-type-sha256-fd796823ba99092846b017e4a9c2d8ea5a1c8e15a3125662cadba1860ceb1b05)
- [`SystemMessage`](#persistence-type-sha256-20a3c1c8a3154e4ae69eada1212e3216baf93454ee4c745565b9374d7539fe8b)
@@ -3816,7 +3816,7 @@ One of:
- `"negative"`
- `"positive"`
<a id="persistence-type-sha256-7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e"></a>
<a id="persistence-type-sha256-975cf73c9f141cb80d0aaa5e507d5157e455182e0d3338cc2c5410ada98a0d37"></a>
<a id="persistence-type-messagesource"></a>
@@ -3824,7 +3824,7 @@ One of:
### `MessageSource`
SHA-256: `7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e`
SHA-256: `975cf73c9f141cb80d0aaa5e507d5157e455182e0d3338cc2c5410ada98a0d37`
Sources: [`packages/llm/llm/src/message.ts:136`](../packages/llm/llm/src/message.ts)
@@ -3832,7 +3832,6 @@ Sources: [`packages/llm/llm/src/message.ts:136`](../packages/llm/llm/src/message
|---|---|---|---|
| `agent-instructions` | `"instructions"` | `changes`: [`AgentInstructionChange[]`](#persistence-type-sha256-2ab12a0e345658f9342816d773fe610f049982bcad82631f43b9205abe43e5ee) | [`AgentInstructionSource`](#persistence-type-sha256-6f22a9d02b9a1f1157f3b0e7bdccd7e7b12b085c4efdb709dfc74a465cd4e590) |
| `agent-message` | `"relay"` | `senderSessionId`: `string` | [`AgentMessageSource`](#persistence-type-sha256-4a9bef9f27a942520cc2279ca7dd3082556e4bff543f66b5c0333e1bbed1cd86) |
| `code-mode` | not declared | none | [`{ kind: "code-mode" }`](#persistence-type-sha256-b0fdf76590690063dff16e2ba5aa14cb6ed074b61980b3860c299c2e8efc7a1a) |
| `compact-checkpoint` | not declared | `compactionId`: `string` | [`CompactionCheckpointSource`](#persistence-type-sha256-31907de9563751822af6d9be02bafaf26faa098bbd1cb412524134d577cc1648) |
| `cordis-host-runner` | not declared | none | [`{ kind: "cordis-host-runner" }`](#persistence-type-sha256-02b2c23f2d94b028c9588a8faace3fce1217405db346da3389368b495457bf79) |
| `dsh-session-title-llm` | `"catalog"` | none | [`{ kind: "dsh-session-title-llm", form: "catalog" }`](#persistence-type-sha256-80677c8c8b804189a0fde8aa70dd4ad7af8bb12dfd03027e8e023c8592c838bc) |
@@ -3872,6 +3871,7 @@ Sources: [`packages/llm/llm/src/message.ts:136`](../packages/llm/llm/src/message
| `plan-mode` | `"relay"` | none | [`{ kind: "plan-mode", form: "relay" }`](#persistence-type-sha256-deaae5cd30987d4f49398e8f9d994c125907e7f928300745fb1dbf15f145d0e7) |
| `plan-mode` | `"snapshot"` | `sections`: [`ContextSnapshotSection[]`](#persistence-type-sha256-c748fb42c80a120038a8c587af80ec39924803c401364db11c8974d5bf6d0262) | [`{ kind: "plan-mode", form: "snapshot" }`](#persistence-type-sha256-8c1c4f72755a78ea163523a46565316e36e9b644382eb48e6635c71a6f412dd2) |
| `plan-mode` | not declared | none | [`{ kind: "plan-mode" }`](#persistence-type-sha256-f4a66f654996c093aae700ea4c434ff2ee3569fea9c0e5813ccf6afdccabd163) |
| `ptc-mode` | not declared | none | [`{ kind: "ptc-mode" }`](#persistence-type-sha256-dba54c09c6e7aafc9acbed7792ecc920d99f92d0784aeeed10af55f7fe0bc8cd) |
| `repeat-tool-reminder` | `"catalog"` | none | [`{ kind: "repeat-tool-reminder", form: "catalog" }`](#persistence-type-sha256-d85590a5675c6e2fd8164e5792a6cceac714605b8ac228adae5ee668facb1490) |
| `repeat-tool-reminder` | `"instructions"` | none | [`{ kind: "repeat-tool-reminder", form: "instructions" }`](#persistence-type-sha256-6f44f32be9bcd9a8bf075c3b575b06c8ed63446386e5b0995c7b73762e68ddae) |
| `repeat-tool-reminder` | `"notice"` | `summary`: `string` | [`{ kind: "repeat-tool-reminder", form: "notice" }`](#persistence-type-sha256-fe1a7acdeed4d0f5ab483396eaa5b3dc97263b7c10eb4da2f0028cb01728bfc9) |
@@ -3939,13 +3939,13 @@ Sources: [`packages/llm/llm/src/message.ts:136`](../packages/llm/llm/src/message
| `user-approval` | not declared | none | [`{ kind: "user-approval" }`](#persistence-type-sha256-6292bcbedaa97feaec5b48a03bb8144b581b93309d9d6c905f26da7a6a7a0a4f) |
| `webhook` | `"notice"` | `deliveryId`: `string`; `provider`: `string`; `ruleId`: `string`; `source`: `string`; `summary`: `string` | [`{ kind: "webhook", form: "notice" }`](#persistence-type-sha256-9edc162949abf93bd5ff049191b345454ba104f583937ce5580fb50f067d2b94) |
<a id="persistence-type-sha256-531c1bf918d4ce9eeb8a51d32484587bc77a62e5806d8c29e64040fcafd6517e"></a>
<a id="persistence-type-sha256-cf07bfb910feecbfe0bc036b4679eef9baf1dbda9bdd2d25d0fd90c6a8753188"></a>
### `Message[]`
SHA-256: `531c1bf918d4ce9eeb8a51d32484587bc77a62e5806d8c29e64040fcafd6517e`
SHA-256: `cf07bfb910feecbfe0bc036b4679eef9baf1dbda9bdd2d25d0fd90c6a8753188`
Array of [`Message`](#persistence-type-sha256-cc2968a9a0a95309a7d3218dcb0c55d153fe7b8c03b5648ea6fcc69d91a64a7f).
Array of [`Message`](#persistence-type-sha256-5d2c092b195b5319447d2daa9fef91291b937763c946f38a070e1c630b3aafe1).
<a id="persistence-type-sha256-719c51f67074f97034a6c94297fe1f4b5d3c8d392c57586dab732aa5398c7a91"></a>
@@ -4330,7 +4330,7 @@ Sources: [`packages/session/session-title/src/types.ts:41`](../packages/session/
| `source` | required | [`SessionTitleSource`](#persistence-type-sha256-30d5a537b296685770b1241c4b4bbde19d5a31ff81aa23df73fab5e90b8fc65f) |
| `title` | required | `string` |
<a id="persistence-type-sha256-608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d"></a>
<a id="persistence-type-sha256-1dfb04b0296cab90e4e0f159b95300d79644817718e05e3ed79907d98447af36"></a>
<a id="persistence-type-packagessessionsession-title-llmsrcindextssessiontitlellmrequesteventdata"></a>
@@ -4338,7 +4338,7 @@ Sources: [`packages/session/session-title/src/types.ts:41`](../packages/session/
### `SessionTitleLlmRequestEventData`
SHA-256: `608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d`
SHA-256: `1dfb04b0296cab90e4e0f159b95300d79644817718e05e3ed79907d98447af36`
Sources: [`packages/session/session-title-llm/src/index.ts:34`](../packages/session/session-title-llm/src/index.ts)
@@ -4346,7 +4346,7 @@ Sources: [`packages/session/session-title-llm/src/index.ts:34`](../packages/sess
|---|---|---|
| `maxTokens` | required | `number` |
| `messageSeqs` | required | [`number[]`](#persistence-type-sha256-5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78) |
| `messages` | required | [`Message[]`](#persistence-type-sha256-531c1bf918d4ce9eeb8a51d32484587bc77a62e5806d8c29e64040fcafd6517e) |
| `messages` | required | [`Message[]`](#persistence-type-sha256-cf07bfb910feecbfe0bc036b4679eef9baf1dbda9bdd2d25d0fd90c6a8753188) |
| `route` | required | [`SessionTitleModelIdentity`](#persistence-type-sha256-07e1a58c58b593f507b8e7f25723bb0aa42baae6e00f5ecfddf28cb1e64d3235) |
| `system` | required | `string` |
| `titleProvider` | required | `string` |
@@ -4961,7 +4961,7 @@ Sources: [`packages/core/session/src/types.ts:231`](../packages/core/session/src
| `interrupted` | not declared | none | [`{ kind: "interrupted" }`](#persistence-type-sha256-56b7c047694875a843ba020dfea3c8380d54ae4ff88ab349e72004dc21e07c23) |
| `max-tokens` | not declared | none | [`{ kind: "max-tokens" }`](#persistence-type-sha256-ab7ec5f9eb2c6dfacca5da4c37cf7ba85d04172053ee6b1ebf1709ffcd99c1a7) |
<a id="persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95"></a>
<a id="persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb"></a>
<a id="persistence-type-packagesllmllmsrcmessagetsusermessage"></a>
@@ -4969,7 +4969,7 @@ Sources: [`packages/core/session/src/types.ts:231`](../packages/core/session/src
### `UserMessage`
SHA-256: `980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95`
SHA-256: `4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb`
Sources: [`packages/llm/llm/src/message.ts:157`](../packages/llm/llm/src/message.ts)
@@ -4978,19 +4978,19 @@ Sources: [`packages/llm/llm/src/message.ts:157`](../packages/llm/llm/src/message
| `content` | required | [`ContentBlock[]`](#persistence-type-sha256-a951a47d0ebf7d7ac401d1ec2fe4e138a43288c5ad2b0cf029a90b97d718f1e6) |
| `id` | required | `string` |
| `role` | required | `"user"` |
| `source` | required | [`MessageSource`](#persistence-type-sha256-7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e) |
| `source` | required | [`MessageSource`](#persistence-type-sha256-975cf73c9f141cb80d0aaa5e507d5157e455182e0d3338cc2c5410ada98a0d37) |
Source compatibility: `source` — `session-source-attribution` v1; `session.user-message.source`; `kind`; `preserve`.
Attribution-only additions: `tmux-context`.
<a id="persistence-type-sha256-fc336025695a2213c63d0fe8715307c6a6ede867713bbf2ab1c8ff9760fdee1f"></a>
<a id="persistence-type-sha256-20e1a1a15728cfcf17a451cc82b54b61dcb0f7abe92403fc0aa1b8f7652c6e5b"></a>
### `UserMessage[]`
SHA-256: `fc336025695a2213c63d0fe8715307c6a6ede867713bbf2ab1c8ff9760fdee1f`
SHA-256: `20e1a1a15728cfcf17a451cc82b54b61dcb0f7abe92403fc0aa1b8f7652c6e5b`
Array of [`UserMessage`](#persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95).
Array of [`UserMessage`](#persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb).
<a id="persistence-type-sha256-c2deb7c9183735d4e0fffddf5c623f4e34daa1c8e96b111982e957dfcbbcf896"></a>
@@ -5871,17 +5871,17 @@ Sources: [`packages/core/session/src/types.ts:418`](../packages/core/session/src
|---|---|---|
| `inherited` | optional | `true` |
<a id="persistence-type-sha256-37af4fdde18eb8638d5037243e0ee1c617b9b1062ae9dbee086feafad852112f"></a>
<a id="persistence-type-sha256-3f7222390f22d3d2ab1d7e9cc5d10ca06d878c9c6e89eb1180b39b39136b7779"></a>
### `{ inserted, outcome?, removedCount?, start, … }`
SHA-256: `37af4fdde18eb8638d5037243e0ee1c617b9b1062ae9dbee086feafad852112f`
SHA-256: `3f7222390f22d3d2ab1d7e9cc5d10ca06d878c9c6e89eb1180b39b39136b7779`
Sources: [`packages/core/agent/src/types.ts:87`](../packages/core/agent/src/types.ts)
| Property | Presence | Type |
|---|---|---|
| `inserted` | required | [`UserMessage[]`](#persistence-type-sha256-fc336025695a2213c63d0fe8715307c6a6ede867713bbf2ab1c8ff9760fdee1f) |
| `inserted` | required | [`UserMessage[]`](#persistence-type-sha256-20e1a1a15728cfcf17a451cc82b54b61dcb0f7abe92403fc0aa1b8f7652c6e5b) |
| `outcome` | optional | `"canceled"` |
| `removedCount` | optional | `number` |
| `start` | required | `number` |
@@ -5929,18 +5929,6 @@ Sources: [`packages/core/session/src/types.ts:205`](../packages/core/session/src
|---|---|---|
| `kind` | required | `"blocked"` |
<a id="persistence-type-sha256-b0fdf76590690063dff16e2ba5aa14cb6ed074b61980b3860c299c2e8efc7a1a"></a>
### `{ kind: "code-mode" }`
SHA-256: `b0fdf76590690063dff16e2ba5aa14cb6ed074b61980b3860c299c2e8efc7a1a`
Sources: [`packages/core/tools/src/ptc.ts:13`](../packages/core/tools/src/ptc.ts)
| Property | Presence | Type |
|---|---|---|
| `kind` | required | `"code-mode"` |
<a id="persistence-type-sha256-b6ef9c6210be8350cd465f485cf520031fffa6bf3809c61a1e713e834c5982d0"></a>
### `{ kind: "completed" }`
@@ -6466,6 +6454,18 @@ Sources: [`packages/session/session-title/src/types.ts:30`](../packages/session/
| `model` | optional | [`SessionTitleModelIdentity`](#persistence-type-sha256-07e1a58c58b593f507b8e7f25723bb0aa42baae6e00f5ecfddf28cb1e64d3235) |
| `provider` | required | `string` |
<a id="persistence-type-sha256-dba54c09c6e7aafc9acbed7792ecc920d99f92d0784aeeed10af55f7fe0bc8cd"></a>
### `{ kind: "ptc-mode" }`
SHA-256: `dba54c09c6e7aafc9acbed7792ecc920d99f92d0784aeeed10af55f7fe0bc8cd`
Sources: [`packages/core/tools/src/ptc.ts:14`](../packages/core/tools/src/ptc.ts)
| Property | Presence | Type |
|---|---|---|
| `kind` | required | `"ptc-mode"` |
<a id="persistence-type-sha256-b062078e899958f99ae464514578b8c093924dfe34bd9a835932b420ff2150b1"></a>
### `{ kind: "repeat-tool-reminder" }`
@@ -7403,17 +7403,17 @@ SHA-256: `a10c17474eaf2ddab7095a099e0fe3d046fc18e56c3e344fc8894c05ff9ef97b`
| `time` | required | `number` |
| `type` | required | `"agent-preset/selected"` |
<a id="persistence-type-sha256-ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f"></a>
<a id="persistence-type-sha256-3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367"></a>
<a id="persistence-type-eventagentinboxspliced"></a>
### `{ type: "agent/inbox/spliced" }`
SHA-256: `ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f`
SHA-256: `3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367`
| Property | Presence | Type |
|---|---|---|
| `data` | required | [`{ inserted, outcome?, removedCount?, start, … }`](#persistence-type-sha256-37af4fdde18eb8638d5037243e0ee1c617b9b1062ae9dbee086feafad852112f) |
| `data` | required | [`{ inserted, outcome?, removedCount?, start, … }`](#persistence-type-sha256-3f7222390f22d3d2ab1d7e9cc5d10ca06d878c9c6e89eb1180b39b39136b7779) |
| `ignorable` | optional | `true` |
| `seq` | required | `number` |
| `time` | required | `number` |
@@ -8002,17 +8002,17 @@ SHA-256: `1b912703e2d64f91c99c675b8f805b01076c8325b905c1218ad81ef0b24909d5`
| `time` | required | `number` |
| `type` | required | `"session/title"` |
<a id="persistence-type-sha256-eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f"></a>
<a id="persistence-type-sha256-4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19"></a>
<a id="persistence-type-eventsessiontitle-llm-request"></a>
### `{ type: "session/title-llm-request" }`
SHA-256: `eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f`
SHA-256: `4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19`
| Property | Presence | Type |
|---|---|---|
| `data` | required | [`SessionTitleLlmRequestEventData`](#persistence-type-sha256-608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d) |
| `data` | required | [`SessionTitleLlmRequestEventData`](#persistence-type-sha256-1dfb04b0296cab90e4e0f159b95300d79644817718e05e3ed79907d98447af36) |
| `ignorable` | optional | `true` |
| `seq` | required | `number` |
| `time` | required | `number` |
@@ -8435,17 +8435,17 @@ Sources: [`packages/llm/llm/src/types.ts:423`](../packages/llm/llm/src/types.ts)
| `type` | required | `"usage"` |
| `usage` | required | [`TokenUsage`](#persistence-type-sha256-fec5442b9ee4122e10514d81d5a43648003fe8bfb7ee2ba50c0cdbdd383ed394) |
<a id="persistence-type-sha256-46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95"></a>
<a id="persistence-type-sha256-c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836"></a>
<a id="persistence-type-eventusermessage"></a>
### `{ type: "user/message" }`
SHA-256: `46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95`
SHA-256: `c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836`
| Property | Presence | Type |
|---|---|---|
| `data` | required | [`UserMessage`](#persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95) |
| `data` | required | [`UserMessage`](#persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb) |
| `ignorable` | optional | `true` |
| `seq` | required | `number` |
| `sourceEventSeqs` | optional | [`number[]`](#persistence-type-sha256-5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78) |
+53 -53
View File
@@ -23,7 +23,7 @@
| `JsonlHeaderLine` | header | `18ee62b8900a4c3d046700f05d7a4d49d6cab2a660a020c87481d1603dd8bd4f` | [`HeaderLine`](#persistence-type-sha256-18ee62b8900a4c3d046700f05d7a4d49d6cab2a660a020c87481d1603dd8bd4f) |
| `SessionEventEnvelope` | envelope | `5776e5553ff2dfe3f5bc202dbb1e7c9f93e35a531aebb7764c23b2b6153b2ccc` | [`union (3 variants)`](#persistence-type-sha256-5776e5553ff2dfe3f5bc202dbb1e7c9f93e35a531aebb7764c23b2b6153b2ccc) |
| `event:agent-preset/selected` | event | `a10c17474eaf2ddab7095a099e0fe3d046fc18e56c3e344fc8894c05ff9ef97b` | [`{ type: "agent-preset/selected" }`](#persistence-type-sha256-a10c17474eaf2ddab7095a099e0fe3d046fc18e56c3e344fc8894c05ff9ef97b) |
| `event:agent/inbox/spliced` | event | `ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f` | [`{ type: "agent/inbox/spliced" }`](#persistence-type-sha256-ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f) |
| `event:agent/inbox/spliced` | event | `3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367` | [`{ type: "agent/inbox/spliced" }`](#persistence-type-sha256-3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367) |
| `event:approval/asked` | event | `3bfeb47b58606f4661904bc723da612782214c463d01e6d61cd6d6193d7374e1` | [`{ type: "approval/asked" }`](#persistence-type-sha256-3bfeb47b58606f4661904bc723da612782214c463d01e6d61cd6d6193d7374e1) |
| `event:approval/decided` | event | `bb1ab3d08f49a9f3b265f844cd78d5c49813062a7b34b54904b426f85d0ff6e3` | [`{ type: "approval/decided" }`](#persistence-type-sha256-bb1ab3d08f49a9f3b265f844cd78d5c49813062a7b34b54904b426f85d0ff6e3) |
| `event:approval/policy` | event | `26718e15e7e395bce9642dba5bbe09b3b1a4ce2213d20d566cd9207d7fc5fb78` | [`{ type: "approval/policy" }`](#persistence-type-sha256-26718e15e7e395bce9642dba5bbe09b3b1a4ce2213d20d566cd9207d7fc5fb78) |
@@ -55,7 +55,7 @@
| `event:session-log-deepseek/delivery-accepted` | event | `d63b8b8ffad9c02fd80c43a17df4f240c1fe8118ecca9de34f9d5871838ab5b9` | [`{ type: "session-log-deepseek/delivery-accepted" }`](#persistence-type-sha256-d63b8b8ffad9c02fd80c43a17df4f240c1fe8118ecca9de34f9d5871838ab5b9) |
| `event:session/end-seed` | event | `5e6db6e24948d4a853c71cb9fabd252ad051ce93d4672c1266cf837c1c17b84e` | [`{ type: "session/end-seed" }`](#persistence-type-sha256-5e6db6e24948d4a853c71cb9fabd252ad051ce93d4672c1266cf837c1c17b84e) |
| `event:session/title` | event | `1b912703e2d64f91c99c675b8f805b01076c8325b905c1218ad81ef0b24909d5` | [`{ type: "session/title" }`](#persistence-type-sha256-1b912703e2d64f91c99c675b8f805b01076c8325b905c1218ad81ef0b24909d5) |
| `event:session/title-llm-request` | event | `eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f` | [`{ type: "session/title-llm-request" }`](#persistence-type-sha256-eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f) |
| `event:session/title-llm-request` | event | `4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19` | [`{ type: "session/title-llm-request" }`](#persistence-type-sha256-4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19) |
| `event:step/end` | event | `e0a787e6ec76c7c94fecbc501b489164ab0293db05bc947914077ad01e674f05` | [`{ type: "step/end" }`](#persistence-type-sha256-e0a787e6ec76c7c94fecbc501b489164ab0293db05bc947914077ad01e674f05) |
| `event:step/start` | event | `4513e088d43e6c68425be30451b9f961cc264fe7318ca62681c41d4d78615986` | [`{ type: "step/start" }`](#persistence-type-sha256-4513e088d43e6c68425be30451b9f961cc264fe7318ca62681c41d4d78615986) |
| `event:subagent/catalog` | event | `ae1f7110feeec697b8cab42b68f7709aa7b3279764099dfb53c25890d2e5c871` | [`{ type: "subagent/catalog" }`](#persistence-type-sha256-ae1f7110feeec697b8cab42b68f7709aa7b3279764099dfb53c25890d2e5c871) |
@@ -77,7 +77,7 @@
| `event:tool/result` | event | `f4c6f3eae6607f412a9023406c8c3bd351a02451848bb78c2436f409447dd60c` | [`{ type: "tool/result" }`](#persistence-type-sha256-f4c6f3eae6607f412a9023406c8c3bd351a02451848bb78c2436f409447dd60c) |
| `event:turn/end` | event | `0f8512903d94f57a4748fa1a2092e64342856796684e6b8343db685b192745ce` | [`{ type: "turn/end" }`](#persistence-type-sha256-0f8512903d94f57a4748fa1a2092e64342856796684e6b8343db685b192745ce) |
| `event:turn/start` | event | `aa0957eca50aeb28bcd2e6930b95809926edacb550c8c340ba526ba6b861b3d8` | [`{ type: "turn/start" }`](#persistence-type-sha256-aa0957eca50aeb28bcd2e6930b95809926edacb550c8c340ba526ba6b861b3d8) |
| `event:user/message` | event | `46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95` | [`{ type: "user/message" }`](#persistence-type-sha256-46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95) |
| `event:user/message` | event | `c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836` | [`{ type: "user/message" }`](#persistence-type-sha256-c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836) |
| `event:web/deepseek-search-llm-request` | event | `cf6e3aaf1e2de6480aa0157730a41b9a492108a55304100b0f7e112711dd4331` | [`{ type: "web/deepseek-search-llm-request" }`](#persistence-type-sha256-cf6e3aaf1e2de6480aa0157730a41b9a492108a55304100b0f7e112711dd4331) |
| `event:workspace/changes` | event | `e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72` | [`{ type: "workspace/changes" }`](#persistence-type-sha256-e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72) |
@@ -1498,14 +1498,6 @@ SHA-256: `e7e154d47d5fbc5366330fb4dade1f108c6dfe4335044d21ded14b7bf1dce084`
`"clear"`
<a id="persistence-type-sha256-1443074511c1f99aaac262e60f81282cd4f2790e7c7ca0d11499bbe7c1e769bf"></a>
### `"code-mode"`
SHA-256: `1443074511c1f99aaac262e60f81282cd4f2790e7c7ca0d11499bbe7c1e769bf`
`"code-mode"`
<a id="persistence-type-sha256-15495614ccfa9cbdeefb0ec2abd76406435f4c6ff3dae42acae8e09ef42025c9"></a>
### `"codex"`
@@ -2144,6 +2136,14 @@ SHA-256: `871bfd6f7bb91061246768d3377f3fd58d6b8ea7c31f44c714ae7ab215650d62`
`"provisioning"`
<a id="persistence-type-sha256-4edec1b770e8ec4ce1220bf42edc5ac46713a1b48d4caa778dcfc98bad1f28a3"></a>
### `"ptc-mode"`
SHA-256: `4edec1b770e8ec4ce1220bf42edc5ac46713a1b48d4caa778dcfc98bad1f28a3`
`"ptc-mode"`
<a id="persistence-type-sha256-12a0cfa619ac4a5fc6c3e8e359c8dae15769edc61497a575935c78d5842f8e42"></a>
### `"read-only"`
@@ -3726,7 +3726,7 @@ SHA-256: `6f72ece8f317cd080c4f20a93f1bf709965f5b81ac4669528f5a023191cfcf20`
| `step` | 必需 | `number` |
| `turn` | 必需 | `number` |
<a id="persistence-type-sha256-cc2968a9a0a95309a7d3218dcb0c55d153fe7b8c03b5648ea6fcc69d91a64a7f"></a>
<a id="persistence-type-sha256-5d2c092b195b5319447d2daa9fef91291b937763c946f38a070e1c630b3aafe1"></a>
<a id="persistence-type-message"></a>
@@ -3734,14 +3734,14 @@ SHA-256: `6f72ece8f317cd080c4f20a93f1bf709965f5b81ac4669528f5a023191cfcf20`
### `Message`
SHA-256: `cc2968a9a0a95309a7d3218dcb0c55d153fe7b8c03b5648ea6fcc69d91a64a7f`
SHA-256: `5d2c092b195b5319447d2daa9fef91291b937763c946f38a070e1c630b3aafe1`
来源:[`packages/llm/llm/src/message.ts:190`](../packages/llm/llm/src/message.ts)
以下类型之一:
- [`ToolResultMessage`](#persistence-type-sha256-8a8b1c3cf223fe58bbe45ea57f0b80eb262a653066dfe5683a648390ed91c13c)
- [`UserMessage`](#persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95)
- [`UserMessage`](#persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb)
- [`AssistantMessage`](#persistence-type-sha256-fd796823ba99092846b017e4a9c2d8ea5a1c8e15a3125662cadba1860ceb1b05)
- [`SystemMessage`](#persistence-type-sha256-20a3c1c8a3154e4ae69eada1212e3216baf93454ee4c745565b9374d7539fe8b)
@@ -3818,7 +3818,7 @@ SHA-256: `390eed1028aba02774f14408647acec10ec5516e97d4f15ecde2b9989d5a69f2`
- `"negative"`
- `"positive"`
<a id="persistence-type-sha256-7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e"></a>
<a id="persistence-type-sha256-975cf73c9f141cb80d0aaa5e507d5157e455182e0d3338cc2c5410ada98a0d37"></a>
<a id="persistence-type-messagesource"></a>
@@ -3826,7 +3826,7 @@ SHA-256: `390eed1028aba02774f14408647acec10ec5516e97d4f15ecde2b9989d5a69f2`
### `MessageSource`
SHA-256: `7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e`
SHA-256: `975cf73c9f141cb80d0aaa5e507d5157e455182e0d3338cc2c5410ada98a0d37`
来源:[`packages/llm/llm/src/message.ts:136`](../packages/llm/llm/src/message.ts)
@@ -3834,7 +3834,6 @@ SHA-256: `7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e`
|---|---|---|---|
| `agent-instructions` | `"instructions"` | `changes`: [`AgentInstructionChange[]`](#persistence-type-sha256-2ab12a0e345658f9342816d773fe610f049982bcad82631f43b9205abe43e5ee) | [`AgentInstructionSource`](#persistence-type-sha256-6f22a9d02b9a1f1157f3b0e7bdccd7e7b12b085c4efdb709dfc74a465cd4e590) |
| `agent-message` | `"relay"` | `senderSessionId`: `string` | [`AgentMessageSource`](#persistence-type-sha256-4a9bef9f27a942520cc2279ca7dd3082556e4bff543f66b5c0333e1bbed1cd86) |
| `code-mode` | 未声明 | 无 | [`{ kind: "code-mode" }`](#persistence-type-sha256-b0fdf76590690063dff16e2ba5aa14cb6ed074b61980b3860c299c2e8efc7a1a) |
| `compact-checkpoint` | 未声明 | `compactionId`: `string` | [`CompactionCheckpointSource`](#persistence-type-sha256-31907de9563751822af6d9be02bafaf26faa098bbd1cb412524134d577cc1648) |
| `cordis-host-runner` | 未声明 | 无 | [`{ kind: "cordis-host-runner" }`](#persistence-type-sha256-02b2c23f2d94b028c9588a8faace3fce1217405db346da3389368b495457bf79) |
| `dsh-session-title-llm` | `"catalog"` | 无 | [`{ kind: "dsh-session-title-llm", form: "catalog" }`](#persistence-type-sha256-80677c8c8b804189a0fde8aa70dd4ad7af8bb12dfd03027e8e023c8592c838bc) |
@@ -3874,6 +3873,7 @@ SHA-256: `7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e`
| `plan-mode` | `"relay"` | 无 | [`{ kind: "plan-mode", form: "relay" }`](#persistence-type-sha256-deaae5cd30987d4f49398e8f9d994c125907e7f928300745fb1dbf15f145d0e7) |
| `plan-mode` | `"snapshot"` | `sections`: [`ContextSnapshotSection[]`](#persistence-type-sha256-c748fb42c80a120038a8c587af80ec39924803c401364db11c8974d5bf6d0262) | [`{ kind: "plan-mode", form: "snapshot" }`](#persistence-type-sha256-8c1c4f72755a78ea163523a46565316e36e9b644382eb48e6635c71a6f412dd2) |
| `plan-mode` | 未声明 | 无 | [`{ kind: "plan-mode" }`](#persistence-type-sha256-f4a66f654996c093aae700ea4c434ff2ee3569fea9c0e5813ccf6afdccabd163) |
| `ptc-mode` | 未声明 | 无 | [`{ kind: "ptc-mode" }`](#persistence-type-sha256-dba54c09c6e7aafc9acbed7792ecc920d99f92d0784aeeed10af55f7fe0bc8cd) |
| `repeat-tool-reminder` | `"catalog"` | 无 | [`{ kind: "repeat-tool-reminder", form: "catalog" }`](#persistence-type-sha256-d85590a5675c6e2fd8164e5792a6cceac714605b8ac228adae5ee668facb1490) |
| `repeat-tool-reminder` | `"instructions"` | 无 | [`{ kind: "repeat-tool-reminder", form: "instructions" }`](#persistence-type-sha256-6f44f32be9bcd9a8bf075c3b575b06c8ed63446386e5b0995c7b73762e68ddae) |
| `repeat-tool-reminder` | `"notice"` | `summary`: `string` | [`{ kind: "repeat-tool-reminder", form: "notice" }`](#persistence-type-sha256-fe1a7acdeed4d0f5ab483396eaa5b3dc97263b7c10eb4da2f0028cb01728bfc9) |
@@ -3941,13 +3941,13 @@ SHA-256: `7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e`
| `user-approval` | 未声明 | 无 | [`{ kind: "user-approval" }`](#persistence-type-sha256-6292bcbedaa97feaec5b48a03bb8144b581b93309d9d6c905f26da7a6a7a0a4f) |
| `webhook` | `"notice"` | `deliveryId`: `string`; `provider`: `string`; `ruleId`: `string`; `source`: `string`; `summary`: `string` | [`{ kind: "webhook", form: "notice" }`](#persistence-type-sha256-9edc162949abf93bd5ff049191b345454ba104f583937ce5580fb50f067d2b94) |
<a id="persistence-type-sha256-531c1bf918d4ce9eeb8a51d32484587bc77a62e5806d8c29e64040fcafd6517e"></a>
<a id="persistence-type-sha256-cf07bfb910feecbfe0bc036b4679eef9baf1dbda9bdd2d25d0fd90c6a8753188"></a>
### `Message[]`
SHA-256: `531c1bf918d4ce9eeb8a51d32484587bc77a62e5806d8c29e64040fcafd6517e`
SHA-256: `cf07bfb910feecbfe0bc036b4679eef9baf1dbda9bdd2d25d0fd90c6a8753188`
[`Message`](#persistence-type-sha256-cc2968a9a0a95309a7d3218dcb0c55d153fe7b8c03b5648ea6fcc69d91a64a7f) 的数组。
[`Message`](#persistence-type-sha256-5d2c092b195b5319447d2daa9fef91291b937763c946f38a070e1c630b3aafe1) 的数组。
<a id="persistence-type-sha256-719c51f67074f97034a6c94297fe1f4b5d3c8d392c57586dab732aa5398c7a91"></a>
@@ -4332,7 +4332,7 @@ SHA-256: `b56f6a885da3dc394c69a3e3cc5c0cfc4da15601b63fda4989eee8f40efc5be4`
| `source` | 必需 | [`SessionTitleSource`](#persistence-type-sha256-30d5a537b296685770b1241c4b4bbde19d5a31ff81aa23df73fab5e90b8fc65f) |
| `title` | 必需 | `string` |
<a id="persistence-type-sha256-608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d"></a>
<a id="persistence-type-sha256-1dfb04b0296cab90e4e0f159b95300d79644817718e05e3ed79907d98447af36"></a>
<a id="persistence-type-packagessessionsession-title-llmsrcindextssessiontitlellmrequesteventdata"></a>
@@ -4340,7 +4340,7 @@ SHA-256: `b56f6a885da3dc394c69a3e3cc5c0cfc4da15601b63fda4989eee8f40efc5be4`
### `SessionTitleLlmRequestEventData`
SHA-256: `608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d`
SHA-256: `1dfb04b0296cab90e4e0f159b95300d79644817718e05e3ed79907d98447af36`
来源:[`packages/session/session-title-llm/src/index.ts:34`](../packages/session/session-title-llm/src/index.ts)
@@ -4348,7 +4348,7 @@ SHA-256: `608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d`
|---|---|---|
| `maxTokens` | 必需 | `number` |
| `messageSeqs` | 必需 | [`number[]`](#persistence-type-sha256-5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78) |
| `messages` | 必需 | [`Message[]`](#persistence-type-sha256-531c1bf918d4ce9eeb8a51d32484587bc77a62e5806d8c29e64040fcafd6517e) |
| `messages` | 必需 | [`Message[]`](#persistence-type-sha256-cf07bfb910feecbfe0bc036b4679eef9baf1dbda9bdd2d25d0fd90c6a8753188) |
| `route` | 必需 | [`SessionTitleModelIdentity`](#persistence-type-sha256-07e1a58c58b593f507b8e7f25723bb0aa42baae6e00f5ecfddf28cb1e64d3235) |
| `system` | 必需 | `string` |
| `titleProvider` | 必需 | `string` |
@@ -4963,7 +4963,7 @@ SHA-256: `f1687f982fa3d41ef29e159feed154ecd13af4dd209acaee16038f223f2e9402`
| `interrupted` | 未声明 | 无 | [`{ kind: "interrupted" }`](#persistence-type-sha256-56b7c047694875a843ba020dfea3c8380d54ae4ff88ab349e72004dc21e07c23) |
| `max-tokens` | 未声明 | 无 | [`{ kind: "max-tokens" }`](#persistence-type-sha256-ab7ec5f9eb2c6dfacca5da4c37cf7ba85d04172053ee6b1ebf1709ffcd99c1a7) |
<a id="persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95"></a>
<a id="persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb"></a>
<a id="persistence-type-packagesllmllmsrcmessagetsusermessage"></a>
@@ -4971,7 +4971,7 @@ SHA-256: `f1687f982fa3d41ef29e159feed154ecd13af4dd209acaee16038f223f2e9402`
### `UserMessage`
SHA-256: `980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95`
SHA-256: `4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb`
来源:[`packages/llm/llm/src/message.ts:157`](../packages/llm/llm/src/message.ts)
@@ -4980,19 +4980,19 @@ SHA-256: `980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95`
| `content` | 必需 | [`ContentBlock[]`](#persistence-type-sha256-a951a47d0ebf7d7ac401d1ec2fe4e138a43288c5ad2b0cf029a90b97d718f1e6) |
| `id` | 必需 | `string` |
| `role` | 必需 | `"user"` |
| `source` | 必需 | [`MessageSource`](#persistence-type-sha256-7aae986884b7f69068d9f9d7d77910a0dbe2b265843a041576877eb1bc01f31e) |
| `source` | 必需 | [`MessageSource`](#persistence-type-sha256-975cf73c9f141cb80d0aaa5e507d5157e455182e0d3338cc2c5410ada98a0d37) |
消息源兼容策略:`source` — `session-source-attribution` v1; `session.user-message.source`; `kind`; `preserve`.
仅表示归属的新增 kind:`tmux-context`.
<a id="persistence-type-sha256-fc336025695a2213c63d0fe8715307c6a6ede867713bbf2ab1c8ff9760fdee1f"></a>
<a id="persistence-type-sha256-20e1a1a15728cfcf17a451cc82b54b61dcb0f7abe92403fc0aa1b8f7652c6e5b"></a>
### `UserMessage[]`
SHA-256: `fc336025695a2213c63d0fe8715307c6a6ede867713bbf2ab1c8ff9760fdee1f`
SHA-256: `20e1a1a15728cfcf17a451cc82b54b61dcb0f7abe92403fc0aa1b8f7652c6e5b`
[`UserMessage`](#persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95) 的数组。
[`UserMessage`](#persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb) 的数组。
<a id="persistence-type-sha256-c2deb7c9183735d4e0fffddf5c623f4e34daa1c8e96b111982e957dfcbbcf896"></a>
@@ -5873,17 +5873,17 @@ SHA-256: `17d1afb770d9941936130996da00dc86782cfef731d8d6526162c301256a4ac3`
|---|---|---|
| `inherited` | 可选 | `true` |
<a id="persistence-type-sha256-37af4fdde18eb8638d5037243e0ee1c617b9b1062ae9dbee086feafad852112f"></a>
<a id="persistence-type-sha256-3f7222390f22d3d2ab1d7e9cc5d10ca06d878c9c6e89eb1180b39b39136b7779"></a>
### `{ inserted, outcome?, removedCount?, start, … }`
SHA-256: `37af4fdde18eb8638d5037243e0ee1c617b9b1062ae9dbee086feafad852112f`
SHA-256: `3f7222390f22d3d2ab1d7e9cc5d10ca06d878c9c6e89eb1180b39b39136b7779`
来源:[`packages/core/agent/src/types.ts:87`](../packages/core/agent/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
| `inserted` | 必需 | [`UserMessage[]`](#persistence-type-sha256-fc336025695a2213c63d0fe8715307c6a6ede867713bbf2ab1c8ff9760fdee1f) |
| `inserted` | 必需 | [`UserMessage[]`](#persistence-type-sha256-20e1a1a15728cfcf17a451cc82b54b61dcb0f7abe92403fc0aa1b8f7652c6e5b) |
| `outcome` | 可选 | `"canceled"` |
| `removedCount` | 可选 | `number` |
| `start` | 必需 | `number` |
@@ -5931,18 +5931,6 @@ SHA-256: `023a355b2be0d688fb6e4df8388dadb942761d46cfe96d0f499aae9631a159d4`
|---|---|---|
| `kind` | 必需 | `"blocked"` |
<a id="persistence-type-sha256-b0fdf76590690063dff16e2ba5aa14cb6ed074b61980b3860c299c2e8efc7a1a"></a>
### `{ kind: "code-mode" }`
SHA-256: `b0fdf76590690063dff16e2ba5aa14cb6ed074b61980b3860c299c2e8efc7a1a`
来源:[`packages/core/tools/src/ptc.ts:13`](../packages/core/tools/src/ptc.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
| `kind` | 必需 | `"code-mode"` |
<a id="persistence-type-sha256-b6ef9c6210be8350cd465f485cf520031fffa6bf3809c61a1e713e834c5982d0"></a>
### `{ kind: "completed" }`
@@ -6468,6 +6456,18 @@ SHA-256: `b81e9de81a481b24e1e1f9adf038bfc59e57b4f35ce62f8f1e45284186f4f812`
| `model` | 可选 | [`SessionTitleModelIdentity`](#persistence-type-sha256-07e1a58c58b593f507b8e7f25723bb0aa42baae6e00f5ecfddf28cb1e64d3235) |
| `provider` | 必需 | `string` |
<a id="persistence-type-sha256-dba54c09c6e7aafc9acbed7792ecc920d99f92d0784aeeed10af55f7fe0bc8cd"></a>
### `{ kind: "ptc-mode" }`
SHA-256: `dba54c09c6e7aafc9acbed7792ecc920d99f92d0784aeeed10af55f7fe0bc8cd`
来源:[`packages/core/tools/src/ptc.ts:14`](../packages/core/tools/src/ptc.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
| `kind` | 必需 | `"ptc-mode"` |
<a id="persistence-type-sha256-b062078e899958f99ae464514578b8c093924dfe34bd9a835932b420ff2150b1"></a>
### `{ kind: "repeat-tool-reminder" }`
@@ -7405,17 +7405,17 @@ SHA-256: `a10c17474eaf2ddab7095a099e0fe3d046fc18e56c3e344fc8894c05ff9ef97b`
| `time` | 必需 | `number` |
| `type` | 必需 | `"agent-preset/selected"` |
<a id="persistence-type-sha256-ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f"></a>
<a id="persistence-type-sha256-3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367"></a>
<a id="persistence-type-eventagentinboxspliced"></a>
### `{ type: "agent/inbox/spliced" }`
SHA-256: `ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f`
SHA-256: `3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367`
| 属性 | 存在性 | 类型 |
|---|---|---|
| `data` | 必需 | [`{ inserted, outcome?, removedCount?, start, … }`](#persistence-type-sha256-37af4fdde18eb8638d5037243e0ee1c617b9b1062ae9dbee086feafad852112f) |
| `data` | 必需 | [`{ inserted, outcome?, removedCount?, start, … }`](#persistence-type-sha256-3f7222390f22d3d2ab1d7e9cc5d10ca06d878c9c6e89eb1180b39b39136b7779) |
| `ignorable` | 可选 | `true` |
| `seq` | 必需 | `number` |
| `time` | 必需 | `number` |
@@ -8004,17 +8004,17 @@ SHA-256: `1b912703e2d64f91c99c675b8f805b01076c8325b905c1218ad81ef0b24909d5`
| `time` | 必需 | `number` |
| `type` | 必需 | `"session/title"` |
<a id="persistence-type-sha256-eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f"></a>
<a id="persistence-type-sha256-4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19"></a>
<a id="persistence-type-eventsessiontitle-llm-request"></a>
### `{ type: "session/title-llm-request" }`
SHA-256: `eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f`
SHA-256: `4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19`
| 属性 | 存在性 | 类型 |
|---|---|---|
| `data` | 必需 | [`SessionTitleLlmRequestEventData`](#persistence-type-sha256-608866d72de8327687e3730cb213d57cf8485012419673de9e5765f4a71f7f2d) |
| `data` | 必需 | [`SessionTitleLlmRequestEventData`](#persistence-type-sha256-1dfb04b0296cab90e4e0f159b95300d79644817718e05e3ed79907d98447af36) |
| `ignorable` | 可选 | `true` |
| `seq` | 必需 | `number` |
| `time` | 必需 | `number` |
@@ -8437,17 +8437,17 @@ SHA-256: `f1a96afe7503ac1817de769cd0ba13d9b80111c7034c50106b3344ecc14cc515`
| `type` | 必需 | `"usage"` |
| `usage` | 必需 | [`TokenUsage`](#persistence-type-sha256-fec5442b9ee4122e10514d81d5a43648003fe8bfb7ee2ba50c0cdbdd383ed394) |
<a id="persistence-type-sha256-46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95"></a>
<a id="persistence-type-sha256-c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836"></a>
<a id="persistence-type-eventusermessage"></a>
### `{ type: "user/message" }`
SHA-256: `46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95`
SHA-256: `c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836`
| 属性 | 存在性 | 类型 |
|---|---|---|
| `data` | 必需 | [`UserMessage`](#persistence-type-sha256-980b8f7c2576a03df48bd09fd68000d88eaec6e99ca5bec36e6448401b8e3e95) |
| `data` | 必需 | [`UserMessage`](#persistence-type-sha256-4daecf02d50b54f9a1c74c66c20099c3320bef18afde4a79d6cb7e17b02e35eb) |
| `ignorable` | 可选 | `true` |
| `seq` | 必需 | `number` |
| `sourceEventSeqs` | 可选 | [`number[]`](#persistence-type-sha256-5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78) |
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/persistence-changes/2026-09-16-session-format-v4.md
2026-09-16-session-format-v4.md: 625e977196d0395c2a3d7c662831914f0c3e6f23
2026-09-16-session-format-v4.zh.md: bd11a72eba0ef1b7653d32ef6f987e500d0b2ba0
2026-09-16-session-format-v4.md: eea41088f14d7955d461e27b08be2522d2eadae9
2026-09-16-session-format-v4.zh.md: 222c062e4ca13fc000449a4440bb378ce43fa5c6
@@ -32,7 +32,7 @@ changes:
decision: version-bump
- root: "event:agent/inbox/spliced"
previous: "2026-09-14-image-offload"
after: "ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f"
after: "3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367"
decision: version-bump
- root: "event:assistant/attempt"
previous: "2026-09-14-image-offload"
@@ -52,7 +52,7 @@ changes:
decision: version-bump
- root: "event:session/title-llm-request"
previous: "2026-09-14-image-offload"
after: "eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f"
after: "4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19"
decision: version-bump
- root: "event:system/message"
previous: "2026-09-14-image-offload"
@@ -76,7 +76,7 @@ changes:
decision: version-bump
- root: "event:user/message"
previous: "2026-09-14-image-offload"
after: "46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95"
after: "c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836"
decision: version-bump
```
@@ -95,6 +95,8 @@ Producer-owned sources replace released plugin wrappers through the [V3-to-V4 mi
The core-owned user source property records the attribution-preservation policy; tmux-context qualifies its location attribution while retaining producer-local duplicate suppression. Auto Review and the compaction summarizer use request-only user inputs, removing their active source registrations without removing historical migration support. These inputs cannot be written as durable Session messages. Catalog formatVersion 2 stores the policy metadata; it does not change the Session version or rewrite frozen schema records. System, model, and tool sources retain their strict semantic rules.
The PTC producer writes `source.kind: 'ptc-mode'`. The V3-to-V4 edge retains `tools-code-mode` and `tools-ptc` as historical plugin lookup keys and maps both to that current kind. The source policy reserves `ptc-mode` against attribution-only qualification.
<a id="verification"></a>
## Verification
@@ -87,7 +87,7 @@
"kind": "event",
"event": "agent/inbox/spliced",
"surface": false,
"digest": "ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f",
"digest": "3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367",
"schema": {
"root": 0,
"nodes": [
@@ -507,16 +507,16 @@
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
128,
129,
@@ -1664,6 +1664,21 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 114,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "ptc-mode"
},
{
"kind": "object",
"properties": [
@@ -1702,7 +1717,7 @@
"properties": [
{
"name": "kind",
"type": 117,
"type": 119,
"optional": false
}
],
@@ -1778,21 +1793,6 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 125,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "code-mode"
},
{
"kind": "object",
"properties": [
@@ -5352,7 +5352,7 @@
"kind": "event",
"event": "session/title-llm-request",
"surface": false,
"digest": "eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f",
"digest": "4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19",
"schema": {
"root": 0,
"nodes": [
@@ -5601,11 +5601,11 @@
},
{
"kind": "literal",
"value": "image/gif"
"value": "image/jpeg"
},
{
"kind": "literal",
"value": "image/jpeg"
"value": "image/gif"
},
{
"kind": "literal",
@@ -5881,17 +5881,17 @@
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
189,
190
@@ -7898,6 +7898,21 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 174,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "ptc-mode"
},
{
"kind": "object",
"properties": [
@@ -7931,21 +7946,6 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 177,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "system-prompt"
},
{
"kind": "object",
"properties": [
@@ -7962,6 +7962,21 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 180,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "system-prompt"
},
{
"kind": "object",
"properties": [
@@ -8028,21 +8043,6 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 186,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "code-mode"
},
{
"kind": "object",
"properties": [
@@ -8135,7 +8135,7 @@
},
{
"name": "source",
"type": 176,
"type": 179,
"optional": false
}
],
@@ -10103,7 +10103,7 @@
"kind": "event",
"event": "user/message",
"surface": true,
"digest": "46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95",
"digest": "c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836",
"schema": {
"root": 0,
"nodes": [
@@ -10497,16 +10497,16 @@
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
125,
126,
@@ -11634,6 +11634,21 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 111,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "ptc-mode"
},
{
"kind": "object",
"properties": [
@@ -11672,7 +11687,7 @@
"properties": [
{
"name": "kind",
"type": 114,
"type": 116,
"optional": false
}
],
@@ -11748,21 +11763,6 @@
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "kind",
"type": 122,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "code-mode"
},
{
"kind": "object",
"properties": [
@@ -32,7 +32,7 @@ changes:
decision: version-bump
- root: "event:agent/inbox/spliced"
previous: "2026-09-14-image-offload"
after: "ab1acc0685cc410d0d1e85ff0e0bd29f4b2b4352dd170db54988319d58d4362f"
after: "3aa732b3400e924132366555c88618f62232b41c1e56b86beee05fd7edc24367"
decision: version-bump
- root: "event:assistant/attempt"
previous: "2026-09-14-image-offload"
@@ -52,7 +52,7 @@ changes:
decision: version-bump
- root: "event:session/title-llm-request"
previous: "2026-09-14-image-offload"
after: "eb655047c0dd3f2f3aefd2c9c719df0d060dd88032ba7caf731ea39db5a6725f"
after: "4eeb9bb8f9c35f59b3020a07113f256c363a504983aecbe33e57fd1ab4f03b19"
decision: version-bump
- root: "event:system/message"
previous: "2026-09-14-image-offload"
@@ -76,7 +76,7 @@ changes:
decision: version-bump
- root: "event:user/message"
previous: "2026-09-14-image-offload"
after: "46c44941f6e93a1764c49f1487e64a57f73ee68a75a657e94c326a8de5d8ad95"
after: "c3a5c8d0f1bc05ab074fdb086da866eece51dd573ae0c30b17a52bb76dec8836"
decision: version-bump
```
@@ -95,6 +95,8 @@ V3-to-V4 迁移将已发布的 user 角色工具结果提升为 tool 角色消
核心拥有的 user source 属性记录归属保留策略;tmux-context 将位置归属标记为符合条件,同时保留生产者内部的去重。Auto Review 和压缩摘要器使用仅供请求使用的 user 输入,移除其活动 source 注册,同时保留历史迁移支持。这些输入不能写为持久化 Session 消息。目录 formatVersion 2 保存策略元数据,不改变 Session 版本,也不重写冻结的 schema 记录。System、model 和 tool source 保持严格的语义规则。
PTC 生产者写入 `source.kind: 'ptc-mode'`。V3→V4 迁入边保留 `tools-code-mode` 和 `tools-ptc` 作为历史 plugin 查找键,并将二者映射到该当前 kind。source 策略保留 `ptc-mode`,不允许将其声明为仅用于归属。
<a id="verification"></a>
## 验证
+24225 -24225
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/core/tools/README.md
README.md: 526f04dad93641452033325a73b256d0ae132f00
README.zh.md: 5a3b6a896db1d32f61f191fdad61a03bd159620e
README.md: 0bcc7ae5a90a5fad495385453ee2747ef91e7bb5
README.zh.md: 3e65248bf34f84040bfebf5ab34ba54cb82ecef0
+2
View File
@@ -126,6 +126,8 @@ Under `ptc` or `both`, the registry exposes the reserved `run_code` transport pl
New sub-calls use `<parent>:ptc:<n>` ids. Consumers treat these ids as opaque and correlate events by exact equality; restored historical ids retain their original bytes. The [PTC mode decision](../../../.agents/notes/implemented/feature/2026-06-15-ptc.md) owns durable naming and restoration rules.
Successful image-bearing subcall results become deferred user-message context with `source.kind` set to `ptc-mode`. Other additional contexts retain their producing tool's attribution.
`run_code` accepts `timeoutMs` when the mounted runtime supports an override; its schema reports the configured default and maximum, the runtime's usage instructions and the Session working directory. The Node default is 120,000 ms with a 600,000 ms cap, including nested tool and approval waits. A wider `sandbox_permissions` mode requires a non-empty `justification` and approval before the program starts. The grant applies to that complete execution; standing Session policy and nested tools retain their own authority. Programs are never replayed automatically: inspect earlier effects before explicitly retrying a denied program.
<a id="extension-points"></a>
+2
View File
@@ -126,6 +126,8 @@ ctx.tools.register(defineTool({
新子调用使用 `<parent>:ptc:<n>` 标识。消费方将这些标识视为不透明值,并通过精确相等关联事件;恢复的历史标识保留原始字节。[PTC mode 决策](../../../.agents/notes/implemented/feature/2026-06-15-ptc.zh.md) 负责持久化命名与恢复规则。
成功且包含图片的子调用结果会成为延后的 user-message 上下文,其 `source.kind` 为 `ptc-mode`。其他 additional context 保留其生产工具的归属。
当已挂载运行时支持覆盖时,`run_code` 接受 `timeoutMs`;其 schema 报告配置的默认值和上限、运行时使用说明及 Session 工作目录。Node 默认值为 120,000 ms,上限为 600,000 ms,包含嵌套工具和审批等待。更宽的 `sandbox_permissions` 模式要求非空 `justification`,并在程序启动前获得审批。授权仅用于该次完整执行;常驻 Session 策略与嵌套工具保留各自权限。程序不会自动重放:显式重试被拒程序前,应检查先前已发生的效果。
<a id="extension-points"></a>
+3 -2
View File
@@ -10,7 +10,8 @@ import { brandString } from '@deepseek-ai/dsh-brand'
import { createUserMessage, HarnessError } from '@deepseek-ai/dsh-llm'
declare module '@deepseek-ai/dsh-llm' {
interface MessageSourceMap {
'code-mode': { kind: 'code-mode' }
/** Images deferred from a successful PTC subcall's final result. */
'ptc-mode': { kind: 'ptc-mode' }
}
}
@@ -638,7 +639,7 @@ export function createRunCodeTool(registry: ToolRuntime, options: RunCodeBridgeO
if (!result.isError && result.content.some(block => block.type === 'image')) {
exec.deferContext(createUserMessage({
content: result.content,
source: { kind: 'code-mode' },
source: { kind: 'ptc-mode' },
}))
}
for (const context of result.additionalContexts ?? []) {
+1 -1
View File
@@ -1383,7 +1383,7 @@ describe('the run_code dispatch bridge', () => {
expect(result.additionalContexts).toMatchObject([{
role: 'user',
source: { kind: 'code-mode' },
source: { kind: 'ptc-mode' },
content: [
{ type: 'text', text: 'image result' },
{ type: 'image', attachment: { mediaType: 'image/png', bytes: 1, width: 1, height: 1 } },
@@ -187,7 +187,7 @@ describe('first-party Session format catalog', () => {
const restore = createSessionFormatCatalogWithChildren([]).createRestore(sourceHeader, { recovery: 'strict', validation: 'current' })
for (const row of rows) restore.decodeRow(row)
const artifact = restore.finish()
const renamedMessage = (id: string) => ({ ...message(id), source: { kind: 'code-mode' } })
const renamedMessage = (id: string) => ({ ...message(id), source: { kind: 'ptc-mode' } })
const expected = [
rows[0], rows[1],
expect.objectContaining({ type: 'system/message', seq: 2 }),
@@ -38,8 +38,8 @@ export function mapEventMessages(
/** Released V3 plugin names whose current producer kind is not the plugin string. */
const RENAMED_PRODUCERS: Readonly<Record<string, string>> = Object.freeze({
'compact': 'compact-checkpoint',
'tools-code-mode': 'code-mode',
'tools-ptc': 'code-mode',
'tools-code-mode': 'ptc-mode',
'tools-ptc': 'ptc-mode',
'dsh-compaction-basic': 'compact-basic',
'@deepseek-ai/dsh-system-prompt': 'runtime-context',
})
@@ -47,7 +47,7 @@ const RENAMED_PRODUCERS: Readonly<Record<string, string>> = Object.freeze({
/** Current producer kinds whose names are not released V3 plugin identities. */
const CURRENT_PRODUCER_KINDS: ReadonlySet<string> = new Set([
'user', 'model', 'tool', 'system-prompt',
'runtime-context', 'compact-checkpoint', 'code-mode', 'compact-basic',
'runtime-context', 'compact-checkpoint', 'ptc-mode', 'compact-basic',
'agent-instructions', 'session-reference', 'team-message', 'goal',
'skill-invocation', 'skill-catalog', 'coordinator', 'subagent-report',
'subagent-settled', 'webhook', 'agent-message', 'model-selection',
@@ -48,7 +48,7 @@ describe('canonical V4 integration', () => {
for (const system of systems) expect(system.data).toMatchObject({ message: { role: 'system', source: { kind: 'system-prompt' } } })
const users = target.events.filter(event => event.type === 'user/message')
expect(users[0]?.data).toMatchObject({ source: { kind: 'runtime-context' } })
expect(users[1]).toMatchObject({ surfaceOp: { op: 'replace', startSeq: 5, endSeq: 5 }, sourceEventSeqs: [5], data: { source: { kind: 'code-mode' } } })
expect(users[1]).toMatchObject({ surfaceOp: { op: 'replace', startSeq: 5, endSeq: 5 }, sourceEventSeqs: [5], data: { source: { kind: 'ptc-mode' } } })
expect(target.events.find(event => event.type === 'tool/ptc-dispatch')?.data).toMatchObject({ arguments: { kind: 'plugin', plugin: 'tools-ptc' } })
const before = JSON.stringify(target)
expect(restoreReleasedV4Artifact(target, new Set(target.events.map(event => event.type)))).toBe(target)
@@ -55,7 +55,8 @@ describe('mapEventMessages', () => {
describe('rewritePluginSource', () => {
it('rewrites renamed and role-sensitive producers, dropping the plugin field', () => {
expect(rewritePluginSource({ kind: 'plugin', plugin: 'tools-ptc' }, 1, 'user')).toEqual({ kind: 'code-mode' })
expect(rewritePluginSource({ kind: 'plugin', plugin: 'tools-ptc' }, 1, 'user')).toEqual({ kind: 'ptc-mode' })
expect(rewritePluginSource({ kind: 'plugin', plugin: 'tools-code-mode' }, 1, 'user')).toEqual({ kind: 'ptc-mode' })
expect(rewritePluginSource({ kind: 'plugin', plugin: '@deepseek-ai/dsh-system-prompt' }, 1, 'system')).toEqual({ kind: 'system-prompt' })
expect(rewritePluginSource({ kind: 'plugin', plugin: '@deepseek-ai/dsh-system-prompt' }, 1, 'user')).toEqual({ kind: 'runtime-context' })
expect(rewritePluginSource({ kind: 'plugin', plugin: 'external', extra: true }, 1, 'user')).toEqual({ kind: 'external', extra: true })
@@ -69,7 +70,7 @@ describe('rewritePluginSource', () => {
})
it('refuses external plugin names that collide with current producer kinds', () => {
for (const plugin of ['plugin', 'user', 'model', 'tool', 'system-prompt', 'runtime-context', 'compact-checkpoint', 'code-mode', 'compact-basic', 'auto-review']) {
for (const plugin of ['plugin', 'user', 'model', 'tool', 'system-prompt', 'runtime-context', 'compact-checkpoint', 'ptc-mode', 'compact-basic', 'auto-review']) {
expect(() => rewritePluginSource({ kind: 'plugin', plugin }, 3, 'user')).toThrow(/collides with a current producer kind/)
}
expect(rewritePluginSource({ kind: 'plugin', plugin: 'agent-instructions', form: 'instructions', changes: [] }, 3, 'user'))
@@ -58,7 +58,7 @@ const imageMessage = {
}
const currentImageMessage = {
...imageMessage,
source: { kind: 'code-mode', form: imageMessage.source.form, summary: imageMessage.source.summary },
source: { kind: 'ptc-mode', form: imageMessage.source.form, summary: imageMessage.source.summary },
}
const dispatch = {
rootCallId: toolCall.id, parentCallId: toolCall.id, subCallId: 'tools-code-mode:child-call',
+1 -1
View File
@@ -726,7 +726,7 @@ describe('recorded source compatibility policy', () => {
expect(validatePersistenceHistory([entry(BASE_ID, before, null, true), entry(NEXT_ID, after, BASE_ID)]).tips.get('event:example/source')?.root).toEqual(after.roots[0])
})
it.each(['auto-review', 'compact-basic', 'code-mode'])('rejects saved qualification of historical kind %s', (kind) => {
it.each(['auto-review', 'compact-basic', 'ptc-mode'])('rejects saved qualification of reserved producer kind %s', (kind) => {
const root = attributedRoot([EXISTING_SOURCE, { kind }], { policy: attributionPolicy([kind]) })
const snapshot: PersistenceSchemaInventory = { formatVersion: 2, roots: [root], types: [] }
expect(() => parsePersistenceSnapshot(snapshot)).toThrow('invalid source compatibility')
+1 -1
View File
@@ -531,7 +531,7 @@ declare module './message.js' {
expect(() => extractPersistenceSchema(sourceFixture(producer))).toThrow(error)
})
it.each(['auto-review', 'compact-basic', 'code-mode'])('rejects reintroduced historical kind %s as new attribution', (kind) => {
it.each(['auto-review', 'compact-basic', 'ptc-mode'])('rejects reserved producer kind %s as new attribution', (kind) => {
for (const role of ['user', 'developer'] as const) {
const root = sourceFixture(`${ATTRIBUTION} reintroduced: {kind: '${kind}'}`, role)
expect(() => extractPersistenceSchema(root)).toThrow('invalid source compatibility')
+1 -1
View File
@@ -6,7 +6,7 @@ import type { SchemaNode, SchemaProperty, SourceCompatibility } from './persiste
// Existing kinds outside this set also reject retroactive qualification during comparison.
const RESERVED_SOURCE_KINDS = new Set([
'user', 'model', 'tool', 'system-prompt', 'compact-checkpoint', 'dsh-session-title-llm', 'tool-registry', 'runtime-context', 'plugin',
'auto-review', 'compact-basic', 'code-mode',
'auto-review', 'compact-basic', 'ptc-mode',
])
/**