@deepseek-ai/dsh-session 0.1.2-alpha.5 → 0.1.3-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +2 -2
- package/README.md +6 -7
- package/README.zh.md +6 -7
- package/lib/index.js +73 -376
- package/lib/invariant.js +2 -2
- package/lib/types/index.d.ts +23 -20
- package/lib/types/index.js +73 -63
- package/lib/types/invariant.js +2 -2
- package/lib/types/known-event-types.js +3 -1
- package/lib/types/surface.d.ts +1 -1
- package/lib/types/surface.js +8 -5
- package/lib/types/types.d.ts +67 -56
- package/lib/types/types.js +9 -10
- package/package.json +9 -13
- package/lib/types/chunk-rows.d.ts +0 -106
- package/lib/types/chunk-rows.js +0 -328
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/core/session/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: e810299678c93fd0b5c740dcd2485df746eee0e0
|
|
6
|
+
README.zh.md: 9d8250053a6b11fd9ac71839bd6517cb58c3d90a
|
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ session.append('user/message', { role: 'user', content: [{ type: 'text', text: '
|
|
|
47
47
|
session.deriveMessages() // the derived model history
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
Surface events (`user/message`, `assistant/message`, `tool/result`) must declare how they join the ordered surface;
|
|
50
|
+
Surface events (`user/message`, `assistant/message`, `tool/result`) must declare how they join the ordered surface. An Assistant message embeds the exact compact provider stream that produced it; `assistant/attempt`, boundaries, and other log-only events never produce a message.
|
|
51
51
|
|
|
52
52
|
### Read the log
|
|
53
53
|
|
|
@@ -77,7 +77,7 @@ This section explains how the package realizes the behavior above; the observabl
|
|
|
77
77
|
|
|
78
78
|
### Design concept
|
|
79
79
|
|
|
80
|
-
The package is built on event sourcing: a `Session` is an append-only log of typed `SessionEvent`s, and everything else — model history, transcripts, telemetry, titles, persistence — derives from that stream. The surface is a derived projection: an incremental manager validates append candidates, advances the ordered view from committed events, and tracks a `replaceGeneration` that bumps on every committed rewrite. Model-visible means logged: anything that reaches a model request must be reconstructable from the log.
|
|
80
|
+
The package is built on event sourcing: a `Session` is an append-only log of typed `SessionEvent`s, and everything else — model history, transcripts, telemetry, titles, persistence — derives from that stream. The surface is a derived projection: an incremental manager validates append candidates, advances the ordered view from committed events, and tracks a `replaceGeneration` that bumps on every committed rewrite. Model-visible means logged: anything that reaches a model request must be reconstructable from the log. Each model attempt that reaches settlement commits one event: `assistant/message` carries the assembled model-visible message plus its compact timed stream, while `assistant/attempt` retains a failed, retried, cancelled, or stream-error attempt without adding model history. A hard process loss before settlement leaves no durable attempt stream.
|
|
81
81
|
|
|
82
82
|
### Request headers
|
|
83
83
|
|
|
@@ -92,7 +92,6 @@ The package is built on event sourcing: a `Session` is an append-only log of typ
|
|
|
92
92
|
| [`src/surface.ts`](src/surface.ts) | Ordered surface projection, replacement validation, `deriveEventMessage` |
|
|
93
93
|
| [`src/request-header.ts`](src/request-header.ts) | `request/header` folding and reconstruction |
|
|
94
94
|
| [`dsh-util-values`](../../util/values/README.md) | Shared lossless JSON validation and detached snapshots |
|
|
95
|
-
| [`src/chunk-rows.ts`](src/chunk-rows.ts) | Shared compact-row storage codec for persistence backends |
|
|
96
95
|
| [`src/repair.ts`](src/repair.ts) | Cold repair of crash-orphaned logs |
|
|
97
96
|
| [`src/invariant.ts`](src/invariant.ts) | Invariant companion: seq, turn/step enclosure, tool call/result pairing |
|
|
98
97
|
|
|
@@ -102,7 +101,7 @@ Every append uses the shared iterative `snapshotJsonValue()` pass, which reads,
|
|
|
102
101
|
|
|
103
102
|
### Derived history
|
|
104
103
|
|
|
105
|
-
`deriveMessages()` caches each surface node's projection once and returns a fresh array per call over shared, deep-frozen messages; each of the three surface event types (`user/message`, `assistant/message`, `tool/result`) projects its own message kind — user content verbatim, the assembled assistant message with its provider and model, or a user-role tool result. A surface rewrite rebuilds the projection — there is no raw-log fallback, so the surface is the single source of derived history.
|
|
104
|
+
`deriveMessages()` caches each surface node's projection once and returns a fresh array per call over shared, deep-frozen messages; each of the three surface event types (`user/message`, `assistant/message`, `tool/result`) projects its own message kind — user content verbatim, the assembled assistant message with its provider and model, or a user-role tool result. Embedded Assistant streams and `assistant/attempt` events remain replay and diagnostic data only. A surface rewrite rebuilds the projection — there is no raw-log fallback, so the surface is the single source of derived history.
|
|
106
105
|
|
|
107
106
|
### The request header
|
|
108
107
|
|
|
@@ -132,7 +131,7 @@ The package-level contract is enough for most consumers; read these when you nee
|
|
|
132
131
|
|
|
133
132
|
#### What the model sees
|
|
134
133
|
|
|
135
|
-
The model receives the complete messages from `user/message`, `assistant/message`, and `tool/result` surface entries verbatim — identities, roles, sources, and content blocks are the same values established at creation, and projections never mint identities. Direct prompts and injected context remain separate `user/message` events whose sources preserve their provenance.
|
|
134
|
+
The model receives the complete messages from `user/message`, `assistant/message`, and `tool/result` surface entries verbatim — identities, roles, sources, and content blocks are the same values established at creation, and projections never mint identities. Direct prompts and injected context remain separate `user/message` events whose sources preserve their provenance. Embedded streams, `assistant/attempt`, boundaries, and other log-only facts add no message.
|
|
136
135
|
|
|
137
136
|
#### Token effect
|
|
138
137
|
|
|
@@ -177,8 +176,8 @@ Logging causes no invalidation, and exact reconstruction preserves request-prefi
|
|
|
177
176
|
|
|
178
177
|
These limits define when the session store needs special care. They are current package constraints, not a task backlog.
|
|
179
178
|
|
|
180
|
-
- **`fork()` cuts only at stable boundaries of live sessions** — the selected prefix must end outside an open turn and the source must be in the store; forking a persisted-but-unloaded session is excluded from the
|
|
181
|
-
- **`SESSION_FORMAT_VERSION`
|
|
179
|
+
- **`fork()` cuts only at stable boundaries of live sessions** — the selected prefix must end outside an open turn and the source must be in the store; forking a persisted-but-unloaded session is excluded from the fork API.
|
|
180
|
+
- **`SESSION_FORMAT_VERSION` names only the current logical representation** — historical headers and events remain in adjacent format packages, while persistence publishes a complete supported chain before constructing `Session`; equal-version unknown events still require the envelope's explicit `ignorable` marker ([mechanism](../../../.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.md)).
|
|
182
181
|
- **`TurnEndReasonMap` omits the ACP-named `refusal` / `max_turn_requests` variants** — producer-gated: they land when an adapter or the loop first emits them.
|
|
183
182
|
- **No session tree beyond fork** — a pi-style entry tree over branched sessions is deferred unless a consumer needs more than boundary-based forking.
|
|
184
183
|
|
package/README.zh.md
CHANGED
|
@@ -47,7 +47,7 @@ session.append('user/message', { role: 'user', content: [{ type: 'text', text: '
|
|
|
47
47
|
session.deriveMessages() // the derived model history
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
表层事件(`user/message`、`assistant/message`、`tool/result`)必须声明如何进入有序 surface
|
|
50
|
+
表层事件(`user/message`、`assistant/message`、`tool/result`)必须声明如何进入有序 surface。Assistant message 会嵌入产生它的精确紧凑 provider stream;`assistant/attempt`、边界与其他仅日志事件从不产生消息。
|
|
51
51
|
|
|
52
52
|
### 读取日志
|
|
53
53
|
|
|
@@ -77,7 +77,7 @@ session.deriveMessages() // the derived model history
|
|
|
77
77
|
|
|
78
78
|
### 设计理念
|
|
79
79
|
|
|
80
|
-
该包建立在事件溯源之上:`Session` 是类型化 `SessionEvent` 的仅追加日志,其他一切——模型历史、transcript、遥测、标题、持久化——都从这条流派生。surface 是派生投影:一个增量管理器校验追加候选、根据已提交事件推进有序视图,并跟踪每次已提交重写都会递增的 `replaceGeneration
|
|
80
|
+
该包建立在事件溯源之上:`Session` 是类型化 `SessionEvent` 的仅追加日志,其他一切——模型历史、transcript、遥测、标题、持久化——都从这条流派生。surface 是派生投影:一个增量管理器校验追加候选、根据已提交事件推进有序视图,并跟踪每次已提交重写都会递增的 `replaceGeneration`。模型可见即已记录:任何到达模型请求的内容都必须能从日志重建。每个到达 settlement 的模型 attempt 都会提交一个事件:`assistant/message` 携带组装后的模型可见 message 及其紧凑带时间 stream,`assistant/attempt` 则保留失败、重试、取消或 stream error attempt,且不添加模型历史。如果进程在 settlement 前硬中断,则不会留下持久 attempt stream。
|
|
81
81
|
|
|
82
82
|
### 请求 header
|
|
83
83
|
|
|
@@ -92,7 +92,6 @@ session.deriveMessages() // the derived model history
|
|
|
92
92
|
| [`src/surface.ts`](src/surface.ts) | 有序 surface 投影、替换校验、`deriveEventMessage` |
|
|
93
93
|
| [`src/request-header.ts`](src/request-header.ts) | `request/header` 折叠与重建 |
|
|
94
94
|
| [`dsh-util-values`](../../util/values/README.zh.md) | 共享无损 JSON 校验与分离式快照 |
|
|
95
|
-
| [`src/chunk-rows.ts`](src/chunk-rows.ts) | 供持久化后端使用的共享紧凑行存储编解码器 |
|
|
96
95
|
| [`src/repair.ts`](src/repair.ts) | 崩溃遗留日志的冷修复 |
|
|
97
96
|
| [`src/invariant.ts`](src/invariant.ts) | 不变式配套:序号、轮次/步骤闭合、工具调用/结果配对 |
|
|
98
97
|
|
|
@@ -102,7 +101,7 @@ session.deriveMessages() // the derived model history
|
|
|
102
101
|
|
|
103
102
|
### 派生历史
|
|
104
103
|
|
|
105
|
-
`deriveMessages()` 把每个 surface 节点的投影缓存一次,每次调用都返回共享、深度冻结消息之上的新数组;三种 surface 事件类型(`user/message`、`assistant/message`、`tool/result`)各自投影自己的消息种类——user 内容原样、带提供方与模型的组装 assistant 消息,或 user
|
|
104
|
+
`deriveMessages()` 把每个 surface 节点的投影缓存一次,每次调用都返回共享、深度冻结消息之上的新数组;三种 surface 事件类型(`user/message`、`assistant/message`、`tool/result`)各自投影自己的消息种类——user 内容原样、带提供方与模型的组装 assistant 消息,或 user 角色的工具结果。嵌入式 Assistant stream 与 `assistant/attempt` 事件只保留重放和诊断数据。surface 重写会重建投影——不存在原始日志回退,因此 surface 是派生历史的唯一来源。
|
|
106
105
|
|
|
107
106
|
### 请求头
|
|
108
107
|
|
|
@@ -132,7 +131,7 @@ session.deriveMessages() // the derived model history
|
|
|
132
131
|
|
|
133
132
|
#### 模型看到什么
|
|
134
133
|
|
|
135
|
-
模型会原样接收 `user/message`、`assistant/message` 与 `tool/result` surface 条目中的完整消息——标识、角色、来源与内容块都与创建时确定的值相同,投影从不生成标识。直接提示词与注入上下文仍是彼此独立的 `user/message`
|
|
134
|
+
模型会原样接收 `user/message`、`assistant/message` 与 `tool/result` surface 条目中的完整消息——标识、角色、来源与内容块都与创建时确定的值相同,投影从不生成标识。直接提示词与注入上下文仍是彼此独立的 `user/message` 事件,各事件的来源会保留其出处。嵌入式 stream、`assistant/attempt`、边界与其他仅日志事实不会添加消息。
|
|
136
135
|
|
|
137
136
|
#### Token 影响
|
|
138
137
|
|
|
@@ -177,8 +176,8 @@ session.deriveMessages() // the derived model history
|
|
|
177
176
|
|
|
178
177
|
这些限制说明会话存储何时需要特别留意。它们是当前包约束,不是任务积压。
|
|
179
178
|
|
|
180
|
-
- **`fork()` 仅在实时会话的稳定边界处切分**:所选前缀结束时不得有开放轮次,且源会话必须位于存储中;
|
|
181
|
-
- **`SESSION_FORMAT_VERSION`
|
|
179
|
+
- **`fork()` 仅在实时会话的稳定边界处切分**:所选前缀结束时不得有开放轮次,且源会话必须位于存储中;fork API 不支持对已持久化但未加载的会话进行 fork。
|
|
180
|
+
- **`SESSION_FORMAT_VERSION` 只命名当前逻辑表示**——历史 header 与事件位于相邻格式包中,持久化会在构造 `Session` 前发布完整受支持链;同版本未知事件仍要求信封显式带有 `ignorable` 标记([机制](../../../.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.zh.md))。
|
|
182
181
|
- **`TurnEndReasonMap` 不含 ACP(Agent Client Protocol)命名的 `refusal`/`max_turn_requests` 变体**:受生产方约束;只有当适配器或循环首次产生这些变体时才加入。
|
|
183
182
|
- **fork 之外没有会话树**:基于分支会话的 pi 风格条目树被推迟,除非消费方需要超越基于边界的 forking 的能力。
|
|
184
183
|
|