dsh-plugin-dev-kb 1.0.9 → 1.3.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/CHANGELOG.md +26 -0
- package/README.en.md +14 -8
- package/README.md +14 -8
- package/docs/banner.svg +25 -0
- package/kb/INDEX.md +8 -2
- package/kb/README.md +4 -4
- package/kb/extra/AGENTS.md +3 -3
- package/kb/extra/cookbook/adding-a-remote-api.md +197 -0
- package/kb/extra/cookbook/adding-a-remote-api.zh.md +197 -0
- package/kb/extra/cookbook/adding-a-session-format-version.md +109 -0
- package/kb/extra/cookbook/adding-a-session-format-version.zh.md +109 -0
- package/kb/extra/cookbook/adding-a-vendored-package.md +1 -1
- package/kb/extra/cookbook/adding-a-vendored-package.zh.md +1 -1
- package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.md +1 -1
- package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.zh.md +1 -1
- package/kb/extra/deepseek-llm-api-wire-extensions.md +19 -15
- package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +19 -15
- package/kb/extra/development.md +13 -3
- package/kb/extra/development.zh.md +13 -3
- package/kb/extra/event-producer-consumer.md +49 -46
- package/kb/extra/event-producer-consumer.zh.md +52 -49
- package/kb/extra/i18n/README.md +2 -1
- package/kb/extra/i18n/README.zh.md +3 -2
- package/kb/extra/i18n/style-samples.md +2 -2
- package/kb/extra/i18n/translation-prompt.md +1 -1
- package/kb/extra/module-graph.md +493 -1002
- package/kb/extra/module-graph.zh.md +495 -1004
- package/kb/extra/rescope.md +1 -1
- package/kb/extra/rescope.zh.md +1 -1
- package/kb/extra/session-format-status.md +47 -0
- package/kb/extra/session-format-status.zh.md +47 -0
- package/kb/extra/subsystems/agent-team.md +3 -2
- package/kb/extra/subsystems/agent-team.zh.md +3 -2
- package/kb/extra/subsystems/attachment.md +157 -4
- package/kb/extra/subsystems/attachment.zh.md +157 -4
- package/kb/extra/subsystems/feedback.md +164 -30
- package/kb/extra/subsystems/feedback.zh.md +164 -30
- package/kb/extra/testing.md +9 -4
- package/kb/extra/testing.zh.md +9 -4
- package/kb/extra/web-styling.md +5 -0
- package/kb/extra/web-styling.zh.md +5 -0
- package/kb/meta/search-index.json +223 -151
- package/kb/meta/site-pages.txt +187 -181
- package/kb/meta/source.json +5 -5
- package/kb/meta/topics.md +5 -5
- package/kb/site/develop/basic/publish.md +1 -1
- package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +3 -2
- package/kb/site/develop/practice/llm-adapter.md +4 -3
- package/kb/site/en/develop/basic/publish.md +1 -1
- package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +3 -2
- package/kb/site/en/develop/practice/llm-adapter.md +4 -3
- package/kb/site/en/guide/network-proxy.md +87 -0
- package/kb/site/en/guide/providers.md +70 -17
- package/kb/site/en/guide/python-sdk.md +19 -3
- package/kb/site/en/guide/schedule.md +2 -0
- package/kb/site/en/reference/agent-lifecycle.md +17 -8
- package/kb/site/en/reference/api-gateway.md +2 -2
- package/kb/site/en/reference/capability-seams.md +24 -10
- package/kb/site/en/reference/config-catalog.md +322 -264
- package/kb/site/en/reference/cookbook/adding-a-package.md +1 -2
- package/kb/site/en/reference/cookbook/adding-a-settings-card.md +10 -8
- package/kb/site/en/reference/cookbook/adding-a-tool.md +1 -1
- package/kb/site/en/reference/cookbook/extension-cookbook.md +16 -13
- package/kb/site/en/reference/index.md +26 -9
- package/kb/site/en/reference/persistence-catalog.md +189 -95
- package/kb/site/en/reference/subsystems/approval.md +1 -1
- package/kb/site/en/reference/subsystems/client-modules.md +9 -0
- package/kb/site/en/reference/subsystems/client-resources.md +94 -0
- package/kb/site/en/reference/subsystems/code-runtime.md +7 -3
- package/kb/site/en/reference/subsystems/commands.md +25 -16
- package/kb/site/en/reference/subsystems/compaction.md +10 -10
- package/kb/site/en/reference/subsystems/conversation.md +11 -4
- package/kb/site/en/reference/subsystems/core.md +173 -29
- package/kb/site/en/reference/subsystems/credentials.md +5 -4
- package/kb/site/en/reference/subsystems/filesystem.md +15 -0
- package/kb/site/en/reference/subsystems/goal.md +38 -2
- package/kb/site/en/reference/subsystems/index.md +3 -1
- package/kb/site/en/reference/subsystems/invariants.md +1 -1
- package/kb/site/en/reference/subsystems/llm-streaming.md +43 -12
- package/kb/site/en/reference/subsystems/lsp.md +1 -1
- package/kb/site/en/reference/subsystems/permission-presets.md +5 -5
- package/kb/site/en/reference/subsystems/persistence.md +211 -199
- package/kb/site/en/reference/subsystems/plan.md +3 -3
- package/kb/site/en/reference/subsystems/sandbox.md +2 -0
- package/kb/site/en/reference/subsystems/schedule.md +9 -3
- package/kb/site/en/reference/subsystems/scope.md +1 -1
- package/kb/site/en/reference/subsystems/session-projection.md +50 -24
- package/kb/site/en/reference/subsystems/session-query.md +19 -13
- package/kb/site/en/reference/subsystems/session-reference.md +29 -1
- package/kb/site/en/reference/subsystems/session-telemetry.md +27 -10
- package/kb/site/en/reference/subsystems/session-title.md +6 -6
- package/kb/site/en/reference/subsystems/session.md +208 -103
- package/kb/site/en/reference/subsystems/settings.md +30 -12
- package/kb/site/en/reference/subsystems/shell.md +9 -6
- package/kb/site/en/reference/subsystems/sidebar-right.md +151 -0
- package/kb/site/en/reference/subsystems/skills.md +1 -1
- package/kb/site/en/reference/subsystems/slots.md +41 -32
- package/kb/site/en/reference/subsystems/spill.md +13 -6
- package/kb/site/en/reference/subsystems/storage.md +28 -5
- package/kb/site/en/reference/subsystems/subagent.md +58 -105
- package/kb/site/en/reference/subsystems/subprocess.md +25 -26
- package/kb/site/en/reference/subsystems/system-prompt.md +18 -3
- package/kb/site/en/reference/subsystems/token-meter.md +4 -3
- package/kb/site/en/reference/subsystems/tools.md +5 -5
- package/kb/site/en/reference/subsystems/typert.md +18 -18
- package/kb/site/en/reference/subsystems/web-client.md +1 -1
- package/kb/site/en/reference/subsystems/workspace.md +88 -9
- package/kb/site/en/reference/tool-catalog.md +56 -66
- package/kb/site/en/reference/tool-execution-pipeline.md +2 -2
- package/kb/site/guide/network-proxy.md +87 -0
- package/kb/site/guide/providers.md +70 -17
- package/kb/site/guide/python-sdk.md +19 -3
- package/kb/site/guide/schedule.md +2 -0
- package/kb/site/reference/agent-lifecycle.md +17 -8
- package/kb/site/reference/api-gateway.md +2 -2
- package/kb/site/reference/capability-seams.md +24 -10
- package/kb/site/reference/config-catalog.md +321 -263
- package/kb/site/reference/cookbook/adding-a-package.md +1 -2
- package/kb/site/reference/cookbook/adding-a-settings-card.md +10 -8
- package/kb/site/reference/cookbook/adding-a-tool.md +1 -1
- package/kb/site/reference/cookbook/extension-cookbook.md +16 -13
- package/kb/site/reference/index.md +26 -9
- package/kb/site/reference/persistence-catalog.md +190 -96
- package/kb/site/reference/subsystems/approval.md +1 -1
- package/kb/site/reference/subsystems/client-modules.md +9 -0
- package/kb/site/reference/subsystems/client-resources.md +94 -0
- package/kb/site/reference/subsystems/code-runtime.md +7 -3
- package/kb/site/reference/subsystems/commands.md +25 -16
- package/kb/site/reference/subsystems/compaction.md +10 -10
- package/kb/site/reference/subsystems/conversation.md +11 -4
- package/kb/site/reference/subsystems/core.md +173 -29
- package/kb/site/reference/subsystems/credentials.md +5 -4
- package/kb/site/reference/subsystems/filesystem.md +15 -0
- package/kb/site/reference/subsystems/goal.md +38 -2
- package/kb/site/reference/subsystems/index.md +14 -12
- package/kb/site/reference/subsystems/invariants.md +1 -1
- package/kb/site/reference/subsystems/llm-streaming.md +43 -12
- package/kb/site/reference/subsystems/lsp.md +1 -1
- package/kb/site/reference/subsystems/permission-presets.md +5 -5
- package/kb/site/reference/subsystems/persistence.md +210 -198
- package/kb/site/reference/subsystems/plan.md +3 -3
- package/kb/site/reference/subsystems/schedule.md +9 -3
- package/kb/site/reference/subsystems/scope.md +1 -1
- package/kb/site/reference/subsystems/session-projection.md +50 -24
- package/kb/site/reference/subsystems/session-query.md +19 -13
- package/kb/site/reference/subsystems/session-reference.md +29 -1
- package/kb/site/reference/subsystems/session-telemetry.md +27 -10
- package/kb/site/reference/subsystems/session-title.md +6 -6
- package/kb/site/reference/subsystems/session.md +208 -103
- package/kb/site/reference/subsystems/settings.md +30 -12
- package/kb/site/reference/subsystems/shell.md +9 -6
- package/kb/site/reference/subsystems/sidebar-right.md +151 -0
- package/kb/site/reference/subsystems/skills.md +1 -1
- package/kb/site/reference/subsystems/slots.md +41 -32
- package/kb/site/reference/subsystems/spill.md +13 -6
- package/kb/site/reference/subsystems/storage.md +28 -5
- package/kb/site/reference/subsystems/subagent.md +58 -105
- package/kb/site/reference/subsystems/subprocess.md +25 -26
- package/kb/site/reference/subsystems/system-prompt.md +18 -3
- package/kb/site/reference/subsystems/token-meter.md +4 -3
- package/kb/site/reference/subsystems/tools.md +5 -5
- package/kb/site/reference/subsystems/typert.md +18 -18
- package/kb/site/reference/subsystems/web-client.md +1 -1
- package/kb/site/reference/subsystems/workspace.md +88 -9
- package/kb/site/reference/tool-catalog.md +55 -65
- package/kb/site/reference/tool-execution-pipeline.md +2 -2
- package/lib/index.js +25 -44
- package/package.json +3 -2
- package/skills/dsh-plugin-dev-kb.md +4 -4
|
@@ -5,7 +5,7 @@ outline: [2,3]
|
|
|
5
5
|
|
|
6
6
|
# 仅限 Session 内的 Schedule
|
|
7
7
|
|
|
8
|
-
Schedule 拥有持久提醒;这些提醒会作为普通的后续对话轮次返回原 live Session。[持久 Schedule Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-08-05-durable-web-schedule.zh.md)
|
|
8
|
+
Schedule 拥有持久提醒;这些提醒会作为普通的后续对话轮次返回原 live Session。[持久 Schedule Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-08-05-durable-web-schedule.zh.md) 负责持久化、生命周期与活动状态呈现,[显式时区边界](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/simplification/2026-08-09-explicit-schedule-time-zone.zh.md) 负责浏览器本地解释。本页记录 [`packages/schedule/schedule/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/schedule/src/types.ts) 中的持久数据形状和面向模型的数据形状;[包 README](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/schedule/README.zh.md) 负责组合、工具行为与确切的提醒 framing。
|
|
9
9
|
|
|
10
10
|
## 持久记录
|
|
11
11
|
|
|
@@ -152,7 +152,7 @@ type ScheduleDispatchChange = OneShotScheduleDispatchChange | EveryScheduleDispa
|
|
|
152
152
|
type ScheduleChange = ScheduleCreateChange | ScheduleDeleteChange | ScheduleDispatchChange
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
-
严格 decoder 与 fold 会拒绝未知版本、额外字段、复用 id、不匹配的一次性提醒或 Every dispatch 形状,以及针对非活动记录的 delete 或 dispatch 转换。普通 Session 折叠完整事件流。fork
|
|
155
|
+
严格 decoder 与 fold 会拒绝未知版本、额外字段、复用 id、不匹配的一次性提醒或 Every dispatch 形状,以及针对非活动记录的 delete 或 dispatch 转换。普通 Session 折叠完整事件流。fork 只折叠精确 `inheritedEventCount` 位置及其后的事件,因此保留历史,但不会接管父 Session 的活动提醒。Projection 初始化会在不可变 header 旁接收该 cut,复用共享 transition,并持久化 cut、活动记录与已使用 id 历史,使缓存恢复继续保持严格回放。`schedule/change` 声明和源码位置也编入[持久化目录](../persistence-catalog.md#schedulechange--log-only)。
|
|
156
156
|
|
|
157
157
|
## 活动视图与管理
|
|
158
158
|
|
|
@@ -180,10 +180,16 @@ type ScheduleView = ScheduleRecord & {
|
|
|
180
180
|
|
|
181
181
|
生成的[工具目录](../tool-catalog.md#deepseek-aidsh-schedule)负责 `schedule_create`、`schedule_list` 和 `schedule_delete` 的参数与结果 schema。一条 Agent-scoped 队列将管理调用与到期工作串行化。每次读取或判断都会先等待共享的 Session 持久化 barrier;create 与实际执行的 delete 在追加后还会再次等待。barrier 失败会报告 `persistence_uncertain`,而不是猜测 eager write 是否已提交。其他稳定错误代码是 `invalid_prompt`、`invalid_selector`、`invalid_rule`、`invalid_time_zone`、`not_future`、`time_out_of_range`、`frequency_too_high`、`corrupt_schedule_log` 和 `internal_error`。
|
|
182
182
|
|
|
183
|
+
## 只读 Web 目录
|
|
184
|
+
|
|
185
|
+
可选 Session projection 注册表存在时,Schedule 会注册客户端可见的 `schedule` key,其值是完整的活动 `ScheduleRecord[]`。live、cache、history 与 detached 读取共用同一套 header-aware 严格 fold;畸形权威输入会使既有读取路径失败,而不会发布部分值。
|
|
186
|
+
|
|
187
|
+
shipped Web bundle 默认禁用 `ui-schedule`,显式 Schedule overlay 则把它与 Host 能力一同启用。[`dsh-client-ui-schedule`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-schedule/README.zh.md)拥有 header 交互,[`dsh-client-ui-workspace`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-workspace/README.zh.md)拥有列表行呈现,持久 Schedule Agent Note 拥有二者共享的活动状态边界。共享值只表示当前活动状态,绝不表示交付历史或回执;到期提醒仍通过下文所述的普通 Assistant 输出出现。
|
|
188
|
+
|
|
183
189
|
## Live 交付
|
|
184
190
|
|
|
185
191
|
进程内 owner 根据持久 fold 派生最早的 timer,并在每次有界等待后重新读取墙钟。cold Session 不执行任何工作;重新打开后会重建 timer,并使已经过去的目标进入 overdue 状态。到期的一次性提醒享有优先级,每次只进入一个后续轮次。当没有一次性提醒到期时,所有 overdue 的 Every 记录会组成上述单个批次。
|
|
186
192
|
|
|
187
193
|
到期工作会先等待 Agent 完全 idle 并认领 maintenance phase,再重新折叠状态、采样本次判断、将一个 `followup()` 排入队列,并追加对应的 dispatch 变更。它绝不会调用 `steer()`,也绝不会中断当前轮次。
|
|
188
194
|
|
|
189
|
-
获得准入的一次性提醒或固定速率批次会启动一个普通的后续轮次,且只通过普通对话 transcript(文本记录)出现;Schedule 不提供独立的持久 Web
|
|
195
|
+
获得准入的一次性提醒或固定速率批次会启动一个普通的后续轮次,且只通过普通对话 transcript(文本记录)出现;Schedule 不提供独立的持久 Web 回执。上面的只读活动目录绝不表示交付成功。如果 framing 构造或同步队列准入失败,则不会记录 dispatch,提醒仍保持活动。队列准入后、持久 dispatch 前的狭窄崩溃窗口可能使提醒内容在恢复后重复,因此该边界提供的是尽力而为的至少一次交付,而非恰好一次交付。
|
|
@@ -5,7 +5,7 @@ outline: [2,3]
|
|
|
5
5
|
|
|
6
6
|
# 作用域注册
|
|
7
7
|
|
|
8
|
-
[scope 包](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/core/scope)提供身份、载体与作用域层词汇,使同一注册上下文同时表达每个 agent(智能体)的可见性和共享生命周期所有权。它是库原语,而不是 Cordis 服务;生命周期设计理由由 [agent-scope 运行时设计 Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-07-12-agent-scope-runtime-design.zh.md#scope-routing-one-opaque-key-selects-one-layer)
|
|
8
|
+
[scope 包](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/core/scope)提供身份、载体与作用域层词汇,使同一注册上下文同时表达每个 agent(智能体)的可见性和共享生命周期所有权。它是库原语,而不是 Cordis 服务;生命周期设计理由由 [agent-scope 运行时设计 Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-07-12-agent-scope-runtime-design.zh.md#scope-routing-one-opaque-key-selects-one-layer)规定,可调用 API 与过滤语义则由包 [README](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/scope/README.zh.md)规定。
|
|
9
9
|
|
|
10
10
|
源码:[`packages/core/scope/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/scope/src/index.ts) 与 [`packages/core/scope/src/store.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/scope/src/store.ts)。
|
|
11
11
|
|
|
@@ -33,9 +33,10 @@ interface ProjectionDefinition<
|
|
|
33
33
|
/**
|
|
34
34
|
* State for the empty log and its immutable Session metadata.
|
|
35
35
|
* @param header - immutable metadata for the Session being projected.
|
|
36
|
+
* @param inheritedEventCount - exact fork-inherited prefix length.
|
|
36
37
|
* @returns the initial state.
|
|
37
38
|
*/
|
|
38
|
-
init(header: SessionHeader): NoInfer<S>
|
|
39
|
+
init(header: SessionHeader, inheritedEventCount: SessionLogOffset): NoInfer<S>
|
|
39
40
|
/**
|
|
40
41
|
* Pure transition: previous state + one committed event → next state. A
|
|
41
42
|
* unit uninterested in an event MUST return the same state reference — an
|
|
@@ -50,7 +51,10 @@ interface ProjectionDefinition<
|
|
|
50
51
|
/** Validates the wire payload before it leaves the host. */
|
|
51
52
|
viewSchema: ZodType<SessionProjectionMap[K]>
|
|
52
53
|
/**
|
|
53
|
-
* State → wire payload (the read-side projection).
|
|
54
|
+
* State → wire payload (the read-side projection). The live drive keeps
|
|
55
|
+
* the two latest raw results and compares them with `Object.is`; an
|
|
56
|
+
* object-valued view must reuse its reference to suppress publication
|
|
57
|
+
* across internal-only state changes.
|
|
54
58
|
* @param state - the current state.
|
|
55
59
|
* @returns the whole current value for this unit's key.
|
|
56
60
|
*/
|
|
@@ -78,7 +82,7 @@ interface ProjectionDefinition<
|
|
|
78
82
|
*/
|
|
79
83
|
interface ProjectionSnapshot {
|
|
80
84
|
/** Seq of the last event the values reflect; -1 for an empty log. */
|
|
81
|
-
asOfSeq:
|
|
85
|
+
asOfSeq: SessionSeqCursor
|
|
82
86
|
/** Whole current client value per registered key. */
|
|
83
87
|
values: Partial<SessionProjectionMap>
|
|
84
88
|
}
|
|
@@ -86,19 +90,19 @@ interface ProjectionSnapshot {
|
|
|
86
90
|
|
|
87
91
|
```ts type-equiv
|
|
88
92
|
/**
|
|
89
|
-
* Change-feed listener: one unit's
|
|
90
|
-
* the schema-validated
|
|
91
|
-
* emission (the seq of the event that caused the change).
|
|
93
|
+
* Change-feed listener: one unit's raw `view` result changed by `Object.is`
|
|
94
|
+
* for one session. `value` is the schema-validated output; `seq` is the
|
|
95
|
+
* unit's watermark at emission (the seq of the event that caused the change).
|
|
92
96
|
*/
|
|
93
97
|
type ProjectionChangeListener = (
|
|
94
98
|
session: Session,
|
|
95
99
|
key: Extract<keyof SessionProjectionMap, string>,
|
|
96
100
|
value: unknown,
|
|
97
|
-
seq:
|
|
101
|
+
seq: SessionSeq,
|
|
98
102
|
) => void
|
|
99
103
|
```
|
|
100
104
|
|
|
101
|
-
`snapshot(session)` 完全同步:载体在切出页面切片的同一 tick 内读取它,因此 `asOfSeq` 使两次读取使用同一个序号。它只返回客户端视图,并在返回前通过各单元的 `viewSchema` 校验。`stateOf(session, key)` 可在不计算无关视图的情况下读取一份实时 host
|
|
105
|
+
`snapshot(session)` 完全同步:载体在切出页面切片的同一 tick 内读取它,因此 `asOfSeq` 使两次读取使用同一个序号。它只返回客户端视图,并在返回前通过各单元的 `viewSchema` 校验。`stateOf(session, key)` 可在不计算无关视图的情况下读取一份实时 host 状态;调用方不得修改这一借用引用。state 引用变化时,注册表计算并缓存一次原始 view;只有该结果通过 `Object.is` 判定为变化时才触发变更流,对象 view 若要在仅内部 state 变化时抑制发布就必须保留引用。
|
|
102
106
|
|
|
103
107
|
## 注册表:`ctx.sessionProjections`
|
|
104
108
|
|
|
@@ -128,11 +132,32 @@ The persisted projection cache service. Opens the `session_projcache` domain at
|
|
|
128
132
|
* paths (the history tail baseline) supersede these values whenever a
|
|
129
133
|
* session is actually opened.
|
|
130
134
|
* @param meta - the listed session's header (identity witness; no log read).
|
|
135
|
+
* @param inheritedEventCount - exact inherited prefix length that completes
|
|
136
|
+
* the checkpoint identity.
|
|
131
137
|
* @param keys - optional projection keys required by the caller's audience.
|
|
132
138
|
* @returns the cut (`asOfSeq` = lowest served-row watermark), or
|
|
133
139
|
* `undefined` when no usable row exists for this lifecycle.
|
|
134
140
|
*/
|
|
135
|
-
cachedSnapshot( meta: SessionHeader, keys?: readonly Extract<keyof SessionProjectionMap, string>[], ): ProjectionSnapshot | undefined
|
|
141
|
+
cachedSnapshot( meta: SessionHeader, inheritedEventCount: SessionLogOffset, keys?: readonly Extract<keyof SessionProjectionMap, string>[], ): ProjectionSnapshot | undefined
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Read only a predecessor checkpoint's title as a zero-I/O listing hint.
|
|
145
|
+
*
|
|
146
|
+
* The authoritative Session header supplies the lifecycle identity. A cache
|
|
147
|
+
* checkpoint can lag that log but cannot lead it because writes flush the
|
|
148
|
+
* log first, so a matching predecessor title is a genuine (possibly stale)
|
|
149
|
+
* fact from this Session. The registry still requires the current title
|
|
150
|
+
* projection's row version and schema. No other predecessor projection is
|
|
151
|
+
* exposed: format normalization can change their current meaning, and the
|
|
152
|
+
* strict {@link cachedSnapshot} / hydration paths continue to reject them.
|
|
153
|
+
* @param meta - authoritative listed Session header.
|
|
154
|
+
* @param inheritedEventCount - exact inherited cut completing the lifecycle identity.
|
|
155
|
+
* @returns a title-only checkpoint view with `asOfSeq: -1`, or `undefined`
|
|
156
|
+
* when the record is current, newer, unrelated, missing, or incompatible
|
|
157
|
+
* with the title unit. The sentinel avoids reusing a sequence that a
|
|
158
|
+
* cardinality-changing Session migration may have remapped.
|
|
159
|
+
*/
|
|
160
|
+
cachedPredecessorTitle( meta: SessionHeader, inheritedEventCount: SessionLogOffset, ): ProjectionSnapshot | undefined
|
|
136
161
|
|
|
137
162
|
/**
|
|
138
163
|
* Hydrate projection cells for an already-prepared Session without another
|
|
@@ -140,11 +165,10 @@ cachedSnapshot( meta: SessionHeader, keys?: readonly Extract<keyof SessionProjec
|
|
|
140
165
|
* advances every unit to the observation cut. No checkpoint is written
|
|
141
166
|
* because the logical observation may contain recovery events not yet durable.
|
|
142
167
|
* @param session - exact unpublished Session retained by persistence.
|
|
143
|
-
* @param meta - observed lifecycle header.
|
|
144
168
|
* @param events - exact logical event prefix represented by the observation.
|
|
145
169
|
* @returns all projection values at the event cut.
|
|
146
170
|
*/
|
|
147
|
-
hydratePrepared( session: Session,
|
|
171
|
+
hydratePrepared( session: Session, events: readonly SessionEvent[], ): ProjectionSnapshot
|
|
148
172
|
|
|
149
173
|
/**
|
|
150
174
|
* Durably checkpoint one live session NOW (all mandatory points call
|
|
@@ -166,13 +190,14 @@ async write(session: Session): Promise<void>
|
|
|
166
190
|
* The caller supplies the complete log in seq order: this service never
|
|
167
191
|
* consults the persistence layer.
|
|
168
192
|
* @param meta - the stored session header (identity witness).
|
|
193
|
+
* @param inheritedEventCount - exact inherited prefix length for projection initialization and identity.
|
|
169
194
|
* @param events - the session's complete log, in seq order.
|
|
170
195
|
* @returns the projection cut at the log end.
|
|
171
196
|
*/
|
|
172
|
-
coldSnapshot(meta: SessionHeader, events: readonly SessionEvent[]): ProjectionSnapshot
|
|
197
|
+
coldSnapshot( meta: SessionHeader, inheritedEventCount: SessionLogOffset, events: readonly SessionEvent[], ): ProjectionSnapshot
|
|
173
198
|
```
|
|
174
199
|
|
|
175
|
-
Types: [Session](./session.md) · [SessionEvent](./session.md) · [SessionHeader](./persistence.md)
|
|
200
|
+
Types: [Session](./session.md) · [SessionEvent](./session.md) · [SessionHeader](./persistence.md) · [SessionLogOffset](./session.md)
|
|
176
201
|
|
|
177
202
|
Source: [`packages/session/session-projection-cache/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-projection-cache/src/index.ts)
|
|
178
203
|
|
|
@@ -180,7 +205,7 @@ Source: [`packages/session/session-projection-cache/src/index.ts`](https://githu
|
|
|
180
205
|
|
|
181
206
|
### `ctx.sessionProjections` — `SessionProjectionRegistry`
|
|
182
207
|
|
|
183
|
-
`ctx.sessionProjections`: the projection unit table and its drive. The service subscribes to `session/event` once; every committed event passes every registered unit's `apply` (eager drive)
|
|
208
|
+
`ctx.sessionProjections`: the projection unit table and its drive. The service subscribes to `session/event` once; every committed event passes every registered unit's `apply` (eager drive). A changed state reference computes the next client view; the change feed is notified only when its raw result changes by `Object.is`. Cells build lazily — a unit registered after events flowed, or a session older than the registry, folds `init` over the in-memory log on first touch (event or read). Registration is an effect (disposer rides the calling fiber): an unloaded domain plugin's key disappears from snapshots and clients read it as capability absence. A host reader either declares `sessionProjections` in its plugin `inject` or fails explicitly when the registry or required key is absent. Contributors may preserve optional registration through `ctx.inject(['sessionProjections'], ...)`. Registrants sharing a key share one unit and are counted: the same tool package mounted in N agent presets registers N times, and the key survives until the last one unloads.
|
|
184
209
|
|
|
185
210
|
```ts cordis-catalog
|
|
186
211
|
/**
|
|
@@ -204,7 +229,7 @@ register< K extends Exclude<keyof SessionProjectionStateMap, keyof SessionProjec
|
|
|
204
229
|
/**
|
|
205
230
|
* Subscribe to the change feed. The registration is an effect on the
|
|
206
231
|
* calling context's fiber.
|
|
207
|
-
* @param listener - called once per client-visible unit whose
|
|
232
|
+
* @param listener - called once per client-visible unit whose raw view changed by `Object.is`, per committed event.
|
|
208
233
|
* @returns the exact disposer that unsubscribes.
|
|
209
234
|
*/
|
|
210
235
|
onChanged(listener: ProjectionChangeListener): () => void
|
|
@@ -268,11 +293,11 @@ checkpoint(session: Session): ProjectionCheckpoint
|
|
|
268
293
|
* yields an end below every watermark and the restore rejects for a full
|
|
269
294
|
* re-read.
|
|
270
295
|
* @param checkpoint - persisted rows for one session (possibly stale or empty).
|
|
271
|
-
* @returns the
|
|
272
|
-
* when no unit is registered (no read needed —
|
|
273
|
-
* serve empty values regardless).
|
|
296
|
+
* @returns the offset for the stored-log suffix read (`SessionHandle.read`),
|
|
297
|
+
* or `undefined` when no unit is registered (no read needed —
|
|
298
|
+
* {@link restore} would serve empty values regardless).
|
|
274
299
|
*/
|
|
275
|
-
restoreFloor(checkpoint: ProjectionCheckpoint):
|
|
300
|
+
restoreFloor(checkpoint: ProjectionCheckpoint): SessionLogOffset | undefined
|
|
276
301
|
|
|
277
302
|
/**
|
|
278
303
|
* View a checkpoint's rows without any log read: for every registered
|
|
@@ -291,8 +316,8 @@ viewCheckpoint( checkpoint: ProjectionCheckpoint, keys?: readonly Extract<keyof
|
|
|
291
316
|
* Cold read: fold every persisted unit over a stored log suffix, seeding
|
|
292
317
|
* each from its checkpoint row when usable — the one read recipe (cached
|
|
293
318
|
* state + forward tail replay + `view`) applied without a live `Session`.
|
|
294
|
-
* Call with the events
|
|
295
|
-
* `
|
|
319
|
+
* Call with the stored events at or past `restoreFloor(checkpoint)` (a
|
|
320
|
+
* `SessionHandle.read` slice) and that same floor as
|
|
296
321
|
* `baseSeq`; the floor's one-below anchor makes the supplied end honest,
|
|
297
322
|
* so a shrunk log is detected here. A row is usable iff its
|
|
298
323
|
* `ver` matches the live unit's `stateVersion`, it does not predate `baseSeq`
|
|
@@ -306,11 +331,12 @@ viewCheckpoint( checkpoint: ProjectionCheckpoint, keys?: readonly Extract<keyof
|
|
|
306
331
|
* @param events - the stored events with `seq >= baseSeq`, in seq order.
|
|
307
332
|
* @param baseSeq - the seq `events` starts at (its first event's seq when non-empty).
|
|
308
333
|
* @param header - immutable metadata for the Session being restored.
|
|
334
|
+
* @param inheritedEventCount - exact fork-inherited prefix length supplied to unit initialization.
|
|
309
335
|
* @returns the snapshot cut at the supplied log end (`asOfSeq` is the last
|
|
310
336
|
* supplied event's seq, `baseSeq - 1` for an empty tail) plus the
|
|
311
337
|
* refreshed checkpoint rows at that cut, ready for a durable write-back.
|
|
312
338
|
*/
|
|
313
|
-
restore( checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq:
|
|
339
|
+
restore( checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq: SessionLogOffset, header: SessionHeader, inheritedEventCount: SessionLogOffset, ): { snapshot: ProjectionSnapshot; checkpoint: ProjectionCheckpoint }
|
|
314
340
|
|
|
315
341
|
/**
|
|
316
342
|
* Restore an exact cut and install its states on the supplied prepared Session.
|
|
@@ -322,10 +348,10 @@ restore( checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], base
|
|
|
322
348
|
* @param baseSeq - first supplied event sequence.
|
|
323
349
|
* @returns all projection values at the supplied cut.
|
|
324
350
|
*/
|
|
325
|
-
hydrate( session: Session, checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq:
|
|
351
|
+
hydrate( session: Session, checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq: SessionLogOffset, ): ProjectionSnapshot
|
|
326
352
|
```
|
|
327
353
|
|
|
328
|
-
Types: [Session](./session.md) · [SessionEvent](./session.md) · [SessionHeader](./persistence.md)
|
|
354
|
+
Types: [Session](./session.md) · [SessionEvent](./session.md) · [SessionHeader](./persistence.md) · [SessionLogOffset](./session.md)
|
|
329
355
|
|
|
330
356
|
Source: [`packages/session/session-projection/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-projection/src/index.ts)
|
|
331
357
|
<!-- END GENERATED cordis-surface -->
|
|
@@ -25,7 +25,7 @@ interface SessionRecord {
|
|
|
25
25
|
header: SessionHeader
|
|
26
26
|
/** Whether the id currently exists in `ctx.sessions`. */
|
|
27
27
|
live: boolean
|
|
28
|
-
/** Whether the active persistence backend currently
|
|
28
|
+
/** Whether the active persistence backend currently lists the id, including a created-but-unmaterialized session it already observes. */
|
|
29
29
|
persisted: boolean
|
|
30
30
|
}
|
|
31
31
|
```
|
|
@@ -37,7 +37,9 @@ interface SessionRecord {
|
|
|
37
37
|
interface SessionLogSnapshot {
|
|
38
38
|
/** Cloned session header selected from the same observation as `events`. */
|
|
39
39
|
session: SessionHeader
|
|
40
|
-
/**
|
|
40
|
+
/** Exact number of fork-inherited events in the observed log. */
|
|
41
|
+
inheritedEventCount: SessionLogOffset
|
|
42
|
+
/** Cloned contiguous raw events after in-memory interrupted-turn balancing and replay validation. */
|
|
41
43
|
events: SessionEvent[]
|
|
42
44
|
}
|
|
43
45
|
```
|
|
@@ -47,8 +49,10 @@ interface SessionLogSnapshot {
|
|
|
47
49
|
interface SessionSurfaceSnapshot {
|
|
48
50
|
/** Cloned session header selected from the same corpus observation as `events`. */
|
|
49
51
|
session: SessionHeader
|
|
52
|
+
/** Exact number of fork-inherited events in the observed log. */
|
|
53
|
+
inheritedEventCount: SessionLogOffset
|
|
50
54
|
/** Highest raw-log seq included in the observation, or `null` for an empty log. */
|
|
51
|
-
capturedThroughSeq:
|
|
55
|
+
capturedThroughSeq: OptionalSessionSeq
|
|
52
56
|
/** Cloned current surface events in model-history order. */
|
|
53
57
|
events: SurfaceEvent[]
|
|
54
58
|
}
|
|
@@ -93,7 +97,7 @@ interface SessionEventRecord {
|
|
|
93
97
|
/** Session that owns the event. */
|
|
94
98
|
sessionId: SessionId
|
|
95
99
|
/** Monotonic event seq within the session. */
|
|
96
|
-
seq:
|
|
100
|
+
seq: SessionSeq
|
|
97
101
|
/** Discriminant of the session event. */
|
|
98
102
|
type: SessionEventType
|
|
99
103
|
/** Event timestamp in Unix epoch milliseconds. */
|
|
@@ -269,7 +273,7 @@ interface SessionEventReadRequest {
|
|
|
269
273
|
/** Session that owns the target event. */
|
|
270
274
|
sessionId: SessionId
|
|
271
275
|
/** Target event seq. */
|
|
272
|
-
seq:
|
|
276
|
+
seq: SessionSeq
|
|
273
277
|
/** Number of preceding raw events to include. */
|
|
274
278
|
before?: number
|
|
275
279
|
/** Number of following raw events to include. */
|
|
@@ -282,14 +286,16 @@ interface SessionEventReadRequest {
|
|
|
282
286
|
interface SessionEventWindow {
|
|
283
287
|
/** Cloned header for the live-preferred source read. */
|
|
284
288
|
session: SessionHeader
|
|
289
|
+
/** Exact number of fork-inherited events in the observed log. */
|
|
290
|
+
inheritedEventCount: SessionLogOffset
|
|
285
291
|
/** Full cloned target event. */
|
|
286
292
|
target: SessionEvent
|
|
287
293
|
/** Full cloned events from `startSeq` through `endSeq`. */
|
|
288
294
|
events: SessionEvent[]
|
|
289
295
|
/** First seq included in `events`. */
|
|
290
|
-
startSeq:
|
|
296
|
+
startSeq: SessionSeq
|
|
291
297
|
/** Last seq included in `events`. */
|
|
292
|
-
endSeq:
|
|
298
|
+
endSeq: SessionSeq
|
|
293
299
|
}
|
|
294
300
|
```
|
|
295
301
|
|
|
@@ -303,7 +309,7 @@ interface SessionEventTraceRequest {
|
|
|
303
309
|
/** Session that owns the target event. */
|
|
304
310
|
sessionId: SessionId
|
|
305
311
|
/** Target event seq. */
|
|
306
|
-
seq:
|
|
312
|
+
seq: SessionSeq
|
|
307
313
|
}
|
|
308
314
|
```
|
|
309
315
|
|
|
@@ -313,15 +319,15 @@ interface SessionEventTrace {
|
|
|
313
319
|
/** Lightweight target record. */
|
|
314
320
|
target: SessionEventRecord
|
|
315
321
|
/** Immediate positional replacement event, when the target was shadowed. */
|
|
316
|
-
replacedBy?:
|
|
322
|
+
replacedBy?: SessionSeq
|
|
317
323
|
/** Positional replacers from the immediate replacement to the final replacement. */
|
|
318
|
-
replacementChain:
|
|
324
|
+
replacementChain: SessionSeq[]
|
|
319
325
|
/** Surface nodes directly removed when the target itself performed a replacement. */
|
|
320
|
-
replacedEventSeqs:
|
|
326
|
+
replacedEventSeqs: SessionSeq[]
|
|
321
327
|
/** Earlier events cited directly as sources, in their recorded order. */
|
|
322
|
-
sourceEventSeqs:
|
|
328
|
+
sourceEventSeqs: SessionSeq[]
|
|
323
329
|
/** Later events that directly cite the target as a source, in log order. */
|
|
324
|
-
derivedEventSeqs:
|
|
330
|
+
derivedEventSeqs: SessionSeq[]
|
|
325
331
|
}
|
|
326
332
|
```
|
|
327
333
|
|
|
@@ -71,7 +71,31 @@ interface SessionReferenceMentionCandidate extends SessionReferenceCandidate {
|
|
|
71
71
|
|
|
72
72
|
## 准备后的消息
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
准备过程保留可读的当前消息内容,并最多返回一个聚合上下文。其持久 source 记录会把 `capturedThroughSeq` 保留为被引用 Session 原始 generation 中的坐标,绝不会把它重新解释为所在 Session 的 seq。`capturedFormatVersion` 记录该 generation;缺失表示已发布格式 v0。
|
|
75
|
+
|
|
76
|
+
```ts type-equiv
|
|
77
|
+
/** Durable source session, cited event seqs, and snapshot facts for prepared cross-session context. */
|
|
78
|
+
interface SessionReferenceSource {
|
|
79
|
+
kind: 'session-reference'
|
|
80
|
+
/** Material lifted out of another session's log (`recall` context form). */
|
|
81
|
+
form: 'recall'
|
|
82
|
+
version: 1
|
|
83
|
+
references: {
|
|
84
|
+
sessionId: string
|
|
85
|
+
label: string
|
|
86
|
+
/** Source Session format generation; absence identifies version 0. */
|
|
87
|
+
capturedFormatVersion?: number
|
|
88
|
+
capturedThroughSeq: OptionalSessionSeq
|
|
89
|
+
compacted: boolean
|
|
90
|
+
originalMessages: number
|
|
91
|
+
retainedMessages: number
|
|
92
|
+
omittedMessages: number
|
|
93
|
+
omittedBytes: number
|
|
94
|
+
truncated: boolean
|
|
95
|
+
inputIndex: number
|
|
96
|
+
}[]
|
|
97
|
+
}
|
|
98
|
+
```
|
|
75
99
|
|
|
76
100
|
```ts type-equiv
|
|
77
101
|
/** Direct message content and optional referenced-session context. */
|
|
@@ -183,6 +207,10 @@ async listCandidates( agent: Agent, query: string = '', limit: number = this.con
|
|
|
183
207
|
|
|
184
208
|
/**
|
|
185
209
|
* Snapshot all references for one accepted direct message and return one aggregated durable context.
|
|
210
|
+
* Automatic budgets use the last assembled route, or agent options before any assembly.
|
|
211
|
+
* Missing model capacity or adapter uses 64 KiB; other metadata lookup failures and cancellation reject preparation.
|
|
212
|
+
* Truncated previews include omission facts and a full-snapshot spill locator, or an explicit unavailable notice.
|
|
213
|
+
* Cancellation prevents context publication, including when storage completes after cancellation.
|
|
186
214
|
* @param agent - target agent; references to it are rejected.
|
|
187
215
|
* @param content - already host-normalized readable message content.
|
|
188
216
|
* @param references - structured source sessions in mention order.
|
|
@@ -5,7 +5,7 @@ outline: [2,3]
|
|
|
5
5
|
|
|
6
6
|
# 遥测(telemetry)
|
|
7
7
|
|
|
8
|
-
对外的会话上报拆分为一项[能力 seam](../capability-seams.md):Service Definition 与捕获协调器([dsh-session-telemetry](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/session/session-telemetry),`ctx.sessionTelemetry
|
|
8
|
+
对外的会话上报拆分为一项[能力 seam](../capability-seams.md):Service Definition 与捕获协调器([dsh-session-telemetry](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/session/session-telemetry),`ctx.sessionTelemetry`)拥有完整的权威事件捕获、`session-telemetry/record` 脱敏 waterfall(瀑布式事件)、handoff 游标与最小后端约定;部署方加载的 Service Provider([dsh-session-telemetry-otel](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/session/session-telemetry-otel))则是原样配置的 OpenTelemetry JS SDK 日志流水线。它是一项可选能力,不属于 agent loop(智能体循环)主干,这里也没有任何内容会进入模型请求。边界公理(harness 的职责止于 `emit()`;批处理、重试、排队与丢失策略都属于上报 SDK)连同被否决的替代方案,均已在[复活 Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.zh.md)中定案;捕获与游标约定见 [Service Definition README](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-telemetry/README.zh.md)。
|
|
9
9
|
|
|
10
10
|
源码:[`packages/session/session-telemetry/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-telemetry/src/index.ts)
|
|
11
11
|
|
|
@@ -40,8 +40,9 @@ interface SessionTelemetryRecord {
|
|
|
40
40
|
severity: SessionTelemetrySeverity
|
|
41
41
|
/**
|
|
42
42
|
* Identity attributes, deliberately minimal: ledger records carry
|
|
43
|
-
* `session.id`, `event.type`, `event.seq`, plus
|
|
44
|
-
* `session.
|
|
43
|
+
* `session.id`, `session.format_version`, `event.type`, `event.seq`, plus optional
|
|
44
|
+
* `session.cwd` / `session.parent_id`; a seeded Session also carries
|
|
45
|
+
* `session.seed_length` from its exact inherited event count;
|
|
45
46
|
* ops records carry `telemetry.op`, `session.id`, and (for `agent-error`)
|
|
46
47
|
* `agent.id`, `turn`, `step`, `error.name`. Anything recoverable from the
|
|
47
48
|
* body is intentionally NOT duplicated here.
|
|
@@ -57,22 +58,38 @@ interface SessionTelemetryRecord {
|
|
|
57
58
|
}
|
|
58
59
|
```
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
每条权威[会话事件](./session.md)都会完整透传为一条有序 ledger 记录,包括每个携带完整紧凑 stream 的 `assistant/message` 或 `assistant/attempt`,以及该 seam 从未听说过、由插件合并进来的类型。进程本地 `agent/assistant-stream` frame 不进入该持久 feed。新 Session 对象从其生命周期边界开始,除非后端选择 `includeHistory`;重新收养同一对象时会从 handoff 游标之后继续。投递是尽力而为的:游标标记的是「已交接」而非「已送达」,记录可能丢失(崩溃、重载窗口)也可能重复(新对象回放、SDK 重试),因此接收端对 ledger 记录基于 `(session.id, session.format_version, event.seq)` 去重;ops 记录刻意省略这类标识——它们是用于告警的信号,而非用于累加的条目,重复被容忍而非被去重。
|
|
61
62
|
|
|
62
63
|
## 共享披露
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
每个后端都通过 `ctx.sessionTelemetry` 上必需的抽象 `sharing` 成员暴露其部署级模式([Service Definition README](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-telemetry/README.zh.md#the-sharing-disclosure))。它既不是逐 Session 的接纳决定,也不是投递回执。`/feedback` 确认文本不查询它。
|
|
65
66
|
|
|
66
67
|
```ts type-equiv
|
|
67
68
|
/**
|
|
68
|
-
* Deployment-selected session-sharing
|
|
69
|
-
* {@link SessionTelemetryBackend} backend to human-facing acknowledgement surfaces (the
|
|
70
|
-
* `/feedback` command's confirmation text). The Service Definition owns the
|
|
71
|
-
* vocabulary so consumers and backends do not depend on a specific provider.
|
|
69
|
+
* Deployment-selected session-sharing mode, not confirmation of SDK delivery.
|
|
72
70
|
*/
|
|
73
71
|
type SessionTelemetrySharingStatus = 'full' | 'feedback-only' | 'disabled'
|
|
74
72
|
```
|
|
75
73
|
|
|
74
|
+
## 捕获策略
|
|
75
|
+
|
|
76
|
+
```ts type-equiv
|
|
77
|
+
/** Whether capture follows live events or reads the canonical log only when requested. */
|
|
78
|
+
type SessionTelemetryCapture = 'live' | 'on-demand'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```ts type-equiv
|
|
82
|
+
/** Backend-selected capture mode and history policy. */
|
|
83
|
+
interface SessionTelemetryCaptureOptions {
|
|
84
|
+
/** Follow live events, or wait for explicit capture; defaults to live. */
|
|
85
|
+
capture?: SessionTelemetryCapture
|
|
86
|
+
/** Include stored history before this lifecycle; defaults to false. */
|
|
87
|
+
includeHistory?: boolean
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`includeHistory` 允许捕获存储与继承的记录,但本身不授权捕获。[OTel 后端](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-telemetry-otel/README.zh.md)使用按需捕获,并要求新的自身显式反馈;它只释放截至该反馈的完整前缀,适用于所有提供方。
|
|
92
|
+
|
|
76
93
|
## 后端约定
|
|
77
94
|
|
|
78
95
|
```ts type-equiv
|
|
@@ -125,7 +142,7 @@ interface SessionTelemetrySink {
|
|
|
125
142
|
|
|
126
143
|
## 脱敏 waterfall:`session-telemetry/record`
|
|
127
144
|
|
|
128
|
-
|
|
145
|
+
每条记录在权威事件副本与 `emit()` 之间都要经过 `session-telemetry/record` [waterfall](../cordis-primer.md#cordis-waterfall-semantics)([事件条目](#session-telemetryrecord--waterfall))。seam 自身不带任何规则:未挂载监听器时,记录以捕获时的原样到达后端;导出数据能干净到什么程度,恰恰取决于部署方挂载了什么规则。监听器通过变换 `next()` 的返回值来堆叠;不调用 `next()` 就返回,即替换其下方的全部逻辑;抛出异常的监听器会在协调器的隔离范围内以 fail-closed 方式扣下这一条记录。脱敏只作用于导出副本;权威会话日志永不改写。
|
|
129
146
|
|
|
130
147
|
<!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
|
|
131
148
|
|
|
@@ -11,7 +11,7 @@ outline: [2,3]
|
|
|
11
11
|
|
|
12
12
|
## 持久标题状态
|
|
13
13
|
|
|
14
|
-
提供方生成修订时会记录 `SessionTitleProviderId`。`SessionTitleEventData` 列出生成标题时使用的精确人类消息 seq,`SessionTitleSnapshot` 则加入 `foldSessionTitle()`
|
|
14
|
+
提供方生成修订时会记录 `SessionTitleProviderId`。`SessionTitleEventData` 列出生成标题时使用的精确人类消息 seq,`SessionTitleSnapshot` 则加入 `ctx.sessionTitle.get()` 与 `foldSessionTitle()` 返回的持久事件封装信息。`title` 投影的版本 1 状态与客户端视图都只保留标题字符串或 `null`,因此既有持久化缓存行仍可读取。
|
|
15
15
|
|
|
16
16
|
```ts type-equiv
|
|
17
17
|
/** Identifies one session-title provider registration. */
|
|
@@ -49,7 +49,7 @@ interface SessionTitleEventData {
|
|
|
49
49
|
/** Normalized non-empty title text. */
|
|
50
50
|
readonly title: string
|
|
51
51
|
/** Exact human `user/message` seqs used to derive this title; empty for an explicit user rename. */
|
|
52
|
-
readonly messageSeqs:
|
|
52
|
+
readonly messageSeqs: SessionSeq[]
|
|
53
53
|
/** Whether the built-in fallback, a registered provider, or the user supplied the title. */
|
|
54
54
|
readonly source: SessionTitleSource
|
|
55
55
|
}
|
|
@@ -59,7 +59,7 @@ interface SessionTitleEventData {
|
|
|
59
59
|
/** Latest folded title plus the title event's durable envelope facts. */
|
|
60
60
|
interface SessionTitleSnapshot extends SessionTitleEventData {
|
|
61
61
|
/** Seq of the latest `session/title` event. */
|
|
62
|
-
readonly eventSeq:
|
|
62
|
+
readonly eventSeq: SessionSeq
|
|
63
63
|
/** Timestamp of the latest `session/title` event. */
|
|
64
64
|
readonly updatedAt: number
|
|
65
65
|
}
|
|
@@ -75,7 +75,7 @@ interface SessionTitleLlmRequestEventData {
|
|
|
75
75
|
/** Registered title-provider identity responsible for the request. */
|
|
76
76
|
readonly titleProvider: SessionTitleProviderId
|
|
77
77
|
/** Exact human `user/message` seqs represented in `messages`. */
|
|
78
|
-
readonly messageSeqs:
|
|
78
|
+
readonly messageSeqs: SessionSeq[]
|
|
79
79
|
/** Exact auxiliary LLM route. */
|
|
80
80
|
readonly route: SessionTitleModelProvenance
|
|
81
81
|
/** Exact auxiliary system prompt. */
|
|
@@ -95,7 +95,7 @@ interface SessionTitleLlmRequestEventData {
|
|
|
95
95
|
/** One eligible human text message exposed to title providers. */
|
|
96
96
|
interface SessionTitleUserMessage {
|
|
97
97
|
/** Source `user/message` event seq. */
|
|
98
|
-
readonly seq:
|
|
98
|
+
readonly seq: SessionSeq
|
|
99
99
|
/** Exact concatenated text-block content. */
|
|
100
100
|
readonly text: string
|
|
101
101
|
}
|
|
@@ -126,7 +126,7 @@ interface SessionTitleProviderResult {
|
|
|
126
126
|
/** Proposed title text. */
|
|
127
127
|
readonly title: string
|
|
128
128
|
/** Exact seqs from `request.messages` used by this result. */
|
|
129
|
-
readonly messageSeqs: readonly
|
|
129
|
+
readonly messageSeqs: readonly SessionSeq[]
|
|
130
130
|
/** Auxiliary LLM route, when generation used a model. */
|
|
131
131
|
readonly model?: SessionTitleModelProvenance
|
|
132
132
|
}
|