dsh-plugin-dev-kb 1.0.9 → 1.1.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 +10 -0
- package/README.en.md +6 -6
- package/README.md +6 -6
- package/kb/INDEX.md +4 -2
- package/kb/README.md +4 -4
- package/kb/extra/AGENTS.md +1 -1
- 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/deepseek-llm-api-wire-extensions.md +18 -14
- package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +18 -14
- package/kb/extra/event-producer-consumer.md +44 -43
- package/kb/extra/event-producer-consumer.zh.md +47 -46
- package/kb/extra/i18n/style-samples.md +2 -2
- package/kb/extra/module-graph.md +444 -991
- package/kb/extra/module-graph.zh.md +446 -993
- package/kb/extra/subsystems/agent-team.md +4 -3
- package/kb/extra/subsystems/agent-team.zh.md +4 -3
- package/kb/extra/subsystems/attachment.md +157 -4
- package/kb/extra/subsystems/attachment.zh.md +157 -4
- package/kb/extra/subsystems/feedback.md +2 -2
- package/kb/extra/subsystems/feedback.zh.md +2 -2
- package/kb/extra/testing.md +6 -2
- package/kb/extra/testing.zh.md +6 -2
- package/kb/extra/web-styling.md +4 -0
- package/kb/extra/web-styling.zh.md +4 -0
- package/kb/meta/search-index.json +135 -111
- package/kb/meta/site-pages.txt +184 -182
- package/kb/meta/source.json +5 -5
- package/kb/meta/topics.md +4 -4
- 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/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/schedule.md +2 -0
- package/kb/site/en/reference/agent-lifecycle.md +5 -3
- package/kb/site/en/reference/api-gateway.md +2 -2
- package/kb/site/en/reference/capability-seams.md +14 -7
- package/kb/site/en/reference/config-catalog.md +157 -230
- 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/extension-cookbook.md +15 -12
- package/kb/site/en/reference/index.md +11 -4
- package/kb/site/en/reference/persistence-catalog.md +91 -70
- 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 +9 -9
- package/kb/site/en/reference/subsystems/conversation.md +11 -4
- package/kb/site/en/reference/subsystems/core.md +96 -15
- package/kb/site/en/reference/subsystems/credentials.md +5 -4
- package/kb/site/en/reference/subsystems/goal.md +1 -1
- package/kb/site/en/reference/subsystems/index.md +1 -1
- package/kb/site/en/reference/subsystems/llm-streaming.md +24 -3
- package/kb/site/en/reference/subsystems/permission-presets.md +5 -5
- package/kb/site/en/reference/subsystems/persistence.md +185 -194
- 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/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 +25 -1
- package/kb/site/en/reference/subsystems/session-telemetry.md +6 -5
- package/kb/site/en/reference/subsystems/session-title.md +6 -6
- package/kb/site/en/reference/subsystems/session.md +156 -73
- package/kb/site/en/reference/subsystems/settings.md +30 -12
- package/kb/site/en/reference/subsystems/skills.md +1 -1
- package/kb/site/en/reference/subsystems/slots.md +1 -0
- package/kb/site/en/reference/subsystems/storage.md +28 -5
- package/kb/site/en/reference/subsystems/subagent.md +43 -97
- package/kb/site/en/reference/subsystems/system-prompt.md +16 -3
- package/kb/site/en/reference/subsystems/token-meter.md +2 -2
- 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 +8 -8
- package/kb/site/en/reference/tool-catalog.md +10 -64
- package/kb/site/guide/network-proxy.md +87 -0
- package/kb/site/guide/providers.md +70 -17
- package/kb/site/guide/schedule.md +2 -0
- package/kb/site/reference/agent-lifecycle.md +5 -3
- package/kb/site/reference/api-gateway.md +2 -2
- package/kb/site/reference/capability-seams.md +14 -7
- package/kb/site/reference/config-catalog.md +156 -229
- 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/extension-cookbook.md +15 -12
- package/kb/site/reference/index.md +11 -4
- package/kb/site/reference/persistence-catalog.md +91 -70
- 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 +9 -9
- package/kb/site/reference/subsystems/conversation.md +11 -4
- package/kb/site/reference/subsystems/core.md +96 -15
- package/kb/site/reference/subsystems/credentials.md +5 -4
- package/kb/site/reference/subsystems/goal.md +1 -1
- package/kb/site/reference/subsystems/index.md +1 -1
- package/kb/site/reference/subsystems/llm-streaming.md +24 -3
- package/kb/site/reference/subsystems/permission-presets.md +5 -5
- package/kb/site/reference/subsystems/persistence.md +184 -193
- package/kb/site/reference/subsystems/plan.md +3 -3
- package/kb/site/reference/subsystems/schedule.md +9 -3
- 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 +25 -1
- package/kb/site/reference/subsystems/session-telemetry.md +6 -5
- package/kb/site/reference/subsystems/session-title.md +6 -6
- package/kb/site/reference/subsystems/session.md +156 -73
- package/kb/site/reference/subsystems/settings.md +30 -12
- package/kb/site/reference/subsystems/skills.md +1 -1
- package/kb/site/reference/subsystems/slots.md +1 -0
- package/kb/site/reference/subsystems/storage.md +28 -5
- package/kb/site/reference/subsystems/subagent.md +43 -97
- package/kb/site/reference/subsystems/system-prompt.md +16 -3
- package/kb/site/reference/subsystems/token-meter.md +2 -2
- 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 +8 -8
- package/kb/site/reference/tool-catalog.md +9 -63
- package/package.json +2 -2
- package/skills/dsh-plugin-dev-kb.md +4 -4
|
@@ -24,7 +24,7 @@ packages/<group>/<pkg>/
|
|
|
24
24
|
|
|
25
25
|
当已有分组与包的角色匹配时,选择该分组(`core`、`llm`、`shell`、`compaction`、`subagent`、`todo`、`session`、`client`/`host`、`util` 或 `test-support`)。允许新建分组,但分组只是纯容器:没有 `package.json`,没有源文件,包仍然恰好位于其下一层。
|
|
26
26
|
|
|
27
|
-
package.json 不变式(由 `pnpm run constraints` / `scripts/check-workspace-constraints.ts` 强制执行):`private: true`,`version` 与根 `package.json` 一致,`type: module`,`main: "lib/index.js"`,`types: "lib/types/index.d.ts"`,`exports["."].types: "./lib/types/index.d.ts"`,`exports["."].default: "./lib/index.js"`,`@deepseek-ai/cordis` 同时出现在 peerDependencies 和 devDependencies 中(相同范围)。每个 dsh 对等依赖(peer dependency)都要在 devDependencies 中镜像。`@deepseek-ai/schemastery` 放在 `dependencies` 中(它是运行时校验器),与 agent-loop 保持一致。`files` 列表精确包含 `lib/index.js`、`lib/
|
|
27
|
+
package.json 不变式(由 `pnpm run constraints` / `scripts/check-workspace-constraints.ts` 强制执行):`private: true`,`version` 与根 `package.json` 一致,`type: module`,`main: "lib/index.js"`,`types: "lib/types/index.d.ts"`,`exports["."].types: "./lib/types/index.d.ts"`,`exports["."].default: "./lib/index.js"`,`@deepseek-ai/cordis` 同时出现在 peerDependencies 和 devDependencies 中(相同范围)。每个 dsh 对等依赖(peer dependency)都要在 devDependencies 中镜像。`@deepseek-ai/schemastery` 放在 `dependencies` 中(它是运行时校验器),与 agent-loop 保持一致。`files` 列表精确包含 `lib/index.js`、`lib/types/**/*.d.ts` 以及门禁认可的包专用运行时产物;发布 `./invariant` 的包还要包含 `lib/invariant.js`。如果包的运行时 export 指向输出树,还要包含 `lib/types/**/*.js`。不要发布 `src`、声明映射、JS map 或陈旧的根声明文件。带有 `bin` 的 CLI 应用包在 `files` 中将 `lib/bin.js` 紧跟在 `lib/index.js` 之后。
|
|
28
28
|
|
|
29
29
|
包内的相对导入在源码中使用显式 `.ts` 后缀(例如 `export * from './types.ts'`)。编译器在输出的 JS 中将其重写为 `.js`,在声明文件中保留显式 `.ts` 后缀;标准的 NodeNext/Node16 TypeScript 消费方会将其解析到同目录的 `.d.ts` 文件。
|
|
30
30
|
|
|
@@ -34,7 +34,6 @@ package.json 不变式(由 `pnpm run constraints` / `scripts/check-workspace-c
|
|
|
34
34
|
|---|---|
|
|
35
35
|
| `tsconfig.base.json` | 已有分组无需编辑;新分组需为 `@deepseek-ai/dsh-*` 通配符添加 `./packages/<group>/*/src` 候选路径 |
|
|
36
36
|
| `tsconfig.host.json`(Host 包)或 `tsconfig.client.json`(Client 包) | 在 `references` 中添加 `{ "path": "./packages/<group>/<pkg>" }`——普通包恰好属于一个 aggregate,绝不两个都加。`api/remotes` 因 Host 生成约定与 Client 消费约定之间存在顺序依赖而使用仓库专属拆分,新增包不得仿照([布局](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/development.zh.md#typescript-project-layout)) |
|
|
37
|
-
| `knip.json` | 仅当包有仓库发现机制尚未覆盖的入口时需要 |
|
|
38
37
|
|
|
39
38
|
`packages/client/*` 包改为 extends `tsconfig.base.client.json`(而非 `tsconfig.base.json`);client 插件包还需在 package.json 声明 `dsh.client`、导出 `./client`、调用共享 tsdown preset(`packages/client/tsdown.client.ts`)——client 侧见 [packages/client/AGENTS.md](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/AGENTS.md)。
|
|
40
39
|
|
|
@@ -10,17 +10,17 @@ editSource: "docs/cookbook/adding-a-settings-card.zh.md"
|
|
|
10
10
|
|
|
11
11
|
## 1. 注册命名空间(Host 半侧)
|
|
12
12
|
|
|
13
|
-
命名空间就是配对用的键,所以只挑一次,并在两个半侧都写出它。已经有 `cordis.yml` entry 的消费方应通过 `
|
|
13
|
+
命名空间就是配对用的键,所以只挑一次,并在两个半侧都写出它。已经有 `cordis.yml` entry 的消费方应通过 `ctx.settings.installSection()` 注册——它把 entry 层叠在用户文档之下,并在没有挂载 settings provider 时照常工作:
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
16
|
import type { Context } from '@deepseek-ai/cordis'
|
|
17
|
-
import {
|
|
17
|
+
import type {} from '@deepseek-ai/dsh-settings'
|
|
18
18
|
import z from '@deepseek-ai/schemastery'
|
|
19
19
|
|
|
20
20
|
declare function assertReachable(endpoint: string | undefined): void
|
|
21
21
|
declare function rebuildFromSettings(config: Config): void
|
|
22
22
|
|
|
23
|
-
export const MY_PLUGIN_NS =
|
|
23
|
+
export const MY_PLUGIN_NS = 'my-plugin'
|
|
24
24
|
|
|
25
25
|
export interface Config {
|
|
26
26
|
endpoint?: string
|
|
@@ -34,11 +34,13 @@ export const Config: z<Config> = z.object({
|
|
|
34
34
|
|
|
35
35
|
export function apply(ctx: Context, config: Config) {
|
|
36
36
|
let source = () => config
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
ctx.inject(['settings'], (settingsCtx) => {
|
|
38
|
+
settingsCtx.settings.installSection(ctx, MY_PLUGIN_NS, Config, config, {
|
|
39
|
+
// Constraints the schema cannot express refuse the write, not the next use.
|
|
40
|
+
validate: value => void assertReachable(value.endpoint),
|
|
41
|
+
setSource: (current) => { source = current },
|
|
42
|
+
onChange: () => { rebuildFromSettings(source()) },
|
|
43
|
+
})
|
|
42
44
|
})
|
|
43
45
|
}
|
|
44
46
|
```
|
|
@@ -38,12 +38,13 @@ export function apply(ctx: Context) {
|
|
|
38
38
|
|
|
39
39
|
## UI 插件
|
|
40
40
|
|
|
41
|
-
UI
|
|
41
|
+
UI 插件把持久 `session/event` record(Assistant settlement、轮次/步骤边界与工具活动)和用于实时 token 呈现的瞬态 `agent/assistant-stream` frame 组合起来,并通过 `agent.followup()` / `agent.steer()` 将输入驱动回去。如果浏览器插件要向内建 Web Client 贡献业务行,则应注册 `ConversationNodeDefinition` 与 keyed Chat renderer;具体约定见 [Conversation 子系统参考](../subsystems/conversation.md)。
|
|
42
42
|
|
|
43
43
|
```ts
|
|
44
44
|
import type { Context } from '@deepseek-ai/cordis'
|
|
45
|
+
import { brandString } from '@deepseek-ai/dsh-brand'
|
|
45
46
|
import { createUserMessage } from '@deepseek-ai/dsh-llm'
|
|
46
|
-
import { SessionId } from '@deepseek-ai/dsh-session'
|
|
47
|
+
import type { SessionId } from '@deepseek-ai/dsh-session'
|
|
47
48
|
|
|
48
49
|
declare function render(text: string): void
|
|
49
50
|
declare function onUserInput(handler: (text: string) => void): void
|
|
@@ -52,12 +53,12 @@ export const name = 'my-ui'
|
|
|
52
53
|
export const inject = ['agents']
|
|
53
54
|
|
|
54
55
|
export function apply(ctx: Context) {
|
|
55
|
-
ctx.on('
|
|
56
|
-
if (
|
|
57
|
-
render(
|
|
56
|
+
ctx.on('agent/assistant-stream', ({ frame }) => {
|
|
57
|
+
if (frame.type === 'chunk' && frame.chunk.type === 'text-delta') {
|
|
58
|
+
render(frame.chunk.text)
|
|
58
59
|
}
|
|
59
60
|
})
|
|
60
|
-
onUserInput(text => ctx.agents.get(SessionId('client-session'))?.followup(createUserMessage({
|
|
61
|
+
onUserInput(text => ctx.agents.get(brandString<SessionId>('client-session'))?.followup(createUserMessage({
|
|
61
62
|
content: [{ type: 'text', text }],
|
|
62
63
|
source: { kind: 'user' },
|
|
63
64
|
})))
|
|
@@ -72,17 +73,19 @@ export function apply(ctx: Context) {
|
|
|
72
73
|
|
|
73
74
|
```ts
|
|
74
75
|
import type { Context } from '@deepseek-ai/cordis'
|
|
76
|
+
import { expandAssistantStream } from '@deepseek-ai/dsh-llm'
|
|
75
77
|
|
|
76
78
|
export const name = 'my-protocol-bridge'
|
|
77
79
|
export const inject = ['agents', 'sessions', 'sessionPersistence']
|
|
78
80
|
|
|
79
81
|
export function apply(ctx: Context) {
|
|
80
|
-
//
|
|
82
|
+
// Publish every committed Assistant text delta to the client.
|
|
81
83
|
ctx.on('session/event', (_session, event) => {
|
|
82
|
-
if (event.type === 'assistant/
|
|
83
|
-
const chunk
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
if (event.type === 'assistant/message' || event.type === 'assistant/attempt') {
|
|
85
|
+
for (const { chunk } of expandAssistantStream(event.data.stream)) {
|
|
86
|
+
if (chunk.type === 'text-delta') {
|
|
87
|
+
// sendToClient({ kind: 'message_chunk', text: chunk.text })
|
|
88
|
+
}
|
|
86
89
|
}
|
|
87
90
|
}
|
|
88
91
|
})
|
|
@@ -128,7 +131,7 @@ export function apply(ctx: Context) {
|
|
|
128
131
|
| skill(技能) | section + 工具注册;调用时通过 `inject()` 注入 skill 内容 |
|
|
129
132
|
| 记忆 | section 提供方 + 工具 |
|
|
130
133
|
| 定时任务(cron) | 插件注册面向模型的调度工具;定时器触发 → 空闲时 `followup(…, {source: {kind: 'plugin', plugin: 'schedule'}})`/忙碌时 `inject()` 通知 |
|
|
131
|
-
| UI(GUI;CLI(命令行界面)输出 JSONL) | 监听 `session/event
|
|
134
|
+
| UI(GUI;CLI(命令行界面)输出 JSONL) | 监听 `agent/assistant-stream` 的实时 chunk,并监听 `session/event` 的持久 settlement、边界与工具活动;输入 → `followup()` |
|
|
132
135
|
| Web Client Chat 业务节点 | 注册 `ConversationNodeDefinition` 与 `conversation.chat.node` keyed renderer |
|
|
133
136
|
| 遥测 / 可回放 trace | `session/event` → JSONL;回放 = `sessions.create(id, { seed })` |
|
|
134
137
|
| 模型适配器 | 通过 `registerAdapter` 注册 `LlmAdapter` 子类(`dsh-llm-deepseek`、`dsh-llm-pi-ai`) |
|
|
@@ -90,7 +90,9 @@ turn/start
|
|
|
90
90
|
step/start
|
|
91
91
|
append entered messages as user/message
|
|
92
92
|
derive model history from the log
|
|
93
|
-
agent/request -> llm/stream -> assistant
|
|
93
|
+
agent/request -> llm/stream -> agent/assistant-stream start
|
|
94
|
+
agent/assistant-stream chunk*
|
|
95
|
+
assistant/message | assistant/attempt -> agent/assistant-stream end
|
|
94
96
|
tool/call* -> tools/pre-execute -> tools/execute -> tools/post-execute -> tool/result*
|
|
95
97
|
step/end
|
|
96
98
|
tools owe another request, or next-step input arrived -> claim -> next step
|
|
@@ -98,7 +100,7 @@ turn/start
|
|
|
98
100
|
turn/end
|
|
99
101
|
```
|
|
100
102
|
|
|
101
|
-
`turn/*`、`step/*`、`user/message`、`assistant
|
|
103
|
+
`turn/*`、`step/*`、`user/message`、`assistant/message`、`assistant/attempt` 和 `tool/*` 是持久会话事件;其余是分属三个事件域的实时扩展点。`agent/assistant-stream` 发布进程本地 start、瞬态 chunk 与 end frame。loop 会在 committed end frame 前把完整紧凑 stream 提交为一个 message 或仅日志 attempt;Web Session-follow adapter 是该 live event 唯一的远程消费方。`agent/pre-step`、`agent/request`、`llm/stream` 和三个 `tools/*` 事件是 waterfall(瀑布式事件),其监听器必须调用 `next()` 才能委托下去;`agent/turn-stopping` 是 serial 事件,没有 `next()`。
|
|
102
104
|
|
|
103
105
|
输入通过同一个 inbox 到达驱动器。有些消息会立即唤醒它;注入的上下文会留在 inbox 中,直到另一条消息将其唤醒。
|
|
104
106
|
|
|
@@ -108,10 +110,14 @@ turn/end
|
|
|
108
110
|
|
|
109
111
|
## 会话日志
|
|
110
112
|
|
|
111
|
-
会话日志是模型所见上下文的来源。`deriveMessages()`
|
|
113
|
+
会话日志是模型所见上下文的来源。`deriveMessages()` 从中投影出模型历史。每个 `assistant/message` 都嵌入产生其组装内容的精确紧凑带时间 stream;`assistant/attempt` 保留已到达 settlement 的失败、重试、取消与 stream error attempt,且不添加模型历史。fork、恢复、transcript(文本记录)、遥测与持久化都从这些持久 settlement 派生,实时 UI 增量则来自 `agent/assistant-stream`;如果进程在 settlement 前硬中断,则不会留下持久 attempt stream(见[决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-09-01-v2-embedded-assistant-streams.zh.md))。
|
|
114
|
+
|
|
115
|
+
Session 消费方只了解当前逻辑格式。仅 header 的 `stat` 与 `list` 会重新扫描每个 Session 目录,选择数值最高的规范 generation,并在不加载事件或发布后继的情况下转换受支持的历史 header。已存储 Session 的 `open` 选择同一 generation,拒绝未来版本,或在内存中组合静态相邻迁移链、校验最终结果,并在返回句柄前以不覆盖方式只发布该版本命名的后继文件且保持源文件不变;语义层的中断轮次修复仍由句柄消费方负责。JSONL v0 使用 `session.jsonl[.zstd]`,v1 及后续版本使用小写 `session.vN.jsonl[.zstd]`;已提交 generation 路径绝不重命名、替换或删除。JSONL provider 负责物理 framing、压缩、generation 选择与排他发布,每个相邻迁移包只负责一个 `vN -> vN+1` 步骤([决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.zh.md))。
|
|
112
116
|
|
|
113
117
|
**模型可见即已记录。** 抵达模型请求的一切都必须能从日志重建,并由一项运行时不变量断言这一点。因此,新增一项模型可见输入就需要新增一个会话事件:扩展 `SessionEventMap` 并从日志渲染。
|
|
114
118
|
|
|
119
|
+
**投影 seam。** `dsh-session-projection` 提供 `ctx.sessionProjections`:已注册单元增量折叠已提交事件,host 消费方通过 `stateOf()` 读取单个类型化状态,载体通过 `snapshot()` 批量取得裁剪后的客户端视图。host 读取方要么在激活时要求该服务,要么在注册表或必需 key 缺席时明确失败。贡献方可以保留 `ctx.inject(['sessionProjections'], ...)` 注册,但不能为缺失的 host 值静默提供默认值。agent loop 为读取方注册共享的 `turnBoundary` 状态([决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-08-19-session-projection-mandatory-seam.zh.md))。
|
|
120
|
+
|
|
115
121
|
## 能力 seam
|
|
116
122
|
|
|
117
123
|
一个 **seam** 是一项可替换能力,包含三种角色:声明接口的 **Service Definition**、实现它的 **Service Provider**,以及使用它的 **Consumer**(通常是面向模型的工具)。一个包可以合并承担多个角色,但单一角色本身不是 seam;添加一项能力意味着把三者一并设计([能力图](./capability-seams.md))。
|
|
@@ -143,7 +149,8 @@ seam 正是替换一个提供方就能改变整个产品的原因。文件系统
|
|
|
143
149
|
| 添加持久会话状态 | 扩展 `SessionEventMap`;从日志渲染和回放 |
|
|
144
150
|
| 生成会话标题 | 注册唯一的 `ctx.sessionTitle` 提供方 |
|
|
145
151
|
| 管理同会话目标 | 使用 `ctx.goals`;通过 `agent/*` 续跑 |
|
|
146
|
-
| fork
|
|
152
|
+
| 在轮次边界 fork 会话 | `ctx.agents.create({ sessionId, seed, meta: { parentSession, seedLength } })`——只有经 agent-loop 发布的会话才会持久化 |
|
|
153
|
+
| 在新后端存储会话 | 基于共享的句柄脚手架实现 `SessionPersistence`(`create`/`open`/`stat`/`list`/`export`) |
|
|
147
154
|
| 将注册项限定到单个 agent | 使用该 agent 的 `agent.ctx` |
|
|
148
155
|
|
|
149
156
|
[扩展实操手册](./cookbook/extension-cookbook.md)将功能映射到能力,并索引[包](./cookbook/adding-a-package.md)、[工具](./cookbook/adding-a-tool.md)、[LLM(大语言模型)适配器](./cookbook/adding-an-llm-adapter.md)和[设置卡片](./cookbook/adding-a-settings-card.md)的分步指南。[Conversation 子系统](./subsystems/conversation.md)负责 Chat node 组装。
|