diff --git a/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.i18n.yaml b/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.i18n.yaml index 87b1ee3a4b..e56fd4028e 100644 --- a/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.i18n.yaml @@ -12,8 +12,8 @@ en: 5656c117648160c8 zh: 7f7c3de8e2ea6d9a /agent-note-persistent-pty-sessions/decision/package-topology: - en: 98d7a77fa6cb717e - zh: b2364ffe4827ac11 + en: 0187ac573d06a360 + zh: 13e08f4f22bacfff /agent-note-persistent-pty-sessions/decision/agent-ownership-and-identity: en: 9bf79081f102eb51 zh: 34855888f0614b47 @@ -21,8 +21,8 @@ en: 882bbfd3f0dc6e09 zh: a547d6ff5e6ef7a1 /agent-note-persistent-pty-sessions/decision/six-model-facing-tools: - en: e124f17351795dba - zh: 9f91f729ca384bb2 + en: b92715f36550c728 + zh: e18d7e0e2363347a /agent-note-persistent-pty-sessions/decision/local-readiness-detection: en: 8f36f06869bd5367 zh: f3560477a8965cbe @@ -33,8 +33,8 @@ en: e96a972845bc3513 zh: d76d7dfb80985e9d /agent-note-persistent-pty-sessions/decision/composition-and-rollout: - en: 9473f6670c12c8e7 - zh: 882f8302007e6026 + en: db49b6dff73d8772 + zh: 1f2182fd2c7dc3af /agent-note-persistent-pty-sessions/decision/deferred-work: en: c0ae6d86dd5c0635 zh: 737bd3fda903d5e3 diff --git a/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.md b/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.md index 5ba80a1667..43a707e661 100644 --- a/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.md +++ b/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.md @@ -24,7 +24,7 @@ The implementation supports interactive shells and line-oriented REPLs on Linux |---|---|---| | `dsh-terminal` | `TerminalSessionService`, branded `TerminalSessionId`, backend registry, owner-scoped session contract, and result types | `ctx.terminals` | | `dsh-terminal-bash` | Persistent-shell backend over `ctx.subprocess.spawnTerminal()`: readiness, bounded terminal buffers, sandbox resolution, and owner-aware session lifecycle | registers a backend on `ctx.terminals` | -| `dsh-experimental-tool-terminal` | Six model-facing tools, task-runtime integration for background sends, guidance, and UI render intents | registers on `ctx.tools` | +| `dsh-tool-terminal` | Six model-facing tools, task-runtime integration for background sends, guidance, and UI render intents | registers on `ctx.tools` | Readiness remains PTY-backend behavior, not a second public contract. The terminal-process provider supplies only substrate facts such as the foreground process group and whether it can prove that group is waiting on input; `dsh-terminal-bash` combines those facts with prompt and silence evidence into the common send result. @@ -62,9 +62,9 @@ The UI render contract is exact and location-free. `terminal_send` uses terminal `terminal_send({ sessionId, text, submit?, run_in_background? })` treats `text` as UTF-8 bytes and resolves `submit` to `true` in the tool implementation. When `submit` is true it writes the platform Enter sequence after the text; when false it writes only the text, allowing control characters and REPL fragments without hidden content heuristics. Cancellation marks queued input before signaling the real foreground group, so input cannot execute if an asynchronous pre-write inspection settles afterward. The canceled send retains its reservation until asynchronous foreground signalling settles, so a successor cannot become that signal's target. `enableRunInBackground` defaults to true; false removes `run_in_background` from the schema and rejects the same undeclared argument if a caller forces it through execution. -Foreground sends return a bounded rendered delta and two independent facts: `waitReason` (`stdin_read | inferred_idle | timeout | session_exit`) and `sessionStatus` (`running` or `exited` with exit code or signal). `session_exit` refers to the PTY's top-level shell process, not an arbitrary foreground command whose status the shell consumes. A timeout never implies process exit. `dsh-experimental-tool-terminal.maxResultBytes` defaults to 262144, rejects values below 64 so creation acknowledgements retain registry-issued ids, and caps each single-text UTF-8 result after normalized tool or pipeline errors, wait, session, pagination, truncation, generic task-status wrappers, policy denials or short-circuits, and post-execute replacements or blocks; the terminal definitions' last-mile `finalizeContent` callback leaves deliberately structured multi-block policy content unchanged. The renderer reserves suffix space and preserves code-point boundaries instead of treating the backend payload cap as the final model bound. +Foreground sends return a bounded rendered delta and two independent facts: `waitReason` (`stdin_read | inferred_idle | timeout | session_exit`) and `sessionStatus` (`running` or `exited` with exit code or signal). `session_exit` refers to the PTY's top-level shell process, not an arbitrary foreground command whose status the shell consumes. A timeout never implies process exit. `dsh-tool-terminal.maxResultBytes` defaults to 262144, rejects values below 64 so creation acknowledgements retain registry-issued ids, and caps each single-text UTF-8 result after normalized tool or pipeline errors, wait, session, pagination, truncation, generic task-status wrappers, policy denials or short-circuits, and post-execute replacements or blocks; the terminal definitions' last-mile `finalizeContent` callback leaves deliberately structured multi-block policy content unchanged. The renderer reserves suffix space and preserves code-point boundaries instead of treating the backend payload cap as the final model bound. -With `run_in_background: true`, `dsh-experimental-tool-terminal` registers the in-flight send on `ctx.jobs` and returns immediately with `jobId`. The producer places `maxResultBytes` on the task snapshot so `job_output`, terminal kill status, and completion notices enforce the same complete-result cap after generic metadata. `job_output(wait: true)` waits, reads incremental output, and records the final result; `job_kill` resolves the current foreground PGID and delivers a real `SIGINT`, including when the application has disabled terminal `ISIG`, and escalates only through the PTY backend's owned teardown path. If the task surface is absent, background mode fails before writing input. No PTY-specific `sleep` tool or general wake-up API is added. +With `run_in_background: true`, `dsh-tool-terminal` registers the in-flight send on `ctx.jobs` and returns immediately with `jobId`. The producer places `maxResultBytes` on the task snapshot so `job_output`, terminal kill status, and completion notices enforce the same complete-result cap after generic metadata. `job_output(wait: true)` waits, reads incremental output, and records the final result; `job_kill` resolves the current foreground PGID and delivers a real `SIGINT`, including when the application has disabled terminal `ISIG`, and escalates only through the PTY backend's owned teardown path. If the task surface is absent, background mode fails before writing input. No PTY-specific `sleep` tool or general wake-up API is added. `terminal_read` pages backward from the newest retained line. The backend enforces both line and UTF-8 byte caps on retained scrollback and the returned page payload, so one oversized line cannot bypass the backend bound; the tool then caps the fully rendered page including pagination and truncation metadata. `truncated` distinguishes retention loss from an ordinary viewport delta. @@ -122,13 +122,13 @@ plugins: handoffGraceMs: 500 timeoutMs: 30000 disposeGraceMs: 3000 - '@deepseek-ai/dsh-experimental-tool-terminal': + '@deepseek-ai/dsh-tool-terminal': config: enableRunInBackground: true maxResultBytes: 262144 ``` -The package ships concise tool guidance explaining persistent state, owner isolation, uncertain idle results, cleanup, and the preference for existing one-shot tools when interaction is unnecessary. It does not mount PTY in the base shipped examples: PTY is opt-in through the dedicated composition, while ACP and headless snapshot overlays exercise it. Within an enabled `dsh-experimental-tool-terminal` instance, the six tools and `run_in_background` are enabled by default; deployments may disable only the background argument with config. +The package ships concise tool guidance explaining persistent state, owner isolation, uncertain idle results, cleanup, and the preference for existing one-shot tools when interaction is unnecessary. It does not mount PTY in the base shipped examples: PTY is opt-in through the dedicated composition, while ACP and headless snapshot overlays exercise it. Within an enabled `dsh-tool-terminal` instance, the six tools and `run_in_background` are enabled by default; deployments may disable only the background argument with config. ### Deferred work diff --git a/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.zh.md b/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.zh.md index 8527df120e..04891dc106 100644 --- a/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.zh.md +++ b/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.zh.md @@ -24,7 +24,7 @@ harness 可以运行前台与后台命令、编辑文件和委派工作,但无 |---|---|---| | `dsh-terminal` | `TerminalSessionService`、branded `TerminalSessionId`、后端注册表、按 owner 隔离的会话约定和结果类型 | `ctx.terminals` | | `dsh-terminal-bash` | 基于 `ctx.subprocess.spawnTerminal()` 的持久 shell 后端:就绪状态、有界终端缓冲、沙箱解析和感知 owner 的会话生命周期 | 在 `ctx.terminals` 上注册后端 | -| `dsh-experimental-tool-terminal` | 6 个面向模型的工具、后台发送的 task 运行时集成、使用指引和 UI 渲染意图 | 注册到 `ctx.tools` | +| `dsh-tool-terminal` | 6 个面向模型的工具、后台发送的 task 运行时集成、使用指引和 UI 渲染意图 | 注册到 `ctx.tools` | 就绪判定仍属于 PTY 后端行为,不是第二条公共约定。终端进程提供方只提供基底事实,例如前台进程组,以及能否证明该组正在等待输入;`dsh-terminal-bash` 将这些事实与提示符和静默证据组合成统一的发送结果。 @@ -62,9 +62,9 @@ UI 渲染约定精确且不携带位置信息。`terminal_send` 只为前台发 `terminal_send({ sessionId, text, submit?, run_in_background? })` 将 `text` 视为 UTF-8 字节,并由工具实现在解析阶段把 `submit` 默认成 `true`。`submit` 为 true 时先写入文本,再写入平台 Enter 序列;为 false 时只写文本,使控制字符和 REPL 片段无需隐藏的内容启发式即可发送。取消会在向真实前台进程组发送信号前将排队输入标记为已取消,因此即使异步的写入前检查随后才结算,该输入也无法执行。被取消的发送会保留其预留,直至异步前台信号发送结算,因此后续发送不会成为该信号的目标。`enableRunInBackground` 默认为 true;设为 false 时,schema 中会移除 `run_in_background`,调用方即使强行把这个未声明参数传入执行流程,也会被拒绝。 -前台发送返回有界的渲染增量和两个独立事实:`waitReason`(`stdin_read | inferred_idle | timeout | session_exit`)与 `sessionStatus`(`running`,或携带退出码或信号的 `exited`)。`session_exit` 指 PTY 顶层 shell 进程退出,不指由 shell 消费状态的任意前台命令。timeout 从不意味着进程已经退出。`dsh-experimental-tool-terminal.maxResultBytes` 默认为 262144;低于 64 的值会被拒绝,以确保创建确认保留注册表签发的 id;每个单文本 UTF-8 结果在加入规范化的工具或流水线错误、等待、会话、分页、截断、通用 task 状态包装、策略拒绝或短路以及 post-execute 替换或阻断后,仍受该值限制;终端定义自有的末端 `finalizeContent` callback 会原样保留策略刻意返回的结构化多块内容。渲染器会为后缀预留空间并保持代码点边界,而不会把后端载荷上限当作面向模型结果的最终上限。 +前台发送返回有界的渲染增量和两个独立事实:`waitReason`(`stdin_read | inferred_idle | timeout | session_exit`)与 `sessionStatus`(`running`,或携带退出码或信号的 `exited`)。`session_exit` 指 PTY 顶层 shell 进程退出,不指由 shell 消费状态的任意前台命令。timeout 从不意味着进程已经退出。`dsh-tool-terminal.maxResultBytes` 默认为 262144;低于 64 的值会被拒绝,以确保创建确认保留注册表签发的 id;每个单文本 UTF-8 结果在加入规范化的工具或流水线错误、等待、会话、分页、截断、通用 task 状态包装、策略拒绝或短路以及 post-execute 替换或阻断后,仍受该值限制;终端定义自有的末端 `finalizeContent` callback 会原样保留策略刻意返回的结构化多块内容。渲染器会为后缀预留空间并保持代码点边界,而不会把后端载荷上限当作面向模型结果的最终上限。 -当 `run_in_background: true` 时,`dsh-experimental-tool-terminal` 在 `ctx.jobs` 上注册进行中的发送,并立即返回 `jobId`。生产方把 `maxResultBytes` 写入 task 快照,使 `job_output`、kill 返回的终态状态和完成通知在加上通用元数据后,仍对完整结果执行同一上限。`job_output(wait: true)` 负责等待、读取增量输出并记录最终结果;`job_kill` 会解析当前前台 PGID 并发送真正的 `SIGINT`,即使应用已禁用终端 `ISIG` 也同样如此,且后续升级仍只通过 PTY 后端拥有的 teardown 路径进行。若 task 对外接口不存在,后台模式必须在写入输入前失败。设计不新增 PTY 专用的 `sleep` 工具或通用唤醒 API。 +当 `run_in_background: true` 时,`dsh-tool-terminal` 在 `ctx.jobs` 上注册进行中的发送,并立即返回 `jobId`。生产方把 `maxResultBytes` 写入 task 快照,使 `job_output`、kill 返回的终态状态和完成通知在加上通用元数据后,仍对完整结果执行同一上限。`job_output(wait: true)` 负责等待、读取增量输出并记录最终结果;`job_kill` 会解析当前前台 PGID 并发送真正的 `SIGINT`,即使应用已禁用终端 `ISIG` 也同样如此,且后续升级仍只通过 PTY 后端拥有的 teardown 路径进行。若 task 对外接口不存在,后台模式必须在写入输入前失败。设计不新增 PTY 专用的 `sleep` 工具或通用唤醒 API。 `terminal_read` 从最新保留行向后分页。后端同时对保留的 scrollback 和返回页载荷执行行数与 UTF-8 字节上限,因此单个超长行无法绕过后端上限;工具随后再限制包含分页与截断元数据的完整渲染页。`truncated` 用于区分保留数据丢失与普通 viewport 增量。 @@ -122,13 +122,13 @@ plugins: handoffGraceMs: 500 timeoutMs: 30000 disposeGraceMs: 3000 - '@deepseek-ai/dsh-experimental-tool-terminal': + '@deepseek-ai/dsh-tool-terminal': config: enableRunInBackground: true maxResultBytes: 262144 ``` -包提供简洁的工具指引,说明持久状态、owner 隔离、不确定的 idle 结果、清理,以及无需交互时优先使用现有一次性工具。已发布的基础示例不挂载 PTY:PTY 仅通过专用组合 opt-in,而 ACP(Agent Client Protocol)与 headless 快照 overlay 会对其进行验证。`dsh-experimental-tool-terminal` 实例一旦启用,6 个工具和 `run_in_background` 就会默认启用;部署可通过配置仅禁用后台参数。 +包提供简洁的工具指引,说明持久状态、owner 隔离、不确定的 idle 结果、清理,以及无需交互时优先使用现有一次性工具。已发布的基础示例不挂载 PTY:PTY 仅通过专用组合 opt-in,而 ACP(Agent Client Protocol)与 headless 快照 overlay 会对其进行验证。`dsh-tool-terminal` 实例一旦启用,6 个工具和 `run_in_background` 就会默认启用;部署可通过配置仅禁用后台参数。 ### 推迟的工作 diff --git a/apps/cli/package.json b/apps/cli/package.json index b8e34aa527..cdf9d6f364 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -102,12 +102,12 @@ "@deepseek-ai/dsh-experimental-tool-worktree": "workspace:*" }, "devDependencies": { - "@deepseek-ai/dsh-experimental-skill-badge": "workspace:*", - "@deepseek-ai/dsh-experimental-webhook-github": "workspace:*", - "@deepseek-ai/dsh-experimental-webhook": "workspace:*", - "@deepseek-ai/dsh-experimental-tool-ralph": "workspace:*", - "@deepseek-ai/dsh-experimental-hooks-codex": "workspace:*", - "@deepseek-ai/dsh-experimental-hooks-claude-code": "workspace:*", + "@deepseek-ai/dsh-skill-badge": "workspace:*", + "@deepseek-ai/dsh-webhook-github": "workspace:*", + "@deepseek-ai/dsh-webhook": "workspace:*", + "@deepseek-ai/dsh-tool-ralph": "workspace:*", + "@deepseek-ai/dsh-hooks-codex": "workspace:*", + "@deepseek-ai/dsh-hooks-claude-code": "workspace:*", "@agentclientprotocol/sdk": "1.4.0", "@deepseek-ai/dsh-acp": "workspace:*", "@deepseek-ai/dsh-agent": "workspace:*", diff --git a/apps/cli/tests/fixtures/dsh-badge/cordis.yml b/apps/cli/tests/fixtures/dsh-badge/cordis.yml index bfbbc7c5a7..e67020c176 100644 --- a/apps/cli/tests/fixtures/dsh-badge/cordis.yml +++ b/apps/cli/tests/fixtures/dsh-badge/cordis.yml @@ -1,6 +1,6 @@ - insert: - id: skill-badge - name: '@deepseek-ai/dsh-experimental-skill-badge' + name: '@deepseek-ai/dsh-skill-badge' - id: skill-filesystem config: diff --git a/apps/cli/tests/fixtures/dsh-badge/snapshot.ts b/apps/cli/tests/fixtures/dsh-badge/snapshot.ts index 3a83a4b3b5..c84912a9f1 100644 --- a/apps/cli/tests/fixtures/dsh-badge/snapshot.ts +++ b/apps/cli/tests/fixtures/dsh-badge/snapshot.ts @@ -14,8 +14,8 @@ const basePatchPath = fileURLToPath(new URL('../../../../../packages/bundle/base // The fixture owns the optional provider; the base bundle has no dependency on it. const overlays = loadOverlayPatches('dsh-badge-snapshot', overlayPath).map(patch => patch.insert === undefined ? patch : { ...patch, - insert: patch.insert.map(row => row.name === '@deepseek-ai/dsh-experimental-skill-badge' - ? { ...row, name: import.meta.resolve('@deepseek-ai/dsh-experimental-skill-badge') } + insert: patch.insert.map(row => row.name === '@deepseek-ai/dsh-skill-badge' + ? { ...row, name: import.meta.resolve('@deepseek-ai/dsh-skill-badge') } : row), }) const ctx = await boot('dsh-badge-snapshot', rootConfigPath, [ diff --git a/apps/cli/tests/fixtures/github-webhook/cordis.yml b/apps/cli/tests/fixtures/github-webhook/cordis.yml index 2f1efe7115..06a90c5e79 100644 --- a/apps/cli/tests/fixtures/github-webhook/cordis.yml +++ b/apps/cli/tests/fixtures/github-webhook/cordis.yml @@ -3,7 +3,7 @@ - insert: - id: webhook-runtime - name: '@deepseek-ai/dsh-experimental-webhook' + name: '@deepseek-ai/dsh-webhook' - id: github-webhook-real-e2e-rule name: './github-webhook-rule.mjs' @@ -28,7 +28,7 @@ port: !!js Number(process.env.DSH_GITHUB_WEBHOOK_PORT) - id: github-webhook-real-e2e-adapter - name: '@deepseek-ai/dsh-experimental-webhook-github' + name: '@deepseek-ai/dsh-webhook-github' config: source: github-real-e2e path: /github diff --git a/apps/cli/tests/fixtures/github-webhook/github-webhook-rule.mjs b/apps/cli/tests/fixtures/github-webhook/github-webhook-rule.mjs index b3d9287801..2ae7c8123b 100644 --- a/apps/cli/tests/fixtures/github-webhook/github-webhook-rule.mjs +++ b/apps/cli/tests/fixtures/github-webhook/github-webhook-rule.mjs @@ -1,5 +1,5 @@ import z from '@deepseek-ai/schemastery' -import { WebhookRuleId } from '@deepseek-ai/dsh-experimental-webhook' +import { WebhookRuleId } from '@deepseek-ai/dsh-webhook' export const name = 'github-webhook-real-e2e-rule' export const inject = ['webhookRuntime'] diff --git a/apps/cli/tests/github-webhook-real.e2e.ts b/apps/cli/tests/github-webhook-real.e2e.ts index 4aa80186ae..4c23211d81 100644 --- a/apps/cli/tests/github-webhook-real.e2e.ts +++ b/apps/cli/tests/github-webhook-real.e2e.ts @@ -362,7 +362,7 @@ describe.skipIf(!process.env.DEEPSEEK_API_KEY)('GitHub webhook through the real initProfile(profile, PROFILE_TEMPLATES.web!.bundles) const manifestPath = join(profile, 'package.json') const manifest = JSON.parse(await readFile(manifestPath, 'utf8')) as { dependencies: Record } - for (const name of ['@deepseek-ai/dsh-experimental-webhook', '@deepseek-ai/dsh-experimental-webhook-github']) { + for (const name of ['@deepseek-ai/dsh-webhook', '@deepseek-ai/dsh-webhook-github']) { const directory = dirname(fileURLToPath(import.meta.resolve(`${name}/package.json`))) const link = join(profile, 'node_modules', name) await mkdir(dirname(link), { recursive: true }) diff --git a/apps/cli/tests/profiles/web/tests/runtime-roster-isolation.spec.ts b/apps/cli/tests/profiles/web/tests/runtime-roster-isolation.spec.ts new file mode 100644 index 0000000000..06f0c67f86 --- /dev/null +++ b/apps/cli/tests/profiles/web/tests/runtime-roster-isolation.spec.ts @@ -0,0 +1,38 @@ +/** Runtime evidence keeps retained experimental names visible through installed aliases. */ + +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { pathToFileURL } from 'node:url' +import { expect, it, onTestFinished } from 'vitest' +import { EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS } from '../../../../../../scripts/experimental-package-policy.ts' +import { experimentalRuntimeReferences } from './runtime-roster-isolation.ts' +import type { RuntimeRoster } from './runtime-roster.ts' + +it.each(Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('finds retained experimental package %s in real roster fields', (name) => { + const root = mkdtempSync(join(tmpdir(), 'dsh-runtime-roster-policy-')) + onTestFinished(() => { rmSync(root, { recursive: true, force: true }) }) + const directory = join(root, 'node_modules/ordinary-alias') + mkdirSync(directory, { recursive: true }) + writeFileSync(join(directory, 'package.json'), JSON.stringify({ name })) + const module = pathToFileURL(join(directory, 'index.js')).href + const subpath = `${name}/client` + const external = `${name}/external` + const injected = `${name}/injected` + const batched = `${name}/batch` + const roster: RuntimeRoster = { + entries: [{ id: 'entry', name, state: 1 }], + plugins: [{ name: 'plugin', owner: subpath, state: 1, modules: [module] }], + modules: [module], + client: { + rev: 'fixture', + entries: [{ id: 'ordinary-client', url: '/client.js', rev: 'fixture', inject: [injected], external: [external] }], + batches: [{ phase: 'application', url: '/batch.js', rev: 'fixture', entries: [batched] }], + }, + } + expect(experimentalRuntimeReferences(roster)).toEqual([name, subpath, module, external, injected, batched].sort()) + writeFileSync(join(directory, 'package.json'), JSON.stringify({ name: `${name}-unrelated` })) + expect(experimentalRuntimeReferences({ + entries: [], plugins: [], modules: [module], client: { rev: 'fixture', entries: [], batches: [] }, + })).toEqual([]) +}) diff --git a/apps/cli/tests/profiles/web/tests/runtime-roster-isolation.ts b/apps/cli/tests/profiles/web/tests/runtime-roster-isolation.ts new file mode 100644 index 0000000000..a79e358c2b --- /dev/null +++ b/apps/cli/tests/profiles/web/tests/runtime-roster-isolation.ts @@ -0,0 +1,24 @@ +/** Experimental identity checks over independently observed built Web runtime records. */ + +import { fileURLToPath } from 'node:url' +import { hasExperimentalPackageReference, isExperimentalPackageName } from '../../../../../../scripts/experimental-package-policy.ts' +import { modulePackage } from './runtime-roster.ts' +import type { RuntimeRoster } from './runtime-roster.ts' + +/** + * Locate experimental package identities and experimental source/artifact paths in runtime evidence. + * @param roster - independently collected Web runtime records. + * @returns diagnostic evidence for every forbidden package reference. + */ +export function experimentalRuntimeReferences(roster: RuntimeRoster): string[] { + const references = new Set([ + ...roster.entries.map(entry => entry.name), + ...roster.plugins.flatMap(plugin => [plugin.owner ?? '', ...plugin.modules]), + ...roster.modules, + ...roster.client.entries.flatMap(entry => [entry.id, ...entry.inject ?? [], ...entry.external ?? []]), + ...roster.client.batches.flatMap(batch => batch.entries), + ]) + return [...references].filter(reference => hasExperimentalPackageReference(reference) + || (reference.startsWith('file:') && (fileURLToPath(reference).replaceAll('\\', '/').includes('/packages/experimental/') + || isExperimentalPackageName(modulePackage(reference) ?? '')))).sort() +} diff --git a/apps/cli/tests/profiles/web/tests/runtime-roster.ts b/apps/cli/tests/profiles/web/tests/runtime-roster.ts index f6156fd1da..4e48203d03 100644 --- a/apps/cli/tests/profiles/web/tests/runtime-roster.ts +++ b/apps/cli/tests/profiles/web/tests/runtime-roster.ts @@ -75,21 +75,3 @@ export function runtimeRoster(ctx: Context): RuntimeRoster { client: ctx.clientModules.graph(), } } - -/** - * Locate experimental package identities and experimental source/artifact paths in runtime evidence. - * @param roster - independently collected Web runtime records. - * @returns diagnostic evidence for every forbidden package reference. - */ -export function experimentalRuntimeReferences(roster: RuntimeRoster): string[] { - const references = new Set([ - ...roster.entries.map(entry => entry.name), - ...roster.plugins.flatMap(plugin => [plugin.owner ?? '', ...plugin.modules]), - ...roster.modules, - ...roster.client.entries.flatMap(entry => [entry.id, ...entry.inject ?? [], ...entry.external ?? []]), - ...roster.client.batches.flatMap(batch => batch.entries), - ]) - return [...references].filter(reference => reference.includes('@deepseek-ai/dsh-experimental-') - || (reference.startsWith('file:') && (fileURLToPath(reference).replaceAll('\\', '/').includes('/packages/experimental/') - || modulePackage(reference)?.startsWith('@deepseek-ai/dsh-experimental-')))).sort() -} diff --git a/apps/cli/tests/profiles/web/tests/web-default-isolation.expected.e2e.ts b/apps/cli/tests/profiles/web/tests/web-default-isolation.expected.e2e.ts index ef0f10cc1d..7563a323aa 100644 --- a/apps/cli/tests/profiles/web/tests/web-default-isolation.expected.e2e.ts +++ b/apps/cli/tests/profiles/web/tests/web-default-isolation.expected.e2e.ts @@ -3,7 +3,8 @@ import { FiberState } from '@deepseek-ai/cordis' import type { WebBootGraph } from '@deepseek-ai/dsh-client-modules/client' import { expect, it } from 'vitest' -import { experimentalRuntimeReferences, modulePackage } from './runtime-roster.ts' +import { modulePackage } from './runtime-roster.ts' +import { experimentalRuntimeReferences } from './runtime-roster-isolation.ts' import { withDefaultWeb, webGet } from './default-web-process.ts' const experimentalName = '@deepseek-ai/dsh-experimental-client-ui-agent-team' diff --git a/apps/cli/tests/profiles/webhook-packed.e2e.ts b/apps/cli/tests/profiles/webhook-packed.e2e.ts index eba0f36c3c..b70138ef72 100644 --- a/apps/cli/tests/profiles/webhook-packed.e2e.ts +++ b/apps/cli/tests/profiles/webhook-packed.e2e.ts @@ -13,8 +13,8 @@ import { pnpmCommand } from '../../../../scripts/release/process.ts' import { packedWorkspaceClosure, type WorkspacePackage } from '../../../../packages/sandbox/sandbox-local/tests/packed-workspace-closure.ts' const root = fileURLToPath(new URL('../../../..', import.meta.url)) -const adapter = '@deepseek-ai/dsh-experimental-webhook-github' -const runtime = '@deepseek-ai/dsh-experimental-webhook' +const adapter = '@deepseek-ai/dsh-webhook-github' +const runtime = '@deepseek-ai/dsh-webhook' const built = existsSync(join(root, 'apps/cli/lib/bin.js')) && existsSync(join(root, 'packages/experimental/webhook-github/lib/index.js')) const secret = 'packed-webhook-test-secret' diff --git a/apps/cli/tests/web-agent-presets.e2e.ts b/apps/cli/tests/web-agent-presets.e2e.ts index 29c159b3d0..14d49d2a2b 100644 --- a/apps/cli/tests/web-agent-presets.e2e.ts +++ b/apps/cli/tests/web-agent-presets.e2e.ts @@ -93,7 +93,7 @@ async function bootWeb( // A deployment-level skill on the host registry's GLOBAL layer — the same // registration shape a repository plugin's skill root uses. The layered // skills test below proves it reaches preset-composed agents. - { insert: [{ id: 'skill-badge', name: import.meta.resolve('@deepseek-ai/dsh-experimental-skill-badge') }] }, + { insert: [{ id: 'skill-badge', name: import.meta.resolve('@deepseek-ai/dsh-skill-badge') }] }, { id: 'modules', disabled: true }, // The physical Connection row owns the disabled HTTP server. bootWeb // supplies only its in-process registries so Host services still prove diff --git a/apps/web/tests/default-product-isolation.e2e.ts b/apps/web/tests/default-product-isolation.e2e.ts index 115bd18ee0..4b535448e1 100644 --- a/apps/web/tests/default-product-isolation.e2e.ts +++ b/apps/web/tests/default-product-isolation.e2e.ts @@ -4,6 +4,7 @@ import { FiberState } from '@deepseek-ai/cordis' import type { Context, Plugin, RegistryService } from '@deepseek-ai/cordis' import type { ClientModuleLoader, ClientModuleLoaderTarget } from '@deepseek-ai/dsh-client-modules/client' import { chromium } from 'playwright' +import { hasExperimentalPackageReference } from '../../../scripts/experimental-package-policy.ts' import { expect, it } from 'vitest' import { withDefaultWeb } from '../../cli/tests/profiles/web/tests/default-web-process.ts' import { newEnglishPage } from './support.ts' @@ -44,7 +45,7 @@ function experimentalClientReferences(roster: Awaited entry.name), ...roster.plugins.flatMap(plugin => [plugin.owner ?? '', ...plugin.modules]), ...roster.modules, - ].filter(name => name.startsWith('@deepseek-ai/dsh-experimental-')) + ].filter(hasExperimentalPackageReference) } it('activates the actual default Client registry without experimental packages', async (test) => { diff --git a/apps/web/tests/github-ready-review.e2e.ts b/apps/web/tests/github-ready-review.e2e.ts index 668fcecc95..9c9ae295e9 100644 --- a/apps/web/tests/github-ready-review.e2e.ts +++ b/apps/web/tests/github-ready-review.e2e.ts @@ -9,7 +9,7 @@ import { chromium } from 'playwright' import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished, vi } from 'vitest' import type { GenerateOptions, StreamChunk } from '@deepseek-ai/dsh-llm' import { LlmAdapter } from '@deepseek-ai/dsh-llm' -import type {} from '@deepseek-ai/dsh-experimental-webhook' +import type {} from '@deepseek-ai/dsh-webhook' import { captureExpandedTurnProcessAria, captureStableAria, diff --git a/docs/architecture.i18n.yaml b/docs/architecture.i18n.yaml index 6415e32582..687f074874 100644 --- a/docs/architecture.i18n.yaml +++ b/docs/architecture.i18n.yaml @@ -33,5 +33,5 @@ en: 93d1dc2eeda4aec2 zh: ee7a9da89151ea17 /deepseek-harness-architecture/where-new-behavior-goes: - en: 3cbf3d7d6094fa44 - zh: 015a848652d90f54 + en: 9b2eb0539a9cd0d6 + zh: 4f575277b91d4e5c diff --git a/docs/architecture.md b/docs/architecture.md index 2b4ba34c38..eb2f72ce4c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -145,7 +145,7 @@ New behavior attaches to a documented extension point. Changing the loop itself | Add a model-facing capability | register on `ctx.tools`; its schema joins prompt assembly | | Give one session a different capability set | compose an agent preset; a service row there needs an `isolate` realm | | Add shell execution | register a `ctx.shell` backend; the local one spawns through `ctx.subprocess` | -| Add persistent terminal execution | register a `ctx.terminals` backend plus `dsh-experimental-tool-terminal` | +| Add persistent terminal execution | register a `ctx.terminals` backend plus `dsh-tool-terminal` | | Add a human command | register on `ctx.commands`; it dispatches without a model turn | | Manage background jobs | register on `ctx.jobs`; `job_*` tools read or stop jobs | | Start a Session from an external webhook | register a trusted rule on `ctx.webhookRuntime` and mount a provider adapter | diff --git a/docs/architecture.zh.md b/docs/architecture.zh.md index dd9fe233a2..413497005e 100644 --- a/docs/architecture.zh.md +++ b/docs/architecture.zh.md @@ -149,7 +149,7 @@ seam 正是替换一个提供方就能改变整个产品的原因。文件系统 | 添加面向模型的能力 | 在 `ctx.tools` 上注册;其 schema 加入提示词组装 | | 让某个会话拥有不同的能力集合 | 组装一个 agent preset;其中的服务行需要 `isolate` realm | | 添加 shell 执行 | 注册 `ctx.shell` 后端;本地后端通过 `ctx.subprocess` spawn 进程 | -| 添加持久化终端执行 | 注册 `ctx.terminals` 后端和 `dsh-experimental-tool-terminal` | +| 添加持久化终端执行 | 注册 `ctx.terminals` 后端和 `dsh-tool-terminal` | | 添加用户命令 | 在 `ctx.commands` 上注册;它无需模型轮次即可分派 | | 管理后台任务 | 在 `ctx.jobs` 上注册;`job_*` 工具读取或停止任务 | | 从外部 webhook 启动 Session | 在 `ctx.webhookRuntime` 上注册可信规则,并挂载提供方适配器 | diff --git a/docs/capability-seams.i18n.yaml b/docs/capability-seams.i18n.yaml index 105f39da9a..d2a62401d8 100644 --- a/docs/capability-seams.i18n.yaml +++ b/docs/capability-seams.i18n.yaml @@ -6,5 +6,5 @@ en: 41d772192075e133 zh: 5ef3da69b4de1d8a /capability-seams-and-core-services: - en: 5a71eeaa839ae17e - zh: 02d8b24bf995e387 + en: 150d8b08a02cc6ae + zh: 17dd3af4dc79660f diff --git a/docs/capability-seams.md b/docs/capability-seams.md index 163488812c..d0564e8e60 100644 --- a/docs/capability-seams.md +++ b/docs/capability-seams.md @@ -626,7 +626,7 @@ flowchart LR | `ctx.directoryPickerController` | `core` | [`api-workspace-controller`](../packages/api/workspace-controller) | - | - | - | Carries the picking seam onto the wire: capability gating, cancellation, and the seam-coded failures a browser directory flow discriminates on. | | `ctx.typert` | `core` | [`typert-registry`](../packages/typert/registry) | - | [`typert-loader`](../packages/typert/loader), [`api-gateway`](../packages/api/gateway) | - | Plugins register live zod contributions directly or through dsh-typert-loader; the API gateway consumes invocation descriptors and providers, while other runtime consumers query schemas and reflection metadata at their own edges. | | `ctx.typertGateway` | `core` | [`api-gateway`](../packages/api/gateway) | - | - | - | Associates generated Remote descriptors with live Cordis services, resolves registered identities, and exposes unary calls through the shared Connection RPC carrier. | -| `ctx.sessionPersistence` | `seam` | [`session-persistence`](../packages/session/session-persistence) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl) | [`agent-loop`](../packages/core/agent-loop), [`tool-bash`](../packages/shell/tool-bash), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite), [`message-feedback`](../packages/feedback/message-feedback) | - | The JSONL backend persists the SessionEvent vocabulary as one artifact per Session. | +| `ctx.sessionPersistence` | `seam` | [`session-persistence`](../packages/session/session-persistence) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl) | [`agent-loop`](../packages/core/agent-loop), [`tool-bash`](../packages/shell/tool-bash), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite), [`message-feedback`](../packages/feedback/message-feedback) | - | The JSONL backend persists the SessionEvent vocabulary as one artifact per Session. | | `ctx.configEditor` | `core` | [`config-editor`](../packages/boot/config-editor) | - | [`settings`](../packages/settings/settings), [`agent-default-model`](../packages/core/agent-default-model) | - | Persists profile config patches under the application file lock and HMR queue, then reconciles Loader entries. | | `ctx.settings` | `core` | [`settings`](../packages/settings/settings) | - | [`api-settings-controller`](../packages/api/settings-controller) | - | Forms project volatile Config fields from active profile entries and delegate validated edits to config-editor. Plugins consume their own Config references. | | `ctx.subagentModelSelection` | `core` | [`tool-subagent`](../packages/subagent/tool-subagent) | - | [`tool-subagent`](../packages/subagent/tool-subagent) | - | Owns the default-off settings namespace that Agent-scoped delegation tools sample when composing a new top-level Session. | @@ -645,16 +645,16 @@ flowchart LR | `ctx.sessionQuery` | `seam` | [`session-query`](../packages/session-query/session-query) | [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | [`session-reference`](../packages/context/session-reference), [`tool-session-query`](../packages/session-query/tool-session-query) | - | The interface supplies exact reads, filters, and traces; its concrete backend adds full-text reconciliation, ranking, snippets, and cursor generations, while the model consumer owns workspace authority and cursor-free rendering. | | `ctx.fileReferences` | `seam` | [`file-reference`](../packages/context/file-reference) | [`file-reference-local`](../packages/context/file-reference-local) | [`api-session-controller`](../packages/api/session-controller) | - | The interface returns path-only completion candidates within an Agent cwd; providers own namespace access and ranking without reading file contents. | | `ctx.sessionReferenceResolver` | `core` | [`session-reference`](../packages/context/session-reference) | - | - | - | Projects bounded current-surface conversation snapshots into durable untrusted message context; host adapters own mention syntax. | -| `ctx.sessionTitle` | `seam` | [`session-title`](../packages/session/session-title) | [`session-title-first-prompt-llm`](../packages/session/session-title-first-prompt-llm), [`session-title-all-prompts-llm`](../packages/session/session-title-all-prompts-llm) | - | - | Owns the deterministic fallback, latest-title fold, and sole optional asynchronous provider registration. | -| `ctx.systemPrompt` | `core` | [`system-prompt`](../packages/core/system-prompt) | - | [`agent-loop`](../packages/core/agent-loop), [`tools`](../packages/core/tools), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-web`](../packages/web/tool-web) | - | Collects prompt sections and model-facing tool schemas for each step. | -| `ctx.tools` | `core` | [`tools`](../packages/core/tools) | - | [`agent-loop`](../packages/core/agent-loop), [`tool-ask-user`](../packages/interaction/tool-ask-user), [`tool-bash`](../packages/shell/tool-bash), [`tool-cordis`](../packages/extensions/tool-cordis), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-skill`](../packages/skill/tool-skill), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-todo`](../packages/todo/tool-todo), [`tool-web`](../packages/web/tool-web) | - | Registers capabilities, owns PTC mode transport, and routes calls through pre-policy, monotonic guards, around dispatch, post-policy, and final-result observation. | +| `ctx.sessionTitle` | `seam` | [`session-title`](../packages/session/session-title) | [`session-title-first-prompt-llm`](../packages/session/session-title-first-prompt-llm), [`session-title-all-prompts-llm`](../packages/experimental/session-title-all-prompts-llm) | - | - | Owns the deterministic fallback, latest-title fold, and sole optional asynchronous provider registration. | +| `ctx.systemPrompt` | `core` | [`system-prompt`](../packages/core/system-prompt) | - | [`agent-loop`](../packages/core/agent-loop), [`tools`](../packages/core/tools), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-web`](../packages/web/tool-web) | - | Collects prompt sections and model-facing tool schemas for each step. | +| `ctx.tools` | `core` | [`tools`](../packages/core/tools) | - | [`agent-loop`](../packages/core/agent-loop), [`tool-ask-user`](../packages/interaction/tool-ask-user), [`tool-bash`](../packages/shell/tool-bash), [`tool-cordis`](../packages/extensions/tool-cordis), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-skill`](../packages/skill/tool-skill), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-todo`](../packages/todo/tool-todo), [`tool-web`](../packages/web/tool-web) | - | Registers capabilities, owns PTC mode transport, and routes calls through pre-policy, monotonic guards, around dispatch, post-policy, and final-result observation. | | `ctx.userQuestions` | `seam` | [`user-questions`](../packages/interaction/user-questions) | - | [`tool-ask-user`](../packages/interaction/tool-ask-user) | - | UI front ends provide the active human-answer provider; tool-ask-user pauses a tool call on the provider-neutral ask() promise. | | `ctx.planMode` | `core` | [`plan-mode`](../packages/plan/plan-mode) | - | - | - | Folds logged plan/mode state, flushes user selections at turn boundaries, renders deployment-owned guidance, registers /plan, and keeps the plan-exit schema stable across transitions. | | `ctx.agentPresets` | `core` | [`agent-preset-registry`](../packages/preset/agent-preset-registry) | - | - | - | Eagerly mounts YAML-declared preset revisions, binds Agents and cold readers to scoped contributions, and retains retired revisions until their last user releases them. | | `ctx.commands` | `core` | [`commands`](../packages/interaction/commands) | - | - | - | Plugins register direct human commands without sending invocations to the model. | | `ctx.sessionProjections` | `core` | [`session-projection`](../packages/session/session-projection) | - | [`api-session-controller`](../packages/api/session-controller), [`tool-todo`](../packages/todo/tool-todo), [`session-title`](../packages/session/session-title) | - | Domains register state-driven fold units; the eager drive keeps per-session watermark states and the Session controller serves baselines and pushes changed values. | | `ctx.sessionProjectionCache` | `core` | [`session-projection-cache`](../packages/session/session-projection-cache) | - | [`api-session-controller`](../packages/api/session-controller), [`session-query`](../packages/session-query/session-query), [`session-reference`](../packages/context/session-reference) | - | Durably checkpoints projection unit states per session (throttled + turn/end/detach mandatory points), serves cached projection views, and accelerates prepared-Session projection hydration. | -| `ctx.skills` | `seam` | [`skill`](../packages/skill/skill) | [`sandbox-windows-acl`](../packages/sandbox/sandbox-windows-acl), [`skill-badge`](../packages/skill/skill-badge), [`skill-filesystem`](../packages/skill/skill-filesystem), [`skill-office`](../packages/skill/skill-office) | [`tool-skill`](../packages/skill/tool-skill) | - | Merges provider skill catalogs; tool-skill renders the session-prefix catalog and loads complete skill bodies. | +| `ctx.skills` | `seam` | [`skill`](../packages/skill/skill) | [`sandbox-windows-acl`](../packages/sandbox/sandbox-windows-acl), [`skill-badge`](../packages/experimental/skill-badge), [`skill-filesystem`](../packages/skill/skill-filesystem), [`skill-office`](../packages/skill/skill-office) | [`tool-skill`](../packages/skill/tool-skill) | - | Merges provider skill catalogs; tool-skill renders the session-prefix catalog and loads complete skill bodies. | | `ctx.agents` | `core` | [`agent`](../packages/core/agent) | - | [`agent-loop`](../packages/core/agent-loop), [`acp`](../packages/acp/acp), [`subagent`](../packages/subagent/subagent) | - | Owns live Agent handles, the create/resume factory seam, and process-local initiator propagation. | | `ctx.agentDefaultModel` | `core` | [`agent-default-model`](../packages/core/agent-default-model) | - | [`api-session-controller`](../packages/api/session-controller), [`headless`](../packages/bundle/headless) | - | Reads the default ModelSelection from volatile Config and saves selections through the profile editor. | | `ctx.agentLoop` | `bundle` | [`agent-loop`](../packages/core/agent-loop) | - | [`base`](../packages/bundle/base), [`sdk-minimal`](../packages/bundle/sdk-minimal) | - | The one concrete loop plugin; extension packages depend on dsh-agent events and services, not on this package. | @@ -662,9 +662,9 @@ flowchart LR | `ctx.goals` | `core` | [`goal`](../packages/goal/goal) | - | - | - | Folds revisioned objective state from the session log and keeps live continuation activation process-local. | | `ctx.ssh` | `core` | [`ssh`](../packages/ssh/ssh) | - | [`fs-ssh`](../packages/ssh/fs-ssh), [`subprocess-ssh`](../packages/ssh/subprocess-ssh), [`sandbox-ssh`](../packages/ssh/sandbox-ssh) | - | Owns one authenticated OpenSSH connection, installed helper identity, independent program streams and disconnect cleanup for the paired remote providers. | | `ctx.subprocess` | `seam` | [`subprocess`](../packages/subprocess/subprocess) | [`subprocess-local`](../packages/subprocess/subprocess-local), [`subprocess-ssh`](../packages/ssh/subprocess-ssh) | [`bash-local`](../packages/shell/bash-local), [`bash-sandbox`](../packages/shell/bash-sandbox), [`terminal-bash`](../packages/terminal/terminal-bash), [`lsp-stdio`](../packages/lsp/lsp-stdio), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code) | - | The bash executors, the PTY shell backend, the LSP host, and the out-of-process ACP, Codex, and Claude Code subagent backends spawn through ctx.subprocess; the service owns process coordinates, tree/session lifetime, stdio dispositions, terminal mechanics, and kill escalation. | -| `ctx.shell` | `seam` | [`shell`](../packages/shell/shell) | [`bash-local`](../packages/shell/bash-local), [`bash-sandbox`](../packages/shell/bash-sandbox), [`pwsh-local`](../packages/shell/pwsh-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex) | - | The model-facing shell tools and hook bridges consume this seam; sandboxed, remote, or PowerShell executors replace bash-local without touching them. | +| `ctx.shell` | `seam` | [`shell`](../packages/shell/shell) | [`bash-local`](../packages/shell/bash-local), [`bash-sandbox`](../packages/shell/bash-sandbox), [`pwsh-local`](../packages/shell/pwsh-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex) | - | The model-facing shell tools and hook bridges consume this seam; sandboxed, remote, or PowerShell executors replace bash-local without touching them. | | `ctx.shellEnv` | `core` | [`shell-env`](../packages/shell/shell-env) | - | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh) | - | Plugins declare effect-scoped DSH_* facts; each shell tool collects one trusted snapshot per execution and its executor rebuilds the namespace. | -| `ctx.terminals` | `seam` | [`terminal`](../packages/terminal/terminal) | [`terminal-bash`](../packages/terminal/terminal-bash) | [`tool-terminal`](../packages/terminal/tool-terminal) | - | The registry owns exact-Agent session identity and cleanup; backends own terminal mechanics, while tool-terminal exposes the owner-scoped model tools. | +| `ctx.terminals` | `seam` | [`terminal`](../packages/terminal/terminal) | [`terminal-bash`](../packages/terminal/terminal-bash) | [`tool-terminal`](../packages/experimental/tool-terminal) | - | The registry owns exact-Agent session identity and cleanup; backends own terminal mechanics, while tool-terminal exposes the owner-scoped model tools. | | `ctx.sandbox` | `seam` | [`sandbox`](../packages/sandbox/sandbox) | [`sandbox-local`](../packages/sandbox/sandbox-local), [`sandbox-ssh`](../packages/ssh/sandbox-ssh) | [`bash-sandbox`](../packages/shell/bash-sandbox), [`terminal-bash`](../packages/terminal/terminal-bash) | - | Consumers hand over the exact argv they are about to spawn; same-world backends wrap it under a per-call policy and report enforcement. | | `ctx.sandboxPolicy` | `core` | [`sandbox-policy`](../packages/sandbox/sandbox-policy) | - | [`bash-sandbox`](../packages/shell/bash-sandbox), [`fs-sandbox`](../packages/fs/fs-sandbox), [`terminal-bash`](../packages/terminal/terminal-bash) | - | The one home for the deployment default mode + workspace root; only the sandboxed executor and provider read the service (the tool layers use the pure `sandbox/mode` fold it also exports). Both enforcing families read it so bash and fs cannot confine to different roots. | | `ctx.approval` | `seam` | [`user-approval`](../packages/interaction/user-approval) | - | [`tools`](../packages/core/tools), [`tool-bash`](../packages/shell/tool-bash), [`acp`](../packages/acp/acp) | - | One-shot permission decisions dispatched over the `approval/request` waterfall; answerers are listeners (the ACP bridge for its own agents), absence fails closed to `unavailable`. | @@ -672,19 +672,19 @@ flowchart LR | `ctx.ptcRuntime` | `seam` | [`ptc-runtime`](../packages/ptc-runtime/ptc-runtime) | [`ptc-runtime-node`](../packages/ptc-runtime/ptc-runtime-node), [`experimental-ptc-runtime-python`](../packages/experimental/ptc-runtime-python) | [`tools`](../packages/core/tools), [`workflow-ptc`](../packages/workflow/workflow-ptc) | - | Runs programs against host-provided async bindings; tools owns PTC presentation and workflow-ptc owns workflow orchestration. | | `ctx.fs` | `seam` | [`fs`](../packages/fs/fs) | [`fs-local`](../packages/fs/fs-local), [`fs-sandbox`](../packages/fs/fs-sandbox), [`fs-ssh`](../packages/ssh/fs-ssh) | [`tool-fs`](../packages/fs/tool-fs) | [`fs-observation-policy`](../packages/fs/fs-observation-policy) | tool-fs executes read/write/edit through ctx.fs; fs-sandbox fences mutations by the shared sandbox mode; fs-observation-policy contributes observed-state checks through the fs/* event gate. | | `ctx.compaction` | `seam` | [`compaction`](../packages/compaction/compaction) | [`compaction-basic`](../packages/compaction/compaction-basic) | [`compaction-basic`](../packages/compaction/compaction-basic) | - | The basic backend consumes post-step pressure and request-error recovery events; there is no model-facing compact tool. | -| `ctx.subagents` | `seam` | [`subagent`](../packages/subagent/subagent) | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process), [`subagent-fork-in-process`](../packages/subagent/subagent-fork-in-process), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code), [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control), [`tool-ralph`](../packages/workflow/tool-ralph) | - | Providers prepare local children or execute external tasks; one activation manager owns both lifecycles. The delegation tool selects a backend, control tools deliver local follow-ups, and workflows await activation results. | +| `ctx.subagents` | `seam` | [`subagent`](../packages/subagent/subagent) | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process), [`subagent-fork-in-process`](../packages/subagent/subagent-fork-in-process), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code), [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control), [`tool-ralph`](../packages/experimental/tool-ralph) | - | Providers prepare local children or execute external tasks; one activation manager owns both lifecycles. The delegation tool selects a backend, control tools deliver local follow-ups, and workflows await activation results. | | `ctx.speechToText` | `seam` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text) | [`experimental-speech-to-text-sensevoice`](../packages/experimental/speech-to-text-sensevoice) | [`experimental-api-speech-to-text`](../packages/experimental/api-speech-to-text) | - | Routes explicit recognizers; the browser uses the authenticated Remote and keeps transcripts in the draft until submission. | | `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | - | Owns the implicit-root roster, durable peer mailbox, shared task DAG, and continuable-child lifecycle; tool-agent-team contributes model controls. | | `ctx.claudeCodeMods` | `core` | [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods) | - | - | - | Loads mods that defineMod plugins add, raises their hook chains from harness extension points, and draws the band above the prompt over its Remote. | | `ctx.inspector` | `core` | `inspector` | - | - | - | Owns the Worker-hosted CDP target and the transport-independent Host and Client observation and Cordis-tree query API. | -| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-jobs`](../packages/jobs/tool-jobs), [`api-job-controller`](../packages/api/job-controller) | - | Producers (background bash/pwsh and PTY sends) register running work; record-declaring jobs additionally stream raw output for non-consuming observers; tool-jobs is the model-facing controller that reads, lists, and kills it; jobs-local is the process-local registry. | +| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-jobs`](../packages/jobs/tool-jobs), [`api-job-controller`](../packages/api/job-controller) | - | Producers (background bash/pwsh and PTY sends) register running work; record-declaring jobs additionally stream raw output for non-consuming observers; tool-jobs is the model-facing controller that reads, lists, and kills it; jobs-local is the process-local registry. | | `ctx.web` | `seam` | [`web`](../packages/web/web) | [`web-search-exa`](../packages/web/web-search-exa), [`web-search-perplexity`](../packages/web/web-search-perplexity), [`web-search-deepseek`](../packages/web/web-search-deepseek), [`web-fetch-http`](../packages/web/web-fetch-http) | [`tool-web`](../packages/web/tool-web) | - | Search and fetch providers register into one ctx.web seam; tool-web owns the stable model-facing names. | | `ctx.spillStore` | `seam` | [`spill`](../packages/spill/spill) | [`spill-local`](../packages/spill/spill-local) | [`spill-policy`](../packages/spill/spill-policy) | - | The backend saves oversized tool text and returns a model-facing locator plus retrieval hint; spill-policy is the tools/post-execute consumer that decides when to spill. | | `ctx.directoryPicker` | `seam` | [`host-directory-picker`](../packages/host/directory-picker) | [`host-directory-picker-native`](../packages/host/directory-picker-native), [`host-directory-picker-browse`](../packages/host/directory-picker-browse) | [`api-workspace-controller`](../packages/api/workspace-controller) | - | Discriminated interaction capability: the native backend opens one OS chooser on the host display, the browse backend serves listing/creation primitives for the in-app browser; dual-face backends fill ui-workspace directory-flow slots from their browser halves (no wire advertisement). | | `ctx.webServer` | `core` | [`host-webserver`](../packages/host/webserver) | - | [`client-connection`](../packages/client/connection), [`client-modules`](../packages/client/modules), [`client-hmr`](../packages/client/hmr) | - | Plain node:http carrier: named-route registry, index transform taps, and the static dist fallback; web-transport plugins register their own routes. | | `ctx.clientModules` | `core` | [`client-modules`](../packages/client/modules) | - | [`client-hmr`](../packages/client/hmr) | - | Composes the __DSH_BOOT__ entry graph from an incremental dsh.client scan, serves plugin bundles, and notifies rebuilt/graph-changed subscribers. | -| `ctx.workflowEngine` | `seam` | [`workflow`](../packages/workflow/workflow) | [`workflow-ptc`](../packages/workflow/workflow-ptc) | [`tool-workflow`](../packages/workflow/tool-workflow), [`tool-ralph`](../packages/workflow/tool-ralph) | - | One engine per context, as in bash, with no named-provider registry; the general workflow and fixed Ralph consumers start runs whose agent() calls fan out through ctx.subagents. | -| `ctx.webhookRuntime` | `core` | [`webhook`](../packages/webhook/webhook) | - | [`webhook-github`](../packages/webhook/webhook-github) | - | Provider adapters dispatch authenticated deliveries; trusted plugins register independent process-local rules, and the runtime turns non-null results into ordinary Workspace-backed Sessions without delivery or completion state. | +| `ctx.workflowEngine` | `seam` | [`workflow`](../packages/workflow/workflow) | [`workflow-ptc`](../packages/workflow/workflow-ptc) | [`tool-workflow`](../packages/workflow/tool-workflow), [`tool-ralph`](../packages/experimental/tool-ralph) | - | One engine per context, as in bash, with no named-provider registry; the general workflow and fixed Ralph consumers start runs whose agent() calls fan out through ctx.subagents. | +| `ctx.webhookRuntime` | `core` | [`webhook`](../packages/experimental/webhook) | - | [`webhook-github`](../packages/experimental/webhook-github) | - | Provider adapters dispatch authenticated deliveries; trusted plugins register independent process-local rules, and the runtime turns non-null results into ordinary Workspace-backed Sessions without delivery or completion state. | | `ctx.lsp` | `seam` | [`lsp`](../packages/lsp/lsp) | [`lsp-stdio`](../packages/lsp/lsp-stdio) | [`tool-lsp`](../packages/lsp/tool-lsp) | - | Provider registration and selection plus normalized query execution over exactly four operations; the seam offers no protocol escape hatch, so a backend translates into the normalized request and result. | | `ctx.dynamicCordisRunner` | `core` | [`cordis-host-runner`](../packages/extensions/cordis-host-runner) | - | [`tool-cordis`](../packages/extensions/tool-cordis) | - | Owns the in-memory definition registry, the vm sandbox for host halves, and the request-run round trip; browser pages reach the same service over the wire through its remote namespace. | | `ctx.cordisInspect` | `core` | [`cordis-host-runner`](../packages/extensions/cordis-host-runner) | - | [`tool-cordis`](../packages/extensions/tool-cordis) | - | Registers host inspect providers, mirrors the client provider manifest, and routes client queries through the dynamic Cordis transport. | diff --git a/docs/capability-seams.zh.md b/docs/capability-seams.zh.md index b424e4435a..5764d14501 100644 --- a/docs/capability-seams.zh.md +++ b/docs/capability-seams.zh.md @@ -628,7 +628,7 @@ flowchart LR | `ctx.directoryPickerController` | `core` | [`api-workspace-controller`](../packages/api/workspace-controller) | - | - | - | 把选目录 seam 送上线:能力门禁、取消传播,以及浏览器目录流程用于分支判断的 seam 错误码。 | | `ctx.typert` | `core` | [`typert-registry`](../packages/typert/registry) | - | [`typert-loader`](../packages/typert/loader), [`api-gateway`](../packages/api/gateway) | - | 插件直接或通过 dsh-typert-loader 注册实时 zod 贡献;API 网关消费调用描述符和提供方,其他运行时消费方则在各自边界查询 schema 与反射元数据。 | | `ctx.typertGateway` | `core` | [`api-gateway`](../packages/api/gateway) | - | - | - | 将生成的 Remote 描述符与实时 Cordis 服务关联,解析已注册的身份,并通过共享的 Connection RPC 载体提供一元调用。 | -| `ctx.sessionPersistence` | `seam` | [`session-persistence`](../packages/session/session-persistence) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl) | [`agent-loop`](../packages/core/agent-loop), [`tool-bash`](../packages/shell/tool-bash), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite), [`message-feedback`](../packages/feedback/message-feedback) | - | JSONL backend 把 SessionEvent 词汇持久化为每个 Session 一份产物。 | +| `ctx.sessionPersistence` | `seam` | [`session-persistence`](../packages/session/session-persistence) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl) | [`agent-loop`](../packages/core/agent-loop), [`tool-bash`](../packages/shell/tool-bash), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite), [`message-feedback`](../packages/feedback/message-feedback) | - | JSONL backend 把 SessionEvent 词汇持久化为每个 Session 一份产物。 | | `ctx.configEditor` | `core` | [`config-editor`](../packages/boot/config-editor) | - | [`settings`](../packages/settings/settings), [`agent-default-model`](../packages/core/agent-default-model) | - | Persists profile config patches under the application file lock and HMR queue, then reconciles Loader entries. | | `ctx.settings` | `core` | [`settings`](../packages/settings/settings) | - | [`api-settings-controller`](../packages/api/settings-controller) | - | Forms project volatile Config fields from active profile entries and delegate validated edits to config-editor. Plugins consume their own Config references. | | `ctx.subagentModelSelection` | `core` | [`tool-subagent`](../packages/subagent/tool-subagent) | - | [`tool-subagent`](../packages/subagent/tool-subagent) | - | 拥有默认关闭的设置命名空间;Agent 作用域的委派工具会在组合新顶层 Session 时读取它。 | @@ -647,16 +647,16 @@ flowchart LR | `ctx.sessionQuery` | `seam` | [`session-query`](../packages/session-query/session-query) | [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | [`session-reference`](../packages/context/session-reference), [`tool-session-query`](../packages/session-query/tool-session-query) | - | 该接口提供精确读取、过滤和追踪;具体后端还提供全文协调、排序、摘要片段和游标世代,而模型消费方负责工作区权限与不含游标的渲染。 | | `ctx.fileReferences` | `seam` | [`file-reference`](../packages/context/file-reference) | [`file-reference-local`](../packages/context/file-reference-local) | [`api-session-controller`](../packages/api/session-controller) | - | 该接口返回 Agent cwd 内仅含路径的补全候选;提供方负责命名空间访问与排序,但不读取文件内容。 | | `ctx.sessionReferenceResolver` | `core` | [`session-reference`](../packages/context/session-reference) | - | - | - | 将当前表层中有界的对话快照投影为持久但不可信的消息上下文;Host 适配器负责提及语法。 | -| `ctx.sessionTitle` | `seam` | [`session-title`](../packages/session/session-title) | [`session-title-first-prompt-llm`](../packages/session/session-title-first-prompt-llm), [`session-title-all-prompts-llm`](../packages/session/session-title-all-prompts-llm) | - | - | 负责确定性回退、最新标题折叠区,以及唯一的可选异步提供方注册。 | -| `ctx.systemPrompt` | `core` | [`system-prompt`](../packages/core/system-prompt) | - | [`agent-loop`](../packages/core/agent-loop), [`tools`](../packages/core/tools), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-web`](../packages/web/tool-web) | - | 为每个步骤收集提示词各部分和面向模型的工具 schema。 | -| `ctx.tools` | `core` | [`tools`](../packages/core/tools) | - | [`agent-loop`](../packages/core/agent-loop), [`tool-ask-user`](../packages/interaction/tool-ask-user), [`tool-bash`](../packages/shell/tool-bash), [`tool-cordis`](../packages/extensions/tool-cordis), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-skill`](../packages/skill/tool-skill), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-todo`](../packages/todo/tool-todo), [`tool-web`](../packages/web/tool-web) | - | 注册能力,负责 PTC mode 传输,并让调用依次经过策略前处理、单调守卫、环绕分派、策略后处理和最终结果观测。 | +| `ctx.sessionTitle` | `seam` | [`session-title`](../packages/session/session-title) | [`session-title-first-prompt-llm`](../packages/session/session-title-first-prompt-llm), [`session-title-all-prompts-llm`](../packages/experimental/session-title-all-prompts-llm) | - | - | 负责确定性回退、最新标题折叠区,以及唯一的可选异步提供方注册。 | +| `ctx.systemPrompt` | `core` | [`system-prompt`](../packages/core/system-prompt) | - | [`agent-loop`](../packages/core/agent-loop), [`tools`](../packages/core/tools), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-web`](../packages/web/tool-web) | - | 为每个步骤收集提示词各部分和面向模型的工具 schema。 | +| `ctx.tools` | `core` | [`tools`](../packages/core/tools) | - | [`agent-loop`](../packages/core/agent-loop), [`tool-ask-user`](../packages/interaction/tool-ask-user), [`tool-bash`](../packages/shell/tool-bash), [`tool-cordis`](../packages/extensions/tool-cordis), [`tool-fs`](../packages/fs/tool-fs), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-skill`](../packages/skill/tool-skill), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-todo`](../packages/todo/tool-todo), [`tool-web`](../packages/web/tool-web) | - | 注册能力,负责 PTC mode 传输,并让调用依次经过策略前处理、单调守卫、环绕分派、策略后处理和最终结果观测。 | | `ctx.userQuestions` | `seam` | [`user-questions`](../packages/interaction/user-questions) | - | [`tool-ask-user`](../packages/interaction/tool-ask-user) | - | UI 前端提供当前生效的人工回答提供方;tool-ask-user 在提供方无关的 ask() promise 上暂停工具调用。 | | `ctx.planMode` | `core` | [`plan-mode`](../packages/plan/plan-mode) | - | - | - | 折叠已记录的计划/模式状态,在轮次边界刷新用户选择,渲染由部署方拥有的指导信息,注册 /plan,并在状态转换期间保持计划退出 schema 稳定。 | | `ctx.agentPresets` | `core` | [`agent-preset-registry`](../packages/preset/agent-preset-registry) | - | - | - | 立即挂载 YAML 声明的 preset 版本,把 Agent 和冷读取绑定到作用域内的贡献,并保留已替换的版本,直到最后一个使用者释放它。 | | `ctx.commands` | `core` | [`commands`](../packages/interaction/commands) | - | - | - | 插件注册直接面向人的命令,而不会把调用发送给模型。 | | `ctx.sessionProjections` | `core` | [`session-projection`](../packages/session/session-projection) | - | [`api-session-controller`](../packages/api/session-controller), [`tool-todo`](../packages/todo/tool-todo), [`session-title`](../packages/session/session-title) | - | 各领域注册由状态驱动的折叠单元;主动驱动过程维护每个会话的水位状态,Session controller 提供 baseline 并推送发生变化的值。 | | `ctx.sessionProjectionCache` | `core` | [`session-projection-cache`](../packages/session/session-projection-cache) | - | [`api-session-controller`](../packages/api/session-controller), [`session-query`](../packages/session-query/session-query), [`session-reference`](../packages/context/session-reference) | - | 按会话持久保存投影单元状态的检查点(节流检查点,以及轮次/结束/分离时的必选检查点),提供缓存投影视图,并加速 prepared Session 的投影恢复。 | -| `ctx.skills` | `seam` | [`skill`](../packages/skill/skill) | [`sandbox-windows-acl`](../packages/sandbox/sandbox-windows-acl), [`skill-badge`](../packages/skill/skill-badge), [`skill-filesystem`](../packages/skill/skill-filesystem), [`skill-office`](../packages/skill/skill-office) | [`tool-skill`](../packages/skill/tool-skill) | - | 合并提供方的 skill(技能)目录;tool-skill 渲染会话前缀目录,并加载完整的 skill 正文。 | +| `ctx.skills` | `seam` | [`skill`](../packages/skill/skill) | [`sandbox-windows-acl`](../packages/sandbox/sandbox-windows-acl), [`skill-badge`](../packages/experimental/skill-badge), [`skill-filesystem`](../packages/skill/skill-filesystem), [`skill-office`](../packages/skill/skill-office) | [`tool-skill`](../packages/skill/tool-skill) | - | 合并提供方的 skill(技能)目录;tool-skill 渲染会话前缀目录,并加载完整的 skill 正文。 | | `ctx.agents` | `core` | [`agent`](../packages/core/agent) | - | [`agent-loop`](../packages/core/agent-loop), [`acp`](../packages/acp/acp), [`subagent`](../packages/subagent/subagent) | - | 拥有实时 Agent 句柄、创建/恢复工厂 seam,以及进程本地的发起方传播。 | | `ctx.agentDefaultModel` | `core` | [`agent-default-model`](../packages/core/agent-default-model) | - | [`api-session-controller`](../packages/api/session-controller), [`headless`](../packages/bundle/headless) | - | Reads the default ModelSelection from volatile Config and saves selections through the profile editor. | | `ctx.agentLoop` | `bundle` | [`agent-loop`](../packages/core/agent-loop) | - | [`base`](../packages/bundle/base), [`sdk-minimal`](../packages/bundle/sdk-minimal) | - | 唯一的具体循环插件;扩展包依赖 dsh-agent 的事件和服务,而不依赖此包。 | @@ -664,9 +664,9 @@ flowchart LR | `ctx.goals` | `core` | [`goal`](../packages/goal/goal) | - | - | - | 从会话日志折叠带修订版本的目标状态,并将实时延续激活保留在进程本地。 | | `ctx.ssh` | `core` | [`ssh`](../packages/ssh/ssh) | - | [`fs-ssh`](../packages/ssh/fs-ssh), [`subprocess-ssh`](../packages/ssh/subprocess-ssh), [`sandbox-ssh`](../packages/ssh/sandbox-ssh) | - | 负责一条经过认证的 OpenSSH 连接、已安装辅助程序身份、独立程序流,以及配套远端提供方的断连清理。 | | `ctx.subprocess` | `seam` | [`subprocess`](../packages/subprocess/subprocess) | [`subprocess-local`](../packages/subprocess/subprocess-local), [`subprocess-ssh`](../packages/ssh/subprocess-ssh) | [`bash-local`](../packages/shell/bash-local), [`bash-sandbox`](../packages/shell/bash-sandbox), [`terminal-bash`](../packages/terminal/terminal-bash), [`lsp-stdio`](../packages/lsp/lsp-stdio), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code) | - | Bash 执行器、PTY shell 后端、LSP Host,以及进程外 ACP、Codex 和 Claude Code subagent 后端都通过 ctx.subprocess 执行 spawn;该服务负责进程坐标、进程树/会话生命周期、stdio 处置、终端机制和 kill 升级。 | -| `ctx.shell` | `seam` | [`shell`](../packages/shell/shell) | [`bash-local`](../packages/shell/bash-local), [`bash-sandbox`](../packages/shell/bash-sandbox), [`pwsh-local`](../packages/shell/pwsh-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex) | - | 面向模型的 shell 工具和钩子桥接消费此 seam;沙箱、远程或 PowerShell 执行器可以替换 bash-local,而无需改动这些消费方。 | +| `ctx.shell` | `seam` | [`shell`](../packages/shell/shell) | [`bash-local`](../packages/shell/bash-local), [`bash-sandbox`](../packages/shell/bash-sandbox), [`pwsh-local`](../packages/shell/pwsh-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex) | - | 面向模型的 shell 工具和钩子桥接消费此 seam;沙箱、远程或 PowerShell 执行器可以替换 bash-local,而无需改动这些消费方。 | | `ctx.shellEnv` | `core` | [`shell-env`](../packages/shell/shell-env) | - | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh) | - | 插件声明限定于 effect 作用域的 DSH_* 事实;每个 shell 工具在每次执行时收集一份可信快照,其执行器据此重建命名空间。 | -| `ctx.terminals` | `seam` | [`terminal`](../packages/terminal/terminal) | [`terminal-bash`](../packages/terminal/terminal-bash) | [`tool-terminal`](../packages/terminal/tool-terminal) | - | 注册表负责精确到 Agent 的会话身份和清理;后端负责终端机制,tool-terminal 则提供限定于所有者作用域的模型接口。 | +| `ctx.terminals` | `seam` | [`terminal`](../packages/terminal/terminal) | [`terminal-bash`](../packages/terminal/terminal-bash) | [`tool-terminal`](../packages/experimental/tool-terminal) | - | 注册表负责精确到 Agent 的会话身份和清理;后端负责终端机制,tool-terminal 则提供限定于所有者作用域的模型接口。 | | `ctx.sandbox` | `seam` | [`sandbox`](../packages/sandbox/sandbox) | [`sandbox-local`](../packages/sandbox/sandbox-local), [`sandbox-ssh`](../packages/ssh/sandbox-ssh) | [`bash-sandbox`](../packages/shell/bash-sandbox), [`terminal-bash`](../packages/terminal/terminal-bash) | - | 消费方交出即将执行 spawn 的确切 argv;与配套子进程提供方共享执行环境的后端按每次调用的策略包装该 argv,并报告强制执行情况。 | | `ctx.sandboxPolicy` | `core` | [`sandbox-policy`](../packages/sandbox/sandbox-policy) | - | [`bash-sandbox`](../packages/shell/bash-sandbox), [`fs-sandbox`](../packages/fs/fs-sandbox), [`terminal-bash`](../packages/terminal/terminal-bash) | - | 统一保存部署默认模式和工作区根目录;只有沙箱执行器和提供方读取该服务(工具层使用它同时导出的纯 `sandbox/mode` 折叠区)。两类强制执行组件都读取该服务,因此 bash 与 fs 不会限制到不同的根目录。 | | `ctx.approval` | `seam` | [`user-approval`](../packages/interaction/user-approval) | - | [`tools`](../packages/core/tools), [`tool-bash`](../packages/shell/tool-bash), [`acp`](../packages/acp/acp) | - | 一次性权限决策通过 `approval/request` waterfall(瀑布式事件)分派;回答方是监听器(即 ACP 为自身 agent 提供的桥接),没有回答方时以 `unavailable` 关闭失败。 | @@ -674,19 +674,19 @@ flowchart LR | `ctx.ptcRuntime` | `seam` | [`ptc-runtime`](../packages/ptc-runtime/ptc-runtime) | [`ptc-runtime-node`](../packages/ptc-runtime/ptc-runtime-node), [`experimental-ptc-runtime-python`](../packages/experimental/ptc-runtime-python) | [`tools`](../packages/core/tools), [`workflow-ptc`](../packages/workflow/workflow-ptc) | - | 使用 Host 提供的异步绑定运行程序;tools 负责 PTC 呈现,workflow-ptc 负责工作流编排。 | | `ctx.fs` | `seam` | [`fs`](../packages/fs/fs) | [`fs-local`](../packages/fs/fs-local), [`fs-sandbox`](../packages/fs/fs-sandbox), [`fs-ssh`](../packages/ssh/fs-ssh) | [`tool-fs`](../packages/fs/tool-fs) | [`fs-observation-policy`](../packages/fs/fs-observation-policy) | tool-fs 通过 ctx.fs 执行读取/写入/编辑;fs-sandbox 按共享沙箱模式限制变更;fs-observation-policy 通过 fs/* 事件门禁贡献基于观测状态的检查。 | | `ctx.compaction` | `seam` | [`compaction`](../packages/compaction/compaction) | [`compaction-basic`](../packages/compaction/compaction-basic) | [`compaction-basic`](../packages/compaction/compaction-basic) | - | 基础后端消费步骤后的压力事件和请求错误恢复事件;不存在面向模型的压缩工具。 | -| `ctx.subagents` | `seam` | [`subagent`](../packages/subagent/subagent) | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process), [`subagent-fork-in-process`](../packages/subagent/subagent-fork-in-process), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code), [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control), [`tool-ralph`](../packages/workflow/tool-ralph) | - | 提供方准备本地子级或执行外部任务;一个 activation 管理器持有两类生命周期。委派工具选择后端,控制工具投递本地后续消息,工作流等待 activation 结果。 | +| `ctx.subagents` | `seam` | [`subagent`](../packages/subagent/subagent) | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process), [`subagent-fork-in-process`](../packages/subagent/subagent-fork-in-process), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code), [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control), [`tool-ralph`](../packages/experimental/tool-ralph) | - | 提供方准备本地子级或执行外部任务;一个 activation 管理器持有两类生命周期。委派工具选择后端,控制工具投递本地后续消息,工作流等待 activation 结果。 | | `ctx.speechToText` | `seam` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text) | [`experimental-speech-to-text-sensevoice`](../packages/experimental/speech-to-text-sensevoice) | [`experimental-api-speech-to-text`](../packages/experimental/api-speech-to-text) | - | 路由显式选择的识别器;浏览器使用带认证的 Remote,并在提交前将转写保留在草稿中。 | | `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | - | 负责隐式 Root roster、持久 peer mailbox、共享任务 DAG 与 continuable child 生命周期;tool-agent-team 提供模型控制工具。 | | `ctx.claudeCodeMods` | `core` | [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods) | - | - | - | 加载 defineMod 插件添加的模组,从 harness 扩展点触发其钩子链,并通过其 Remote 绘制提示框上方的横幅。 | | `ctx.inspector` | `core` | `inspector` | - | - | - | 负责 Worker 托管的 CDP target,以及独立于传输的 Host 和 Client observation 与 Cordis tree query API。 | -| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-jobs`](../packages/jobs/tool-jobs), [`api-job-controller`](../packages/api/job-controller) | - | 生产方(后台 bash/pwsh 与 PTY 发送)登记正在运行的工作;声明 record 的 job 还为非消费观察者流式提供原始输出;tool-jobs 是面向模型的控制器,用于读取、列出和终止这些工作;jobs-local 是进程本地注册表。 | +| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-jobs`](../packages/jobs/tool-jobs), [`api-job-controller`](../packages/api/job-controller) | - | 生产方(后台 bash/pwsh 与 PTY 发送)登记正在运行的工作;声明 record 的 job 还为非消费观察者流式提供原始输出;tool-jobs 是面向模型的控制器,用于读取、列出和终止这些工作;jobs-local 是进程本地注册表。 | | `ctx.web` | `seam` | [`web`](../packages/web/web) | [`web-search-exa`](../packages/web/web-search-exa), [`web-search-perplexity`](../packages/web/web-search-perplexity), [`web-search-deepseek`](../packages/web/web-search-deepseek), [`web-fetch-http`](../packages/web/web-fetch-http) | [`tool-web`](../packages/web/tool-web) | - | 搜索和抓取提供方注册到同一个 ctx.web seam;tool-web 负责稳定的面向模型名称。 | | `ctx.spillStore` | `seam` | [`spill`](../packages/spill/spill) | [`spill-local`](../packages/spill/spill-local) | [`spill-policy`](../packages/spill/spill-policy) | - | 后端保存过大的工具文本,并返回面向模型的定位信息和取回提示;spill-policy 是 tools/post-execute 消费方,负责决定何时 spill。 | | `ctx.directoryPicker` | `seam` | [`host-directory-picker`](../packages/host/directory-picker) | [`host-directory-picker-native`](../packages/host/directory-picker-native), [`host-directory-picker-browse`](../packages/host/directory-picker-browse) | [`api-workspace-controller`](../packages/api/workspace-controller) | - | 带判别标记的交互能力:原生后端在 Host 显示设备上打开一个操作系统选择器,浏览后端为应用内浏览器提供列表与创建原语;双端后端通过其浏览器侧填充 ui-workspace 目录流程的 slot(不通过协议发布)。 | | `ctx.webServer` | `core` | [`host-webserver`](../packages/host/webserver) | - | [`client-connection`](../packages/client/connection), [`client-modules`](../packages/client/modules), [`client-hmr`](../packages/client/hmr) | - | 普通的 node:http 载体:具名路由注册表、索引转换 tap,以及静态 dist 回退;Web 传输插件注册自己的路由。 | | `ctx.clientModules` | `core` | [`client-modules`](../packages/client/modules) | - | [`client-hmr`](../packages/client/hmr) | - | 通过增量 `dsh.client` 扫描组合 __DSH_BOOT__ 入口图,提供插件组合包,并通知重建/图变更订阅方。 | -| `ctx.workflowEngine` | `seam` | [`workflow`](../packages/workflow/workflow) | [`workflow-ptc`](../packages/workflow/workflow-ptc) | [`tool-workflow`](../packages/workflow/tool-workflow), [`tool-ralph`](../packages/workflow/tool-ralph) | - | 每个上下文使用一个引擎,与 bash 相同,且没有具名提供方注册表;通用工作流与固定 Ralph 消费方启动运行,其中的 agent() 调用通过 ctx.subagents 扇出。 | -| `ctx.webhookRuntime` | `core` | [`webhook`](../packages/webhook/webhook) | - | [`webhook-github`](../packages/webhook/webhook-github) | - | 提供方适配器分派已认证交付;可信插件注册独立的进程本地规则,runtime 把非 null 结果转换为普通的 Workspace-backed Session,不保留交付或完成状态。 | +| `ctx.workflowEngine` | `seam` | [`workflow`](../packages/workflow/workflow) | [`workflow-ptc`](../packages/workflow/workflow-ptc) | [`tool-workflow`](../packages/workflow/tool-workflow), [`tool-ralph`](../packages/experimental/tool-ralph) | - | 每个上下文使用一个引擎,与 bash 相同,且没有具名提供方注册表;通用工作流与固定 Ralph 消费方启动运行,其中的 agent() 调用通过 ctx.subagents 扇出。 | +| `ctx.webhookRuntime` | `core` | [`webhook`](../packages/experimental/webhook) | - | [`webhook-github`](../packages/experimental/webhook-github) | - | 提供方适配器分派已认证交付;可信插件注册独立的进程本地规则,runtime 把非 null 结果转换为普通的 Workspace-backed Session,不保留交付或完成状态。 | | `ctx.lsp` | `seam` | [`lsp`](../packages/lsp/lsp) | [`lsp-stdio`](../packages/lsp/lsp-stdio) | [`tool-lsp`](../packages/lsp/tool-lsp) | - | 提供方注册与选择,加上恰好四种操作的标准化查询执行;该 seam 不提供协议逃生口,后端必须转换为标准化请求和结果。 | | `ctx.dynamicCordisRunner` | `core` | [`cordis-host-runner`](../packages/extensions/cordis-host-runner) | - | [`tool-cordis`](../packages/extensions/tool-cordis) | - | 拥有内存定义注册表、Host 半的 vm 沙箱和 request-run 往返流程;浏览器页面通过其 Remote 命名空间在线访问同一服务。 | | `ctx.cordisInspect` | `core` | [`cordis-host-runner`](../packages/extensions/cordis-host-runner) | - | [`tool-cordis`](../packages/extensions/tool-cordis) | - | 注册 Host inspect 提供方、镜像 Client 提供方 manifest,并通过动态 Cordis 传输路由 Client 查询。 | diff --git a/docs/config-catalog.md b/docs/config-catalog.md index 7e7696562e..90d8b4f2ab 100644 --- a/docs/config-catalog.md +++ b/docs/config-catalog.md @@ -1450,7 +1450,7 @@ export interface HmrConfig extends ChokidarOptions { ## `@deepseek-ai/dsh-hooks-claude-code` - `inject`: `shell` · `sessionProjections` · `workingDirectory` -- `source`: [`packages/hooks/hooks-claude-code/src/index.ts:51`](../packages/hooks/hooks-claude-code/src/index.ts) +- `source`: [`packages/experimental/hooks-claude-code/src/index.ts:51`](../packages/experimental/hooks-claude-code/src/index.ts) ```ts config-catalog /** Plugin config: where the CC hook config lives + substitution roots. */ @@ -1489,7 +1489,7 @@ export interface Config { ## `@deepseek-ai/dsh-hooks-codex` - `inject`: `shell` · `sessionProjections` · `workingDirectory` -- `source`: [`packages/hooks/hooks-codex/src/index.ts:50`](../packages/hooks/hooks-codex/src/index.ts) +- `source`: [`packages/experimental/hooks-codex/src/index.ts:50`](../packages/experimental/hooks-codex/src/index.ts) ```ts config-catalog /** Plugin config: where the Codex hooks.json lives + the model name for payloads. */ @@ -2897,7 +2897,7 @@ export interface Config { - `inject`: `sessionTitle` · `llm` · `sessions` - `refs`: [`SessionTitleLlmConfig`](../packages/session/session-title-llm/src/index.ts) -- `source`: [`packages/session/session-title-all-prompts-llm/src/index.ts:15`](../packages/session/session-title-all-prompts-llm/src/index.ts) +- `source`: [`packages/experimental/session-title-all-prompts-llm/src/index.ts:15`](../packages/experimental/session-title-all-prompts-llm/src/index.ts) ```ts config-catalog /** Required LLM policy; this plugin adds no defaults. */ @@ -3827,7 +3827,7 @@ export interface Config { ## `@deepseek-ai/dsh-tool-ralph` - `inject`: `tools` · `workflowEngine` · `subagents` · `systemPrompt` -- `source`: [`packages/workflow/tool-ralph/src/index.ts:21`](../packages/workflow/tool-ralph/src/index.ts) +- `source`: [`packages/experimental/tool-ralph/src/index.ts:21`](../packages/experimental/tool-ralph/src/index.ts) ```ts config-catalog /** Deployment policy for the fixed Ralph workflow. */ @@ -3964,7 +3964,7 @@ export interface Config { ## `@deepseek-ai/dsh-tool-terminal` - `inject`: `terminals` · `tools` · `systemPrompt` · `workingDirectory` -- `source`: [`packages/terminal/tool-terminal/src/index.ts:38`](../packages/terminal/tool-terminal/src/index.ts) +- `source`: [`packages/experimental/tool-terminal/src/index.ts:38`](../packages/experimental/tool-terminal/src/index.ts) ```ts config-catalog /** Model-facing terminal tool configuration. */ @@ -4336,7 +4336,7 @@ export interface Config { ## `@deepseek-ai/dsh-webhook-github` - `inject`: `webServer` · `webhookRuntime` · `credentials` -- `source`: [`packages/webhook/webhook-github/src/index.ts:17`](../packages/webhook/webhook-github/src/index.ts) +- `source`: [`packages/experimental/webhook-github/src/index.ts:17`](../packages/experimental/webhook-github/src/index.ts) ```ts config-catalog /** Required GitHub ingress configuration. */ @@ -4519,7 +4519,7 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co | `@deepseek-ai/dsh-session-stats` | `sessionProjections` | [`packages/session/session-stats/src/index.ts`](../packages/session/session-stats/src/index.ts) | | `@deepseek-ai/dsh-session-turn-outline` | `sessionProjections` | [`packages/session/session-turn-outline/src/index.ts`](../packages/session/session-turn-outline/src/index.ts) | | `@deepseek-ai/dsh-settings` | `configEditor` · `profileContext` | [`packages/settings/settings/src/index.ts`](../packages/settings/settings/src/index.ts) | -| `@deepseek-ai/dsh-skill-badge` | `skills` | [`packages/skill/skill-badge/src/index.ts`](../packages/skill/skill-badge/src/index.ts) | +| `@deepseek-ai/dsh-skill-badge` | `skills` | [`packages/experimental/skill-badge/src/index.ts`](../packages/experimental/skill-badge/src/index.ts) | | `@deepseek-ai/dsh-storage` | — | [`packages/storage/storage/src/index.ts`](../packages/storage/storage/src/index.ts) | | `@deepseek-ai/dsh-subprocess-local` | — | [`packages/subprocess/subprocess-local/src/index.ts`](../packages/subprocess/subprocess-local/src/index.ts) | | `@deepseek-ai/dsh-subprocess-ssh` | `ssh` | [`packages/ssh/subprocess-ssh/src/index.ts`](../packages/ssh/subprocess-ssh/src/index.ts) | @@ -4530,7 +4530,7 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co | `@deepseek-ai/dsh-tool-subagent-control` | `tools` · `subagents` | [`packages/subagent/tool-subagent-control/src/index.ts`](../packages/subagent/tool-subagent-control/src/index.ts) | | `@deepseek-ai/dsh-tool-working-directory` | `tools` · `workingDirectory` | [`packages/session/tool-working-directory/src/index.ts`](../packages/session/tool-working-directory/src/index.ts) | | `@deepseek-ai/dsh-user-questions` | — | [`packages/interaction/user-questions/src/index.ts`](../packages/interaction/user-questions/src/index.ts) | -| `@deepseek-ai/dsh-webhook` | `agents` · `agentDefaultModel` · `agentPresets` · `permissionPresets` · `sessionTitle` · `workspaceRegistry` | [`packages/webhook/webhook/src/index.ts`](../packages/webhook/webhook/src/index.ts) | +| `@deepseek-ai/dsh-webhook` | `agents` · `agentDefaultModel` · `agentPresets` · `permissionPresets` · `sessionTitle` · `workspaceRegistry` | [`packages/experimental/webhook/src/index.ts`](../packages/experimental/webhook/src/index.ts) | | `@deepseek-ai/dsh-workspace` | `storageDomain` · `sessionPersistence` | [`packages/workspace/workspace/src/index.ts`](../packages/workspace/workspace/src/index.ts) | @@ -4589,7 +4589,7 @@ Imported as libraries by other packages; a `cordis.yml` cannot load them. | `@deepseek-ai/dsh-experimental-webworker-packer` | — | [`packages/experimental/webworker-packer/src/index.ts`](../packages/experimental/webworker-packer/src/index.ts) | | `@deepseek-ai/dsh-experimental-webworker-runtime` | — | [`packages/experimental/webworker-runtime/src/index.ts`](../packages/experimental/webworker-runtime/src/index.ts) | | `@deepseek-ai/dsh-home-paths` | — | [`packages/util/home-paths/src/index.ts`](../packages/util/home-paths/src/index.ts) | -| `@deepseek-ai/dsh-hook-protocol` | — | [`packages/hooks/hook-protocol/src/index.ts`](../packages/hooks/hook-protocol/src/index.ts) | +| `@deepseek-ai/dsh-hook-protocol` | — | [`packages/experimental/hook-protocol/src/index.ts`](../packages/experimental/hook-protocol/src/index.ts) | | `@deepseek-ai/dsh-http-proxy` | — | [`packages/util/http-proxy/src/index.ts`](../packages/util/http-proxy/src/index.ts) | | `@deepseek-ai/dsh-launch-environment` | — | [`packages/util/launch-environment/src/index.ts`](../packages/util/launch-environment/src/index.ts) | | `@deepseek-ai/dsh-lazy-require` | — | [`packages/util/lazy-require/src/index.ts`](../packages/util/lazy-require/src/index.ts) | diff --git a/docs/config-catalog.zh.md b/docs/config-catalog.zh.md index f1112ec85a..d52f162e7e 100644 --- a/docs/config-catalog.zh.md +++ b/docs/config-catalog.zh.md @@ -1452,7 +1452,7 @@ export interface HmrConfig extends ChokidarOptions { ## `@deepseek-ai/dsh-hooks-claude-code` - `inject`: `shell` · `sessionProjections` · `workingDirectory` -- `source`: [`packages/hooks/hooks-claude-code/src/index.ts:51`](../packages/hooks/hooks-claude-code/src/index.ts) +- `source`: [`packages/experimental/hooks-claude-code/src/index.ts:51`](../packages/experimental/hooks-claude-code/src/index.ts) ```ts config-catalog /** Plugin config: where the CC hook config lives + substitution roots. */ @@ -1491,7 +1491,7 @@ export interface Config { ## `@deepseek-ai/dsh-hooks-codex` - `inject`: `shell` · `sessionProjections` · `workingDirectory` -- `source`: [`packages/hooks/hooks-codex/src/index.ts:50`](../packages/hooks/hooks-codex/src/index.ts) +- `source`: [`packages/experimental/hooks-codex/src/index.ts:50`](../packages/experimental/hooks-codex/src/index.ts) ```ts config-catalog /** Plugin config: where the Codex hooks.json lives + the model name for payloads. */ @@ -2899,7 +2899,7 @@ export interface Config { - `inject`: `sessionTitle` · `llm` · `sessions` - `refs`: [`SessionTitleLlmConfig`](../packages/session/session-title-llm/src/index.ts) -- `source`: [`packages/session/session-title-all-prompts-llm/src/index.ts:15`](../packages/session/session-title-all-prompts-llm/src/index.ts) +- `source`: [`packages/experimental/session-title-all-prompts-llm/src/index.ts:15`](../packages/experimental/session-title-all-prompts-llm/src/index.ts) ```ts config-catalog /** Required LLM policy; this plugin adds no defaults. */ @@ -3829,7 +3829,7 @@ export interface Config { ## `@deepseek-ai/dsh-tool-ralph` - `inject`: `tools` · `workflowEngine` · `subagents` · `systemPrompt` -- `source`: [`packages/workflow/tool-ralph/src/index.ts:21`](../packages/workflow/tool-ralph/src/index.ts) +- `source`: [`packages/experimental/tool-ralph/src/index.ts:21`](../packages/experimental/tool-ralph/src/index.ts) ```ts config-catalog /** Deployment policy for the fixed Ralph workflow. */ @@ -3966,7 +3966,7 @@ export interface Config { ## `@deepseek-ai/dsh-tool-terminal` - `inject`: `terminals` · `tools` · `systemPrompt` · `workingDirectory` -- `source`: [`packages/terminal/tool-terminal/src/index.ts:38`](../packages/terminal/tool-terminal/src/index.ts) +- `source`: [`packages/experimental/tool-terminal/src/index.ts:38`](../packages/experimental/tool-terminal/src/index.ts) ```ts config-catalog /** Model-facing terminal tool configuration. */ @@ -4338,7 +4338,7 @@ export interface Config { ## `@deepseek-ai/dsh-webhook-github` - `inject`: `webServer` · `webhookRuntime` · `credentials` -- `source`: [`packages/webhook/webhook-github/src/index.ts:17`](../packages/webhook/webhook-github/src/index.ts) +- `source`: [`packages/experimental/webhook-github/src/index.ts:17`](../packages/experimental/webhook-github/src/index.ts) ```ts config-catalog /** Required GitHub ingress configuration. */ @@ -4521,7 +4521,7 @@ export interface Config { | `@deepseek-ai/dsh-session-stats` | `sessionProjections` | [`packages/session/session-stats/src/index.ts`](../packages/session/session-stats/src/index.ts) | | `@deepseek-ai/dsh-session-turn-outline` | `sessionProjections` | [`packages/session/session-turn-outline/src/index.ts`](../packages/session/session-turn-outline/src/index.ts) | | `@deepseek-ai/dsh-settings` | `configEditor` · `profileContext` | [`packages/settings/settings/src/index.ts`](../packages/settings/settings/src/index.ts) | -| `@deepseek-ai/dsh-skill-badge` | `skills` | [`packages/skill/skill-badge/src/index.ts`](../packages/skill/skill-badge/src/index.ts) | +| `@deepseek-ai/dsh-skill-badge` | `skills` | [`packages/experimental/skill-badge/src/index.ts`](../packages/experimental/skill-badge/src/index.ts) | | `@deepseek-ai/dsh-storage` | — | [`packages/storage/storage/src/index.ts`](../packages/storage/storage/src/index.ts) | | `@deepseek-ai/dsh-subprocess-local` | — | [`packages/subprocess/subprocess-local/src/index.ts`](../packages/subprocess/subprocess-local/src/index.ts) | | `@deepseek-ai/dsh-subprocess-ssh` | `ssh` | [`packages/ssh/subprocess-ssh/src/index.ts`](../packages/ssh/subprocess-ssh/src/index.ts) | @@ -4532,7 +4532,7 @@ export interface Config { | `@deepseek-ai/dsh-tool-subagent-control` | `tools` · `subagents` | [`packages/subagent/tool-subagent-control/src/index.ts`](../packages/subagent/tool-subagent-control/src/index.ts) | | `@deepseek-ai/dsh-tool-working-directory` | `tools` · `workingDirectory` | [`packages/session/tool-working-directory/src/index.ts`](../packages/session/tool-working-directory/src/index.ts) | | `@deepseek-ai/dsh-user-questions` | — | [`packages/interaction/user-questions/src/index.ts`](../packages/interaction/user-questions/src/index.ts) | -| `@deepseek-ai/dsh-webhook` | `agents` · `agentDefaultModel` · `agentPresets` · `permissionPresets` · `sessionTitle` · `workspaceRegistry` | [`packages/webhook/webhook/src/index.ts`](../packages/webhook/webhook/src/index.ts) | +| `@deepseek-ai/dsh-webhook` | `agents` · `agentDefaultModel` · `agentPresets` · `permissionPresets` · `sessionTitle` · `workspaceRegistry` | [`packages/experimental/webhook/src/index.ts`](../packages/experimental/webhook/src/index.ts) | | `@deepseek-ai/dsh-workspace` | `storageDomain` · `sessionPersistence` | [`packages/workspace/workspace/src/index.ts`](../packages/workspace/workspace/src/index.ts) | @@ -4591,7 +4591,7 @@ export interface Config { | `@deepseek-ai/dsh-experimental-webworker-packer` | — | [`packages/experimental/webworker-packer/src/index.ts`](../packages/experimental/webworker-packer/src/index.ts) | | `@deepseek-ai/dsh-experimental-webworker-runtime` | — | [`packages/experimental/webworker-runtime/src/index.ts`](../packages/experimental/webworker-runtime/src/index.ts) | | `@deepseek-ai/dsh-home-paths` | — | [`packages/util/home-paths/src/index.ts`](../packages/util/home-paths/src/index.ts) | -| `@deepseek-ai/dsh-hook-protocol` | — | [`packages/hooks/hook-protocol/src/index.ts`](../packages/hooks/hook-protocol/src/index.ts) | +| `@deepseek-ai/dsh-hook-protocol` | — | [`packages/experimental/hook-protocol/src/index.ts`](../packages/experimental/hook-protocol/src/index.ts) | | `@deepseek-ai/dsh-http-proxy` | — | [`packages/util/http-proxy/src/index.ts`](../packages/util/http-proxy/src/index.ts) | | `@deepseek-ai/dsh-launch-environment` | — | [`packages/util/launch-environment/src/index.ts`](../packages/util/launch-environment/src/index.ts) | | `@deepseek-ai/dsh-lazy-require` | — | [`packages/util/lazy-require/src/index.ts`](../packages/util/lazy-require/src/index.ts) | diff --git a/docs/cookbook/extension-cookbook.i18n.yaml b/docs/cookbook/extension-cookbook.i18n.yaml index 1bceacde0d..e841296f69 100644 --- a/docs/cookbook/extension-cookbook.i18n.yaml +++ b/docs/cookbook/extension-cookbook.i18n.yaml @@ -21,5 +21,5 @@ en: f0a28d07c0bb4d1b zh: 840962f512cb4031 /cookbook-extension-plugin-shapes/the-feature-mechanism-map: - en: abe512b526ffbefd - zh: 6bae5440248441f3 + en: fa917d46c071fad2 + zh: 4062805237e2c847 diff --git a/docs/cookbook/extension-cookbook.md b/docs/cookbook/extension-cookbook.md index 272fc41b8f..006b6b7092 100644 --- a/docs/cookbook/extension-cookbook.md +++ b/docs/cookbook/extension-cookbook.md @@ -103,7 +103,7 @@ Every product feature maps to a listener on a documented extension point — the | Product feature | Plugin mechanism | |---|---| -| Hook system (user + project level) | listeners on `agent/created`, `agent/pre-step`, `agent/request`, `tools/pre-execute`, `tools/post-execute`, and `agent/turn-stopping`; the waterfalls return typed decisions, while `agent/turn-stopping` may steer another step; the `dsh-experimental-hooks-claude-code` / `dsh-experimental-hooks-codex` bridges map hook config files onto these extension points | +| Hook system (user + project level) | listeners on `agent/created`, `agent/pre-step`, `agent/request`, `tools/pre-execute`, `tools/post-execute`, and `agent/turn-stopping`; the waterfalls return typed decisions, while `agent/turn-stopping` may steer another step; the `dsh-hooks-claude-code` / `dsh-hooks-codex` bridges map hook config files onto these extension points | | `/goal` | `ctx.goals` owns durable state, `dsh-goal-round-driver` schedules same-session rounds through the public `Agent`, and separate command/tool producers expose human/model control | | `/loop` | on the `turn/end` session event, `followup()` the next iteration; or force-continue | | Dynamic workflow | `ctx.workflowEngine` + the PTC workflow engine + the `workflow` tool; structured in-process children enforce output with scoped prompt/tool registrations, a monotonic tool guard, final `tools/result` commit (including enclosing `run_code`), and the structured-output execution's monotonic `concludeTurn()` marker | diff --git a/docs/cookbook/extension-cookbook.zh.md b/docs/cookbook/extension-cookbook.zh.md index c2b9d75424..826510f6a5 100644 --- a/docs/cookbook/extension-cookbook.zh.md +++ b/docs/cookbook/extension-cookbook.zh.md @@ -107,7 +107,7 @@ export function apply(ctx: Context) { | 产品功能 | 插件机制 | |---|---| -| 钩子系统(用户级 + 项目级) | `agent/created`、`agent/pre-step`、`agent/request`、`tools/pre-execute`、`tools/post-execute` 和 `agent/turn-stopping` 上的监听器;waterfall 返回类型化决策,`agent/turn-stopping` 则可通过 steering(中途引导)触发下一步;`dsh-experimental-hooks-claude-code` / `dsh-experimental-hooks-codex` 桥接器将钩子配置文件映射到这些扩展点上 | +| 钩子系统(用户级 + 项目级) | `agent/created`、`agent/pre-step`、`agent/request`、`tools/pre-execute`、`tools/post-execute` 和 `agent/turn-stopping` 上的监听器;waterfall 返回类型化决策,`agent/turn-stopping` 则可通过 steering(中途引导)触发下一步;`dsh-hooks-claude-code` / `dsh-hooks-codex` 桥接器将钩子配置文件映射到这些扩展点上 | | `/goal` | `ctx.goals` 管理持久状态,`dsh-goal-round-driver` 通过公共 `Agent` 调度同会话 Round,独立的命令/工具生产方分别提供人类/模型控制 | | `/loop` | 在 `turn/end` 会话事件上 `followup()` 下一次迭代;或强制继续 | | 动态工作流 | `ctx.workflowEngine` + PTC 工作流引擎 + `workflow` 工具;结构化的进程内子任务通过作用域化的提示词/工具注册、单调工具守卫、最终 `tools/result` 提交(包括外层 `run_code`)和结构化输出执行的单调 `concludeTurn()` 标记来强制输出 | diff --git a/docs/event-producer-consumer.md b/docs/event-producer-consumer.md index 789a4e911f..a0e09be091 100644 --- a/docs/event-producer-consumer.md +++ b/docs/event-producer-consumer.md @@ -11,17 +11,17 @@ This matrix shows which packages dispatch each harness-owned event and which pac | `agent-loop/config-start-failed` | `emit` | [`packages/core/agent-loop/src/index.ts:238`](../packages/core/agent-loop/src/index.ts) | [`agent-loop`](../packages/core/agent-loop) (`events.dispatch`) | - | | `agent-preset/selected` | `emit` | [`packages/preset/agent-preset-registry/src/types.ts:69`](../packages/preset/agent-preset-registry/src/types.ts) | [`agent-preset-registry`](../packages/preset/agent-preset-registry) (`emit`) | `remotes` | | `agent/assistant-stream` | `emit` | [`packages/core/agent/src/runtime-types.ts:363`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`headless`](../packages/bundle/headless), `session-controller` | -| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:261`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `agent-team`, `browser-use-runtime`, `claude-code-mods`, [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`loader-smoke`](../packages/test-support/loader-smoke), `session-controller`, `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) | +| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:261`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `agent-team`, `browser-use-runtime`, `claude-code-mods`, [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`loader-smoke`](../packages/test-support/loader-smoke), `session-controller`, `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) | | `agent/disposed` | `emit` | [`packages/core/agent/src/runtime-types.ts:270`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`events.dispatch`) | [`agent-loop`](../packages/core/agent-loop), `claude-code-mods`, [`file-reference-local`](../packages/context/file-reference-local), [`goal-round-driver`](../packages/goal/goal-round-driver), `session-controller`, [`subagent`](../packages/subagent/subagent), `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) | | `agent/error` | `emit` | [`packages/core/agent/src/runtime-types.ts:393`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`deepseek-account`](../packages/credentials/deepseek-account), [`goal-round-driver`](../packages/goal/goal-round-driver), [`headless`](../packages/bundle/headless), `server`, `session-controller`, [`session-telemetry`](../packages/session/session-telemetry), [`subagent`](../packages/subagent/subagent) | | `agent/inbox/claimed` | `emit` | [`packages/core/agent/src/runtime-types.ts:299`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`tool-jobs`](../packages/jobs/tool-jobs), [`user-questions`](../packages/interaction/user-questions) | | `agent/inbox/discarded` | `emit` | [`packages/core/agent/src/runtime-types.ts:307`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`user-questions`](../packages/interaction/user-questions) | | `agent/inbox/inserted` | `emit` | [`packages/core/agent/src/runtime-types.ts:288`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent) | -| `agent/pre-step` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:320`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`compaction-basic`](../packages/compaction/compaction-basic), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`plan-mode`](../packages/plan/plan-mode), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), `session-controller`, [`session-reference`](../packages/context/session-reference), [`time-context`](../packages/context/time-context), [`tmux-context`](../packages/context/tmux-context), [`tool-skill`](../packages/skill/tool-skill) | -| `agent/request` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:337`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`webhook`](../packages/webhook/webhook) | +| `agent/pre-step` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:320`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`compaction-basic`](../packages/compaction/compaction-basic), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`plan-mode`](../packages/plan/plan-mode), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), `session-controller`, [`session-reference`](../packages/context/session-reference), [`time-context`](../packages/context/time-context), [`tmux-context`](../packages/context/tmux-context), [`tool-skill`](../packages/skill/tool-skill) | +| `agent/request` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:337`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`webhook`](../packages/experimental/webhook) | | `agent/request-error` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:353`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`compaction-basic`](../packages/compaction/compaction-basic), [`compaction-image-offload`](../packages/compaction/compaction-image-offload), [`llm-retry`](../packages/llm/llm-retry) | | `agent/status` | `emit` | [`packages/core/agent/src/runtime-types.ts:280`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), `agent-team`, [`compaction-basic`](../packages/compaction/compaction-basic), [`goal-round-driver`](../packages/goal/goal-round-driver), `server`, `session-controller` | -| `agent/turn-stopping` | `serial` | [`packages/core/agent/src/runtime-types.ts:381`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`serial`) | [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`workspace-changes`](../packages/deliverables/workspace-changes) | +| `agent/turn-stopping` | `serial` | [`packages/core/agent/src/runtime-types.ts:381`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`serial`) | [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`workspace-changes`](../packages/deliverables/workspace-changes) | | `api-session/activity` | `emit` | [`packages/api/session-controller/src/types.ts:611`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` | | `api-session/added` | `emit` | [`packages/api/session-controller/src/types.ts:591`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` | | `api-session/error` | `emit` | [`packages/api/session-controller/src/types.ts:618`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` | @@ -67,16 +67,16 @@ This matrix shows which packages dispatch each harness-owned event and which pac | `session/flush` | `parallel` | [`packages/core/session/src/index.ts:82`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl), [`session-telemetry`](../packages/session/session-telemetry) | | `settings/document-updated` | `emit` | [`packages/settings/settings/src/types.ts:75`](../packages/settings/settings/src/types.ts) | [`settings`](../packages/settings/settings) (`emit`) | `remotes` | | `skills/change` | `emit` | [`packages/skill/skill/src/index.ts:296`](../packages/skill/skill/src/index.ts) | [`skill`](../packages/skill/skill) (`events.dispatch`) | - | -| `subagent/end` | `emit` | [`packages/subagent/subagent/src/index.ts:166`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/hooks/hooks-claude-code), `server` | +| `subagent/end` | `emit` | [`packages/subagent/subagent/src/index.ts:166`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/experimental/hooks-claude-code), `server` | | `subagent/provider-added` | `emit` | [`packages/subagent/subagent/src/index.ts:142`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`emit`) | [`tool-subagent`](../packages/subagent/tool-subagent) | | `subagent/provider-removed` | `emit` | [`packages/subagent/subagent/src/index.ts:148`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`tool-subagent`](../packages/subagent/tool-subagent) | -| `subagent/start` | `emit` | [`packages/subagent/subagent/src/index.ts:158`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/hooks/hooks-claude-code) | +| `subagent/start` | `emit` | [`packages/subagent/subagent/src/index.ts:158`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/experimental/hooks-claude-code) | | `system-prompt/assemble` | `waterfall` | [`packages/core/system-prompt/src/index.ts:31`](../packages/core/system-prompt/src/index.ts) | [`system-prompt`](../packages/core/system-prompt) (`waterfall`) | [`agent`](../packages/core/agent), `browser-use-runtime`, [`session-reference`](../packages/context/session-reference), [`working-directory`](../packages/session/working-directory) | | `system-prompt/change` | `emit` | [`packages/core/system-prompt/src/index.ts:37`](../packages/core/system-prompt/src/index.ts) | [`system-prompt`](../packages/core/system-prompt) (`emit`) | - | | `tools/change` | `emit` | [`packages/core/tools/src/index.ts:209`](../packages/core/tools/src/index.ts) | [`agent-preset-registry`](../packages/preset/agent-preset-registry) (`emit`), [`tools`](../packages/core/tools) (`emit`) | `browser-use-runtime`, [`tool-subagent`](../packages/subagent/tool-subagent) | | `tools/execute` | `waterfall` | [`packages/core/tools/src/index.ts:165`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `browser-use-runtime`, `browser-use-stagehand-native`, `claude-code-mods`, `computer-use-cua-driver-native`, [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), `timeout-policy` | -| `tools/post-execute` | `waterfall` | [`packages/core/tools/src/index.ts:177`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `claude-code-mods`, [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`spill-policy`](../packages/spill/spill-policy), [`tool-fs-search`](../packages/fs/tool-fs-search) | -| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:154`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `auto-review`, [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`tool-jobs`](../packages/jobs/tool-jobs), [`workspace-changes`](../packages/deliverables/workspace-changes) | +| `tools/post-execute` | `waterfall` | [`packages/core/tools/src/index.ts:177`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `claude-code-mods`, [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`spill-policy`](../packages/spill/spill-policy), [`tool-fs-search`](../packages/fs/tool-fs-search) | +| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:154`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `auto-review`, [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`tool-jobs`](../packages/jobs/tool-jobs), [`workspace-changes`](../packages/deliverables/workspace-changes) | | `tools/ptc-dispatch-log` | `waterfall` | [`packages/core/tools/src/index.ts:191`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`spill-policy`](../packages/spill/spill-policy) | | `tools/result` | `emit` | [`packages/core/tools/src/index.ts:199`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`events.dispatch`) | [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`subagent`](../packages/subagent/subagent), [`tool-present`](../packages/deliverables/tool-present) | | `user-questions/request` | `waterfall` | [`packages/interaction/user-questions/src/types.ts:157`](../packages/interaction/user-questions/src/types.ts) | [`user-questions`](../packages/interaction/user-questions) (`waterfall`) | `remotes` | diff --git a/docs/event-producer-consumer.zh.md b/docs/event-producer-consumer.zh.md index f875f274d4..fc4fb598ba 100644 --- a/docs/event-producer-consumer.zh.md +++ b/docs/event-producer-consumer.zh.md @@ -13,17 +13,17 @@ | `agent-loop/config-start-failed` | `emit` | [`packages/core/agent-loop/src/index.ts:238`](../packages/core/agent-loop/src/index.ts) | [`agent-loop`](../packages/core/agent-loop) (`events.dispatch`) | - | | `agent-preset/selected` | `emit` | [`packages/preset/agent-preset-registry/src/types.ts:69`](../packages/preset/agent-preset-registry/src/types.ts) | [`agent-preset-registry`](../packages/preset/agent-preset-registry) (`emit`) | `remotes` | | `agent/assistant-stream` | `emit` | [`packages/core/agent/src/runtime-types.ts:363`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`headless`](../packages/bundle/headless), `session-controller` | -| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:261`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `agent-team`, `browser-use-runtime`, `claude-code-mods`, [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`loader-smoke`](../packages/test-support/loader-smoke), `session-controller`, `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) | +| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:261`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `agent-team`, `browser-use-runtime`, `claude-code-mods`, [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`loader-smoke`](../packages/test-support/loader-smoke), `session-controller`, `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) | | `agent/disposed` | `emit` | [`packages/core/agent/src/runtime-types.ts:270`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`events.dispatch`) | [`agent-loop`](../packages/core/agent-loop), `claude-code-mods`, [`file-reference-local`](../packages/context/file-reference-local), [`goal-round-driver`](../packages/goal/goal-round-driver), `session-controller`, [`subagent`](../packages/subagent/subagent), `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) | | `agent/error` | `emit` | [`packages/core/agent/src/runtime-types.ts:393`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`deepseek-account`](../packages/credentials/deepseek-account), [`goal-round-driver`](../packages/goal/goal-round-driver), [`headless`](../packages/bundle/headless), `server`, `session-controller`, [`session-telemetry`](../packages/session/session-telemetry), [`subagent`](../packages/subagent/subagent) | | `agent/inbox/claimed` | `emit` | [`packages/core/agent/src/runtime-types.ts:299`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`tool-jobs`](../packages/jobs/tool-jobs), [`user-questions`](../packages/interaction/user-questions) | | `agent/inbox/discarded` | `emit` | [`packages/core/agent/src/runtime-types.ts:307`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`user-questions`](../packages/interaction/user-questions) | | `agent/inbox/inserted` | `emit` | [`packages/core/agent/src/runtime-types.ts:288`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent) | -| `agent/pre-step` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:320`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`compaction-basic`](../packages/compaction/compaction-basic), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`plan-mode`](../packages/plan/plan-mode), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), `session-controller`, [`session-reference`](../packages/context/session-reference), [`time-context`](../packages/context/time-context), [`tmux-context`](../packages/context/tmux-context), [`tool-skill`](../packages/skill/tool-skill) | -| `agent/request` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:337`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`webhook`](../packages/webhook/webhook) | +| `agent/pre-step` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:320`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`compaction-basic`](../packages/compaction/compaction-basic), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`plan-mode`](../packages/plan/plan-mode), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), `session-controller`, [`session-reference`](../packages/context/session-reference), [`time-context`](../packages/context/time-context), [`tmux-context`](../packages/context/tmux-context), [`tool-skill`](../packages/skill/tool-skill) | +| `agent/request` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:337`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`agent`](../packages/core/agent), [`webhook`](../packages/experimental/webhook) | | `agent/request-error` | `waterfall` | [`packages/core/agent/src/runtime-types.ts:353`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`compaction-basic`](../packages/compaction/compaction-basic), [`compaction-image-offload`](../packages/compaction/compaction-image-offload), [`llm-retry`](../packages/llm/llm-retry) | | `agent/status` | `emit` | [`packages/core/agent/src/runtime-types.ts:280`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), `agent-team`, [`compaction-basic`](../packages/compaction/compaction-basic), [`goal-round-driver`](../packages/goal/goal-round-driver), `server`, `session-controller` | -| `agent/turn-stopping` | `serial` | [`packages/core/agent/src/runtime-types.ts:381`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`serial`) | [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`workspace-changes`](../packages/deliverables/workspace-changes) | +| `agent/turn-stopping` | `serial` | [`packages/core/agent/src/runtime-types.ts:381`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`serial`) | [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`workspace-changes`](../packages/deliverables/workspace-changes) | | `api-session/activity` | `emit` | [`packages/api/session-controller/src/types.ts:611`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` | | `api-session/added` | `emit` | [`packages/api/session-controller/src/types.ts:591`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` | | `api-session/error` | `emit` | [`packages/api/session-controller/src/types.ts:618`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` | @@ -69,16 +69,16 @@ | `session/flush` | `parallel` | [`packages/core/session/src/index.ts:82`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl), [`session-telemetry`](../packages/session/session-telemetry) | | `settings/document-updated` | `emit` | [`packages/settings/settings/src/types.ts:75`](../packages/settings/settings/src/types.ts) | [`settings`](../packages/settings/settings) (`emit`) | `remotes` | | `skills/change` | `emit` | [`packages/skill/skill/src/index.ts:296`](../packages/skill/skill/src/index.ts) | [`skill`](../packages/skill/skill) (`events.dispatch`) | - | -| `subagent/end` | `emit` | [`packages/subagent/subagent/src/index.ts:166`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/hooks/hooks-claude-code), `server` | +| `subagent/end` | `emit` | [`packages/subagent/subagent/src/index.ts:166`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/experimental/hooks-claude-code), `server` | | `subagent/provider-added` | `emit` | [`packages/subagent/subagent/src/index.ts:142`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`emit`) | [`tool-subagent`](../packages/subagent/tool-subagent) | | `subagent/provider-removed` | `emit` | [`packages/subagent/subagent/src/index.ts:148`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`tool-subagent`](../packages/subagent/tool-subagent) | -| `subagent/start` | `emit` | [`packages/subagent/subagent/src/index.ts:158`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/hooks/hooks-claude-code) | +| `subagent/start` | `emit` | [`packages/subagent/subagent/src/index.ts:158`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude-code`](../packages/experimental/hooks-claude-code) | | `system-prompt/assemble` | `waterfall` | [`packages/core/system-prompt/src/index.ts:31`](../packages/core/system-prompt/src/index.ts) | [`system-prompt`](../packages/core/system-prompt) (`waterfall`) | [`agent`](../packages/core/agent), `browser-use-runtime`, [`session-reference`](../packages/context/session-reference), [`working-directory`](../packages/session/working-directory) | | `system-prompt/change` | `emit` | [`packages/core/system-prompt/src/index.ts:37`](../packages/core/system-prompt/src/index.ts) | [`system-prompt`](../packages/core/system-prompt) (`emit`) | - | | `tools/change` | `emit` | [`packages/core/tools/src/index.ts:209`](../packages/core/tools/src/index.ts) | [`agent-preset-registry`](../packages/preset/agent-preset-registry) (`emit`), [`tools`](../packages/core/tools) (`emit`) | `browser-use-runtime`, [`tool-subagent`](../packages/subagent/tool-subagent) | | `tools/execute` | `waterfall` | [`packages/core/tools/src/index.ts:165`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `browser-use-runtime`, `browser-use-stagehand-native`, `claude-code-mods`, `computer-use-cua-driver-native`, [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), `timeout-policy` | -| `tools/post-execute` | `waterfall` | [`packages/core/tools/src/index.ts:177`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `claude-code-mods`, [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`spill-policy`](../packages/spill/spill-policy), [`tool-fs-search`](../packages/fs/tool-fs-search) | -| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:154`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `auto-review`, [`hooks-claude-code`](../packages/hooks/hooks-claude-code), [`hooks-codex`](../packages/hooks/hooks-codex), [`tool-jobs`](../packages/jobs/tool-jobs), [`workspace-changes`](../packages/deliverables/workspace-changes) | +| `tools/post-execute` | `waterfall` | [`packages/core/tools/src/index.ts:177`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `claude-code-mods`, [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder), [`spill-policy`](../packages/spill/spill-policy), [`tool-fs-search`](../packages/fs/tool-fs-search) | +| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:154`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `auto-review`, [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`tool-jobs`](../packages/jobs/tool-jobs), [`workspace-changes`](../packages/deliverables/workspace-changes) | | `tools/ptc-dispatch-log` | `waterfall` | [`packages/core/tools/src/index.ts:191`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`spill-policy`](../packages/spill/spill-policy) | | `tools/result` | `emit` | [`packages/core/tools/src/index.ts:199`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`events.dispatch`) | [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`subagent`](../packages/subagent/subagent), [`tool-present`](../packages/deliverables/tool-present) | | `user-questions/request` | `waterfall` | [`packages/interaction/user-questions/src/types.ts:157`](../packages/interaction/user-questions/src/types.ts) | [`user-questions`](../packages/interaction/user-questions) (`waterfall`) | `remotes` | diff --git a/docs/module-graph.md b/docs/module-graph.md index 8f87464298..67fad51880 100644 --- a/docs/module-graph.md +++ b/docs/module-graph.md @@ -64,7 +64,6 @@ flowchart TD end subgraph group_skill["packages/skill"] pkg_skill["skill"] - pkg_skill_badge["skill-badge"] pkg_skill_filesystem["skill-filesystem"] pkg_skill_office["skill-office"] pkg_tool_skill["tool-skill"] @@ -100,11 +99,6 @@ flowchart TD subgraph group_plan["packages/plan"] pkg_plan_mode["plan-mode"] end - subgraph group_hooks["packages/hooks"] - pkg_hook_protocol["hook-protocol"] - pkg_hooks_claude_code["hooks-claude-code"] - pkg_hooks_codex["hooks-codex"] - end subgraph group_session_query["packages/session-query"] pkg_session_log_export["session-log-export"] pkg_session_query["session-query"] @@ -274,6 +268,15 @@ flowchart TD pkg_experimental_webworker_packer["experimental-webworker-packer"] pkg_experimental_webworker_runtime["experimental-webworker-runtime"] pkg_experimental_worktree["experimental-worktree"] + pkg_hook_protocol["hook-protocol"] + pkg_hooks_claude_code["hooks-claude-code"] + pkg_hooks_codex["hooks-codex"] + pkg_session_title_all_prompts_llm["session-title-all-prompts-llm"] + pkg_skill_badge["skill-badge"] + pkg_tool_ralph["tool-ralph"] + pkg_tool_terminal["tool-terminal"] + pkg_webhook["webhook"] + pkg_webhook_github["webhook-github"] end subgraph group_extensions["packages/extensions"] pkg_client_ui_cordis["client-ui-cordis"] @@ -365,7 +368,6 @@ flowchart TD pkg_session_telemetry["session-telemetry"] pkg_session_telemetry_otel["session-telemetry-otel"] pkg_session_title["session-title"] - pkg_session_title_all_prompts_llm["session-title-all-prompts-llm"] pkg_session_title_first_prompt_llm["session-title-first-prompt-llm"] pkg_session_title_llm["session-title-llm"] pkg_session_turn_outline["session-turn-outline"] @@ -410,7 +412,6 @@ flowchart TD subgraph group_terminal["packages/terminal"] pkg_terminal["terminal"] pkg_terminal_bash["terminal-bash"] - pkg_tool_terminal["tool-terminal"] end subgraph group_test_support["packages/test-support"] pkg_agent_loop_testkit["agent-loop-testkit"] @@ -427,12 +428,7 @@ flowchart TD pkg_typert_protocol["typert-protocol"] pkg_typert_registry["typert-registry"] end - subgraph group_webhook["packages/webhook"] - pkg_webhook["webhook"] - pkg_webhook_github["webhook-github"] - end subgraph group_workflow["packages/workflow"] - pkg_tool_ralph["tool-ralph"] pkg_tool_workflow["tool-workflow"] pkg_workflow["workflow"] pkg_workflow_ptc["workflow-ptc"] @@ -472,7 +468,6 @@ flowchart TD pkg_subprocess --> pkg_http_proxy pkg_remote_mock --> pkg_typert_protocol pkg_typert_loader --> pkg_typert_registry - pkg_skill_badge --> pkg_skill pkg_skill_office --> pkg_skill pkg_web_fetch_http --> pkg_http_proxy pkg_web_fetch_http --> pkg_timeout @@ -498,6 +493,7 @@ flowchart TD pkg_experimental_webworker_runtime --> pkg_client_connection pkg_experimental_webworker_runtime --> pkg_client_modules pkg_experimental_webworker_runtime --> pkg_host_webserver + pkg_skill_badge --> pkg_skill pkg_host_frontend_static --> pkg_client_connection pkg_host_frontend_static --> pkg_host_webserver pkg_persona --> pkg_system_prompt @@ -587,8 +583,6 @@ flowchart TD pkg_skill_filesystem --> pkg_fs pkg_skill_filesystem --> pkg_home_paths pkg_skill_filesystem --> pkg_skill - pkg_hook_protocol --> pkg_session - pkg_hook_protocol --> pkg_shell pkg_api_workspace_controller --> pkg_api_gateway pkg_api_workspace_controller --> pkg_client_connection pkg_api_workspace_controller --> pkg_host_directory_picker @@ -602,6 +596,8 @@ flowchart TD pkg_experimental_api_speech_to_text --> pkg_typert_protocol pkg_experimental_speech_to_text_sensevoice --> pkg_experimental_speech_to_text pkg_experimental_speech_to_text_sensevoice --> pkg_subprocess + pkg_hook_protocol --> pkg_session + pkg_hook_protocol --> pkg_shell pkg_lsp_stdio --> pkg_brand pkg_lsp_stdio --> pkg_fs pkg_lsp_stdio --> pkg_llm @@ -854,13 +850,6 @@ flowchart TD pkg_plan_mode --> pkg_system_prompt pkg_plan_mode --> pkg_tools pkg_plan_mode --> pkg_user_questions - pkg_hooks_codex --> pkg_agent - pkg_hooks_codex --> pkg_hook_protocol - pkg_hooks_codex --> pkg_llm - pkg_hooks_codex --> pkg_session - pkg_hooks_codex --> pkg_session_projection - pkg_hooks_codex --> pkg_tools - pkg_hooks_codex --> pkg_working_directory pkg_command_compact --> pkg_commands pkg_command_compact --> pkg_compaction pkg_compaction_image_offload --> pkg_agent @@ -911,6 +900,25 @@ flowchart TD pkg_experimental_computer_use_cua_driver_native --> pkg_tools pkg_experimental_tool_worktree --> pkg_experimental_worktree pkg_experimental_tool_worktree --> pkg_tools + pkg_hooks_codex --> pkg_agent + pkg_hooks_codex --> pkg_hook_protocol + pkg_hooks_codex --> pkg_llm + pkg_hooks_codex --> pkg_session + pkg_hooks_codex --> pkg_session_projection + pkg_hooks_codex --> pkg_tools + pkg_hooks_codex --> pkg_working_directory + pkg_session_title_all_prompts_llm --> pkg_llm + pkg_session_title_all_prompts_llm --> pkg_session + pkg_session_title_all_prompts_llm --> pkg_session_title + pkg_session_title_all_prompts_llm --> pkg_session_title_llm + pkg_tool_terminal --> pkg_agent + pkg_tool_terminal --> pkg_jobs + pkg_tool_terminal --> pkg_llm + pkg_tool_terminal --> pkg_output_retention + pkg_tool_terminal --> pkg_system_prompt + pkg_tool_terminal --> pkg_terminal + pkg_tool_terminal --> pkg_tools + pkg_tool_terminal --> pkg_working_directory pkg_cordis_host_runner --> pkg_agent pkg_cordis_host_runner --> pkg_brand pkg_cordis_host_runner --> pkg_llm @@ -961,10 +969,6 @@ flowchart TD pkg_session_checkpoint_policy --> pkg_session pkg_session_checkpoint_policy --> pkg_session_persistence pkg_session_checkpoint_policy --> pkg_tools - pkg_session_title_all_prompts_llm --> pkg_llm - pkg_session_title_all_prompts_llm --> pkg_session - pkg_session_title_all_prompts_llm --> pkg_session_title - pkg_session_title_all_prompts_llm --> pkg_session_title_llm pkg_session_title_first_prompt_llm --> pkg_llm pkg_session_title_first_prompt_llm --> pkg_session pkg_session_title_first_prompt_llm --> pkg_session_title @@ -997,14 +1001,6 @@ flowchart TD pkg_ssh --> pkg_session_projection pkg_ssh --> pkg_subprocess pkg_ssh --> pkg_subprocess_local - pkg_tool_terminal --> pkg_agent - pkg_tool_terminal --> pkg_jobs - pkg_tool_terminal --> pkg_llm - pkg_tool_terminal --> pkg_output_retention - pkg_tool_terminal --> pkg_system_prompt - pkg_tool_terminal --> pkg_terminal - pkg_tool_terminal --> pkg_tools - pkg_tool_terminal --> pkg_working_directory pkg_llm_replay --> pkg_compaction pkg_llm_replay --> pkg_deepseek_llm_api_extensions pkg_llm_replay --> pkg_llm @@ -1049,6 +1045,14 @@ flowchart TD pkg_experimental_auto_review --> pkg_session pkg_experimental_auto_review --> pkg_tools pkg_experimental_auto_review --> pkg_working_directory + pkg_webhook --> pkg_agent + pkg_webhook --> pkg_agent_default_model + pkg_webhook --> pkg_agent_preset_registry + pkg_webhook --> pkg_llm + pkg_webhook --> pkg_permission_presets + pkg_webhook --> pkg_session + pkg_webhook --> pkg_session_title + pkg_webhook --> pkg_workspace pkg_tool_cordis --> pkg_agent pkg_tool_cordis --> pkg_app_boot pkg_tool_cordis --> pkg_cordis_host_runner @@ -1112,14 +1116,6 @@ flowchart TD pkg_agent_loop_testkit --> pkg_system_prompt pkg_agent_loop_testkit --> pkg_tools pkg_agent_loop_testkit --> pkg_working_directory - pkg_webhook --> pkg_agent - pkg_webhook --> pkg_agent_default_model - pkg_webhook --> pkg_agent_preset_registry - pkg_webhook --> pkg_llm - pkg_webhook --> pkg_permission_presets - pkg_webhook --> pkg_session - pkg_webhook --> pkg_session_title - pkg_webhook --> pkg_workspace pkg_subagent --> pkg_agent pkg_subagent --> pkg_agent_preset_registry pkg_subagent --> pkg_attachment @@ -1236,14 +1232,6 @@ flowchart TD pkg_tool_subagent_control --> pkg_session pkg_tool_subagent_control --> pkg_subagent pkg_tool_subagent_control --> pkg_tools - pkg_hooks_claude_code --> pkg_agent - pkg_hooks_claude_code --> pkg_hook_protocol - pkg_hooks_claude_code --> pkg_llm - pkg_hooks_claude_code --> pkg_session - pkg_hooks_claude_code --> pkg_session_projection - pkg_hooks_claude_code --> pkg_subagent - pkg_hooks_claude_code --> pkg_tools - pkg_hooks_claude_code --> pkg_working_directory pkg_api_session_controller --> pkg_agent pkg_api_session_controller --> pkg_agent_default_model pkg_api_session_controller --> pkg_agent_preset_registry @@ -1307,15 +1295,23 @@ flowchart TD pkg_experimental_agent_team --> pkg_session_persistence pkg_experimental_agent_team --> pkg_session_projection pkg_experimental_agent_team --> pkg_subagent - pkg_sdk_protocol --> pkg_llm - pkg_sdk_protocol --> pkg_session - pkg_sdk_protocol --> pkg_subagent + pkg_hooks_claude_code --> pkg_agent + pkg_hooks_claude_code --> pkg_hook_protocol + pkg_hooks_claude_code --> pkg_llm + pkg_hooks_claude_code --> pkg_session + pkg_hooks_claude_code --> pkg_session_projection + pkg_hooks_claude_code --> pkg_subagent + pkg_hooks_claude_code --> pkg_tools + pkg_hooks_claude_code --> pkg_working_directory pkg_tool_ralph --> pkg_agent pkg_tool_ralph --> pkg_llm pkg_tool_ralph --> pkg_subagent pkg_tool_ralph --> pkg_system_prompt pkg_tool_ralph --> pkg_tools pkg_tool_ralph --> pkg_workflow + pkg_sdk_protocol --> pkg_llm + pkg_sdk_protocol --> pkg_session + pkg_sdk_protocol --> pkg_subagent pkg_workflow_ptc --> pkg_agent pkg_workflow_ptc --> pkg_llm pkg_workflow_ptc --> pkg_ptc_runtime @@ -1565,7 +1561,6 @@ flowchart TD | [`subprocess`](../packages/subprocess/subprocess) | `subprocess` | [`http-proxy`](../packages/util/http-proxy) | | [`remote-mock`](../packages/test-support/remote-mock) | `test-support` | [`typert-protocol`](../packages/typert/protocol) | | [`typert-loader`](../packages/typert/loader) | `typert` | [`typert-registry`](../packages/typert/registry) | -| [`skill-badge`](../packages/skill/skill-badge) | `skill` | [`skill`](../packages/skill/skill) | | [`skill-office`](../packages/skill/skill-office) | `skill` | [`skill`](../packages/skill/skill) | | [`web-fetch-http`](../packages/web/web-fetch-http) | `web` | [`http-proxy`](../packages/util/http-proxy), [`timeout`](../packages/util/timeout), [`web`](../packages/web/web) | | [`web-search-exa`](../packages/web/web-search-exa) | `web` | [`launch-environment`](../packages/util/launch-environment), [`web`](../packages/web/web) | @@ -1578,6 +1573,7 @@ flowchart TD | [`experimental-computer-use-cua-driver-mcp`](../packages/experimental/computer-use-cua-driver-mcp) | `experimental` | [`computer-use`](../packages/computer-use/computer-use) | | [`experimental-inspector`](../packages/experimental/inspector) | `experimental` | [`client-connection`](../packages/client/connection), [`client-modules`](../packages/client/modules), [`host-webserver`](../packages/host/webserver) | | [`experimental-webworker-runtime`](../packages/experimental/webworker-runtime) | `experimental` | [`client-connection`](../packages/client/connection), [`client-modules`](../packages/client/modules), [`host-webserver`](../packages/host/webserver) | +| [`skill-badge`](../packages/experimental/skill-badge) | `experimental` | [`skill`](../packages/skill/skill) | | [`host-frontend-static`](../packages/host/frontend-static) | `host` | [`client-connection`](../packages/client/connection), [`host-webserver`](../packages/host/webserver) | | [`persona`](../packages/preset/persona) | `preset` | [`system-prompt`](../packages/core/system-prompt) | | [`sandbox`](../packages/sandbox/sandbox) | `sandbox` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session) | @@ -1611,11 +1607,11 @@ flowchart TD | [`fs-local`](../packages/fs/fs-local) | `fs` | [`fs`](../packages/fs/fs) | | [`fs-observation-policy`](../packages/fs/fs-observation-policy) | `fs` | [`fs`](../packages/fs/fs) | | [`skill-filesystem`](../packages/skill/skill-filesystem) | `skill` | [`fs`](../packages/fs/fs), [`home-paths`](../packages/util/home-paths), [`skill`](../packages/skill/skill) | -| [`hook-protocol`](../packages/hooks/hook-protocol) | `hooks` | [`session`](../packages/core/session), [`shell`](../packages/shell/shell) | | [`api-workspace-controller`](../packages/api/workspace-controller) | `api` | [`api-gateway`](../packages/api/gateway), [`client-connection`](../packages/client/connection), [`host-directory-picker`](../packages/host/directory-picker), [`session`](../packages/core/session), [`storage-domain`](../packages/storage/storage-domain), [`typert-protocol`](../packages/typert/protocol), [`workspace`](../packages/workspace/workspace) | | [`config-editor`](../packages/boot/config-editor) | `boot` | [`app-boot`](../packages/boot/app-boot), [`hmr`](../packages/boot/hmr) | | [`experimental-api-speech-to-text`](../packages/experimental/api-speech-to-text) | `experimental` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text), [`typert-protocol`](../packages/typert/protocol) | | [`experimental-speech-to-text-sensevoice`](../packages/experimental/speech-to-text-sensevoice) | `experimental` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text), [`subprocess`](../packages/subprocess/subprocess) | +| [`hook-protocol`](../packages/experimental/hook-protocol) | `experimental` | [`session`](../packages/core/session), [`shell`](../packages/shell/shell) | | [`lsp-stdio`](../packages/lsp/lsp-stdio) | `lsp` | [`brand`](../packages/util/brand), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`lsp`](../packages/lsp/lsp), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`bash-local`](../packages/shell/bash-local) | `shell` | [`shell`](../packages/shell/shell), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`pwsh-local`](../packages/shell/pwsh-local) | `shell` | [`shell`](../packages/shell/shell), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | @@ -1668,7 +1664,6 @@ flowchart TD | [`tool-web`](../packages/web/tool-web) | `web` | [`llm`](../packages/llm/llm), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`web`](../packages/web/web) | | [`tool-todo`](../packages/todo/tool-todo) | `todo` | [`agent`](../packages/core/agent), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools) | | [`plan-mode`](../packages/plan/plan-mode) | `plan` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`user-questions`](../packages/interaction/user-questions) | -| [`hooks-codex`](../packages/hooks/hooks-codex) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`command-compact`](../packages/compaction/command-compact) | `compaction` | [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction) | | [`compaction-image-offload`](../packages/compaction/compaction-image-offload) | `compaction` | [`agent`](../packages/core/agent), [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`session`](../packages/core/session) | | [`agent-instructions`](../packages/context/agent-instructions) | `context` | [`agent`](../packages/core/agent), [`fs`](../packages/fs/fs), [`home-paths`](../packages/util/home-paths), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | @@ -1680,6 +1675,9 @@ flowchart TD | [`experimental-browser-use-stagehand-native`](../packages/experimental/browser-use-stagehand-native) | `experimental` | [`agent`](../packages/core/agent), [`browser-use`](../packages/browser-use/browser-use), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`experimental-computer-use-cua-driver-native`](../packages/experimental/computer-use-cua-driver-native) | `experimental` | [`computer-use`](../packages/computer-use/computer-use), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`experimental-tool-worktree`](../packages/experimental/tool-worktree) | `experimental` | [`experimental-worktree`](../packages/experimental/worktree), [`tools`](../packages/core/tools) | +| [`hooks-codex`](../packages/experimental/hooks-codex) | `experimental` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/experimental/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | +| [`session-title-all-prompts-llm`](../packages/experimental/session-title-all-prompts-llm) | `experimental` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`session-title-llm`](../packages/session/session-title-llm) | +| [`tool-terminal`](../packages/experimental/tool-terminal) | `experimental` | [`agent`](../packages/core/agent), [`jobs`](../packages/jobs/jobs), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`system-prompt`](../packages/core/system-prompt), [`terminal`](../packages/terminal/terminal), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`cordis-host-runner`](../packages/extensions/cordis-host-runner) | `extensions` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol) | | [`message-feedback`](../packages/feedback/message-feedback) | `feedback` | [`brand`](../packages/util/brand), [`command-feedback`](../packages/feedback/command-feedback), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`typert-protocol`](../packages/typert/protocol) | | [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder) | `guard` | [`agent`](../packages/core/agent), [`tools`](../packages/core/tools) | @@ -1690,14 +1688,12 @@ flowchart TD | [`mcp-resources`](../packages/mcp/mcp-resources) | `mcp` | [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`agent-preset-registry`](../packages/preset/agent-preset-registry) | `preset` | [`agent`](../packages/core/agent), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`settings`](../packages/settings/settings), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol) | | [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy) | `session` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`tools`](../packages/core/tools) | -| [`session-title-all-prompts-llm`](../packages/session/session-title-all-prompts-llm) | `session` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`session-title-llm`](../packages/session/session-title-llm) | | [`session-title-first-prompt-llm`](../packages/session/session-title-first-prompt-llm) | `session` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`session-title-llm`](../packages/session/session-title-llm) | | [`tool-working-directory`](../packages/session/tool-working-directory) | `session` | [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`shell-env`](../packages/shell/shell-env) | `shell` | [`app-boot`](../packages/boot/app-boot), [`home-paths`](../packages/util/home-paths), [`shell`](../packages/shell/shell), [`tools`](../packages/core/tools) | | [`tool-bash-persistent`](../packages/shell/tool-bash-persistent) | `shell` | [`agent`](../packages/core/agent), [`output-retention`](../packages/util/output-retention), [`terminal`](../packages/terminal/terminal), [`timeout`](../packages/util/timeout), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`tool-pwsh-persistent`](../packages/shell/tool-pwsh-persistent) | `shell` | [`agent`](../packages/core/agent), [`output-retention`](../packages/util/output-retention), [`terminal`](../packages/terminal/terminal), [`timeout`](../packages/util/timeout), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`ssh`](../packages/ssh/ssh) | `ssh` | [`brand`](../packages/util/brand), [`fs`](../packages/fs/fs), [`fs-local`](../packages/fs/fs-local), [`fs-sandbox`](../packages/fs/fs-sandbox), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-local`](../packages/sandbox/sandbox-local), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session-projection`](../packages/session/session-projection), [`subprocess`](../packages/subprocess/subprocess), [`subprocess-local`](../packages/subprocess/subprocess-local) | -| [`tool-terminal`](../packages/terminal/tool-terminal) | `terminal` | [`agent`](../packages/core/agent), [`jobs`](../packages/jobs/jobs), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`system-prompt`](../packages/core/system-prompt), [`terminal`](../packages/terminal/terminal), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`llm-replay`](../packages/test-support/llm-replay) | `test-support` | [`compaction`](../packages/compaction/compaction), [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions), [`llm`](../packages/llm/llm), [`session`](../packages/core/session) | | [`tool-workflow`](../packages/workflow/tool-workflow) | `workflow` | [`agent`](../packages/core/agent), [`jobs`](../packages/jobs/jobs), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) | | [`plugin-package-inventory-deepseek`](../packages/llm/plugin-package-inventory-deepseek) | `llm` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions), [`session`](../packages/core/session) | @@ -1706,6 +1702,7 @@ flowchart TD | [`api-settings-controller`](../packages/api/settings-controller) | `api` | [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`credentials`](../packages/credentials/credentials), [`native-command`](../packages/util/native-command), [`session`](../packages/core/session), [`settings`](../packages/settings/settings), [`typert-protocol`](../packages/typert/protocol) | | [`web-app`](../packages/bundle/web-app) | `bundle` | [`shell-env`](../packages/shell/shell-env), [`system-prompt`](../packages/core/system-prompt) | | [`experimental-auto-review`](../packages/experimental/auto-review) | `experimental` | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | +| [`webhook`](../packages/experimental/webhook) | `experimental` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`workspace`](../packages/workspace/workspace) | | [`tool-cordis`](../packages/extensions/tool-cordis) | `extensions` | [`agent`](../packages/core/agent), [`app-boot`](../packages/boot/app-boot), [`cordis-host-runner`](../packages/extensions/cordis-host-runner), [`tools`](../packages/core/tools) | | [`host-plugin-inventory`](../packages/host/plugin-inventory) | `host` | [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`brand`](../packages/util/brand), [`typert-protocol`](../packages/typert/protocol) | | [`mcp-client`](../packages/mcp/mcp-client) | `mcp` | [`attachment`](../packages/attachment/attachment), [`llm`](../packages/llm/llm), [`mcp-resources`](../packages/mcp/mcp-resources), [`scope`](../packages/core/scope), [`subprocess`](../packages/subprocess/subprocess), [`system-prompt`](../packages/core/system-prompt), [`timeout`](../packages/util/timeout), [`tools`](../packages/core/tools) | @@ -1717,7 +1714,6 @@ flowchart TD | [`sandbox-ssh`](../packages/ssh/sandbox-ssh) | `ssh` | [`sandbox`](../packages/sandbox/sandbox), [`ssh`](../packages/ssh/ssh) | | [`subprocess-ssh`](../packages/ssh/subprocess-ssh) | `ssh` | [`ssh`](../packages/ssh/ssh), [`subprocess`](../packages/subprocess/subprocess), [`subprocess-local`](../packages/subprocess/subprocess-local) | | [`agent-loop-testkit`](../packages/test-support/agent-loop-testkit) | `test-support` | [`agent`](../packages/core/agent), [`agent-loop`](../packages/core/agent-loop), [`fs-local`](../packages/fs/fs-local), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | -| [`webhook`](../packages/webhook/webhook) | `webhook` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`workspace`](../packages/workspace/workspace) | | [`subagent`](../packages/subagent/subagent) | `subagent` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`attachment`](../packages/attachment/attachment), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`session-query`](../packages/session-query/session-query), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol), [`user-approval`](../packages/interaction/user-approval), [`util-time`](../packages/util/time), [`working-directory`](../packages/session/working-directory), [`workspace`](../packages/workspace/workspace) | | [`spill-policy`](../packages/spill/spill-policy) | `spill` | [`attachment`](../packages/attachment/attachment), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`session`](../packages/core/session), [`spill`](../packages/spill/spill), [`token-meter`](../packages/llm/token-meter), [`tools`](../packages/core/tools) | | [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | `session-query` | [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-query`](../packages/session-query/session-query) | @@ -1727,7 +1723,7 @@ flowchart TD | [`compaction-tool-result-pruner`](../packages/compaction/compaction-tool-result-pruner) | `compaction` | [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`token-meter`](../packages/llm/token-meter) | | [`experimental-browser-use-runtime`](../packages/experimental/browser-use-runtime) | `experimental` | [`agent`](../packages/core/agent), [`browser-use`](../packages/browser-use/browser-use), [`mcp-client`](../packages/mcp/mcp-client), [`scope`](../packages/core/scope), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods) | `experimental` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`storage-domain`](../packages/storage/storage-domain), [`subprocess`](../packages/subprocess/subprocess), [`token-meter`](../packages/llm/token-meter), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol), [`user-questions`](../packages/interaction/user-questions), [`working-directory`](../packages/session/working-directory) | -| [`webhook-github`](../packages/webhook/webhook-github) | `webhook` | [`credentials`](../packages/credentials/credentials), [`host-webserver`](../packages/host/webserver), [`session`](../packages/core/session), [`webhook`](../packages/webhook/webhook) | +| [`webhook-github`](../packages/experimental/webhook-github) | `experimental` | [`credentials`](../packages/credentials/credentials), [`host-webserver`](../packages/host/webserver), [`session`](../packages/core/session), [`webhook`](../packages/experimental/webhook) | | [`subagent-acp`](../packages/subagent/subagent-acp) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`subagent-claude-code`](../packages/subagent/subagent-claude-code) | `subagent` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`subagent-codex`](../packages/subagent/subagent-codex) | `subagent` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | @@ -1735,14 +1731,14 @@ flowchart TD | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process) | `subagent` | [`subagent`](../packages/subagent/subagent) | | [`tool-subagent`](../packages/subagent/tool-subagent) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`tool-subagent-control`](../packages/subagent/tool-subagent-control) | `subagent` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) | -| [`hooks-claude-code`](../packages/hooks/hooks-claude-code) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`api-session-controller`](../packages/api/session-controller) | `api` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`api-gateway`](../packages/api/gateway), [`attachment`](../packages/attachment/attachment), [`client-connection`](../packages/client/connection), [`client-file-upload`](../packages/client/file-upload), [`commands`](../packages/interaction/commands), [`credentials`](../packages/credentials/credentials), [`file-reference`](../packages/context/file-reference), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`native-command`](../packages/util/native-command), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-query`](../packages/session-query/session-query), [`session-title`](../packages/session/session-title), [`settings`](../packages/settings/settings), [`skill`](../packages/skill/skill), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol), [`typert-registry`](../packages/typert/registry), [`util-time`](../packages/util/time), [`util-values`](../packages/util/values), [`util-workspace-path`](../packages/util/workspace-path), [`working-directory`](../packages/session/working-directory), [`workspace`](../packages/workspace/workspace) | | [`headless`](../packages/bundle/headless) | `bundle` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-query`](../packages/session-query/session-query), [`subagent`](../packages/subagent/subagent) | | [`compaction-basic`](../packages/compaction/compaction-basic) | `compaction` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction), [`compaction-tool-result-pruner`](../packages/compaction/compaction-tool-result-pruner), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`token-meter`](../packages/llm/token-meter) | | [`session-reference`](../packages/context/session-reference) | `context` | [`agent`](../packages/core/agent), [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-query`](../packages/session-query/session-query), [`session-title`](../packages/session/session-title), [`spill`](../packages/spill/spill), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`typert-protocol`](../packages/typert/protocol) | | [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent) | +| [`hooks-claude-code`](../packages/experimental/hooks-claude-code) | `experimental` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/experimental/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | +| [`tool-ralph`](../packages/experimental/tool-ralph) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) | | [`sdk-protocol`](../packages/sdk/protocol) | `sdk` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent) | -| [`tool-ralph`](../packages/workflow/tool-ralph) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) | | [`workflow-ptc`](../packages/workflow/workflow-ptc) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`ptc-runtime`](../packages/ptc-runtime/ptc-runtime), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow), [`working-directory`](../packages/session/working-directory) | | [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | `experimental` | [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-slots`](../packages/client/ui-slots), [`client-ui-workspace`](../packages/client/ui-workspace), [`experimental-agent-team`](../packages/experimental/agent-team), [`session`](../packages/core/session) | | [`experimental-client-ui-claude-code-mods`](../packages/experimental/client-ui-claude-code-mods) | `experimental` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-slots`](../packages/client/ui-slots), [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods), [`session`](../packages/core/session), [`typert-protocol`](../packages/typert/protocol) | diff --git a/docs/module-graph.zh.md b/docs/module-graph.zh.md index 29e7a62e4e..a660c3285b 100644 --- a/docs/module-graph.zh.md +++ b/docs/module-graph.zh.md @@ -66,7 +66,6 @@ flowchart TD end subgraph group_skill["packages/skill"] pkg_skill["skill"] - pkg_skill_badge["skill-badge"] pkg_skill_filesystem["skill-filesystem"] pkg_skill_office["skill-office"] pkg_tool_skill["tool-skill"] @@ -102,11 +101,6 @@ flowchart TD subgraph group_plan["packages/plan"] pkg_plan_mode["plan-mode"] end - subgraph group_hooks["packages/hooks"] - pkg_hook_protocol["hook-protocol"] - pkg_hooks_claude_code["hooks-claude-code"] - pkg_hooks_codex["hooks-codex"] - end subgraph group_session_query["packages/session-query"] pkg_session_log_export["session-log-export"] pkg_session_query["session-query"] @@ -276,6 +270,15 @@ flowchart TD pkg_experimental_webworker_packer["experimental-webworker-packer"] pkg_experimental_webworker_runtime["experimental-webworker-runtime"] pkg_experimental_worktree["experimental-worktree"] + pkg_hook_protocol["hook-protocol"] + pkg_hooks_claude_code["hooks-claude-code"] + pkg_hooks_codex["hooks-codex"] + pkg_session_title_all_prompts_llm["session-title-all-prompts-llm"] + pkg_skill_badge["skill-badge"] + pkg_tool_ralph["tool-ralph"] + pkg_tool_terminal["tool-terminal"] + pkg_webhook["webhook"] + pkg_webhook_github["webhook-github"] end subgraph group_extensions["packages/extensions"] pkg_client_ui_cordis["client-ui-cordis"] @@ -367,7 +370,6 @@ flowchart TD pkg_session_telemetry["session-telemetry"] pkg_session_telemetry_otel["session-telemetry-otel"] pkg_session_title["session-title"] - pkg_session_title_all_prompts_llm["session-title-all-prompts-llm"] pkg_session_title_first_prompt_llm["session-title-first-prompt-llm"] pkg_session_title_llm["session-title-llm"] pkg_session_turn_outline["session-turn-outline"] @@ -412,7 +414,6 @@ flowchart TD subgraph group_terminal["packages/terminal"] pkg_terminal["terminal"] pkg_terminal_bash["terminal-bash"] - pkg_tool_terminal["tool-terminal"] end subgraph group_test_support["packages/test-support"] pkg_agent_loop_testkit["agent-loop-testkit"] @@ -429,12 +430,7 @@ flowchart TD pkg_typert_protocol["typert-protocol"] pkg_typert_registry["typert-registry"] end - subgraph group_webhook["packages/webhook"] - pkg_webhook["webhook"] - pkg_webhook_github["webhook-github"] - end subgraph group_workflow["packages/workflow"] - pkg_tool_ralph["tool-ralph"] pkg_tool_workflow["tool-workflow"] pkg_workflow["workflow"] pkg_workflow_ptc["workflow-ptc"] @@ -474,7 +470,6 @@ flowchart TD pkg_subprocess --> pkg_http_proxy pkg_remote_mock --> pkg_typert_protocol pkg_typert_loader --> pkg_typert_registry - pkg_skill_badge --> pkg_skill pkg_skill_office --> pkg_skill pkg_web_fetch_http --> pkg_http_proxy pkg_web_fetch_http --> pkg_timeout @@ -500,6 +495,7 @@ flowchart TD pkg_experimental_webworker_runtime --> pkg_client_connection pkg_experimental_webworker_runtime --> pkg_client_modules pkg_experimental_webworker_runtime --> pkg_host_webserver + pkg_skill_badge --> pkg_skill pkg_host_frontend_static --> pkg_client_connection pkg_host_frontend_static --> pkg_host_webserver pkg_persona --> pkg_system_prompt @@ -589,8 +585,6 @@ flowchart TD pkg_skill_filesystem --> pkg_fs pkg_skill_filesystem --> pkg_home_paths pkg_skill_filesystem --> pkg_skill - pkg_hook_protocol --> pkg_session - pkg_hook_protocol --> pkg_shell pkg_api_workspace_controller --> pkg_api_gateway pkg_api_workspace_controller --> pkg_client_connection pkg_api_workspace_controller --> pkg_host_directory_picker @@ -604,6 +598,8 @@ flowchart TD pkg_experimental_api_speech_to_text --> pkg_typert_protocol pkg_experimental_speech_to_text_sensevoice --> pkg_experimental_speech_to_text pkg_experimental_speech_to_text_sensevoice --> pkg_subprocess + pkg_hook_protocol --> pkg_session + pkg_hook_protocol --> pkg_shell pkg_lsp_stdio --> pkg_brand pkg_lsp_stdio --> pkg_fs pkg_lsp_stdio --> pkg_llm @@ -856,13 +852,6 @@ flowchart TD pkg_plan_mode --> pkg_system_prompt pkg_plan_mode --> pkg_tools pkg_plan_mode --> pkg_user_questions - pkg_hooks_codex --> pkg_agent - pkg_hooks_codex --> pkg_hook_protocol - pkg_hooks_codex --> pkg_llm - pkg_hooks_codex --> pkg_session - pkg_hooks_codex --> pkg_session_projection - pkg_hooks_codex --> pkg_tools - pkg_hooks_codex --> pkg_working_directory pkg_command_compact --> pkg_commands pkg_command_compact --> pkg_compaction pkg_compaction_image_offload --> pkg_agent @@ -913,6 +902,25 @@ flowchart TD pkg_experimental_computer_use_cua_driver_native --> pkg_tools pkg_experimental_tool_worktree --> pkg_experimental_worktree pkg_experimental_tool_worktree --> pkg_tools + pkg_hooks_codex --> pkg_agent + pkg_hooks_codex --> pkg_hook_protocol + pkg_hooks_codex --> pkg_llm + pkg_hooks_codex --> pkg_session + pkg_hooks_codex --> pkg_session_projection + pkg_hooks_codex --> pkg_tools + pkg_hooks_codex --> pkg_working_directory + pkg_session_title_all_prompts_llm --> pkg_llm + pkg_session_title_all_prompts_llm --> pkg_session + pkg_session_title_all_prompts_llm --> pkg_session_title + pkg_session_title_all_prompts_llm --> pkg_session_title_llm + pkg_tool_terminal --> pkg_agent + pkg_tool_terminal --> pkg_jobs + pkg_tool_terminal --> pkg_llm + pkg_tool_terminal --> pkg_output_retention + pkg_tool_terminal --> pkg_system_prompt + pkg_tool_terminal --> pkg_terminal + pkg_tool_terminal --> pkg_tools + pkg_tool_terminal --> pkg_working_directory pkg_cordis_host_runner --> pkg_agent pkg_cordis_host_runner --> pkg_brand pkg_cordis_host_runner --> pkg_llm @@ -963,10 +971,6 @@ flowchart TD pkg_session_checkpoint_policy --> pkg_session pkg_session_checkpoint_policy --> pkg_session_persistence pkg_session_checkpoint_policy --> pkg_tools - pkg_session_title_all_prompts_llm --> pkg_llm - pkg_session_title_all_prompts_llm --> pkg_session - pkg_session_title_all_prompts_llm --> pkg_session_title - pkg_session_title_all_prompts_llm --> pkg_session_title_llm pkg_session_title_first_prompt_llm --> pkg_llm pkg_session_title_first_prompt_llm --> pkg_session pkg_session_title_first_prompt_llm --> pkg_session_title @@ -999,14 +1003,6 @@ flowchart TD pkg_ssh --> pkg_session_projection pkg_ssh --> pkg_subprocess pkg_ssh --> pkg_subprocess_local - pkg_tool_terminal --> pkg_agent - pkg_tool_terminal --> pkg_jobs - pkg_tool_terminal --> pkg_llm - pkg_tool_terminal --> pkg_output_retention - pkg_tool_terminal --> pkg_system_prompt - pkg_tool_terminal --> pkg_terminal - pkg_tool_terminal --> pkg_tools - pkg_tool_terminal --> pkg_working_directory pkg_llm_replay --> pkg_compaction pkg_llm_replay --> pkg_deepseek_llm_api_extensions pkg_llm_replay --> pkg_llm @@ -1051,6 +1047,14 @@ flowchart TD pkg_experimental_auto_review --> pkg_session pkg_experimental_auto_review --> pkg_tools pkg_experimental_auto_review --> pkg_working_directory + pkg_webhook --> pkg_agent + pkg_webhook --> pkg_agent_default_model + pkg_webhook --> pkg_agent_preset_registry + pkg_webhook --> pkg_llm + pkg_webhook --> pkg_permission_presets + pkg_webhook --> pkg_session + pkg_webhook --> pkg_session_title + pkg_webhook --> pkg_workspace pkg_tool_cordis --> pkg_agent pkg_tool_cordis --> pkg_app_boot pkg_tool_cordis --> pkg_cordis_host_runner @@ -1114,14 +1118,6 @@ flowchart TD pkg_agent_loop_testkit --> pkg_system_prompt pkg_agent_loop_testkit --> pkg_tools pkg_agent_loop_testkit --> pkg_working_directory - pkg_webhook --> pkg_agent - pkg_webhook --> pkg_agent_default_model - pkg_webhook --> pkg_agent_preset_registry - pkg_webhook --> pkg_llm - pkg_webhook --> pkg_permission_presets - pkg_webhook --> pkg_session - pkg_webhook --> pkg_session_title - pkg_webhook --> pkg_workspace pkg_subagent --> pkg_agent pkg_subagent --> pkg_agent_preset_registry pkg_subagent --> pkg_attachment @@ -1238,14 +1234,6 @@ flowchart TD pkg_tool_subagent_control --> pkg_session pkg_tool_subagent_control --> pkg_subagent pkg_tool_subagent_control --> pkg_tools - pkg_hooks_claude_code --> pkg_agent - pkg_hooks_claude_code --> pkg_hook_protocol - pkg_hooks_claude_code --> pkg_llm - pkg_hooks_claude_code --> pkg_session - pkg_hooks_claude_code --> pkg_session_projection - pkg_hooks_claude_code --> pkg_subagent - pkg_hooks_claude_code --> pkg_tools - pkg_hooks_claude_code --> pkg_working_directory pkg_api_session_controller --> pkg_agent pkg_api_session_controller --> pkg_agent_default_model pkg_api_session_controller --> pkg_agent_preset_registry @@ -1309,15 +1297,23 @@ flowchart TD pkg_experimental_agent_team --> pkg_session_persistence pkg_experimental_agent_team --> pkg_session_projection pkg_experimental_agent_team --> pkg_subagent - pkg_sdk_protocol --> pkg_llm - pkg_sdk_protocol --> pkg_session - pkg_sdk_protocol --> pkg_subagent + pkg_hooks_claude_code --> pkg_agent + pkg_hooks_claude_code --> pkg_hook_protocol + pkg_hooks_claude_code --> pkg_llm + pkg_hooks_claude_code --> pkg_session + pkg_hooks_claude_code --> pkg_session_projection + pkg_hooks_claude_code --> pkg_subagent + pkg_hooks_claude_code --> pkg_tools + pkg_hooks_claude_code --> pkg_working_directory pkg_tool_ralph --> pkg_agent pkg_tool_ralph --> pkg_llm pkg_tool_ralph --> pkg_subagent pkg_tool_ralph --> pkg_system_prompt pkg_tool_ralph --> pkg_tools pkg_tool_ralph --> pkg_workflow + pkg_sdk_protocol --> pkg_llm + pkg_sdk_protocol --> pkg_session + pkg_sdk_protocol --> pkg_subagent pkg_workflow_ptc --> pkg_agent pkg_workflow_ptc --> pkg_llm pkg_workflow_ptc --> pkg_ptc_runtime @@ -1567,7 +1563,6 @@ flowchart TD | [`subprocess`](../packages/subprocess/subprocess) | `subprocess` | [`http-proxy`](../packages/util/http-proxy) | | [`remote-mock`](../packages/test-support/remote-mock) | `test-support` | [`typert-protocol`](../packages/typert/protocol) | | [`typert-loader`](../packages/typert/loader) | `typert` | [`typert-registry`](../packages/typert/registry) | -| [`skill-badge`](../packages/skill/skill-badge) | `skill` | [`skill`](../packages/skill/skill) | | [`skill-office`](../packages/skill/skill-office) | `skill` | [`skill`](../packages/skill/skill) | | [`web-fetch-http`](../packages/web/web-fetch-http) | `web` | [`http-proxy`](../packages/util/http-proxy), [`timeout`](../packages/util/timeout), [`web`](../packages/web/web) | | [`web-search-exa`](../packages/web/web-search-exa) | `web` | [`launch-environment`](../packages/util/launch-environment), [`web`](../packages/web/web) | @@ -1580,6 +1575,7 @@ flowchart TD | [`experimental-computer-use-cua-driver-mcp`](../packages/experimental/computer-use-cua-driver-mcp) | `experimental` | [`computer-use`](../packages/computer-use/computer-use) | | [`experimental-inspector`](../packages/experimental/inspector) | `experimental` | [`client-connection`](../packages/client/connection), [`client-modules`](../packages/client/modules), [`host-webserver`](../packages/host/webserver) | | [`experimental-webworker-runtime`](../packages/experimental/webworker-runtime) | `experimental` | [`client-connection`](../packages/client/connection), [`client-modules`](../packages/client/modules), [`host-webserver`](../packages/host/webserver) | +| [`skill-badge`](../packages/experimental/skill-badge) | `experimental` | [`skill`](../packages/skill/skill) | | [`host-frontend-static`](../packages/host/frontend-static) | `host` | [`client-connection`](../packages/client/connection), [`host-webserver`](../packages/host/webserver) | | [`persona`](../packages/preset/persona) | `preset` | [`system-prompt`](../packages/core/system-prompt) | | [`sandbox`](../packages/sandbox/sandbox) | `sandbox` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session) | @@ -1613,11 +1609,11 @@ flowchart TD | [`fs-local`](../packages/fs/fs-local) | `fs` | [`fs`](../packages/fs/fs) | | [`fs-observation-policy`](../packages/fs/fs-observation-policy) | `fs` | [`fs`](../packages/fs/fs) | | [`skill-filesystem`](../packages/skill/skill-filesystem) | `skill` | [`fs`](../packages/fs/fs), [`home-paths`](../packages/util/home-paths), [`skill`](../packages/skill/skill) | -| [`hook-protocol`](../packages/hooks/hook-protocol) | `hooks` | [`session`](../packages/core/session), [`shell`](../packages/shell/shell) | | [`api-workspace-controller`](../packages/api/workspace-controller) | `api` | [`api-gateway`](../packages/api/gateway), [`client-connection`](../packages/client/connection), [`host-directory-picker`](../packages/host/directory-picker), [`session`](../packages/core/session), [`storage-domain`](../packages/storage/storage-domain), [`typert-protocol`](../packages/typert/protocol), [`workspace`](../packages/workspace/workspace) | | [`config-editor`](../packages/boot/config-editor) | `boot` | [`app-boot`](../packages/boot/app-boot), [`hmr`](../packages/boot/hmr) | | [`experimental-api-speech-to-text`](../packages/experimental/api-speech-to-text) | `experimental` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text), [`typert-protocol`](../packages/typert/protocol) | | [`experimental-speech-to-text-sensevoice`](../packages/experimental/speech-to-text-sensevoice) | `experimental` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text), [`subprocess`](../packages/subprocess/subprocess) | +| [`hook-protocol`](../packages/experimental/hook-protocol) | `experimental` | [`session`](../packages/core/session), [`shell`](../packages/shell/shell) | | [`lsp-stdio`](../packages/lsp/lsp-stdio) | `lsp` | [`brand`](../packages/util/brand), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`lsp`](../packages/lsp/lsp), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`bash-local`](../packages/shell/bash-local) | `shell` | [`shell`](../packages/shell/shell), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`pwsh-local`](../packages/shell/pwsh-local) | `shell` | [`shell`](../packages/shell/shell), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | @@ -1670,7 +1666,6 @@ flowchart TD | [`tool-web`](../packages/web/tool-web) | `web` | [`llm`](../packages/llm/llm), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`web`](../packages/web/web) | | [`tool-todo`](../packages/todo/tool-todo) | `todo` | [`agent`](../packages/core/agent), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools) | | [`plan-mode`](../packages/plan/plan-mode) | `plan` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`user-questions`](../packages/interaction/user-questions) | -| [`hooks-codex`](../packages/hooks/hooks-codex) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`command-compact`](../packages/compaction/command-compact) | `compaction` | [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction) | | [`compaction-image-offload`](../packages/compaction/compaction-image-offload) | `compaction` | [`agent`](../packages/core/agent), [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`session`](../packages/core/session) | | [`agent-instructions`](../packages/context/agent-instructions) | `context` | [`agent`](../packages/core/agent), [`fs`](../packages/fs/fs), [`home-paths`](../packages/util/home-paths), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | @@ -1682,6 +1677,9 @@ flowchart TD | [`experimental-browser-use-stagehand-native`](../packages/experimental/browser-use-stagehand-native) | `experimental` | [`agent`](../packages/core/agent), [`browser-use`](../packages/browser-use/browser-use), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`experimental-computer-use-cua-driver-native`](../packages/experimental/computer-use-cua-driver-native) | `experimental` | [`computer-use`](../packages/computer-use/computer-use), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`experimental-tool-worktree`](../packages/experimental/tool-worktree) | `experimental` | [`experimental-worktree`](../packages/experimental/worktree), [`tools`](../packages/core/tools) | +| [`hooks-codex`](../packages/experimental/hooks-codex) | `experimental` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/experimental/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | +| [`session-title-all-prompts-llm`](../packages/experimental/session-title-all-prompts-llm) | `experimental` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`session-title-llm`](../packages/session/session-title-llm) | +| [`tool-terminal`](../packages/experimental/tool-terminal) | `experimental` | [`agent`](../packages/core/agent), [`jobs`](../packages/jobs/jobs), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`system-prompt`](../packages/core/system-prompt), [`terminal`](../packages/terminal/terminal), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`cordis-host-runner`](../packages/extensions/cordis-host-runner) | `extensions` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol) | | [`message-feedback`](../packages/feedback/message-feedback) | `feedback` | [`brand`](../packages/util/brand), [`command-feedback`](../packages/feedback/command-feedback), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`typert-protocol`](../packages/typert/protocol) | | [`repeat-tool-reminder`](../packages/guard/repeat-tool-reminder) | `guard` | [`agent`](../packages/core/agent), [`tools`](../packages/core/tools) | @@ -1692,14 +1690,12 @@ flowchart TD | [`mcp-resources`](../packages/mcp/mcp-resources) | `mcp` | [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`agent-preset-registry`](../packages/preset/agent-preset-registry) | `preset` | [`agent`](../packages/core/agent), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`settings`](../packages/settings/settings), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol) | | [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy) | `session` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`tools`](../packages/core/tools) | -| [`session-title-all-prompts-llm`](../packages/session/session-title-all-prompts-llm) | `session` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`session-title-llm`](../packages/session/session-title-llm) | | [`session-title-first-prompt-llm`](../packages/session/session-title-first-prompt-llm) | `session` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`session-title-llm`](../packages/session/session-title-llm) | | [`tool-working-directory`](../packages/session/tool-working-directory) | `session` | [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`shell-env`](../packages/shell/shell-env) | `shell` | [`app-boot`](../packages/boot/app-boot), [`home-paths`](../packages/util/home-paths), [`shell`](../packages/shell/shell), [`tools`](../packages/core/tools) | | [`tool-bash-persistent`](../packages/shell/tool-bash-persistent) | `shell` | [`agent`](../packages/core/agent), [`output-retention`](../packages/util/output-retention), [`terminal`](../packages/terminal/terminal), [`timeout`](../packages/util/timeout), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`tool-pwsh-persistent`](../packages/shell/tool-pwsh-persistent) | `shell` | [`agent`](../packages/core/agent), [`output-retention`](../packages/util/output-retention), [`terminal`](../packages/terminal/terminal), [`timeout`](../packages/util/timeout), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`ssh`](../packages/ssh/ssh) | `ssh` | [`brand`](../packages/util/brand), [`fs`](../packages/fs/fs), [`fs-local`](../packages/fs/fs-local), [`fs-sandbox`](../packages/fs/fs-sandbox), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-local`](../packages/sandbox/sandbox-local), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session-projection`](../packages/session/session-projection), [`subprocess`](../packages/subprocess/subprocess), [`subprocess-local`](../packages/subprocess/subprocess-local) | -| [`tool-terminal`](../packages/terminal/tool-terminal) | `terminal` | [`agent`](../packages/core/agent), [`jobs`](../packages/jobs/jobs), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`system-prompt`](../packages/core/system-prompt), [`terminal`](../packages/terminal/terminal), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`llm-replay`](../packages/test-support/llm-replay) | `test-support` | [`compaction`](../packages/compaction/compaction), [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions), [`llm`](../packages/llm/llm), [`session`](../packages/core/session) | | [`tool-workflow`](../packages/workflow/tool-workflow) | `workflow` | [`agent`](../packages/core/agent), [`jobs`](../packages/jobs/jobs), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) | | [`plugin-package-inventory-deepseek`](../packages/llm/plugin-package-inventory-deepseek) | `llm` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions), [`session`](../packages/core/session) | @@ -1708,6 +1704,7 @@ flowchart TD | [`api-settings-controller`](../packages/api/settings-controller) | `api` | [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`credentials`](../packages/credentials/credentials), [`native-command`](../packages/util/native-command), [`session`](../packages/core/session), [`settings`](../packages/settings/settings), [`typert-protocol`](../packages/typert/protocol) | | [`web-app`](../packages/bundle/web-app) | `bundle` | [`shell-env`](../packages/shell/shell-env), [`system-prompt`](../packages/core/system-prompt) | | [`experimental-auto-review`](../packages/experimental/auto-review) | `experimental` | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | +| [`webhook`](../packages/experimental/webhook) | `experimental` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`workspace`](../packages/workspace/workspace) | | [`tool-cordis`](../packages/extensions/tool-cordis) | `extensions` | [`agent`](../packages/core/agent), [`app-boot`](../packages/boot/app-boot), [`cordis-host-runner`](../packages/extensions/cordis-host-runner), [`tools`](../packages/core/tools) | | [`host-plugin-inventory`](../packages/host/plugin-inventory) | `host` | [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`brand`](../packages/util/brand), [`typert-protocol`](../packages/typert/protocol) | | [`mcp-client`](../packages/mcp/mcp-client) | `mcp` | [`attachment`](../packages/attachment/attachment), [`llm`](../packages/llm/llm), [`mcp-resources`](../packages/mcp/mcp-resources), [`scope`](../packages/core/scope), [`subprocess`](../packages/subprocess/subprocess), [`system-prompt`](../packages/core/system-prompt), [`timeout`](../packages/util/timeout), [`tools`](../packages/core/tools) | @@ -1719,7 +1716,6 @@ flowchart TD | [`sandbox-ssh`](../packages/ssh/sandbox-ssh) | `ssh` | [`sandbox`](../packages/sandbox/sandbox), [`ssh`](../packages/ssh/ssh) | | [`subprocess-ssh`](../packages/ssh/subprocess-ssh) | `ssh` | [`ssh`](../packages/ssh/ssh), [`subprocess`](../packages/subprocess/subprocess), [`subprocess-local`](../packages/subprocess/subprocess-local) | | [`agent-loop-testkit`](../packages/test-support/agent-loop-testkit) | `test-support` | [`agent`](../packages/core/agent), [`agent-loop`](../packages/core/agent-loop), [`fs-local`](../packages/fs/fs-local), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | -| [`webhook`](../packages/webhook/webhook) | `webhook` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`workspace`](../packages/workspace/workspace) | | [`subagent`](../packages/subagent/subagent) | `subagent` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`attachment`](../packages/attachment/attachment), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`session-query`](../packages/session-query/session-query), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol), [`user-approval`](../packages/interaction/user-approval), [`util-time`](../packages/util/time), [`working-directory`](../packages/session/working-directory), [`workspace`](../packages/workspace/workspace) | | [`spill-policy`](../packages/spill/spill-policy) | `spill` | [`attachment`](../packages/attachment/attachment), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`session`](../packages/core/session), [`spill`](../packages/spill/spill), [`token-meter`](../packages/llm/token-meter), [`tools`](../packages/core/tools) | | [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | `session-query` | [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-query`](../packages/session-query/session-query) | @@ -1729,7 +1725,7 @@ flowchart TD | [`compaction-tool-result-pruner`](../packages/compaction/compaction-tool-result-pruner) | `compaction` | [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`token-meter`](../packages/llm/token-meter) | | [`experimental-browser-use-runtime`](../packages/experimental/browser-use-runtime) | `experimental` | [`agent`](../packages/core/agent), [`browser-use`](../packages/browser-use/browser-use), [`mcp-client`](../packages/mcp/mcp-client), [`scope`](../packages/core/scope), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods) | `experimental` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`storage-domain`](../packages/storage/storage-domain), [`subprocess`](../packages/subprocess/subprocess), [`token-meter`](../packages/llm/token-meter), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol), [`user-questions`](../packages/interaction/user-questions), [`working-directory`](../packages/session/working-directory) | -| [`webhook-github`](../packages/webhook/webhook-github) | `webhook` | [`credentials`](../packages/credentials/credentials), [`host-webserver`](../packages/host/webserver), [`session`](../packages/core/session), [`webhook`](../packages/webhook/webhook) | +| [`webhook-github`](../packages/experimental/webhook-github) | `experimental` | [`credentials`](../packages/credentials/credentials), [`host-webserver`](../packages/host/webserver), [`session`](../packages/core/session), [`webhook`](../packages/experimental/webhook) | | [`subagent-acp`](../packages/subagent/subagent-acp) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`subagent-claude-code`](../packages/subagent/subagent-claude-code) | `subagent` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | | [`subagent-codex`](../packages/subagent/subagent-codex) | `subagent` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess), [`timeout`](../packages/util/timeout) | @@ -1737,14 +1733,14 @@ flowchart TD | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process) | `subagent` | [`subagent`](../packages/subagent/subagent) | | [`tool-subagent`](../packages/subagent/tool-subagent) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) | | [`tool-subagent-control`](../packages/subagent/tool-subagent-control) | `subagent` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) | -| [`hooks-claude-code`](../packages/hooks/hooks-claude-code) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | | [`api-session-controller`](../packages/api/session-controller) | `api` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`api-gateway`](../packages/api/gateway), [`attachment`](../packages/attachment/attachment), [`client-connection`](../packages/client/connection), [`client-file-upload`](../packages/client/file-upload), [`commands`](../packages/interaction/commands), [`credentials`](../packages/credentials/credentials), [`file-reference`](../packages/context/file-reference), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`native-command`](../packages/util/native-command), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-query`](../packages/session-query/session-query), [`session-title`](../packages/session/session-title), [`settings`](../packages/settings/settings), [`skill`](../packages/skill/skill), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol), [`typert-registry`](../packages/typert/registry), [`util-time`](../packages/util/time), [`util-values`](../packages/util/values), [`util-workspace-path`](../packages/util/workspace-path), [`working-directory`](../packages/session/working-directory), [`workspace`](../packages/workspace/workspace) | | [`headless`](../packages/bundle/headless) | `bundle` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-query`](../packages/session-query/session-query), [`subagent`](../packages/subagent/subagent) | | [`compaction-basic`](../packages/compaction/compaction-basic) | `compaction` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction), [`compaction-tool-result-pruner`](../packages/compaction/compaction-tool-result-pruner), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`token-meter`](../packages/llm/token-meter) | | [`session-reference`](../packages/context/session-reference) | `context` | [`agent`](../packages/core/agent), [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-query`](../packages/session-query/session-query), [`session-title`](../packages/session/session-title), [`spill`](../packages/spill/spill), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`typert-protocol`](../packages/typert/protocol) | | [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent) | +| [`hooks-claude-code`](../packages/experimental/hooks-claude-code) | `experimental` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/experimental/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) | +| [`tool-ralph`](../packages/experimental/tool-ralph) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) | | [`sdk-protocol`](../packages/sdk/protocol) | `sdk` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent) | -| [`tool-ralph`](../packages/workflow/tool-ralph) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) | | [`workflow-ptc`](../packages/workflow/workflow-ptc) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`ptc-runtime`](../packages/ptc-runtime/ptc-runtime), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow), [`working-directory`](../packages/session/working-directory) | | [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | `experimental` | [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-slots`](../packages/client/ui-slots), [`client-ui-workspace`](../packages/client/ui-workspace), [`experimental-agent-team`](../packages/experimental/agent-team), [`session`](../packages/core/session) | | [`experimental-client-ui-claude-code-mods`](../packages/experimental/client-ui-claude-code-mods) | `experimental` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-slots`](../packages/client/ui-slots), [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods), [`session`](../packages/core/session), [`typert-protocol`](../packages/typert/protocol) | diff --git a/docs/subsystems/claude-code-mods.i18n.yaml b/docs/subsystems/claude-code-mods.i18n.yaml index f85d0a1549..67dce12eae 100644 --- a/docs/subsystems/claude-code-mods.i18n.yaml +++ b/docs/subsystems/claude-code-mods.i18n.yaml @@ -6,8 +6,8 @@ en: e520df3bf44e1160 zh: 557956eaf6faf4a7 /claude-code-mods-compatibility/packaging-and-loading: - en: 169ef86a77b15f0a - zh: a3425924fc771856 + en: 75cf021ce8babaab + zh: caa20540f8bce11a /claude-code-mods-compatibility/events: en: cea776ec0063c311 zh: 6b8c8b32f2f7ede9 diff --git a/docs/subsystems/claude-code-mods.md b/docs/subsystems/claude-code-mods.md index f5d63e5183..1d125affae 100644 --- a/docs/subsystems/claude-code-mods.md +++ b/docs/subsystems/claude-code-mods.md @@ -15,7 +15,7 @@ Every way a mod behaves differently through this bridge than under Claude Code, | A hooks module may be TypeScript | A `.ts` hooks module loads only where the launcher transpiles (the source launch does; a built install does not) | DSH ships plain Node | | Mods run in-process with `$` as their only access to the host | The hooks module runs in-process with Node's globals, no access rule, and the process's full authority: `$.env` reads and writes the harness environment, `$.http.fetch` reaches any URL, `$.fs` and `$.tool.call` act as the session | No sandbox is applied to mods; mount only mods you would run as a plugin | | `import type { … } from 'claude-code'`, `declare module 'claude-code' { interface PluginState }` | The `claude-code` module name resolves only inside this repository's test setup, to the bridge's types; a mod outside it imports `@deepseek-ai/dsh-experimental-claude-code-mods` | The type names are the bridge's own | -| `settings hooks` in `hooks.json` run beside mod hooks | Not run; mount `@deepseek-ai/dsh-experimental-hooks-claude-code` for them | Different bridge | +| `settings hooks` in `hooks.json` run beside mod hooks | Not run; mount `@deepseek-ai/dsh-hooks-claude-code` for them | Different bridge | ## Events diff --git a/docs/subsystems/claude-code-mods.zh.md b/docs/subsystems/claude-code-mods.zh.md index 0bf67fd561..696b6af1e7 100644 --- a/docs/subsystems/claude-code-mods.zh.md +++ b/docs/subsystems/claude-code-mods.zh.md @@ -15,7 +15,7 @@ | 钩子模块可以是 TypeScript | `.ts` 钩子模块只在启动器转译时可加载(源码启动可以;构建后的安装不行) | DSH 交付的是纯 Node | | 模组在进程内运行,`$` 是其访问宿主的唯一途径 | 钩子模块以 Node 全局对象在进程内运行,没有访问规则,并拥有进程的全部权限:`$.env` 读写 harness 环境变量,`$.http.fetch` 可访问任意 URL,`$.fs` 与 `$.tool.call` 以会话的身份行动 | 不对模组施加沙箱;只挂载你愿意作为插件运行的模组 | | `import type { … } from 'claude-code'`、`declare module 'claude-code' { interface PluginState }` | `claude-code` 模块名只在本仓库的测试设置中解析到桥接的类型;仓库外的模组导入 `@deepseek-ai/dsh-experimental-claude-code-mods` | 类型名是桥接自己的 | -| `hooks.json` 中的设置钩子与模组钩子并行运行 | 不运行;为它们挂载 `@deepseek-ai/dsh-experimental-hooks-claude-code` | 不同的桥接 | +| `hooks.json` 中的设置钩子与模组钩子并行运行 | 不运行;为它们挂载 `@deepseek-ai/dsh-hooks-claude-code` | 不同的桥接 | ## 事件 diff --git a/docs/subsystems/session.i18n.yaml b/docs/subsystems/session.i18n.yaml index 6b344f0f33..1a778923dc 100644 --- a/docs/subsystems/session.i18n.yaml +++ b/docs/subsystems/session.i18n.yaml @@ -6,8 +6,8 @@ en: 28fb7eb8f758fdf0 zh: a36d6f03e331ad86 /sessions/sessioneventmap-the-event-vocabulary: - en: e1d52db578c6cb8a - zh: ddc12916f6e60b81 + en: 541354f6468e117d + zh: 2d7a665bad828a02 /sessions/sessioneventmap-the-event-vocabulary/the-request-header-event-request-header: en: 6eb931fcb2f4ab8d zh: d822a83384cc1fee @@ -57,8 +57,8 @@ en: 63b4059793255ca3 zh: 6bc7891c320249f4 /sessions/plugin-contributed-log-only-events: - en: a176d23454f6f6e3 - zh: 1b6af3e8fd8e9d6e + en: 0a014a755b75449f + zh: 9d59d74490a1bcb2 /sessions/plugin-contributed-log-only-events/plugin-records: en: 15102fd0b937fbf3 zh: 37ebf1d715db097c diff --git a/docs/subsystems/session.md b/docs/subsystems/session.md index bb26c8e9cd..1dd08630bb 100644 --- a/docs/subsystems/session.md +++ b/docs/subsystems/session.md @@ -8,7 +8,7 @@ Source: [`packages/core/session/src/types.ts`](../../packages/core/session/src/t ## `SessionEventMap` — the event vocabulary -The append-only event types. Merge-extensible: a plugin declares extra event types via declaration merging — e.g. the [compaction seam](compaction.md) adds `compaction/start` / `compaction/summary` / `compaction/end`, and `@deepseek-ai/dsh-experimental-hook-protocol` adds log-only `hook/invoked` / `hook/result` records for a hook bridge. Like `compaction/*`, these are NOT `SurfaceEventType`s (no `surfaceOp`). The generated [persistence log event catalog](../persistence-catalog.md) enumerates every member — core and merged — with its payload, surface badge, and declaration site. +The append-only event types. Merge-extensible: a plugin declares extra event types via declaration merging — e.g. the [compaction seam](compaction.md) adds `compaction/start` / `compaction/summary` / `compaction/end`, and `@deepseek-ai/dsh-hook-protocol` adds log-only `hook/invoked` / `hook/result` records for a hook bridge. Like `compaction/*`, these are NOT `SurfaceEventType`s (no `surfaceOp`). The generated [persistence log event catalog](../persistence-catalog.md) enumerates every member — core and merged — with its payload, surface badge, and declaration site. ```ts type-equiv /** A user-role specialization of the shared message representation. */ @@ -750,7 +750,7 @@ A plugin may declaration-merge extra `SessionEventMap` types. These are **log-on When several events in one plugin-owned family assemble into one Web Client Conversation Node, every start, update, result, resource, or interruption event in that family carries or independently derives the same stable business id. This requirement applies to correlated Node families, not to every Session event; it lets the client group each event without guessing from adjacency or scanning history. See the [Conversation subsystem](conversation.md). -The hook bridges' `hook/invoked` / `hook/result` pairs (from `@deepseek-ai/dsh-experimental-hook-protocol`) correlate by `handlerId`. `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, and `Stop` fire inside the loop's open turn, so their `hook/*` records are turn-enclosed by construction. `SessionStart` gets no `hook/*` record because it runs before turn 1; its context remains pending in the inbox until a waking delivery opens a turn. +The hook bridges' `hook/invoked` / `hook/result` pairs (from `@deepseek-ai/dsh-hook-protocol`) correlate by `handlerId`. `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, and `Stop` fire inside the loop's open turn, so their `hook/*` records are turn-enclosed by construction. `SessionStart` gets no `hook/*` record because it runs before turn 1; its context remains pending in the inbox until a waking delivery opens a turn. ### Plugin records diff --git a/docs/subsystems/session.zh.md b/docs/subsystems/session.zh.md index d63d691a10..8085cb8067 100644 --- a/docs/subsystems/session.zh.md +++ b/docs/subsystems/session.zh.md @@ -8,7 +8,7 @@ ## `SessionEventMap`:事件词汇 -仅追加的事件类型。可通过声明合并扩展:插件通过 declaration merging 声明额外的事件类型。例如[压缩(compaction) seam](compaction.zh.md) 添加了 `compaction/start` / `compaction/summary` / `compaction/end`,`@deepseek-ai/dsh-experimental-hook-protocol` 为钩子桥接添加了仅记录日志的 `hook/invoked` / `hook/result` 记录。与 `compaction/*` 一样,这些都不是 `SurfaceEventType`(没有 `surfaceOp`)。生成的[持久化日志事件目录](../persistence-catalog.zh.md)列举了所有成员(核心与合并扩展的),包含其 payload、surface 标记与声明位置。 +仅追加的事件类型。可通过声明合并扩展:插件通过 declaration merging 声明额外的事件类型。例如[压缩(compaction) seam](compaction.zh.md) 添加了 `compaction/start` / `compaction/summary` / `compaction/end`,`@deepseek-ai/dsh-hook-protocol` 为钩子桥接添加了仅记录日志的 `hook/invoked` / `hook/result` 记录。与 `compaction/*` 一样,这些都不是 `SurfaceEventType`(没有 `surfaceOp`)。生成的[持久化日志事件目录](../persistence-catalog.zh.md)列举了所有成员(核心与合并扩展的),包含其 payload、surface 标记与声明位置。 ```ts type-equiv /** A user-role specialization of the shared message representation. */ @@ -754,7 +754,7 @@ interface TurnEndReasonMap { 如果同一个插件事件族中的多条事件要组装成一个 Web Client Conversation Node,该事件族中的每条 start、update、result、resource 或 interruption 事件都必须携带或独立推导出同一个稳定业务 id。此要求只约束需要关联的 Node 事件族,并不要求每条 Session 事件都有业务 id;Client 因此无须根据相邻关系猜测归属,也无须扫描历史。参见 [Conversation 子系统](conversation.zh.md)。 -钩子桥接层的 `hook/invoked` / `hook/result` 对(来自 `@deepseek-ai/dsh-experimental-hook-protocol`)通过 `handlerId` 关联。`UserPromptSubmit`、`PreToolUse`、`PostToolUse` 与 `Stop` 在 loop 已打开的轮次内触发,因此其 `hook/*` 记录天然位于轮次之内。`SessionStart` 不生成 `hook/*` 记录,因为它在轮次 1 之前运行;其上下文会在 inbox 中保持待处理,直到唤醒交付打开一个轮次。 +钩子桥接层的 `hook/invoked` / `hook/result` 对(来自 `@deepseek-ai/dsh-hook-protocol`)通过 `handlerId` 关联。`UserPromptSubmit`、`PreToolUse`、`PostToolUse` 与 `Stop` 在 loop 已打开的轮次内触发,因此其 `hook/*` 记录天然位于轮次之内。`SessionStart` 不生成 `hook/*` 记录,因为它在轮次 1 之前运行;其上下文会在 inbox 中保持待处理,直到唤醒交付打开一个轮次。 ### 插件记录 diff --git a/docs/subsystems/skills.i18n.yaml b/docs/subsystems/skills.i18n.yaml index c65da46c7a..c4fbc992b6 100644 --- a/docs/subsystems/skills.i18n.yaml +++ b/docs/subsystems/skills.i18n.yaml @@ -3,14 +3,14 @@ # After editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/skills.md /skills: - en: 8e9b47984ad1b59e - zh: 2dbe82fe2ef13618 + en: ad77015352a17ed6 + zh: 5c84933161845393 /skills/provider-registry: en: abe338b6c6d1ebd1 zh: c604db2de10a23c4 /skills/local-discovery-priority: - en: 13233cb0f2d37f66 - zh: d13b16ae7a444649 + en: accf8ad4c73c41ad + zh: 141294fe8dab8ecf /skills/skill-identity: en: 61295a9cf1c51588 zh: 1c4c1582688d2310 diff --git a/docs/subsystems/skills.md b/docs/subsystems/skills.md index 31fdd4fcee..3bfdbff402 100644 --- a/docs/subsystems/skills.md +++ b/docs/subsystems/skills.md @@ -2,7 +2,7 @@ English | [中文](skills.zh.md) -The [skill capability family](../../packages/skill) includes the Service Definition ([dsh-skill](../../packages/skill/skill), `ctx.skills`), the local Service Provider ([dsh-skill-filesystem](../../packages/skill/skill-filesystem)), optional packaged providers ([dsh-experimental-skill-badge](../../packages/experimental/skill-badge), [dsh-skill-office](../../packages/skill/skill-office), and the Windows ACL diagnosis provider in [dsh-sandbox-windows-acl](../../packages/sandbox/sandbox-windows-acl)), and the Consumer ([dsh-tool-skill](../../packages/skill/tool-skill)). The registry merges provider catalogs across its host and per-scope layers; providers contribute local or packaged skills; the Consumer owns the initial and replacement catalogs plus the model-facing `skill` tool. Skills are optional instructions, not session events, so their vocabulary lives here rather than in [core.md](core.md). +The [skill capability family](../../packages/skill) includes the Service Definition ([dsh-skill](../../packages/skill/skill), `ctx.skills`), the local Service Provider ([dsh-skill-filesystem](../../packages/skill/skill-filesystem)), optional packaged providers ([dsh-skill-badge](../../packages/experimental/skill-badge), [dsh-skill-office](../../packages/skill/skill-office), and the Windows ACL diagnosis provider in [dsh-sandbox-windows-acl](../../packages/sandbox/sandbox-windows-acl)), and the Consumer ([dsh-tool-skill](../../packages/skill/tool-skill)). The registry merges provider catalogs across its host and per-scope layers; providers contribute local or packaged skills; the Consumer owns the initial and replacement catalogs plus the model-facing `skill` tool. Skills are optional instructions, not session events, so their vocabulary lives here rather than in [core.md](core.md). Source: [`packages/skill/skill/src/index.ts`](../../packages/skill/skill/src/index.ts), [`packages/skill/skill-filesystem/src/index.ts`](../../packages/skill/skill-filesystem/src/index.ts), [`packages/experimental/skill-badge/src/index.ts`](../../packages/experimental/skill-badge/src/index.ts), [`packages/skill/skill-office/src/index.ts`](../../packages/skill/skill-office/src/index.ts), [`packages/sandbox/sandbox-windows-acl/src/acl-skill.ts`](../../packages/sandbox/sandbox-windows-acl/src/acl-skill.ts), and [`packages/skill/tool-skill/src/index.ts`](../../packages/skill/tool-skill/src/index.ts). @@ -76,7 +76,7 @@ The shipped local provider scans roots in rank order: The project root is the nearest ancestor containing `.git`; without one, the current cwd is used. When `ctx.fs` is available, the git-root walk probes `.git` through the filesystem service so remote or sandboxed workspaces do not fall back to the host filesystem boundary. The user DSH root skips its `.system` child. The local provider does not synthesize built-in system skills; deployments supply packaged skills through configured bundled roots or dedicated providers. -`dsh-experimental-skill-badge` registers one immutable `bundled` candidate at `BUNDLED_SKILL_RANK` and exposes its packaged asset directory through `resourceBase`. The shipped CLI declares the plugin disabled, so enabling its composition row is an explicit opt-in. +`dsh-skill-badge` registers one immutable `bundled` candidate at `BUNDLED_SKILL_RANK` and exposes its packaged asset directory through `resourceBase`. The shipped CLI declares the plugin disabled, so enabling its composition row is an explicit opt-in. Chokidar watches existing roots for direct bundle/flat-entry additions and removals plus direct skill-entry changes. A missing root is followed one absent path segment at a time from its nearest existing ancestor until Chokidar can attach. Resource files below a bundle are not catalog changes. Model-facing `write` and `edit` observations synchronously invalidate the provider when their target is catalog-relevant, while the host watcher covers IDE, Git, shell, and external-process mutations. Watcher failures make the current observation incomplete without hiding readable candidates from direct loads; project-scoped watchers use a configured bounded LRU. diff --git a/docs/subsystems/skills.zh.md b/docs/subsystems/skills.zh.md index 07634870c1..d93f8416fb 100644 --- a/docs/subsystems/skills.zh.md +++ b/docs/subsystems/skills.zh.md @@ -2,7 +2,7 @@ [English](skills.md) | 中文 -[skill(技能)能力族](../../packages/skill) 包含 Service Definition([dsh-skill](../../packages/skill/skill),`ctx.skills`)、本地 Service Provider([dsh-skill-filesystem](../../packages/skill/skill-filesystem))、可选的随包提供方([dsh-experimental-skill-badge](../../packages/experimental/skill-badge)、[dsh-skill-office](../../packages/skill/skill-office) 及 [dsh-sandbox-windows-acl](../../packages/sandbox/sandbox-windows-acl) 中的 Windows ACL 诊断提供方)和 Consumer([dsh-tool-skill](../../packages/skill/tool-skill))。注册表在其宿主层与各 scope 层之间合并各提供方的目录;提供方贡献本地或随包 skill;Consumer 拥有初始目录和替换目录,以及面向模型的 `skill` 工具。skill 是可选的指令而非会话事件,因此其词汇定义在此处而非 [core.md](core.zh.md)。 +[skill(技能)能力族](../../packages/skill) 包含 Service Definition([dsh-skill](../../packages/skill/skill),`ctx.skills`)、本地 Service Provider([dsh-skill-filesystem](../../packages/skill/skill-filesystem))、可选的随包提供方([dsh-skill-badge](../../packages/experimental/skill-badge)、[dsh-skill-office](../../packages/skill/skill-office) 及 [dsh-sandbox-windows-acl](../../packages/sandbox/sandbox-windows-acl) 中的 Windows ACL 诊断提供方)和 Consumer([dsh-tool-skill](../../packages/skill/tool-skill))。注册表在其宿主层与各 scope 层之间合并各提供方的目录;提供方贡献本地或随包 skill;Consumer 拥有初始目录和替换目录,以及面向模型的 `skill` 工具。skill 是可选的指令而非会话事件,因此其词汇定义在此处而非 [core.md](core.zh.md)。 源码:[`packages/skill/skill/src/index.ts`](../../packages/skill/skill/src/index.ts)、[`packages/skill/skill-filesystem/src/index.ts`](../../packages/skill/skill-filesystem/src/index.ts)、[`packages/experimental/skill-badge/src/index.ts`](../../packages/experimental/skill-badge/src/index.ts)、[`packages/skill/skill-office/src/index.ts`](../../packages/skill/skill-office/src/index.ts)、[`packages/sandbox/sandbox-windows-acl/src/acl-skill.ts`](../../packages/sandbox/sandbox-windows-acl/src/acl-skill.ts) 与 [`packages/skill/tool-skill/src/index.ts`](../../packages/skill/tool-skill/src/index.ts)。 @@ -76,7 +76,7 @@ interface SkillProviderControl { 项目根目录为包含 `.git` 的最近祖先目录;找不到时使用当前 cwd。当 `ctx.fs` 可用时,git-root 向上查找通过文件系统服务探测 `.git`,使远程或沙箱工作区不会回退到宿主文件系统边界。用户 DSH 根目录会跳过其 `.system` 子目录。本地提供方不会合成内置系统 skill;部署方通过已配置的 bundled 根目录或专用提供方提供随包 skill。 -`dsh-experimental-skill-badge` 在 `BUNDLED_SKILL_RANK` 注册一个不可变的 `bundled` 候选项,并通过 `resourceBase` 公开其随包资产目录。交付的 CLI(命令行界面)将该插件声明为禁用,因此启用其组合配置行即为显式选择加入。 +`dsh-skill-badge` 在 `BUNDLED_SKILL_RANK` 注册一个不可变的 `bundled` 候选项,并通过 `resourceBase` 公开其随包资产目录。交付的 CLI(命令行界面)将该插件声明为禁用,因此启用其组合配置行即为显式选择加入。 Chokidar 会监视现有根目录中直属 bundle 和平铺条目的添加与移除,以及直属 skill 条目的变更。缺失的根目录会从最近的现有祖先开始,逐个跟踪缺失路径段,直至 Chokidar 可以附加。bundle 下的资源文件变更不属于目录变更。面向模型的 `write` 和 `edit` 观测会在目标路径与目录相关时同步使提供方目录失效,而宿主 watcher 覆盖 IDE、Git、shell 和外部进程产生的变更。watcher 失败会使当前观测不完整,但不会在直接加载时隐藏可读候选项;项目作用域 watcher 使用按配置设限的 LRU。 diff --git a/docs/subsystems/webhook.i18n.yaml b/docs/subsystems/webhook.i18n.yaml index fadaacdfe9..bb5cff569f 100644 --- a/docs/subsystems/webhook.i18n.yaml +++ b/docs/subsystems/webhook.i18n.yaml @@ -15,5 +15,5 @@ en: 2ccdbc45140f9c41 zh: af509a7fb0f84e18 /webhook-runtime/github-adapter: - en: 4f99db873df49da3 - zh: 7bb93fd67b1e6e2d + en: ddb0522ef321a8c5 + zh: 6f08a99848facaf3 diff --git a/docs/subsystems/webhook.md b/docs/subsystems/webhook.md index 97c5959d75..8bc71ab121 100644 --- a/docs/subsystems/webhook.md +++ b/docs/subsystems/webhook.md @@ -32,7 +32,7 @@ Failed attachment disposes the new Agent before a prompt exists. A failure betwe ## GitHub adapter -`@deepseek-ai/dsh-experimental-webhook-github` registers an exact route on an injected WebServer, resolves its credential reference for each request, verifies the untouched `application/json` body before parsing, and returns `202` immediately after in-memory dispatch. Its normalized event guarantees a signed lossless-JSON object; rules validate the event-specific fields they consume. +`@deepseek-ai/dsh-webhook-github` registers an exact route on an injected WebServer, resolves its credential reference for each request, verifies the untouched `application/json` body before parsing, and returns `202` immediately after in-memory dispatch. Its normalized event guarantees a signed lossless-JSON object; rules validate the event-specific fields they consume. The [GitHub review guide](../user/guide/github-review.md) mounts this route on an isolated second WebServer so exposing webhook ingress does not expose the browser API. diff --git a/docs/subsystems/webhook.zh.md b/docs/subsystems/webhook.zh.md index 0f427302fe..4d0e108f72 100644 --- a/docs/subsystems/webhook.zh.md +++ b/docs/subsystems/webhook.zh.md @@ -32,7 +32,7 @@ follow-up 是普通持久 user-role 消息,使用 `source.kind: "webhook"`, ## GitHub 适配器 -`@deepseek-ai/dsh-experimental-webhook-github` 在注入的 WebServer 上注册精确路由,为每次请求解析凭据引用,在解析前验证未改动的 `application/json` body,并在内存分发后立即返回 `202`。它的规范化事件保证为已签名的无损 JSON 对象;规则负责验证自己消费的事件特定字段。 +`@deepseek-ai/dsh-webhook-github` 在注入的 WebServer 上注册精确路由,为每次请求解析凭据引用,在解析前验证未改动的 `application/json` body,并在内存分发后立即返回 `202`。它的规范化事件保证为已签名的无损 JSON 对象;规则负责验证自己消费的事件特定字段。 [GitHub 评审指南](../user/guide/github-review.zh.md)把该路由挂载在隔离的第二个 WebServer 上,因此暴露 webhook 入口不会暴露浏览器 API。 diff --git a/docs/subsystems/workflow.i18n.yaml b/docs/subsystems/workflow.i18n.yaml index 1a1fba991f..f3b906de0d 100644 --- a/docs/subsystems/workflow.i18n.yaml +++ b/docs/subsystems/workflow.i18n.yaml @@ -3,8 +3,8 @@ # After editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/workflow.md /workflow: - en: 5b0844dea8f31ba6 - zh: 7422bb6b5d87bad7 + en: 4b264eb88e5cedfb + zh: 78585763a79cd1c9 /workflow/the-start-request: en: 6c8755833293a36c zh: a0f061387fe0d3a6 diff --git a/docs/subsystems/workflow.md b/docs/subsystems/workflow.md index b436a50556..5b51dc1ff1 100644 --- a/docs/subsystems/workflow.md +++ b/docs/subsystems/workflow.md @@ -4,7 +4,7 @@ English | [中文](workflow.zh.md) The workflow seam lets an agent run a model-written orchestration SCRIPT that starts subagents. Like [subagent](subagent.md) it is **one optional capability**, not part of the agent loop, so its types and operations live here rather than in [core.md](core.md). Like bash, it permits ONE engine implementation per context to provide `ctx.workflowEngine`; there is no named-provider registry (a second engine replaces the first through plugin configuration rather than running beside it). -Service Definition: [dsh-workflow](../../packages/workflow/workflow) (`ctx.workflowEngine` and the vocabulary below). [dsh-workflow-ptc](../../packages/workflow/workflow-ptc) executes the VM and helpers through the shared Node PTC process runtime under the calling Session's file policy. The consumers are [dsh-tool-workflow](../../packages/workflow/tool-workflow) and the opt-in [dsh-experimental-tool-ralph](../../packages/experimental/tool-ralph). [Workflow sandbox reuse](../../.agents/notes/implemented/architecture/2026-09-13-workflow-ptc-sandbox-reuse.md) owns execution choices; the [dynamic-workflows reference](../../packages/workflow/workflow/README.md) owns script semantics. +Service Definition: [dsh-workflow](../../packages/workflow/workflow) (`ctx.workflowEngine` and the vocabulary below). [dsh-workflow-ptc](../../packages/workflow/workflow-ptc) executes the VM and helpers through the shared Node PTC process runtime under the calling Session's file policy. The consumers are [dsh-tool-workflow](../../packages/workflow/tool-workflow) and the opt-in [dsh-tool-ralph](../../packages/experimental/tool-ralph). [Workflow sandbox reuse](../../.agents/notes/implemented/architecture/2026-09-13-workflow-ptc-sandbox-reuse.md) owns execution choices; the [dynamic-workflows reference](../../packages/workflow/workflow/README.md) owns script semantics. Sources: browser-safe vocabulary in [`packages/workflow/workflow/src/types.ts`](../../packages/workflow/workflow/src/types.ts), Host request and live-run handles in [`runtime-types.ts`](../../packages/workflow/workflow/src/runtime-types.ts). diff --git a/docs/subsystems/workflow.zh.md b/docs/subsystems/workflow.zh.md index 25d4729691..1514fa31d6 100644 --- a/docs/subsystems/workflow.zh.md +++ b/docs/subsystems/workflow.zh.md @@ -4,7 +4,7 @@ 工作流 seam 允许 agent(智能体)运行由模型编写、会启动 subagent 的编排脚本。与 [subagent](subagent.zh.md) 一样,它是**一项可选能力**,不属于 agent loop,因此其类型和操作记录在此处,而非 [core.md](core.zh.md)。与 bash 一样,每个上下文只允许一个引擎实现提供 `ctx.workflowEngine`;没有命名提供方注册表(第二个引擎通过插件配置替换第一个,而不与它同时运行)。 -Service Definition:[dsh-workflow](../../packages/workflow/workflow)(`ctx.workflowEngine` 和下文词汇)。[dsh-workflow-ptc](../../packages/workflow/workflow-ptc)通过共享 Node PTC 进程运行时按调用 Session 的文件策略执行 VM 与辅助函数。消费方为 [dsh-tool-workflow](../../packages/workflow/tool-workflow) 和需显式启用的 [dsh-experimental-tool-ralph](../../packages/experimental/tool-ralph)。[工作流沙箱复用](../../.agents/notes/implemented/architecture/2026-09-13-workflow-ptc-sandbox-reuse.zh.md)负责执行选择;[动态工作流参考](../../packages/workflow/workflow/README.zh.md)负责脚本语义。 +Service Definition:[dsh-workflow](../../packages/workflow/workflow)(`ctx.workflowEngine` 和下文词汇)。[dsh-workflow-ptc](../../packages/workflow/workflow-ptc)通过共享 Node PTC 进程运行时按调用 Session 的文件策略执行 VM 与辅助函数。消费方为 [dsh-tool-workflow](../../packages/workflow/tool-workflow) 和需显式启用的 [dsh-tool-ralph](../../packages/experimental/tool-ralph)。[工作流沙箱复用](../../.agents/notes/implemented/architecture/2026-09-13-workflow-ptc-sandbox-reuse.zh.md)负责执行选择;[动态工作流参考](../../packages/workflow/workflow/README.zh.md)负责脚本语义。 源码:浏览器安全词汇位于 [`packages/workflow/workflow/src/types.ts`](../../packages/workflow/workflow/src/types.ts),Host 请求与活跃运行句柄位于 [`runtime-types.ts`](../../packages/workflow/workflow/src/runtime-types.ts)。 diff --git a/docs/tool-catalog.i18n.yaml b/docs/tool-catalog.i18n.yaml index ee55bee5ca..e430311c4d 100644 --- a/docs/tool-catalog.i18n.yaml +++ b/docs/tool-catalog.i18n.yaml @@ -136,28 +136,28 @@ zh: c6ce31ff2c195520 /tool-schema-catalog/deepseek-ai-dsh-tool-fs-search/grep: en: 6e1f7da62cc9a35b - zh: ee7f3081887f8067 + zh: 594817b0befeea86 /tool-schema-catalog/deepseek-ai-dsh-tool-terminal: en: 77501c1b592b6a88 zh: 77501c1b592b6a88 /tool-schema-catalog/deepseek-ai-dsh-tool-terminal/terminal-close: - en: 6d6e428c866ac6c1 - zh: 8033539fcdcb6e7b + en: 4da73ab1c95aadc6 + zh: 998471bc4f5af00a /tool-schema-catalog/deepseek-ai-dsh-tool-terminal/terminal-list: - en: ae7d5bce32142aa5 - zh: e956a650a5bf294b + en: 4cde2b1d38f93e04 + zh: 2c93f43d54ec9da2 /tool-schema-catalog/deepseek-ai-dsh-tool-terminal/terminal-open: - en: c542bd7f7e872441 - zh: 14731de81780b518 + en: 7051c20587ae426d + zh: 39a6aad70d643fbc /tool-schema-catalog/deepseek-ai-dsh-tool-terminal/terminal-read: - en: 6a7491d2436e4404 - zh: 772ff408ec0a67e3 + en: 833b47cca9b00b9d + zh: 24b3db5b48f0446a /tool-schema-catalog/deepseek-ai-dsh-tool-terminal/terminal-send: - en: e24ca8735dd59adb - zh: 24f7140a0aed0968 + en: 60a8805611533884 + zh: 50e4ac6e7f7b9b0a /tool-schema-catalog/deepseek-ai-dsh-tool-terminal/terminal-signal: - en: 36a7f502acf00049 - zh: 00b4567b534eb7b2 + en: 0191964f5be70426 + zh: 501c2769633a2a0b /tool-schema-catalog/deepseek-ai-dsh-tool-goal: en: 74fff3741e7c13de zh: 74fff3741e7c13de @@ -190,13 +190,13 @@ zh: 32982123b1f0e5bc /tool-schema-catalog/deepseek-ai-dsh-tool-lsp/lsp: en: 877f1dc0f69e2038 - zh: 2fa570020f87919c + zh: 5dda8001fb614315 /tool-schema-catalog/deepseek-ai-dsh-tool-ralph: en: 45bd083870e2c92d zh: 45bd083870e2c92d /tool-schema-catalog/deepseek-ai-dsh-tool-ralph/ralph: - en: a14c562ee26ddfd8 - zh: caa6d1acf95a8199 + en: e97552156225cf10 + zh: 9ea32b8485e950ec /tool-schema-catalog/deepseek-ai-dsh-tool-skill: en: 927a5ac0974b7642 zh: 927a5ac0974b7642 diff --git a/docs/tool-catalog.md b/docs/tool-catalog.md index 8090050b50..5230b22ff6 100644 --- a/docs/tool-catalog.md +++ b/docs/tool-catalog.md @@ -30,11 +30,11 @@ This table connects model-visible tool names to the plugin package and service s | `@deepseek-ai/dsh-tool-str-replace-editor` | `str_replace_editor` | `ctx.tools`, `ctx.fs` | `tool/call`, `fs/observed after view presence/absence, edit absence, or successful mutation`, `tool/result` | - | Standalone view/create/unique literal replace/line insert tool over the filesystem seam; it composes with any shell or terminal API. | | `@deepseek-ai/dsh-tool-fs` | `edit`, `read`, `read_image`, `write` | `ctx.workingDirectory`, `ctx.tools`, `ctx.fs`, `ctx.systemPrompt`, `ctx.attachments (image-tool registration)`, `ctx.llm + an image-capable route (image-tool execution)` | `tool/call`, `fs/write-intent or fs/edit-intent for mutations`, `fs/observed after read presence/absence or successful file operation`, `durable attachment (read_image)`, `tool/result` | - | The read-before-write/edit policy is added by `@deepseek-ai/dsh-fs-observation-policy` (an `fs/*` event-gate plugin, no schema change); a deployment that loads these tools is expected to also load it. The image tool is not registered without `ctx.attachments`; its schema is route-independent, and execution refuses unless the exact routed model declares image input. | | `@deepseek-ai/dsh-tool-fs-search` | `glob`, `grep` | `ctx.workingDirectory`, `ctx.tools`, `ctx.subprocess`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | glob and grep are unconditional discovery tools that spawn the packaged ripgrep binary (`@vscode/ripgrep`) through ctx.subprocess as ordinary foreground calls (never background jobs) — no host `rg` install and no shell layer. The catalog uses `sampleOverCapGlobResults: true`; deployments must choose that behavior explicitly. Capped results save the complete formatted list through the optional ctx.spillStore backend; returned locators are follow-up-readable/searchable when the backend exposes local paths in co-located deployments. | -| `@deepseek-ai/dsh-experimental-tool-terminal` | `terminal_close`, `terminal_list`, `terminal_open`, `terminal_read`, `terminal_send`, `terminal_signal` | `ctx.workingDirectory`, `ctx.tools`, `ctx.terminals`, `ctx.systemPrompt`, `ctx.jobs at call time for run_in_background` | `tool/call`, `tool/result` | - | The six terminal tools are opt-in and complement one-shot shell/filesystem tools. `terminal_send(run_in_background: true)` registers with `ctx.jobs`; TUI, named key sequences, BEL, resize, auto-start, and cross-agent sharing are absent from the schema. | +| `@deepseek-ai/dsh-tool-terminal` | `terminal_close`, `terminal_list`, `terminal_open`, `terminal_read`, `terminal_send`, `terminal_signal` | `ctx.workingDirectory`, `ctx.tools`, `ctx.terminals`, `ctx.systemPrompt`, `ctx.jobs at call time for run_in_background` | `tool/call`, `tool/result` | - | The six terminal tools are opt-in and complement one-shot shell/filesystem tools. `terminal_send(run_in_background: true)` registers with `ctx.jobs`; TUI, named key sequences, BEL, resize, auto-start, and cross-agent sharing are absent from the schema. | | `@deepseek-ai/dsh-tool-goal` | `create_goal`, `get_goal`, `update_goal` | `ctx.tools`, `ctx.agents`, `ctx.goals`, `ctx.systemPrompt`, `a calling Agent in an authorized open turn` | `tool/call`, `goal/change for mutations`, `tool/result` | - | create, edit, pause, and resume require direct-human root authority; complete and blocked also accept the exact current goal round. The default blocked lower bound is three admitted rounds. | | `@deepseek-ai/dsh-tool-schedule` | `schedule_create`, `schedule_delete`, `schedule_list`, `schedule_update` | `ctx.tools`, `ctx.schedule` | `tool/call`, `Schedule storage domain create, update, or delete`, `tool/result` | - | A preset or Agent scope mounts this package; the preset decides which agents receive the four management tools. Each call acts on the calling Agent's Session. Accepts after_seconds, explicit absolute at, bounded fixed-rate every_seconds, daily and weekly local times in an explicit IANA zone, and cron as a five-field expression. Management uses the Host storage domain; due messages resume the original Session. | | `@deepseek-ai/dsh-tool-lsp` | `lsp` | `ctx.workingDirectory`, `ctx.tools`, `ctx.lsp`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | The lsp tool keeps provider selection and language-server subprocesses behind ctx.lsp, so its model-visible schema stays stable across providers. Requires a registered provider (e.g. `@deepseek-ai/dsh-lsp-stdio`) at runtime; without one, a query returns the structured `LSP_UNAVAILABLE` error rather than changing the schema. | -| `@deepseek-ai/dsh-experimental-tool-ralph` | `ralph` | `ctx.tools`, `ctx.workflowEngine`, `ctx.subagents`, `ctx.systemPrompt`, `a calling Agent (exec.agent parents every fresh round)` | `tool/call`, `tool/result`, `workflow and child session events during execution` | - | A fixed foreground workflow starts one fresh structured child per round; the model selects only the immutable objective and an optional round cap. | +| `@deepseek-ai/dsh-tool-ralph` | `ralph` | `ctx.tools`, `ctx.workflowEngine`, `ctx.subagents`, `ctx.systemPrompt`, `a calling Agent (exec.agent parents every fresh round)` | `tool/call`, `tool/result`, `workflow and child session events during execution` | - | A fixed foreground workflow starts one fresh structured child per round; the model selects only the immutable objective and an optional round cap. | | `@deepseek-ai/dsh-tool-skill` | `skill` | `ctx.workingDirectory`, `ctx.tools`, `ctx.agents`, `ctx.skills` | `tool/call`, `tool/result`, `user/message replacement catalogs via agent.inject()` | - | - | | `@deepseek-ai/dsh-tool-session-query` | `session_event_read`, `session_event_search`, `session_event_trace`, `session_search`, `session_trace` | `ctx.tools`, `ctx.systemPrompt`, `ctx.sessionQuery`, `a calling Agent for workspace authority` | `tool/call`, `tool/result` | - | The five read-only tools hide provider cursors and authorize every result from the immutable calling agent session. The package is opt-in; compositions that need enforced deadlines or bounded inline output also mount the generic timeout or spill policies. | | `@deepseek-ai/dsh-tool-subagent` | `list_subagent_models`, `subagent` | `ctx.tools`, `ctx.subagents`, `ctx.systemPrompt`, `ctx.llm for model discovery and selected-route validation` | `tool/call`, `tool/result`, `child session events through the chosen provider` | `subagent`, `subagent_fork` | The registered delegation name is the load-time `toolName` config (default `subagent`); the default schema above has model selection off, while the discovery schema is shown as the fixed companion available in an enabled Session. Web presets sample the Plugins preference for each new top-level Session and preserve that decision for its child Sessions; `subagent_fork` remains fixed-route. Each instance selects its backend through `provider` and reads model-selection settings through `modelSelectionSettings`. Every delegation returns a child id promptly; local children accept follow-ups, while external backends report their single execution automatically. | @@ -1120,9 +1120,9 @@ Source: [`packages/fs/tool-fs-search/src/index.ts`](../packages/fs/tool-fs-searc glob and grep are unconditional discovery tools that spawn the packaged ripgrep binary (`@vscode/ripgrep`) through ctx.subprocess as ordinary foreground calls (never background jobs) — no host `rg` install and no shell layer. The catalog uses `sampleOverCapGlobResults: true`; deployments must choose that behavior explicitly. Capped results save the complete formatted list through the optional ctx.spillStore backend; returned locators are follow-up-readable/searchable when the backend exposes local paths in co-located deployments. - + -## `@deepseek-ai/dsh-experimental-tool-terminal` +## `@deepseek-ai/dsh-tool-terminal` ### `terminal_close` @@ -1720,9 +1720,9 @@ Source: [`packages/lsp/tool-lsp/src/index.ts`](../packages/lsp/tool-lsp/src/inde The lsp tool keeps provider selection and language-server subprocesses behind ctx.lsp, so its model-visible schema stays stable across providers. Requires a registered provider (e.g. `@deepseek-ai/dsh-lsp-stdio`) at runtime; without one, a query returns the structured `LSP_UNAVAILABLE` error rather than changing the schema. - + -## `@deepseek-ai/dsh-experimental-tool-ralph` +## `@deepseek-ai/dsh-tool-ralph` ### `ralph` diff --git a/docs/tool-catalog.zh.md b/docs/tool-catalog.zh.md index 68f846b459..c29125e2a6 100644 --- a/docs/tool-catalog.zh.md +++ b/docs/tool-catalog.zh.md @@ -34,11 +34,11 @@ | `@deepseek-ai/dsh-tool-str-replace-editor` | `str_replace_editor` | `ctx.tools`、`ctx.fs` | `tool/call`、`fs/observed after view presence/absence, edit absence, or successful mutation`、`tool/result` | - | 基于文件系统 seam 的独立查看/创建/唯一字面量替换/按行插入工具;可与任何 shell 或终端接口组合。 | | `@deepseek-ai/dsh-tool-fs` | `edit`、`read`、`read_image`、`write` | `ctx.workingDirectory`、`ctx.tools`、`ctx.fs`、`ctx.systemPrompt`、`ctx.attachments (image-tool registration)`、`ctx.llm + an image-capable route (image-tool execution)` | `tool/call`、`fs/write-intent or fs/edit-intent for mutations`、`fs/observed after read presence/absence or successful file operation`、`durable attachment (read_image)`、`tool/result` | - | 先读后写/编辑策略由 `@deepseek-ai/dsh-fs-observation-policy` 添加;它是一个 `fs/*` 事件门禁插件,不会改变 schema。加载这些工具的部署按预期也应加载该插件。没有 `ctx.attachments` 时图片工具不会注册;其 schema 与路由无关,执行时除非确切路由的模型声明图片输入,否则拒绝。 | | `@deepseek-ai/dsh-tool-fs-search` | `glob`、`grep` | `ctx.workingDirectory`、`ctx.tools`、`ctx.subprocess`、`ctx.systemPrompt` | `tool/call`、`tool/result` | - | glob 和 grep 是无条件可用的发现工具,通过 ctx.subprocess spawn 随包提供的 ripgrep 二进制文件(`@vscode/ripgrep`),并作为普通前台调用运行,绝不作为后台任务;无需在宿主机安装 `rg`,也不经过 shell 层。本目录使用 `sampleOverCapGlobResults: true`;部署必须显式选择该行为。结果超过上限时,会通过可选的 ctx.spillStore 后端保存完整的格式化列表;在共置部署中,如果后端公开本地路径,返回的定位信息可供后续读取/搜索。 | -| `@deepseek-ai/dsh-experimental-tool-terminal` | `terminal_close`、`terminal_list`、`terminal_open`、`terminal_read`、`terminal_send`、`terminal_signal` | `ctx.workingDirectory`、`ctx.tools`、`ctx.terminals`、`ctx.systemPrompt`、`ctx.jobs at call time for run_in_background` | `tool/call`、`tool/result` | - | 这 6 个终端工具需要选择启用,用于补充一次性 bash/文件系统工具。`terminal_send(run_in_background: true)` 会注册到 `ctx.jobs`;schema 不包含 TUI、具名按键序列、BEL、调整尺寸、自动启动和跨 agent 共享。 | +| `@deepseek-ai/dsh-tool-terminal` | `terminal_close`、`terminal_list`、`terminal_open`、`terminal_read`、`terminal_send`、`terminal_signal` | `ctx.workingDirectory`、`ctx.tools`、`ctx.terminals`、`ctx.systemPrompt`、`ctx.jobs at call time for run_in_background` | `tool/call`、`tool/result` | - | 这 6 个终端工具需要选择启用,用于补充一次性 bash/文件系统工具。`terminal_send(run_in_background: true)` 会注册到 `ctx.jobs`;schema 不包含 TUI、具名按键序列、BEL、调整尺寸、自动启动和跨 agent 共享。 | | `@deepseek-ai/dsh-tool-goal` | `create_goal`、`get_goal`、`update_goal` | `ctx.tools`、`ctx.agents`、`ctx.goals`、`ctx.systemPrompt`、`a calling Agent in an authorized open turn` | `tool/call`、`goal/change for mutations`、`tool/result` | - | create、edit、pause 和 resume 要求直接来自人类的根权限;complete 和 blocked 也接受确切的当前 Goal Round。blocked 的默认下限是 3 个获准的 Round。 | | `@deepseek-ai/dsh-tool-schedule` | `schedule_create`、`schedule_delete`、`schedule_list`、`schedule_update` | `ctx.tools`、`ctx.schedule` | `tool/call`、Schedule storage domain 创建、更新或删除、`tool/result` | - | preset 或 Agent scope 挂载本包;由 preset 决定哪些 agent 获得这四个管理工具。每次调用都作用于调用方 Agent 的 Session。接受 after_seconds、显式绝对 at、有界固定速率 every_seconds、带显式 IANA 时区的每日与每周本地时间,以及作为五字段表达式的 cron。管理使用宿主 storage domain;到期消息会恢复原 Session。 | | `@deepseek-ai/dsh-tool-lsp` | `lsp` | `ctx.workingDirectory`、`ctx.tools`、`ctx.lsp`、`ctx.systemPrompt` | `tool/call`、`tool/result` | - | lsp 工具将提供方选择和语言服务器子进程置于 ctx.lsp 之后,因此其模型可见 schema 在更换提供方时保持稳定。运行时要求已注册提供方,例如 `@deepseek-ai/dsh-lsp-stdio`;如果没有提供方,查询会返回结构化 `LSP_UNAVAILABLE` 错误,而不会改变 schema。 | -| `@deepseek-ai/dsh-experimental-tool-ralph` | `ralph` | `ctx.tools`、`ctx.workflowEngine`、`ctx.subagents`、`ctx.systemPrompt`、`a calling Agent (exec.agent parents every fresh round)` | `tool/call`、`tool/result`、`workflow and child session events during execution` | - | 固定的前台工作流会在每个 Round 启动一个全新的结构化子级;模型只能选择不可变目标和可选的 Round 上限。 | +| `@deepseek-ai/dsh-tool-ralph` | `ralph` | `ctx.tools`、`ctx.workflowEngine`、`ctx.subagents`、`ctx.systemPrompt`、`a calling Agent (exec.agent parents every fresh round)` | `tool/call`、`tool/result`、`workflow and child session events during execution` | - | 固定的前台工作流会在每个 Round 启动一个全新的结构化子级;模型只能选择不可变目标和可选的 Round 上限。 | | `@deepseek-ai/dsh-tool-skill` | `skill` | `ctx.workingDirectory`、`ctx.tools`、`ctx.agents`、`ctx.skills` | `tool/call`、`tool/result`、`user/message replacement catalogs via agent.inject()` | - | - | | `@deepseek-ai/dsh-tool-session-query` | `session_event_read`、`session_event_search`、`session_event_trace`、`session_search`、`session_trace` | `ctx.tools`、`ctx.systemPrompt`、`ctx.sessionQuery`、`a calling Agent for workspace authority` | `tool/call`、`tool/result` | - | 这 5 个只读工具会隐藏提供方游标,并根据不可变的调用 agent 会话为每个结果授权。该包需要选择启用;需要强制截止时间或限制行内输出的组合还会挂载通用超时或 spill 策略。 | | `@deepseek-ai/dsh-tool-subagent` | `list_subagent_models`、`subagent` | `ctx.tools`、`ctx.subagents`、`ctx.systemPrompt`、`用于模型发现和所选路由校验的 ctx.llm` | `tool/call`、`tool/result`、`child session events through the chosen provider` | `subagent`、`subagent_fork` | 注册的委派工具名称取决于加载时 `toolName` 配置(默认为 `subagent`);上述默认 schema 关闭模型选择,而发现 schema 则展示为已启用 Session 中可用的固定配套工具。Web preset 会在每个新顶层 Session 创建时读取插件页偏好,并为其子 Session 保留该决定;`subagent_fork` 始终使用固定路由。每个实例通过 `provider` 选择后端,通过 `modelSelectionSettings` 读取模型选择设置。每次委派都会立即返回子代理 id;本地子代理接受后续消息,外部后端自动汇报单次执行结果。 | @@ -1128,7 +1128,7 @@ glob 和 grep 是无条件可用的发现工具,通过 ctx.subprocess spawn -## `@deepseek-ai/dsh-experimental-tool-terminal` +## `@deepseek-ai/dsh-tool-terminal` ### `terminal_close` @@ -1728,7 +1728,7 @@ lsp 工具将提供方选择和语言服务器子进程置于 ctx.lsp 之后, -## `@deepseek-ai/dsh-experimental-tool-ralph` +## `@deepseek-ai/dsh-tool-ralph` ### `ralph` diff --git a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.i18n.yaml b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.i18n.yaml new file mode 100644 index 0000000000..92dd85b5a7 --- /dev/null +++ b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.i18n.yaml @@ -0,0 +1,16 @@ +# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading +# section, a hash of its English and Chinese blocks outside code blocks and generated regions. +# After editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.md +/: + en: ba51914a407e33ae + zh: f0440eb120093d36 +/explicit-installation-and-composition-for-optional-capabilities: + en: 5a3fcd469d908d58 + zh: df94cc0beddc20ef +/explicit-installation-and-composition-for-optional-capabilities/change: + en: 3143b032a22268ec + zh: e55603836a24022a +/explicit-installation-and-composition-for-optional-capabilities/migration: + en: e197a95e2e59af22 + zh: dfdda504922c1dc5 diff --git a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.md b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.md new file mode 100644 index 0000000000..678146bfc1 --- /dev/null +++ b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.md @@ -0,0 +1,28 @@ +--- +kind: upgrade-guide +description: "Explicit installation, peer dependencies, and configuration for optional hooks, webhooks, tools, and skills." +--- + +# Explicit installation and composition for optional capabilities + +English | [中文](guide.zh.md) + +## Change + +The CLI and Python runtime omit the hook bridges from their installation dependencies, and the CLI omits the webhook pair. Base and the full Web presets omit dormant Ralph rows, and base omits its dormant badge row. A patch that only enables a removed row does not insert its plugin. Default active behavior, plugin registration names, tool names, and recorded Session event names remain unchanged. + +Package ownership and naming follow the [experimental package policy](../../../../scripts/experimental-package-policy.ts). Installation and composition are separate: installing a plugin package does not mount it, and a bundle must be selected before its contributed rows can be configured. + +## Migration + +1. Install any packages missing from the target profile together with their required peers. Profiles disable automatic peer installation. For example, run `dsh plugin --profile web add @deepseek-ai/dsh-hooks-claude-code @deepseek-ai/dsh-hook-protocol`. The Codex bridge needs the same protocol peer; the GitHub adapter needs `@deepseek-ai/dsh-webhook` alongside `@deepseek-ai/dsh-webhook-github`. +2. Select an available bundle before overriding its rows. For a capability composed manually, replace an override of a removed row with a complete insertion. Add preset-local tools inside that preset's `config.plugins`, including the services they require. A Host badge insertion is: + + ```yaml + - insert: + - id: skill-badge + name: '@deepseek-ai/dsh-skill-badge' + ``` + +3. For GitHub review, use the example distributed with the adapter instead of the removed CLI example. Follow the [installed-profile instructions](../../../user/guide/github-review.md); keep customized rule modules inside the profile so their imports resolve its installed packages. +4. Start the profile and confirm that its configured plugins activate without missing-package, missing-peer, or missing-row errors. Confirm the expected tool or skill is available in the intended Agent preset. diff --git a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.zh.md b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.zh.md new file mode 100644 index 0000000000..4ca4f3cf51 --- /dev/null +++ b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.zh.md @@ -0,0 +1,28 @@ +--- +kind: upgrade-guide +description: "可选 hooks、webhooks、工具与技能所需的显式安装、peer 依赖和配置。" +--- + +# 可选能力的显式安装与组合 + +[English](guide.md) | 中文 + +## 变更 + +CLI 与 Python 运行时的安装依赖不再包含 hook 桥接,CLI 也不再包含 webhook 包对。Base 与完整 Web 预设省略休眠的 Ralph 行,base 也省略休眠的徽章行。仅启用已移除行的 patch 不会插入其插件。默认活动行为、插件注册名称、工具名称与已记录的 Session 事件名称保持不变。 + +包归属和命名遵循[实验包策略](../../../../scripts/experimental-package-policy.ts)。安装与组合相互独立:安装插件包不会挂载它,必须先选择 bundle 才能配置其贡献的行。 + +## 迁移 + +1. 将目标 profile 缺少的包与所需 peer 一起安装。Profile 禁用自动 peer 安装。例如,运行 `dsh plugin --profile web add @deepseek-ai/dsh-hooks-claude-code @deepseek-ai/dsh-hook-protocol`。Codex 桥接需要相同的协议 peer;GitHub 适配器需要同时安装 `@deepseek-ai/dsh-webhook` 与 `@deepseek-ai/dsh-webhook-github`。 +2. 覆盖 bundle 的行之前先选择可用的 bundle。对于手动组合的能力,将覆盖已移除行的 patch 替换为完整插入。在预设的 `config.plugins` 中添加预设内工具及其所需服务。Host 徽章插入示例: + + ```yaml + - insert: + - id: skill-badge + name: '@deepseek-ai/dsh-skill-badge' + ``` + +3. GitHub review 使用适配器随附的示例,替代已删除的 CLI 示例。遵循[安装版 profile 说明](../../../user/guide/github-review.zh.md);将定制规则模块保留在 profile 内,使其导入能解析该 profile 安装的包。 +4. 启动 profile,确认配置的插件激活时没有缺包、缺 peer 或缺行错误。确认预期工具或技能在目标 Agent 预设中可用。 diff --git a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.i18n.yaml b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.i18n.yaml deleted file mode 100644 index 3b0f803c4c..0000000000 --- a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.i18n.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading -# section, a hash of its English and Chinese blocks outside code blocks and generated regions. -# After editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.md -/: - en: dd6fc9abae171d7b - zh: 7aed30461003cbef -/experimental-package-names-and-explicit-composition: - en: 1ddb73ece556f6e5 - zh: 1f169e6d590f45e2 -/experimental-package-names-and-explicit-composition/change: - en: ae31baa97d4514be - zh: 936e1120fc433f1a -/experimental-package-names-and-explicit-composition/migration: - en: e3c79a2189f7edfd - zh: d47869013fdd481b diff --git a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.md b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.md deleted file mode 100644 index 203aae729c..0000000000 --- a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -kind: upgrade-guide -description: "Nine optional packages use experimental names, and hook, webhook, terminal, Ralph, and badge configurations require explicit installation or insertion." ---- - -# Experimental package names and explicit composition - -English | [中文](guide.zh.md) - -## Change - -The next release replaces these v0.2.1-alpha.1 package names: - -| Old name suffix after `@deepseek-ai/dsh-` | New suffix | -|---|---| -| `hook-protocol` | `experimental-hook-protocol` | -| `hooks-claude-code` | `experimental-hooks-claude-code` | -| `hooks-codex` | `experimental-hooks-codex` | -| `webhook` | `experimental-webhook` | -| `webhook-github` | `experimental-webhook-github` | -| `session-title-all-prompts-llm` | `experimental-session-title-all-prompts-llm` | -| `tool-terminal` | `experimental-tool-terminal` | -| `tool-ralph` | `experimental-tool-ralph` | -| `skill-badge` | `experimental-skill-badge` | - -The CLI and Python runtime do not install the relocated hook bridges or Ralph. The CLI does not install the webhook pair. Base and the full Web presets omit dormant Ralph rows, and base omits its dormant badge row. Patches that only enable those removed IDs no longer insert a plugin. Default active behavior, plugin registration names, tool names, and recorded Session event names remain unchanged. - -## Migration - -1. Replace old npm names in dependencies, imports, profile patches, and overlays using the table. Do not rewrite recorded Session events. -2. Install the packages and missing peers into each affected profile. Profiles disable automatic peer installation. For example, run `dsh plugin --profile web add @deepseek-ai/dsh-experimental-hooks-claude-code @deepseek-ai/dsh-experimental-hook-protocol`. The Codex bridge needs the same protocol peer. The GitHub adapter needs `@deepseek-ai/dsh-experimental-webhook` alongside `@deepseek-ai/dsh-experimental-webhook-github`. Terminal-tool profiles also need `@deepseek-ai/dsh-experimental-tool-terminal` explicitly installed; the CLI ships the terminal service and backend, but the tool is outside its production dependencies. -3. Replace an override of a removed row with a complete insertion. Add preset-local tools inside that preset's `config.plugins`, including the services they require. A host badge insertion is: - - ```yaml - - insert: - - id: skill-badge - name: '@deepseek-ai/dsh-experimental-skill-badge' - ``` - -4. For GitHub review, use the example distributed with the adapter instead of the removed CLI example. Follow the [installed-profile instructions](../../../user/guide/github-review.md); keep customized rule modules inside the profile so their imports resolve its installed packages. -5. Start the profile and confirm that its configured plugins activate without missing-package, missing-peer, or missing-row errors. Confirm the expected tool or skill is available in the intended Agent preset. diff --git a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.zh.md b/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.zh.md deleted file mode 100644 index c3f874e150..0000000000 --- a/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-renames/guide.zh.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -kind: upgrade-guide -description: "九个可选包使用实验性名称,钩子、webhook、终端、Ralph 和徽章配置需要显式安装或插入。" ---- - -# 实验性包名称与显式组合 - -[English](guide.md) | 中文 - -## 变更 - -下一个版本替换以下 v0.2.1-alpha.1 包名称: - -| `@deepseek-ai/dsh-` 后的旧名称后缀 | 新后缀 | -|---|---| -| `hook-protocol` | `experimental-hook-protocol` | -| `hooks-claude-code` | `experimental-hooks-claude-code` | -| `hooks-codex` | `experimental-hooks-codex` | -| `webhook` | `experimental-webhook` | -| `webhook-github` | `experimental-webhook-github` | -| `session-title-all-prompts-llm` | `experimental-session-title-all-prompts-llm` | -| `tool-terminal` | `experimental-tool-terminal` | -| `tool-ralph` | `experimental-tool-ralph` | -| `skill-badge` | `experimental-skill-badge` | - -CLI 与 Python 运行时不再安装迁移后的钩子桥接或 Ralph。CLI 不再安装两个 webhook 包。Base 与完整 Web 预设省略休眠的 Ralph 行,base 也省略休眠的徽章行。只启用这些已删除 ID 的 patch 不会插入插件。默认活动行为、插件注册名称、工具名称与已记录的 Session 事件名称保持不变。 - -## 迁移 - -1. 按表替换依赖、导入、profile patch 和 overlay 中的旧 npm 名称。不要改写已记录的 Session 事件。 -2. 将包与缺失的 peer 安装到每个受影响的 profile。Profile 禁用自动 peer 安装。例如,运行 `dsh plugin --profile web add @deepseek-ai/dsh-experimental-hooks-claude-code @deepseek-ai/dsh-experimental-hook-protocol`。Codex 桥接需要相同的协议 peer。GitHub 适配器需要同时安装 `@deepseek-ai/dsh-experimental-webhook` 与 `@deepseek-ai/dsh-experimental-webhook-github`。使用终端工具的 profile 还需显式安装 `@deepseek-ai/dsh-experimental-tool-terminal`;CLI 随附终端服务与后端,但其生产依赖不包含该工具。 -3. 将覆盖已删除行的 patch 替换为完整插入。在预设的 `config.plugins` 中添加预设内工具及其需要的服务。宿主徽章插入示例: - - ```yaml - - insert: - - id: skill-badge - name: '@deepseek-ai/dsh-experimental-skill-badge' - ``` - -4. GitHub review 使用适配器随附的示例,替代已删除的 CLI 示例。遵循[安装版 profile 说明](../../../user/guide/github-review.zh.md);将定制规则模块保留在 profile 内,使其导入能解析该 profile 安装的包。 -5. 启动 profile,确认配置的插件激活时没有缺包、缺 peer 或缺行错误。确认预期工具或技能在目标 Agent 预设中可用。 diff --git a/docs/user/guide/github-review.md b/docs/user/guide/github-review.md index 6dd900af46..981458d36b 100644 --- a/docs/user/guide/github-review.md +++ b/docs/user/guide/github-review.md @@ -25,9 +25,9 @@ printf '%s\n' "$DSH_GITHUB_WEBHOOK_SECRET" Install both experimental packages into the Web profile first. Profiles do not install peers automatically; the GitHub adapter needs the webhook runtime explicitly: ```sh -dsh plugin --profile web add @deepseek-ai/dsh-experimental-webhook @deepseek-ai/dsh-experimental-webhook-github +dsh plugin --profile web add @deepseek-ai/dsh-webhook @deepseek-ai/dsh-webhook-github export DSH_GITHUB_REVIEW_WORKSPACE=/path/to/deepseek-harness -dsh web --patch "${DSH_HOME:-$HOME/.dsh}/profiles/web/node_modules/@deepseek-ai/dsh-experimental-webhook-github/examples/github-review/cordis.yml" +dsh web --patch "${DSH_HOME:-$HOME/.dsh}/profiles/web/node_modules/@deepseek-ai/dsh-webhook-github/examples/github-review/cordis.yml" ``` The adapter distributes the example, which loads from the profile's installation directory so its rule module can resolve profile-installed peers. Do not run the rule from an arbitrary directory outside the profile. To customize it, copy both example files to `$DSH_HOME/profiles/web/github-review/`, edit the configuration, and point `--patch` at that copy of `cordis.yml`; use `~/.dsh` when `DSH_HOME` is unset. diff --git a/docs/user/guide/github-review.zh.md b/docs/user/guide/github-review.zh.md index f3d11abad4..4ad240f91a 100644 --- a/docs/user/guide/github-review.zh.md +++ b/docs/user/guide/github-review.zh.md @@ -25,9 +25,9 @@ printf '%s\n' "$DSH_GITHUB_WEBHOOK_SECRET" 先把两个实验包安装到 Web profile。Profile 不会自动安装 peer;GitHub 适配器需要显式安装 webhook 运行时: ```sh -dsh plugin --profile web add @deepseek-ai/dsh-experimental-webhook @deepseek-ai/dsh-experimental-webhook-github +dsh plugin --profile web add @deepseek-ai/dsh-webhook @deepseek-ai/dsh-webhook-github export DSH_GITHUB_REVIEW_WORKSPACE=/path/to/deepseek-harness -dsh web --patch "${DSH_HOME:-$HOME/.dsh}/profiles/web/node_modules/@deepseek-ai/dsh-experimental-webhook-github/examples/github-review/cordis.yml" +dsh web --patch "${DSH_HOME:-$HOME/.dsh}/profiles/web/node_modules/@deepseek-ai/dsh-webhook-github/examples/github-review/cordis.yml" ``` 示例随 GitHub 适配器发布,并从 profile 的安装目录加载,因此规则模块能解析该 profile 安装的 peer。不要把规则单独放到 profile 之外的任意目录运行。需要定制时,将示例的两个文件复制到 `$DSH_HOME/profiles/web/github-review/`,修改其配置并把 `--patch` 指向复制后的 `cordis.yml`;未设置 `DSH_HOME` 时使用 `~/.dsh`。 diff --git a/package.json b/package.json index 0dabc11245..ead6a0e6c7 100644 --- a/package.json +++ b/package.json @@ -208,10 +208,10 @@ "verify-product-use": "tsx scripts/verify-product-use.ts" }, "devDependencies": { - "@deepseek-ai/dsh-experimental-hooks-claude-code": "workspace:*", - "@deepseek-ai/dsh-experimental-hooks-codex": "workspace:*", - "@deepseek-ai/dsh-experimental-tool-ralph": "workspace:*", - "@deepseek-ai/dsh-experimental-tool-terminal": "workspace:*", + "@deepseek-ai/dsh-hooks-claude-code": "workspace:*", + "@deepseek-ai/dsh-hooks-codex": "workspace:*", + "@deepseek-ai/dsh-tool-ralph": "workspace:*", + "@deepseek-ai/dsh-tool-terminal": "workspace:*", "@deepseek-ai/dsh-agent": "workspace:*", "@deepseek-ai/dsh-browser-use": "workspace:*", "@deepseek-ai/dsh-experimental-browser-use-runtime": "workspace:*", diff --git a/packages/client/tsdown.client.ts b/packages/client/tsdown.client.ts index 386beef230..2e8c06b18e 100644 --- a/packages/client/tsdown.client.ts +++ b/packages/client/tsdown.client.ts @@ -20,6 +20,7 @@ import { transform } from 'lightningcss' import { optionalStringArray } from './modules/src/client/manifest.ts' import { PLATFORM_MODULES, PRELOADED_CLIENT_EXTERNALS } from './web/src/platform.ts' import { clientBuildEnvironmentDefines } from '../../scripts/client-build-environment.ts' +import { isExperimentalPackageName } from '../../scripts/experimental-package-policy.ts' import { BundleInputIsolation, physicalBundleInput } from '../../scripts/bundle-input-isolation.ts' /** @@ -629,7 +630,7 @@ function clientInputIsolation(id: string): { plugin: TsdownPlugin sourcePath: (source: string, mapPath: string) => string } { - const experimental = id.startsWith('@deepseek-ai/dsh-experimental-') + const experimental = isExperimentalPackageName(id) const inputs = new BundleInputIsolation(REPOSITORY_ROOT, `client bundle isolation (${id})`) return { plugin: { diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 5698ad1f42..a0e284f130 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -53,7 +53,7 @@ "@deepseek-ai/dsh-tools": "workspace:*", "@deepseek-ai/dsh-tool-jobs": "workspace:*", "@deepseek-ai/dsh-tool-session-query": "workspace:*", - "@deepseek-ai/dsh-experimental-tool-terminal": "workspace:*", + "@deepseek-ai/dsh-tool-terminal": "workspace:*", "@deepseek-ai/dsh-spill": "workspace:*", "@deepseek-ai/cordis": "workspace:~", "@deepseek-ai/dsh-api-remotes": "workspace:*", diff --git a/packages/client/ui-tool/tests/details-models.client.spec.ts b/packages/client/ui-tool/tests/details-models.client.spec.ts index de6bcc173d..9642bd55f7 100644 --- a/packages/client/ui-tool/tests/details-models.client.spec.ts +++ b/packages/client/ui-tool/tests/details-models.client.spec.ts @@ -8,7 +8,7 @@ import { en as commonEn } from '@deepseek-ai/dsh-client-locale/src/locales/en.ts import { zh as commonZh } from '@deepseek-ai/dsh-client-locale/src/locales/zh.ts' import { statusLine } from '@deepseek-ai/dsh-tool-jobs/src/render.ts' import { presentation } from '@deepseek-ai/dsh-tool-session-query/src/presentation.ts' -import { renderList, renderRead, renderSpawn } from '@deepseek-ai/dsh-experimental-tool-terminal/src/render.ts' +import { renderList, renderRead, renderSpawn } from '@deepseek-ai/dsh-tool-terminal/src/render.ts' import { formatSpillNotice } from '@deepseek-ai/dsh-spill-policy/notice' import { detailBadge, detailJson, detailList, detailRecord, inspectionItems, nonempty } from '../src/client/tool/models/detail-model-shared.ts' import { detailsCardModel } from '../src/client/tool/models/details-card-model.ts' diff --git a/packages/core/agent-loop/tests/interception.spec.ts b/packages/core/agent-loop/tests/interception.spec.ts index 3d7349c88a..352583df36 100644 --- a/packages/core/agent-loop/tests/interception.spec.ts +++ b/packages/core/agent-loop/tests/interception.spec.ts @@ -730,7 +730,7 @@ describe('tools/pre-execute gate (native-plugin permission pattern, end-to-end t }) describe('worked example: a native hook plugin is just a cordis plugin on the seams', () => { - // The whole point of the interception taxonomy: a "native hook" needs no dsh-experimental-hook-protocol, + // The whole point of the interception taxonomy: a "native hook" needs no dsh-hook-protocol, // no external command, no hook/* log — it is an ordinary cordis plugin subscribing to the // canonical events and returning typed decisions. const NativeGuard = { diff --git a/packages/experimental/AGENTS.md b/packages/experimental/AGENTS.md index 3fbb97eb09..a3a281f8d8 100644 --- a/packages/experimental/AGENTS.md +++ b/packages/experimental/AGENTS.md @@ -3,7 +3,7 @@ These rules supplement the [package rules](../AGENTS.md). The [experimental reference](README.md#status) defines experimental, optional, and Official status; the rules below define dependency isolation and promotion. - A package belongs here only when its complete public contract is experimental or internal-only. An experimental option inside a release package stays with its owning product role. -- Every package here uses the `@deepseek-ai/dsh-experimental-*` npm prefix and joins the dsh release family by default: omit `private` and set `publishConfig.access: public`. Only directories in `PRIVATE_EXPERIMENTAL_PACKAGE_DIRECTORIES` in [the publication policy](../../scripts/experimental-package-policy.ts) stay private: set `private: true` and omit `publishConfig`. +- Package names follow [the experimental naming policy](../../scripts/experimental-package-policy.ts); packages join the dsh release family by default: omit `private` and set `publishConfig.access: public`. Only directories in `PRIVATE_EXPERIMENTAL_PACKAGE_DIRECTORIES` in [the publication policy](../../scripts/experimental-package-policy.ts) stay private: set `private: true` and omit `publishConfig`. - Release packages and apps outside this group must not name experimental packages in `dependencies`, `optionalDependencies`, or `peerDependencies`. [Default-product isolation](../../.agents/notes/implemented/process/2026-09-12-default-product-experimental-isolation.md) also checks transitive installations, runtime imports, and shipped compositions in CI. Experimental packages may depend on release packages and each other. Tests may use experimental packages through `devDependencies`; examples may load them explicitly. - Experimental status does not relax engineering, security, documentation, lifecycle, testing, or snapshot requirements. -- Publishing an experimental package does not promote it or add a stability promise. Promotion moves a package to its product-role group and removes `experimental-` from its npm name; update every import and configuration row atomically, then review its public contract, limitations, test evidence, release payload, runtime dependents, and named stable owner. +- Publishing an experimental package does not promote it or add a stability promise. Promotion moves a package to its product-role group and applies that group's naming rules; update affected imports and configuration rows atomically, then review its public contract, limitations, test evidence, release payload, runtime dependents, and named stable owner. diff --git a/packages/experimental/README.i18n.yaml b/packages/experimental/README.i18n.yaml index 50d400cb28..a4b0e9025f 100644 --- a/packages/experimental/README.i18n.yaml +++ b/packages/experimental/README.i18n.yaml @@ -9,14 +9,14 @@ en: 18bc48bb66b3e516 zh: 51f2340a5c921f36 /packages-experimental/summary: - en: b268bb4e0a1f2013 - zh: bc4abacc015b44dc + en: 18477c54ce3a4fe0 + zh: 9382579479ad1dd8 /packages-experimental/table-of-contents: en: cd24cc2ef2ec742e zh: 7db21f509a8620a5 /packages-experimental/experimental-optional-and-official: - en: 5d86d3390fe062a0 - zh: 582d77571ba08f65 + en: b55aeb927737b90d + zh: 0b215fcb5c2c7908 /packages-experimental/packages: en: 8dbff5ff0843dd44 zh: 5d8947f8a309f8b0 diff --git a/packages/experimental/README.md b/packages/experimental/README.md index 9eb47dd124..8af9546c29 100644 --- a/packages/experimental/README.md +++ b/packages/experimental/README.md @@ -9,7 +9,7 @@ English | [中文](README.zh.md) ## Summary -Install and compose experimental capabilities explicitly, without a product-support commitment. Packages publish under `@deepseek-ai/dsh-experimental-*`; private packages require an entry in the [publication policy](../../scripts/experimental-package-policy.ts). The [optional-bundle rule](../../.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md) determines which capabilities ship switched off with the installation for explicit selection in the GUI plugin manager’s Official group. +Install and compose experimental capabilities explicitly, without a product-support commitment. Package naming and publication follow the [experimental package policy](../../scripts/experimental-package-policy.ts). The [optional-bundle rule](../../.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md) determines which capabilities ship switched off with the installation for explicit selection in the GUI plugin manager’s Official group. ## Table of Contents @@ -27,7 +27,7 @@ Install and compose experimental capabilities explicitly, without a product-supp **Optional** means a user explicitly selects the capability. **Official** means the project maintains and lists the package in the Plugins page. Neither describes maturity; publication, default installation, and GUI visibility do not determine maturity either. Product packages outside this group have maintained product roles, while their public APIs still follow the repository's pre-stable policy. -Promotion requires a named product role, documented public behavior and limitations, current consumers, release contents, and test evidence. Move the package to its product group, remove `experimental-` from its npm name, and update every consumer together. The [subtree rules](AGENTS.md) govern dependency isolation and publication. +Promotion requires a named product role, documented public behavior and limitations, current consumers, release contents, and test evidence. Move the package to its product group, apply that group's naming rules, and update affected consumers together. The [subtree rules](AGENTS.md) govern dependency isolation and publication. ----- diff --git a/packages/experimental/README.zh.md b/packages/experimental/README.zh.md index d58ab12346..0bdfcbdd7c 100644 --- a/packages/experimental/README.zh.md +++ b/packages/experimental/README.zh.md @@ -9,7 +9,7 @@ kind: "package-group" ## 概述 -实验性能力可按需安装和组合,但不提供产品支持承诺。各包以 `@deepseek-ai/dsh-experimental-*` 名称发布;私有包必须列入[发布策略](../../scripts/experimental-package-policy.ts)。[可选组合规则](../../.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md)决定哪些能力以默认关闭状态随安装提供,并在 GUI 插件管理器的官方分组显式启用。 +实验性能力可按需安装和组合,但不提供产品支持承诺。包命名和发布遵循[实验包策略](../../scripts/experimental-package-policy.ts)。[可选组合规则](../../.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md)决定哪些能力以默认关闭状态随安装提供,并在 GUI 插件管理器的官方分组显式启用。 ## 目录 @@ -27,7 +27,7 @@ kind: "package-group" **可选**表示用户显式选择该能力。**官方**表示项目维护并在插件页列出该包。两者均不表示成熟度;发布、默认安装和界面可见性也不决定成熟度。组外产品包承担维护职责,其公开 API 仍遵循仓库的预稳定政策。 -晋升需要明确的产品职责、公开行为与限制、当前消费者、发布内容以及测试证据。晋升时将包移入对应产品组,去掉 npm 名称中的 `experimental-`,并同时更新所有消费者。[子树规则](AGENTS.md)规定依赖隔离和发布要求。 +晋升需要明确的产品职责、公开行为与限制、当前消费者、发布内容以及测试证据。晋升时将包移入对应产品组,应用该组的命名规则,并同时更新受影响的消费者。[子树规则](AGENTS.md)规定依赖隔离和发布要求。 ----- diff --git a/packages/experimental/claude-code-mods/README.i18n.yaml b/packages/experimental/claude-code-mods/README.i18n.yaml index 249bc80575..aa0a5e6116 100644 --- a/packages/experimental/claude-code-mods/README.i18n.yaml +++ b/packages/experimental/claude-code-mods/README.i18n.yaml @@ -45,8 +45,8 @@ en: a141066b146cef7c zh: fe91851f05c008c4 /deepseek-ai-dsh-experimental-claude-code-mods/further-exploration: - en: e42263bd872fd588 - zh: 07805adc5d7a661a + en: bf439c5f325ef30a + zh: e089b043d9701180 /deepseek-ai-dsh-experimental-claude-code-mods/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 @@ -78,8 +78,8 @@ en: ca31263f47f654d9 zh: 17d55e6641705627 /deepseek-ai-dsh-experimental-claude-code-mods/known-limitations-and-deferred-work: - en: c4e5cc431b15c7e5 - zh: a964d0a9a1f13b0f + en: 99aaa73c8ef9c609 + zh: 46fab480bd2b1706 /deepseek-ai-dsh-experimental-claude-code-mods/known-limitations-and-deferred-work/dev-note: en: 4d1e26f4cc9c3c1c zh: d80209b56c56b11c diff --git a/packages/experimental/claude-code-mods/README.md b/packages/experimental/claude-code-mods/README.md index 9b98b6f7a8..4fd02d3ded 100644 --- a/packages/experimental/claude-code-mods/README.md +++ b/packages/experimental/claude-code-mods/README.md @@ -148,7 +148,7 @@ A call whose service is not composed rejects with the missing service's package - [Claude Code mods reference](https://code.claude.com/docs/en/plugins/mods/reference) — the events, methods, and limits this bridge mirrors. - [The Web band](../client-ui-claude-code-mods/README.md) — the Client package that draws `ui.render` trees in the input dock. - [Experimental packages](../README.md) — publication policy and dependency isolation. -- [Claude Code hook bridge](../hooks-claude-code/README.md) — the settings-hook bridge; a plugin's `hooks.json` settings hooks need `dsh-experimental-hooks-claude-code`. +- [Claude Code hook bridge](../hooks-claude-code/README.md) — the settings-hook bridge; a plugin's `hooks.json` settings hooks need `dsh-hooks-claude-code`. - [Tool execution pipeline](../../../docs/tool-execution-pipeline.md) — the waterfalls `tool.call` runs around. - [Human commands](../../interaction/commands/README.md) — the registry `$.command.register` lands on. @@ -207,7 +207,7 @@ These limits describe where a Claude Code mod behaves differently through this b - **No sandbox, no static analysis, no hot reload** — the hooks module runs in-process with Node's globals and the process's full authority (its environment, network, filesystem, and tools); the `$`-only access rule, `claude plugin validate`, type generation, `--plugin-dir` watching, and the in-session mod authoring flow are not implemented. Mount only mods you would run as a plugin. Mounting a mod again re-runs `register` on the same evaluated module, so module-level variables keep their values. - **`turn.complete` text** — the `{ text }` a hook returns reaches the host log, not a line under the answer; `durationMs` counts from the turn's `turn/start`. - **`$.session.usage`** — `window` is `0` and `percent` absent until the route's context window and a provider usage report are known through the token meter; `rateLimits` is always empty. `$.fs.stat` reports `mtimeMs: 0`. -- **`plugin.json` and `hooks.json`** — not read; `defineMod` carries the identity, and a plugin's settings hooks need `@deepseek-ai/dsh-experimental-hooks-claude-code`. +- **`plugin.json` and `hooks.json`** — not read; `defineMod` carries the identity, and a plugin's settings hooks need `@deepseek-ai/dsh-hooks-claude-code`. ### Dev Note diff --git a/packages/experimental/claude-code-mods/README.zh.md b/packages/experimental/claude-code-mods/README.zh.md index 65956b7e30..1a2f909626 100644 --- a/packages/experimental/claude-code-mods/README.zh.md +++ b/packages/experimental/claude-code-mods/README.zh.md @@ -148,7 +148,7 @@ Blast Radius 的 DSH 包装使用当前运行的可执行文件提供 Node 计 - [Claude Code 模组参考](https://code.claude.com/docs/en/plugins/mods/reference) — 本桥接镜像的事件、方法与限制。 - [Web 横幅](../client-ui-claude-code-mods/README.zh.md) — 在输入停靠区绘制 `ui.render` 树的 Client 包。 - [实验性包](../README.zh.md) — 发布策略与依赖隔离。 -- [Claude Code 钩子桥接](../hooks-claude-code/README.zh.md) — 设置钩子桥接;插件 `hooks.json` 中的设置钩子需要 `dsh-experimental-hooks-claude-code`。 +- [Claude Code 钩子桥接](../hooks-claude-code/README.zh.md) — 设置钩子桥接;插件 `hooks.json` 中的设置钩子需要 `dsh-hooks-claude-code`。 - [工具执行流水线](../../../docs/tool-execution-pipeline.zh.md) — `tool.call` 所包裹的瀑布流。 - [人类命令](../../interaction/commands/README.zh.md) — `$.command.register` 落到的注册表。 @@ -207,7 +207,7 @@ Message from the "" mod: - **无沙箱、无静态分析、无热重载** — 钩子模块以 Node 全局对象在进程内运行,拥有本进程的全部权限(环境变量、网络、文件系统与工具);仅 `$` 访问规则、`claude plugin validate`、类型生成、`--plugin-dir` 监视与会话内模组编写流程均未实现。只挂载你愿意作为插件运行的模组。再次挂载模组会在同一已求值模块上重新运行 `register`,模块级变量保留其值。 - **`turn.complete` 文本** — 钩子返回的 `{ text }` 到达宿主日志,而非答案下方的一行;`durationMs` 从该轮的 `turn/start` 起算。 - **`$.session.usage`** — 在 token 计量器得知路由的上下文窗口与提供商用量报告之前,`window` 为 `0` 且无 `percent`;`rateLimits` 始终为空。`$.fs.stat` 报告 `mtimeMs: 0`。 -- **`plugin.json` 与 `hooks.json`** — 不读取;`defineMod` 承载身份,插件的设置钩子需要 `@deepseek-ai/dsh-experimental-hooks-claude-code`。 +- **`plugin.json` 与 `hooks.json`** — 不读取;`defineMod` 承载身份,插件的设置钩子需要 `@deepseek-ai/dsh-hooks-claude-code`。 ### 开发备注 diff --git a/packages/experimental/hook-protocol/README.i18n.yaml b/packages/experimental/hook-protocol/README.i18n.yaml index e5bea2416a..ca049db303 100644 --- a/packages/experimental/hook-protocol/README.i18n.yaml +++ b/packages/experimental/hook-protocol/README.i18n.yaml @@ -5,57 +5,57 @@ /: en: 7cfe3761eedff848 zh: 80b0bed5743d0924 -/deepseek-ai-dsh-experimental-hook-protocol: - en: 59c4379ae58d7ca3 - zh: 6d015de6ce018358 -/deepseek-ai-dsh-experimental-hook-protocol/summary: - en: 2831db16082fcbed - zh: 38c1eb54c1dd56dc -/deepseek-ai-dsh-experimental-hook-protocol/table-of-contents: +/deepseek-ai-dsh-hook-protocol: + en: 3092627c127b688d + zh: bbdb083e0a5dbc25 +/deepseek-ai-dsh-hook-protocol/summary: + en: e8ab847d0db16043 + zh: 5c1e72f4b4a54fe1 +/deepseek-ai-dsh-hook-protocol/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-hook-protocol/use-this-package: - en: 84b3719a71cc14a9 - zh: 8f500851d2f02784 -/deepseek-ai-dsh-experimental-hook-protocol/use-this-package/when-to-choose-it: - en: b1a1a4e9652ab792 - zh: 08f819dd3b0b98d4 -/deepseek-ai-dsh-experimental-hook-protocol/use-this-package/what-a-hook-can-do: +/deepseek-ai-dsh-hook-protocol/use-this-package: + en: 4b29a18ac60be5bb + zh: 4a02b48f9e914101 +/deepseek-ai-dsh-hook-protocol/use-this-package/when-to-choose-it: + en: 435c1a335f8dfccf + zh: efe58c06dc40d4d9 +/deepseek-ai-dsh-hook-protocol/use-this-package/what-a-hook-can-do: en: 043f54b3a5b518a7 zh: a4115083a9b1cef1 -/deepseek-ai-dsh-experimental-hook-protocol/use-this-package/what-you-see-when-hooks-run: +/deepseek-ai-dsh-hook-protocol/use-this-package/what-you-see-when-hooks-run: en: ba2d6ed1db063f53 zh: ab1b8d72dccd2ff1 -/deepseek-ai-dsh-experimental-hook-protocol/understand-the-implementation: +/deepseek-ai-dsh-hook-protocol/understand-the-implementation: en: 08b3960150e9c5e2 zh: 6bb2f236d697de01 -/deepseek-ai-dsh-experimental-hook-protocol/understand-the-implementation/processing-pipeline: - en: b25d80f19b551f1a - zh: 9c6602f008d89bce -/deepseek-ai-dsh-experimental-hook-protocol/understand-the-implementation/hook-session-events: +/deepseek-ai-dsh-hook-protocol/understand-the-implementation/processing-pipeline: + en: f71878539d98392e + zh: 826a0dd95475fff3 +/deepseek-ai-dsh-hook-protocol/understand-the-implementation/hook-session-events: en: f01ab4ab98f052b3 zh: 1da25fa50378bd19 -/deepseek-ai-dsh-experimental-hook-protocol/understand-the-implementation/design-philosophy: +/deepseek-ai-dsh-hook-protocol/understand-the-implementation/design-philosophy: en: 7f9239eaea5a945c zh: 9ba6a2ea955d4934 -/deepseek-ai-dsh-experimental-hook-protocol/understand-the-implementation/source-map: - en: aa4983adf89ea45c - zh: cc83b0ede5ff156c -/deepseek-ai-dsh-experimental-hook-protocol/further-exploration: +/deepseek-ai-dsh-hook-protocol/understand-the-implementation/source-map: + en: 0d8956a6d8608ee0 + zh: 9f554284c4c0a36e +/deepseek-ai-dsh-hook-protocol/further-exploration: en: 8b585ce73c2be2cc zh: c0270fd001e1352b -/deepseek-ai-dsh-experimental-hook-protocol/model-experience: - en: 99188699e4c6e334 - zh: bba689b1e0f33d97 -/deepseek-ai-dsh-experimental-hook-protocol/model-experience/kv-cache-effect: +/deepseek-ai-dsh-hook-protocol/model-experience: + en: 53d2f59435a4a88f + zh: 79c8fc2849b20718 +/deepseek-ai-dsh-hook-protocol/model-experience/kv-cache-effect: en: e290ccc9b3c92c08 zh: cb3c8823f41e7afe -/deepseek-ai-dsh-experimental-hook-protocol/known-limitations-and-deferred-work: +/deepseek-ai-dsh-hook-protocol/known-limitations-and-deferred-work: en: 1ca6146a077a7d2d zh: 369741569178fc79 -/deepseek-ai-dsh-experimental-hook-protocol/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-hook-protocol/known-limitations-and-deferred-work/dev-note: en: ac1d08360a93382b zh: 6c58749bae9a6e65 -/deepseek-ai-dsh-experimental-hook-protocol/known-limitations-and-deferred-work/dev-note/future-run-level-halt: +/deepseek-ai-dsh-hook-protocol/known-limitations-and-deferred-work/dev-note/future-run-level-halt: en: bfb3db50de22c1d0 zh: 2a979359b0edbbe7 diff --git a/packages/experimental/hook-protocol/README.md b/packages/experimental/hook-protocol/README.md index 4c043ebb2e..b443839fd1 100644 --- a/packages/experimental/hook-protocol/README.md +++ b/packages/experimental/hook-protocol/README.md @@ -3,13 +3,13 @@ description: "The shared hook rules behind the Claude Code and Codex bridges — kind: "package-library" --- -# @deepseek-ai/dsh-experimental-hook-protocol +# @deepseek-ai/dsh-hook-protocol English | [中文](README.zh.md) ## Summary -`dsh-experimental-hook-protocol` makes both bridges handle your hooks identically: it defines what a hook can do and what happens when it runs. You never install or configure it yourself — choose `dsh-experimental-hooks-claude-code` or `dsh-experimental-hooks-codex`, point it at your existing `hooks.json`, and these rules apply to your hooks. Through either bridge, a hook can block a prompt or tool call with a message the model sees, attach extra context to the conversation, or ask the run to stop. Only command hooks run; `http`, `mcp_tool`, `prompt`, and `agent` handlers are skipped with a warning. +`dsh-hook-protocol` makes both bridges handle your hooks identically: it defines what a hook can do and what happens when it runs. You never install or configure it yourself — choose `dsh-hooks-claude-code` or `dsh-hooks-codex`, point it at your existing `hooks.json`, and these rules apply to your hooks. Through either bridge, a hook can block a prompt or tool call with a message the model sees, attach extra context to the conversation, or ask the run to stop. Only command hooks run; `http`, `mcp_tool`, `prompt`, and `agent` handlers are skipped with a warning. ## Table of Contents @@ -25,11 +25,11 @@ English | [中文](README.zh.md) ## Use this package -You don't install or configure this package directly — mounting `dsh-experimental-hooks-claude-code` or `dsh-experimental-hooks-codex` applies these rules to your existing `hooks.json` hooks. Use this page to learn what a hook can do and what happens when it runs; the two bridge pages list which events each dialect supports. +You don't install or configure this package directly — mounting `dsh-hooks-claude-code` or `dsh-hooks-codex` applies these rules to your existing `hooks.json` hooks. Use this page to learn what a hook can do and what happens when it runs; the two bridge pages list which events each dialect supports. ### When to choose it -Choose `dsh-experimental-hooks-claude-code` or `dsh-experimental-hooks-codex` when you have existing Claude Code or Codex hooks and want them to keep working during agent runs. You never choose this package directly. Avoid the whole group for bespoke behavior with no reference-tool equivalent: a native Cordis plugin has the full harness API with no hook protocol in between. +Choose `dsh-hooks-claude-code` or `dsh-hooks-codex` when you have existing Claude Code or Codex hooks and want them to keep working during agent runs. You never choose this package directly. Avoid the whole group for bespoke behavior with no reference-tool equivalent: a native Cordis plugin has the full harness API with no hook protocol in between. ### What a hook can do @@ -112,7 +112,7 @@ Read these pages when the package-level contract is not enough. They move from t ## Model Experience -Indirectly, through `dsh-experimental-hooks-claude-code` and `dsh-experimental-hooks-codex`, which are the only consumers that render decoded hook output into model context. +Indirectly, through `dsh-hooks-claude-code` and `dsh-hooks-codex`, which are the only consumers that render decoded hook output into model context. #### KV Cache effect diff --git a/packages/experimental/hook-protocol/README.zh.md b/packages/experimental/hook-protocol/README.zh.md index a9e4c7d9dd..6a7a444b65 100644 --- a/packages/experimental/hook-protocol/README.zh.md +++ b/packages/experimental/hook-protocol/README.zh.md @@ -3,13 +3,13 @@ description: "Claude Code 与 Codex 桥接背后的共享钩子规则——钩 kind: "package-library" --- -# @deepseek-ai/dsh-experimental-hook-protocol +# @deepseek-ai/dsh-hook-protocol [English](README.md) | 中文 ## 概述 -`dsh-experimental-hook-protocol` 让两个桥接以相同方式处理你的钩子:它定义钩子能做什么、运行时会发生什么。你无需自行安装或配置它——选择 `dsh-experimental-hooks-claude-code` 或 `dsh-experimental-hooks-codex`,把它指向你现有的 `hooks.json`,这些规则就会作用于你的钩子。通过任一桥接,钩子都可以带一条模型可见的消息阻塞提示词或工具调用、向对话附加额外上下文,或请求运行停止。只有 command 钩子会运行;`http`、`mcp_tool`、`prompt` 与 `agent` handler 会被跳过并给出警告。 +`dsh-hook-protocol` 让两个桥接以相同方式处理你的钩子:它定义钩子能做什么、运行时会发生什么。你无需自行安装或配置它——选择 `dsh-hooks-claude-code` 或 `dsh-hooks-codex`,把它指向你现有的 `hooks.json`,这些规则就会作用于你的钩子。通过任一桥接,钩子都可以带一条模型可见的消息阻塞提示词或工具调用、向对话附加额外上下文,或请求运行停止。只有 command 钩子会运行;`http`、`mcp_tool`、`prompt` 与 `agent` handler 会被跳过并给出警告。 ## 目录 @@ -25,11 +25,11 @@ kind: "package-library" ## 使用本包 -你无需直接安装或配置本包——挂载 `dsh-experimental-hooks-claude-code` 或 `dsh-experimental-hooks-codex` 就会把这些规则应用到你的 `hooks.json` 钩子上。用本页了解钩子能做什么、运行时会发生什么;两个桥接页面列出各方言支持的事件。 +你无需直接安装或配置本包——挂载 `dsh-hooks-claude-code` 或 `dsh-hooks-codex` 就会把这些规则应用到你的 `hooks.json` 钩子上。用本页了解钩子能做什么、运行时会发生什么;两个桥接页面列出各方言支持的事件。 ### 何时选择 -当你持有现有的 Claude Code 或 Codex 钩子、希望它们在 agent(智能体)运行期间继续工作时,选择 `dsh-experimental-hooks-claude-code` 或 `dsh-experimental-hooks-codex`。你永远不会直接选择本包。没有参考工具对应物的定制行为请避开整个组:原生 Cordis 插件拥有完整的 harness API,无需中间的钩子协议。 +当你持有现有的 Claude Code 或 Codex 钩子、希望它们在 agent(智能体)运行期间继续工作时,选择 `dsh-hooks-claude-code` 或 `dsh-hooks-codex`。你永远不会直接选择本包。没有参考工具对应物的定制行为请避开整个组:原生 Cordis 插件拥有完整的 harness API,无需中间的钩子协议。 ### 钩子能做什么 @@ -112,7 +112,7 @@ kind: "package-library" ## 模型体验 -通过 `dsh-experimental-hooks-claude-code` 与 `dsh-experimental-hooks-codex` 间接影响;它们是将解码后的 hook 输出渲染为模型上下文的唯一消费方。 +通过 `dsh-hooks-claude-code` 与 `dsh-hooks-codex` 间接影响;它们是将解码后的 hook 输出渲染为模型上下文的唯一消费方。 #### KV Cache 影响 diff --git a/packages/experimental/hook-protocol/package.json b/packages/experimental/hook-protocol/package.json index 20f1fac8b5..1195c9de2c 100644 --- a/packages/experimental/hook-protocol/package.json +++ b/packages/experimental/hook-protocol/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-hook-protocol", + "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", "version": "0.2.1-alpha.1", "publishConfig": { diff --git a/packages/experimental/hook-protocol/src/codec.ts b/packages/experimental/hook-protocol/src/codec.ts index c111b5291a..273e86f312 100644 --- a/packages/experimental/hook-protocol/src/codec.ts +++ b/packages/experimental/hook-protocol/src/codec.ts @@ -2,7 +2,7 @@ * Decode hook process outcomes for both dialects. Exit 0 may carry structured * JSON or plain stdout; exit 2 blocks with stderr as the reason; every other * exit is a non-blocking error. Bridges decide which recognized fields apply. - * @module @deepseek-ai/dsh-experimental-hook-protocol/codec + * @module @deepseek-ai/dsh-hook-protocol/codec */ import type { HookOutput } from './types.ts' diff --git a/packages/experimental/hook-protocol/src/detached.ts b/packages/experimental/hook-protocol/src/detached.ts index 4493cdd872..92eee06858 100644 --- a/packages/experimental/hook-protocol/src/detached.ts +++ b/packages/experimental/hook-protocol/src/detached.ts @@ -2,7 +2,7 @@ * Quiescence tracking for emit-shaped hook runs that no extension point awaits. Bridges * track the run plus its continuation, pass the tracker signal into execution, * and drain on disposal so no process or late callback outlives the fiber. - * @module @deepseek-ai/dsh-experimental-hook-protocol/detached + * @module @deepseek-ai/dsh-hook-protocol/detached */ /** In-flight registry for one bridge's detached hook runs; see the module doc for the wiring contract. */ diff --git a/packages/experimental/hook-protocol/src/events.ts b/packages/experimental/hook-protocol/src/events.ts index cf5525839b..d7c93095e9 100644 --- a/packages/experimental/hook-protocol/src/events.ts +++ b/packages/experimental/hook-protocol/src/events.ts @@ -3,7 +3,7 @@ * intent and must remain turn-enclosed and invoked/result paired. Mid-turn hook * points satisfy that boundary; SessionStart records injected context instead * and does not append `hook/*` outside a turn. - * @module @deepseek-ai/dsh-experimental-hook-protocol/events + * @module @deepseek-ai/dsh-hook-protocol/events */ import type { Session } from '@deepseek-ai/dsh-session' diff --git a/packages/experimental/hook-protocol/src/index.ts b/packages/experimental/hook-protocol/src/index.ts index d6316d1fff..f36b86b44b 100644 --- a/packages/experimental/hook-protocol/src/index.ts +++ b/packages/experimental/hook-protocol/src/index.ts @@ -3,7 +3,7 @@ * decoding, restrictive outcome merging, durable event helpers, and detached * run quiescence. Claude Code and Codex bridges own their distinct payloads, * environment rules, matcher mode, and typed extension-point mappings. - * @module @deepseek-ai/dsh-experimental-hook-protocol + * @module @deepseek-ai/dsh-hook-protocol */ export type { diff --git a/packages/experimental/hook-protocol/src/matcher.ts b/packages/experimental/hook-protocol/src/matcher.ts index 3a8cbc2725..f27c695234 100644 --- a/packages/experimental/hook-protocol/src/matcher.ts +++ b/packages/experimental/hook-protocol/src/matcher.ts @@ -4,7 +4,7 @@ * treats every non-empty pattern as an unanchored regex. Missing, empty, and * `*` match all. Runtime matching contains invalid regexes as non-matches; * config parsers use {@link matcherDiagnostic} to reject them with a diagnostic. - * @module @deepseek-ai/dsh-experimental-hook-protocol/matcher + * @module @deepseek-ai/dsh-hook-protocol/matcher */ import type { MatcherGroup, MatcherMode } from './types.ts' diff --git a/packages/experimental/hook-protocol/src/merge.ts b/packages/experimental/hook-protocol/src/merge.ts index 100fffac3b..c2d25f0ab5 100644 --- a/packages/experimental/hook-protocol/src/merge.ts +++ b/packages/experimental/hook-protocol/src/merge.ts @@ -3,7 +3,7 @@ * is `deny > ask > allow`; the first `continue:false` stop is sticky; reasons * for the winning rank are joined; and context and system messages accumulate * in hook order. - * @module @deepseek-ai/dsh-experimental-hook-protocol/merge + * @module @deepseek-ai/dsh-hook-protocol/merge */ import type { HookOutput } from './types.ts' diff --git a/packages/experimental/hook-protocol/src/runner.ts b/packages/experimental/hook-protocol/src/runner.ts index a0319466b0..197a743fc1 100644 --- a/packages/experimental/hook-protocol/src/runner.ts +++ b/packages/experimental/hook-protocol/src/runner.ts @@ -3,7 +3,7 @@ * process-group cancellation, and timeout machinery. The bridge supplies the * trusted stdin payload and dialect environment, then this module decodes the * captured outcome. - * @module @deepseek-ai/dsh-experimental-hook-protocol/runner + * @module @deepseek-ai/dsh-hook-protocol/runner */ import type { ShellExecutor } from '@deepseek-ai/dsh-shell' diff --git a/packages/experimental/hook-protocol/src/types.ts b/packages/experimental/hook-protocol/src/types.ts index dcdc9ab1a0..84fd04a210 100644 --- a/packages/experimental/hook-protocol/src/types.ts +++ b/packages/experimental/hook-protocol/src/types.ts @@ -2,7 +2,7 @@ * Dialect-neutral vocabulary and log-only events shared by the Claude Code and * Codex hook bridges. Payload construction, matching differences, environment, * and extension-point-specific decision mapping remain owned by each bridge. - * @module @deepseek-ai/dsh-experimental-hook-protocol/types + * @module @deepseek-ai/dsh-hook-protocol/types */ declare module '@deepseek-ai/dsh-session/types' { diff --git a/packages/experimental/hook-protocol/tests/codec.spec.ts b/packages/experimental/hook-protocol/tests/codec.spec.ts index ba65d56657..252caa4cff 100644 --- a/packages/experimental/hook-protocol/tests/codec.spec.ts +++ b/packages/experimental/hook-protocol/tests/codec.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { parseHookOutput } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { parseHookOutput } from '@deepseek-ai/dsh-hook-protocol' describe('parseHookOutput — exit code semantics', () => { it('exit 0 with no stdout is a neutral success', () => { diff --git a/packages/experimental/hook-protocol/tests/detached.spec.ts b/packages/experimental/hook-protocol/tests/detached.spec.ts index 643b3d6c6c..03e10c7a0d 100644 --- a/packages/experimental/hook-protocol/tests/detached.spec.ts +++ b/packages/experimental/hook-protocol/tests/detached.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { createDetachedRuns } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { createDetachedRuns } from '@deepseek-ai/dsh-hook-protocol' /** A promise settled from outside, so a test controls exactly when a tracked run finishes. */ function deferred(): { promise: Promise; resolve: () => void; reject: (error: Error) => void } { diff --git a/packages/experimental/hook-protocol/tests/events.spec.ts b/packages/experimental/hook-protocol/tests/events.spec.ts index 09ba471469..b8c21b3190 100644 --- a/packages/experimental/hook-protocol/tests/events.spec.ts +++ b/packages/experimental/hook-protocol/tests/events.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import { Session, SessionId } from '@deepseek-ai/dsh-session' -import { appendHookInvoked, appendHookResult, summarizeStderr, type HookOutput } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { appendHookInvoked, appendHookResult, summarizeStderr, type HookOutput } from '@deepseek-ai/dsh-hook-protocol' /** A {@link HookOutput} with the required stream fields defaulted. */ function output(over: Partial = {}): HookOutput { diff --git a/packages/experimental/hook-protocol/tests/matcher.spec.ts b/packages/experimental/hook-protocol/tests/matcher.spec.ts index 5e23ded9dd..39fae74d14 100644 --- a/packages/experimental/hook-protocol/tests/matcher.spec.ts +++ b/packages/experimental/hook-protocol/tests/matcher.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { matcherDiagnostic, matchesMatcher, selectHookGroups, type MatcherGroup } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { matcherDiagnostic, matchesMatcher, selectHookGroups, type MatcherGroup } from '@deepseek-ai/dsh-hook-protocol' describe('matchesMatcher — match-all sentinels (both dialects)', () => { for (const mode of ['claude-code', 'codex'] as const) { diff --git a/packages/experimental/hook-protocol/tests/merge.spec.ts b/packages/experimental/hook-protocol/tests/merge.spec.ts index 5dd21e2b0a..def2474927 100644 --- a/packages/experimental/hook-protocol/tests/merge.spec.ts +++ b/packages/experimental/hook-protocol/tests/merge.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { mergeHookOutputs } from '@deepseek-ai/dsh-experimental-hook-protocol' -import type { HookOutput } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { mergeHookOutputs } from '@deepseek-ai/dsh-hook-protocol' +import type { HookOutput } from '@deepseek-ai/dsh-hook-protocol' function out(over: Partial = {}): HookOutput { return { exitCode: 0, stderr: '', stdout: '', ...over } diff --git a/packages/experimental/hook-protocol/tests/runner.spec.ts b/packages/experimental/hook-protocol/tests/runner.spec.ts index 74f8d2eae2..0aa27fb748 100644 --- a/packages/experimental/hook-protocol/tests/runner.spec.ts +++ b/packages/experimental/hook-protocol/tests/runner.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, expectTypeOf, it } from 'vitest' import type { ShellExecRequest, ShellExecSpec, ShellExecution, ShellExecutor, ShellRunResult } from '@deepseek-ai/dsh-shell' -import { DEFAULT_HOOK_TIMEOUT_MS, runHook } from '@deepseek-ai/dsh-experimental-hook-protocol' -import type { RunHookOptions } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { DEFAULT_HOOK_TIMEOUT_MS, runHook } from '@deepseek-ai/dsh-hook-protocol' +import type { RunHookOptions } from '@deepseek-ai/dsh-hook-protocol' /** * A minimal stand-in for the bits of {@link ShellExecutor} that {@link runHook} diff --git a/packages/experimental/hooks-claude-code/README.i18n.yaml b/packages/experimental/hooks-claude-code/README.i18n.yaml index 5527b802b5..dec4a60dd0 100644 --- a/packages/experimental/hooks-claude-code/README.i18n.yaml +++ b/packages/experimental/hooks-claude-code/README.i18n.yaml @@ -5,84 +5,84 @@ /: en: 3570440302708236 zh: 6e4217f2856879a1 -/deepseek-ai-dsh-experimental-hooks-claude-code: - en: 77dc8c195263a10d - zh: 51f3ab9fa13d950e -/deepseek-ai-dsh-experimental-hooks-claude-code/summary: - en: 6aaa917b54b3af85 - zh: 7054c24382ab6083 -/deepseek-ai-dsh-experimental-hooks-claude-code/table-of-contents: +/deepseek-ai-dsh-hooks-claude-code: + en: 1320640b17bd33f3 + zh: cffe24254ccc5e12 +/deepseek-ai-dsh-hooks-claude-code/summary: + en: fd56bd2d9107d126 + zh: de7e8358840e23b1 +/deepseek-ai-dsh-hooks-claude-code/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-hooks-claude-code/use-this-package: - en: af7c3b8bcce24e7f - zh: 6b5225e34cbd1c85 -/deepseek-ai-dsh-experimental-hooks-claude-code/use-this-package/when-to-choose-it: +/deepseek-ai-dsh-hooks-claude-code/use-this-package: + en: 7534e384c3ba85f2 + zh: dd28c3a11d096796 +/deepseek-ai-dsh-hooks-claude-code/use-this-package/when-to-choose-it: en: 5fdf4ff17e6d9a2e zh: 82979c137758005d -/deepseek-ai-dsh-experimental-hooks-claude-code/use-this-package/smallest-working-setup: - en: 2c493d787543e82b - zh: fc2f7c595a5542f6 -/deepseek-ai-dsh-experimental-hooks-claude-code/use-this-package/what-your-hooks-can-do: +/deepseek-ai-dsh-hooks-claude-code/use-this-package/smallest-working-setup: + en: b2724490aee1f8e0 + zh: abbcb0eebb3207a4 +/deepseek-ai-dsh-hooks-claude-code/use-this-package/what-your-hooks-can-do: en: 6c3b126e6607c311 zh: 33199f443edb2824 -/deepseek-ai-dsh-experimental-hooks-claude-code/use-this-package/how-hooks-run-and-fail: - en: 98d13f2e7207e3f3 - zh: 4e0336b32c2775e9 -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation: +/deepseek-ai-dsh-hooks-claude-code/use-this-package/how-hooks-run-and-fail: + en: d2da19a016554a19 + zh: 5c579bc80b04e7a4 +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation: en: d33ddd080880b3f5 zh: 64328f5239c26752 -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation/hook-point-mapping: +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation/hook-point-mapping: en: d315f54ec60f8860 zh: 53b7a6531d9f4bbb -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation/payloads-and-environment: +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation/payloads-and-environment: en: 0389b516653c7f45 zh: 15ec2182113a9aa4 -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation/matcher-subjects-and-serial-execution: +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation/matcher-subjects-and-serial-execution: en: 0f30690502687688 zh: 19d4ec653c19f00e -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation/detached-runs-and-disposal: - en: aa09842e9c40ad82 - zh: f7b65a3f2604003c -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation/design-philosophy: +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation/detached-runs-and-disposal: + en: b04f07b845653345 + zh: 9159c4a908e292cb +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation/design-philosophy: en: e9dc2e482e9a7b50 zh: 5fa4e92b75884f93 -/deepseek-ai-dsh-experimental-hooks-claude-code/understand-the-implementation/source-map: +/deepseek-ai-dsh-hooks-claude-code/understand-the-implementation/source-map: en: 0289ee9e374d3606 zh: b88841c10ad5c10f -/deepseek-ai-dsh-experimental-hooks-claude-code/further-exploration: - en: 6f34fec52fcf5fd3 - zh: 15dde7f0ec896efc -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience: +/deepseek-ai-dsh-hooks-claude-code/further-exploration: + en: 1cb82f5b18b49430 + zh: 20323fdd0d17c16b +/deepseek-ai-dsh-hooks-claude-code/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/hook-provided-context: +/deepseek-ai-dsh-hooks-claude-code/model-experience/hook-provided-context: en: 7b2f5028dacd7146 zh: e4d226735f7abfc2 -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/hook-provided-context/what-the-model-sees: +/deepseek-ai-dsh-hooks-claude-code/model-experience/hook-provided-context/what-the-model-sees: en: 7b6edde085633c5f zh: caadcfe8b9364c6d -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/hook-provided-context/token-effect: +/deepseek-ai-dsh-hooks-claude-code/model-experience/hook-provided-context/token-effect: en: b70e3524b160cd63 zh: e1011ee18d1bf12b -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/hook-provided-context/kv-cache-effect: +/deepseek-ai-dsh-hooks-claude-code/model-experience/hook-provided-context/kv-cache-effect: en: f5d5f97a153f7c70 zh: f681f89596f500f5 -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome: +/deepseek-ai-dsh-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome: en: 82be8d95921ef639 zh: 11c185068ec18932 -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome/what-the-model-sees: +/deepseek-ai-dsh-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome/what-the-model-sees: en: 1313b662532a2bda zh: 4002d38540286a94 -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome/token-effect: +/deepseek-ai-dsh-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome/token-effect: en: 7c13e10d2a0e3151 zh: 54ffd88bca4fce3a -/deepseek-ai-dsh-experimental-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome/kv-cache-effect: +/deepseek-ai-dsh-hooks-claude-code/model-experience/blocked-prompt-or-tool-outcome/kv-cache-effect: en: f84fa6c0511cd113 zh: f6ce9cdd47a72684 -/deepseek-ai-dsh-experimental-hooks-claude-code/known-limitations-and-deferred-work: +/deepseek-ai-dsh-hooks-claude-code/known-limitations-and-deferred-work: en: 23ab8cf19542ea03 zh: e56f896b4393c1c5 -/deepseek-ai-dsh-experimental-hooks-claude-code/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-hooks-claude-code/known-limitations-and-deferred-work/dev-note: en: b1e9a373ae8b7bb0 zh: 30446fe59d5ec8be diff --git a/packages/experimental/hooks-claude-code/README.md b/packages/experimental/hooks-claude-code/README.md index a3d4e6529b..97dd24d8d7 100644 --- a/packages/experimental/hooks-claude-code/README.md +++ b/packages/experimental/hooks-claude-code/README.md @@ -3,13 +3,13 @@ description: "Run your existing Claude Code hooks.json or settings hook config d kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-hooks-claude-code +# @deepseek-ai/dsh-hooks-claude-code English | [中文](README.zh.md) ## Summary -`dsh-experimental-hooks-claude-code` runs command hooks from your existing Claude Code `hooks.json` or settings file during agent runs, without requiring a rewrite. Supported hooks can run when sessions, prompts, tools, stops, or subagents reach matching moments. They can block prompts or tool calls with model-visible reasons, add conversation context, or force another model turn. Choose this package to reuse Claude Code command hooks in the harness; use a native plugin for behavior that has no Claude Code equivalent. +`dsh-hooks-claude-code` runs command hooks from your existing Claude Code `hooks.json` or settings file during agent runs, without requiring a rewrite. Supported hooks can run when sessions, prompts, tools, stops, or subagents reach matching moments. They can block prompts or tool calls with model-visible reasons, add conversation context, or force another model turn. Choose this package to reuse Claude Code command hooks in the harness; use a native plugin for behavior that has no Claude Code equivalent. ## Table of Contents @@ -36,7 +36,7 @@ Use it when you own a Claude Code `hooks.json` (or a settings file whose `hooks` ### Smallest working setup ```yaml -- name: '@deepseek-ai/dsh-experimental-hooks-claude-code' +- name: '@deepseek-ai/dsh-hooks-claude-code' config: configPath: ./.claude/hooks.json pluginRoot: ./.claude/plugins/my-plugin @@ -51,7 +51,7 @@ Use it when you own a Claude Code `hooks.json` (or a settings file whose `hooks` | `defaultTimeoutMs` | `600,000` | Per-hook timeout when a hook sets none (the Claude Code default) | | `stderrSummaryMaxChars` | `500` | Character cap on the persisted `hook/result` stderr summary | -The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-hooks-claude-code) is the exhaustive source for every accepted field. +The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-hooks-claude-code) is the exhaustive source for every accepted field. ### What your hooks can do @@ -98,7 +98,7 @@ The matcher subject is the tool name (`PreToolUse` / `PostToolUse`), the session ### Detached runs and disposal -The three emit points (`SessionStart`, `SubagentStart`, `SubagentStop`) run detached — no extension point awaits them. Each run chain is tracked, and disposing the bridge aborts still-running hook processes, then drains the continuations before the dispose resolves (`createDetachedRuns` in `dsh-experimental-hook-protocol`). +The three emit points (`SessionStart`, `SubagentStart`, `SubagentStop`) run detached — no extension point awaits them. Each run chain is tracked, and disposing the bridge aborts still-running hook processes, then drains the continuations before the dispose resolves (`createDetachedRuns` in `dsh-hook-protocol`). ### Design philosophy @@ -130,7 +130,7 @@ Read these pages when the package-level contract is not enough. They move from t - [Hook protocol library](../hook-protocol/README.md) — the shared hook rules this bridge applies. - [Hook bridges Agent Note](../../../.agents/notes/archived/feature/2026-06-30-hook-bridges.md) — the bridge design, decision mapping, and deferred gaps. - [Interception extension-points reference](../../../docs/tool-execution-pipeline.md) — the typed-Decision surface the bridge maps onto. -- [Generated configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-hooks-claude-code) — every accepted config field and its source declaration. +- [Generated configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-hooks-claude-code) — every accepted config field and its source declaration. ----- diff --git a/packages/experimental/hooks-claude-code/README.zh.md b/packages/experimental/hooks-claude-code/README.zh.md index 39dd0cccfd..829ddd92bf 100644 --- a/packages/experimental/hooks-claude-code/README.zh.md +++ b/packages/experimental/hooks-claude-code/README.zh.md @@ -3,13 +3,13 @@ description: "在 agent 运行期间使用你现有的 Claude Code hooks.json kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-hooks-claude-code +# @deepseek-ai/dsh-hooks-claude-code [English](README.md) | 中文 ## 概述 -`dsh-experimental-hooks-claude-code` 在 agent(智能体)运行期间执行你现有 Claude Code `hooks.json` 或 settings 文件中的 command 钩子,无需重写。受支持的钩子会在会话、提示词、工具、停止或 subagent 到达对应时刻时运行。它们可以带模型可见的原因阻塞提示词或工具调用、添加对话上下文,或强制模型再执行一个轮次。需要在 harness 中复用 Claude Code command 钩子时选择本包;没有 Claude Code 对应物的行为应使用原生插件。 +`dsh-hooks-claude-code` 在 agent(智能体)运行期间执行你现有 Claude Code `hooks.json` 或 settings 文件中的 command 钩子,无需重写。受支持的钩子会在会话、提示词、工具、停止或 subagent 到达对应时刻时运行。它们可以带模型可见的原因阻塞提示词或工具调用、添加对话上下文,或强制模型再执行一个轮次。需要在 harness 中复用 Claude Code command 钩子时选择本包;没有 Claude Code 对应物的行为应使用原生插件。 ## 目录 @@ -36,7 +36,7 @@ kind: "package-reference" ### 最小配置 ```yaml -- name: '@deepseek-ai/dsh-experimental-hooks-claude-code' +- name: '@deepseek-ai/dsh-hooks-claude-code' config: configPath: ./.claude/hooks.json pluginRoot: ./.claude/plugins/my-plugin @@ -51,7 +51,7 @@ kind: "package-reference" | `defaultTimeoutMs` | `600,000` | hook 未设置时的每 hook 超时(即 Claude Code 默认值) | | `stderrSummaryMaxChars` | `500` | 持久化 `hook/result` stderr 摘要的字符上限 | -生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-hooks-claude-code)是每个受支持字段的穷尽式真源。 +生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-hooks-claude-code)是每个受支持字段的穷尽式真源。 ### 你的钩子能做什么 @@ -98,7 +98,7 @@ matcher subject 是工具名称(`PreToolUse`/`PostToolUse`)、会话源( ### 脱离运行与释放 -三个 emit 点(`SessionStart`、`SubagentStart`、`SubagentStop`)以脱离方式运行——没有扩展点等待它们。每条运行链都会被跟踪,对桥接执行 dispose(资源释放)时会中止仍在运行的 hook 进程,并在 dispose 完成前排空 continuation(`createDetachedRuns`,位于 `dsh-experimental-hook-protocol`)。 +三个 emit 点(`SessionStart`、`SubagentStart`、`SubagentStop`)以脱离方式运行——没有扩展点等待它们。每条运行链都会被跟踪,对桥接执行 dispose(资源释放)时会中止仍在运行的 hook 进程,并在 dispose 完成前排空 continuation(`createDetachedRuns`,位于 `dsh-hook-protocol`)。 ### 设计理念 @@ -130,7 +130,7 @@ matcher subject 是工具名称(`PreToolUse`/`PostToolUse`)、会话源( - [hook 协议库](../hook-protocol/README.zh.md)——本桥接应用的共享钩子规则。 - [钩子桥接 Agent Note](../../../.agents/notes/archived/feature/2026-06-30-hook-bridges.md)——桥接设计、决策映射与延期缺口。 - [拦截扩展点 参考](../../../docs/tool-execution-pipeline.zh.md)——桥接所映射的类型化 Decision 接口面。 -- [生成的配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-hooks-claude-code)——每个受支持配置字段及其源声明。 +- [生成的配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-hooks-claude-code)——每个受支持配置字段及其源声明。 ----- diff --git a/packages/experimental/hooks-claude-code/package.json b/packages/experimental/hooks-claude-code/package.json index 1ea77c56ed..9799278af9 100644 --- a/packages/experimental/hooks-claude-code/package.json +++ b/packages/experimental/hooks-claude-code/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-hooks-claude-code", + "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", "version": "0.2.1-alpha.1", "publishConfig": { @@ -31,7 +31,7 @@ }, "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:*", - "@deepseek-ai/dsh-experimental-hook-protocol": "workspace:*", + "@deepseek-ai/dsh-hook-protocol": "workspace:*", "@deepseek-ai/dsh-llm": "workspace:*", "@deepseek-ai/dsh-session": "workspace:*", "@deepseek-ai/dsh-subagent": "workspace:*", @@ -47,7 +47,7 @@ "@deepseek-ai/dsh-shell": "workspace:*", "@deepseek-ai/dsh-bash-local": "workspace:*", "@deepseek-ai/dsh-subprocess-local": "workspace:*", - "@deepseek-ai/dsh-experimental-hook-protocol": "workspace:*", + "@deepseek-ai/dsh-hook-protocol": "workspace:*", "@deepseek-ai/dsh-llm": "workspace:*", "@deepseek-ai/dsh-session": "workspace:*", "@deepseek-ai/dsh-session-persistence-jsonl": "workspace:*", diff --git a/packages/experimental/hooks-claude-code/src/config.ts b/packages/experimental/hooks-claude-code/src/config.ts index 3f628627da..72bd55bfd5 100644 --- a/packages/experimental/hooks-claude-code/src/config.ts +++ b/packages/experimental/hooks-claude-code/src/config.ts @@ -3,10 +3,10 @@ * Only command hooks run; other hook types are returned as skipped so the * bridge can warn. Plugin-root and project-directory substitutions are applied * to commands at parse time. - * @module @deepseek-ai/dsh-experimental-hooks-claude-code/config + * @module @deepseek-ai/dsh-hooks-claude-code/config */ -import { matcherDiagnostic, type MatcherGroup } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { matcherDiagnostic, type MatcherGroup } from '@deepseek-ai/dsh-hook-protocol' const CLAUDE_EVENTS = [ 'SessionStart', diff --git a/packages/experimental/hooks-claude-code/src/index.ts b/packages/experimental/hooks-claude-code/src/index.ts index 2027ab42e1..afbc60de08 100644 --- a/packages/experimental/hooks-claude-code/src/index.ts +++ b/packages/experimental/hooks-claude-code/src/index.ts @@ -2,10 +2,10 @@ * Bridge for unmodified Claude Code command hooks on harness interception * extension points. It supports SessionStart, prompt/tool pre/post, Stop, and subagent * start/stop. It owns Claude payloads, environment, substitution, and decision - * mapping; shared execution and parsing live in `dsh-experimental-hook-protocol`. + * mapping; shared execution and parsing live in `dsh-hook-protocol`. * `updatedInput` is logged and warned but not honored. Bespoke behavior should * use typed native plugins on the same extension points. - * @module @deepseek-ai/dsh-experimental-hooks-claude-code + * @module @deepseek-ai/dsh-hooks-claude-code */ import type {} from '@deepseek-ai/dsh-working-directory' @@ -36,7 +36,7 @@ import { selectHookGroups, type HookOutput, type MergedHookOutcome, -} from '@deepseek-ai/dsh-experimental-hook-protocol' +} from '@deepseek-ai/dsh-hook-protocol' // Pulls in the declaration-merged subagent events and the identity pairing their // start/end edges. import type { SubagentRunId } from '@deepseek-ai/dsh-subagent' diff --git a/packages/experimental/hooks-claude-code/tests/bridge.spec.ts b/packages/experimental/hooks-claude-code/tests/bridge.spec.ts index c966b4d116..f6b012bc28 100644 --- a/packages/experimental/hooks-claude-code/tests/bridge.spec.ts +++ b/packages/experimental/hooks-claude-code/tests/bridge.spec.ts @@ -14,12 +14,12 @@ import { LocalBashExecutor } from '@deepseek-ai/dsh-bash-local' import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local' import { scopeTarget } from '@deepseek-ai/dsh-scope' import SubagentRuntime, { SubagentRunId } from '@deepseek-ai/dsh-subagent' -import * as HooksClaude from '@deepseek-ai/dsh-experimental-hooks-claude-code' +import * as HooksClaude from '@deepseek-ai/dsh-hooks-claude-code' import { MockAdapter, textResponse, toolCallResponse } from '../../../core/agent-loop/tests/mock-adapter.ts' /** * Full-loop bridge tests: a scripted mock MODEL drives the REAL agent loop + REAL - * bash executor, and the REAL `dsh-experimental-hooks-claude-code` bridge runs REAL shell hook + * bash executor, and the REAL `dsh-hooks-claude-code` bridge runs REAL shell hook * scripts written to a temp dir — only the model is mocked (the "prefer the real * implementation" rule). Each test writes a `hooks.json` + executable scripts, * loads the bridge pointed at them, and asserts the hook's effect on the loop. diff --git a/packages/experimental/hooks-claude-code/tests/config.spec.ts b/packages/experimental/hooks-claude-code/tests/config.spec.ts index 69b21177c9..a6f2e73050 100644 --- a/packages/experimental/hooks-claude-code/tests/config.spec.ts +++ b/packages/experimental/hooks-claude-code/tests/config.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { parseClaudeCodeConfig, substituteCommand } from '@deepseek-ai/dsh-experimental-hooks-claude-code/src/config.ts' +import { parseClaudeCodeConfig, substituteCommand } from '@deepseek-ai/dsh-hooks-claude-code/src/config.ts' describe('substituteCommand', () => { it('replaces CLAUDE_PLUGIN_ROOT and CLAUDE_PROJECT_DIR (all occurrences)', () => { diff --git a/packages/experimental/hooks-claude-code/tests/coverage-cases.ts b/packages/experimental/hooks-claude-code/tests/coverage-cases.ts index f5e59ed715..b77aa85c96 100644 --- a/packages/experimental/hooks-claude-code/tests/coverage-cases.ts +++ b/packages/experimental/hooks-claude-code/tests/coverage-cases.ts @@ -15,7 +15,7 @@ import { LocalBashExecutor } from '@deepseek-ai/dsh-bash-local' import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local' import { scopeTarget } from '@deepseek-ai/dsh-scope' import SubagentRuntime, { SubagentRunId } from '@deepseek-ai/dsh-subagent' -import * as HooksClaude from '@deepseek-ai/dsh-experimental-hooks-claude-code' +import * as HooksClaude from '@deepseek-ai/dsh-hooks-claude-code' import { MockAdapter, textResponse, toolCallResponse } from '../../../core/agent-loop/tests/mock-adapter.ts' declare module '@deepseek-ai/dsh-llm' { diff --git a/packages/experimental/hooks-codex/README.i18n.yaml b/packages/experimental/hooks-codex/README.i18n.yaml index 9c3732a261..be1bac6e41 100644 --- a/packages/experimental/hooks-codex/README.i18n.yaml +++ b/packages/experimental/hooks-codex/README.i18n.yaml @@ -5,84 +5,84 @@ /: en: 9ee4cd57e234a8ff zh: 59e5d8f84fa762ff -/deepseek-ai-dsh-experimental-hooks-codex: - en: 92a5fd5c6751a2ac - zh: 70e2ba81906d33dc -/deepseek-ai-dsh-experimental-hooks-codex/summary: - en: 717bfd84f7eda519 - zh: 31d2a38edbee47e7 -/deepseek-ai-dsh-experimental-hooks-codex/table-of-contents: +/deepseek-ai-dsh-hooks-codex: + en: 99fdfc9d35118255 + zh: 4b4d11c3b20b6b96 +/deepseek-ai-dsh-hooks-codex/summary: + en: e02e93d326449402 + zh: 5de5f527d2182537 +/deepseek-ai-dsh-hooks-codex/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-hooks-codex/use-this-package: - en: 86b84a66b82845f8 - zh: bd7fbd4e066d06f8 -/deepseek-ai-dsh-experimental-hooks-codex/use-this-package/when-to-choose-it: +/deepseek-ai-dsh-hooks-codex/use-this-package: + en: ea8333ed6fbca7f3 + zh: a08be14b26816d95 +/deepseek-ai-dsh-hooks-codex/use-this-package/when-to-choose-it: en: 44d77bc8d948bc6d zh: 81afaf977570f4ef -/deepseek-ai-dsh-experimental-hooks-codex/use-this-package/smallest-working-setup: - en: 7e5d0d061053e561 - zh: 17a8f5ee928501a3 -/deepseek-ai-dsh-experimental-hooks-codex/use-this-package/what-your-hooks-can-do: +/deepseek-ai-dsh-hooks-codex/use-this-package/smallest-working-setup: + en: 2b8374fe112d8125 + zh: 9067b8cb714e911b +/deepseek-ai-dsh-hooks-codex/use-this-package/what-your-hooks-can-do: en: dee90142e7e87214 zh: 8d83d7e0208ba1ef -/deepseek-ai-dsh-experimental-hooks-codex/use-this-package/how-hooks-run-and-fail: - en: 03b55a30e9ec5f0c - zh: 258907341232ca45 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation: +/deepseek-ai-dsh-hooks-codex/use-this-package/how-hooks-run-and-fail: + en: f373e44302e514d0 + zh: 7fc88478ec7047a4 +/deepseek-ai-dsh-hooks-codex/understand-the-implementation: en: d33ddd080880b3f5 zh: 64328f5239c26752 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation/hook-point-mapping: +/deepseek-ai-dsh-hooks-codex/understand-the-implementation/hook-point-mapping: en: 755ca39231841ffc zh: 30e793dfaf11a336 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation/payloads-and-environment: +/deepseek-ai-dsh-hooks-codex/understand-the-implementation/payloads-and-environment: en: 542413d7e8cfeaf4 zh: 3b5d0d3fdd0231f2 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation/matcher-subjects-and-serial-execution: +/deepseek-ai-dsh-hooks-codex/understand-the-implementation/matcher-subjects-and-serial-execution: en: fd52c0eb70bf0094 zh: 6415f109fbd763d3 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation/detached-runs-and-disposal: - en: 070e9ebe76c4509b - zh: c88b544ba0446449 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation/design-philosophy: +/deepseek-ai-dsh-hooks-codex/understand-the-implementation/detached-runs-and-disposal: + en: b45f1eafa8f4f467 + zh: a073a76e1d7670e6 +/deepseek-ai-dsh-hooks-codex/understand-the-implementation/design-philosophy: en: 6f882aab3d924115 zh: 7ed83a6d16a22c77 -/deepseek-ai-dsh-experimental-hooks-codex/understand-the-implementation/source-map: +/deepseek-ai-dsh-hooks-codex/understand-the-implementation/source-map: en: 8f74796cf859a750 zh: be4dd22dccba1782 -/deepseek-ai-dsh-experimental-hooks-codex/further-exploration: - en: a9de5a64fb0cc815 - zh: 7d3d715bfedf9fb7 -/deepseek-ai-dsh-experimental-hooks-codex/model-experience: +/deepseek-ai-dsh-hooks-codex/further-exploration: + en: 2298004b8b8cd0e7 + zh: 788909ae6196ca7a +/deepseek-ai-dsh-hooks-codex/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/hook-provided-context: +/deepseek-ai-dsh-hooks-codex/model-experience/hook-provided-context: en: 7b2f5028dacd7146 zh: e4d226735f7abfc2 -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/hook-provided-context/what-the-model-sees: +/deepseek-ai-dsh-hooks-codex/model-experience/hook-provided-context/what-the-model-sees: en: 3f94df641a34a437 zh: 21bc5823229dbb6c -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/hook-provided-context/token-effect: +/deepseek-ai-dsh-hooks-codex/model-experience/hook-provided-context/token-effect: en: b70e3524b160cd63 zh: e1011ee18d1bf12b -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/hook-provided-context/kv-cache-effect: +/deepseek-ai-dsh-hooks-codex/model-experience/hook-provided-context/kv-cache-effect: en: f5d5f97a153f7c70 zh: f681f89596f500f5 -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/blocked-prompt-or-tool-outcome: +/deepseek-ai-dsh-hooks-codex/model-experience/blocked-prompt-or-tool-outcome: en: 82be8d95921ef639 zh: 11c185068ec18932 -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/blocked-prompt-or-tool-outcome/what-the-model-sees: +/deepseek-ai-dsh-hooks-codex/model-experience/blocked-prompt-or-tool-outcome/what-the-model-sees: en: fd44027de2255f3f zh: d880eb4d2d3f6af8 -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/blocked-prompt-or-tool-outcome/token-effect: +/deepseek-ai-dsh-hooks-codex/model-experience/blocked-prompt-or-tool-outcome/token-effect: en: 7c13e10d2a0e3151 zh: 54ffd88bca4fce3a -/deepseek-ai-dsh-experimental-hooks-codex/model-experience/blocked-prompt-or-tool-outcome/kv-cache-effect: +/deepseek-ai-dsh-hooks-codex/model-experience/blocked-prompt-or-tool-outcome/kv-cache-effect: en: f84fa6c0511cd113 zh: f6ce9cdd47a72684 -/deepseek-ai-dsh-experimental-hooks-codex/known-limitations-and-deferred-work: +/deepseek-ai-dsh-hooks-codex/known-limitations-and-deferred-work: en: 11c88847e78bdbc5 zh: dea334c689116d0f -/deepseek-ai-dsh-experimental-hooks-codex/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-hooks-codex/known-limitations-and-deferred-work/dev-note: en: 5f03857c3bb6834a zh: 54f485d08db9020f diff --git a/packages/experimental/hooks-codex/README.md b/packages/experimental/hooks-codex/README.md index e67784bbcf..3c054a0613 100644 --- a/packages/experimental/hooks-codex/README.md +++ b/packages/experimental/hooks-codex/README.md @@ -3,13 +3,13 @@ description: "Run your existing Codex hooks.json hook config during agent runs kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-hooks-codex +# @deepseek-ai/dsh-hooks-codex English | [中文](README.zh.md) ## Summary -`dsh-experimental-hooks-codex` runs command hooks from an existing Codex `hooks.json` during agent runs, so prompt and tool gates work without being rewritten. It supports five Codex hook points: session start, prompt submission, before and after tool execution, and stop. Hooks can block prompts or tool calls with model-visible reasons, add conversation context, or force another agent step. Choose this package to reuse Codex command hooks in the harness; use a native plugin for behavior outside this supported subset. +`dsh-hooks-codex` runs command hooks from an existing Codex `hooks.json` during agent runs, so prompt and tool gates work without being rewritten. It supports five Codex hook points: session start, prompt submission, before and after tool execution, and stop. Hooks can block prompts or tool calls with model-visible reasons, add conversation context, or force another agent step. Choose this package to reuse Codex command hooks in the harness; use a native plugin for behavior outside this supported subset. ## Table of Contents @@ -36,7 +36,7 @@ Use it when you own a Codex `hooks.json` and its command hooks should gate promp ### Smallest working setup ```yaml -- name: '@deepseek-ai/dsh-experimental-hooks-codex' +- name: '@deepseek-ai/dsh-hooks-codex' config: configPath: ./.codex/hooks.json model: deepseek-v4 @@ -49,7 +49,7 @@ Use it when you own a Codex `hooks.json` and its command hooks should gate promp | `defaultTimeoutMs` | `600,000` | Per-hook timeout when a hook sets none (the Codex default) | | `stderrSummaryMaxChars` | `500` | Character cap on the persisted `hook/result` stderr summary | -The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-hooks-codex) is the exhaustive source for every accepted field. +The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-hooks-codex) is the exhaustive source for every accepted field. ### What your hooks can do @@ -94,7 +94,7 @@ The matcher subject is the tool name (`PreToolUse` / `PostToolUse`) or the sessi ### Detached runs and disposal -`SessionStart` is the one emit point and runs detached — no extension point awaits it. Each run chain is tracked, and disposing the bridge aborts a still-running hook process, then drains the continuation before the dispose resolves (`createDetachedRuns` in `dsh-experimental-hook-protocol`). +`SessionStart` is the one emit point and runs detached — no extension point awaits it. Each run chain is tracked, and disposing the bridge aborts a still-running hook process, then drains the continuation before the dispose resolves (`createDetachedRuns` in `dsh-hook-protocol`). ### Design philosophy @@ -126,7 +126,7 @@ Read these pages when the package-level contract is not enough. They move from t - [Hook protocol library](../hook-protocol/README.md) — the shared hook rules this bridge applies. - [Hook bridges Agent Note](../../../.agents/notes/archived/feature/2026-06-30-hook-bridges.md) — the bridge design, decision mapping, and deferred gaps. - [Interception extension-points reference](../../../docs/tool-execution-pipeline.md) — the typed-Decision surface the bridge maps onto. -- [Generated configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-hooks-codex) — every accepted config field and its source declaration. +- [Generated configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-hooks-codex) — every accepted config field and its source declaration. ----- diff --git a/packages/experimental/hooks-codex/README.zh.md b/packages/experimental/hooks-codex/README.zh.md index 1bf5783500..420e13b2fb 100644 --- a/packages/experimental/hooks-codex/README.zh.md +++ b/packages/experimental/hooks-codex/README.zh.md @@ -3,13 +3,13 @@ description: "在 agent 运行期间使用你现有的 Codex hooks.json 钩子 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-hooks-codex +# @deepseek-ai/dsh-hooks-codex [English](README.md) | 中文 ## 概述 -`dsh-experimental-hooks-codex` 在 agent(智能体)运行期间执行现有 Codex `hooks.json` 中的 command 钩子,让提示词与工具把关逻辑无需重写即可生效。它支持 5 个 Codex hook 点:会话开始、提示词提交、工具执行前后以及停止。钩子可以用模型可见的原因阻塞提示词或工具调用、添加对话上下文,或强制 agent 再执行一步。需要在 harness 中复用 Codex command 钩子时选择本包;超出这一受支持子集的行为应使用原生插件。 +`dsh-hooks-codex` 在 agent(智能体)运行期间执行现有 Codex `hooks.json` 中的 command 钩子,让提示词与工具把关逻辑无需重写即可生效。它支持 5 个 Codex hook 点:会话开始、提示词提交、工具执行前后以及停止。钩子可以用模型可见的原因阻塞提示词或工具调用、添加对话上下文,或强制 agent 再执行一步。需要在 harness 中复用 Codex command 钩子时选择本包;超出这一受支持子集的行为应使用原生插件。 ## 目录 @@ -36,7 +36,7 @@ kind: "package-reference" ### 最小配置 ```yaml -- name: '@deepseek-ai/dsh-experimental-hooks-codex' +- name: '@deepseek-ai/dsh-hooks-codex' config: configPath: ./.codex/hooks.json model: deepseek-v4 @@ -49,7 +49,7 @@ kind: "package-reference" | `defaultTimeoutMs` | `600,000` | hook 未设置时的每 hook 超时(即 Codex 默认值) | | `stderrSummaryMaxChars` | `500` | 持久化 `hook/result` stderr 摘要的字符上限 | -生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-hooks-codex)是每个受支持字段的穷尽式真源。 +生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-hooks-codex)是每个受支持字段的穷尽式真源。 ### 你的钩子能做什么 @@ -94,7 +94,7 @@ matcher subject 是工具名称(`PreToolUse`/`PostToolUse`)或会话源( ### 脱离运行与释放 -`SessionStart` 是唯一的 emit 点,它脱离运行——没有扩展点等待它。每条运行链都会被跟踪,对桥接执行 dispose(资源释放)时会中止仍在运行的 hook 进程,并在 dispose 完成前排空 continuation(`createDetachedRuns`,位于 `dsh-experimental-hook-protocol`)。 +`SessionStart` 是唯一的 emit 点,它脱离运行——没有扩展点等待它。每条运行链都会被跟踪,对桥接执行 dispose(资源释放)时会中止仍在运行的 hook 进程,并在 dispose 完成前排空 continuation(`createDetachedRuns`,位于 `dsh-hook-protocol`)。 ### 设计理念 @@ -126,7 +126,7 @@ matcher subject 是工具名称(`PreToolUse`/`PostToolUse`)或会话源( - [hook 协议库](../hook-protocol/README.zh.md)——本桥接应用的共享钩子规则。 - [钩子桥接 Agent Note](../../../.agents/notes/archived/feature/2026-06-30-hook-bridges.md)——桥接设计、决策映射与延期缺口。 - [拦截扩展点 参考](../../../docs/tool-execution-pipeline.zh.md)——桥接所映射的类型化 Decision 接口面。 -- [生成的配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-hooks-codex)——每个受支持配置字段及其源声明。 +- [生成的配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-hooks-codex)——每个受支持配置字段及其源声明。 ----- diff --git a/packages/experimental/hooks-codex/package.json b/packages/experimental/hooks-codex/package.json index babdca9027..e4eac2a937 100644 --- a/packages/experimental/hooks-codex/package.json +++ b/packages/experimental/hooks-codex/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-hooks-codex", + "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", "version": "0.2.1-alpha.1", "publishConfig": { @@ -31,7 +31,7 @@ }, "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:*", - "@deepseek-ai/dsh-experimental-hook-protocol": "workspace:*", + "@deepseek-ai/dsh-hook-protocol": "workspace:*", "@deepseek-ai/dsh-llm": "workspace:*", "@deepseek-ai/dsh-session": "workspace:*", "@deepseek-ai/dsh-tools": "workspace:*", @@ -46,7 +46,7 @@ "@deepseek-ai/dsh-shell": "workspace:*", "@deepseek-ai/dsh-bash-local": "workspace:*", "@deepseek-ai/dsh-subprocess-local": "workspace:*", - "@deepseek-ai/dsh-experimental-hook-protocol": "workspace:*", + "@deepseek-ai/dsh-hook-protocol": "workspace:*", "@deepseek-ai/dsh-llm": "workspace:*", "@deepseek-ai/dsh-session": "workspace:*", "@deepseek-ai/dsh-session-persistence-jsonl": "workspace:*", diff --git a/packages/experimental/hooks-codex/src/config.ts b/packages/experimental/hooks-codex/src/config.ts index 24df5d810d..ae82340ad4 100644 --- a/packages/experimental/hooks-codex/src/config.ts +++ b/packages/experimental/hooks-codex/src/config.ts @@ -2,10 +2,10 @@ * Parse Codex's five-event hook subset into shared {@link MatcherGroup}s. Only synchronous command * hooks run; other types and `async: true` commands are recorded as skipped. Codex performs no * command substitution. - * @module @deepseek-ai/dsh-experimental-hooks-codex/config + * @module @deepseek-ai/dsh-hooks-codex/config */ -import { matcherDiagnostic, type MatcherGroup } from '@deepseek-ai/dsh-experimental-hook-protocol' +import { matcherDiagnostic, type MatcherGroup } from '@deepseek-ai/dsh-hook-protocol' /** The five Codex hook points this bridge supports. */ export const CODEX_EVENTS = ['PreToolUse', 'PostToolUse', 'SessionStart', 'UserPromptSubmit', 'Stop'] as const diff --git a/packages/experimental/hooks-codex/src/index.ts b/packages/experimental/hooks-codex/src/index.ts index 1c3fdcb00c..8dc76fef58 100644 --- a/packages/experimental/hooks-codex/src/index.ts +++ b/packages/experimental/hooks-codex/src/index.ts @@ -4,8 +4,8 @@ * matchers, snake_case payloads without a trailing newline, no hook environment * or command substitution, and no pre-tool approval or rewrite path; only * blocking decisions are honored. Shared execution and parsing live in - * `dsh-experimental-hook-protocol`. - * @module @deepseek-ai/dsh-experimental-hooks-codex + * `dsh-hook-protocol`. + * @module @deepseek-ai/dsh-hooks-codex */ // Each dialect bridge keeps its complete dependency list visible at the entry @@ -39,7 +39,7 @@ import { selectHookGroups, type HookOutput, type MergedHookOutcome, -} from '@deepseek-ai/dsh-experimental-hook-protocol' +} from '@deepseek-ai/dsh-hook-protocol' import { parseCodexConfig, type CodexHookConfig } from './config.ts' /* jscpd:ignore-end */ diff --git a/packages/experimental/hooks-codex/tests/bridge.spec.ts b/packages/experimental/hooks-codex/tests/bridge.spec.ts index 441fa5faa2..242eb91819 100644 --- a/packages/experimental/hooks-codex/tests/bridge.spec.ts +++ b/packages/experimental/hooks-codex/tests/bridge.spec.ts @@ -12,7 +12,7 @@ import type { Agent } from '@deepseek-ai/dsh-agent' import AgentLoop from '@deepseek-ai/dsh-agent-loop' import { LocalBashExecutor } from '@deepseek-ai/dsh-bash-local' import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local' -import * as HooksCodex from '@deepseek-ai/dsh-experimental-hooks-codex' +import * as HooksCodex from '@deepseek-ai/dsh-hooks-codex' import { MockAdapter, textResponse, toolCallResponse } from '../../../core/agent-loop/tests/mock-adapter.ts' /** diff --git a/packages/experimental/hooks-codex/tests/config.spec.ts b/packages/experimental/hooks-codex/tests/config.spec.ts index 365ed71505..8503d13151 100644 --- a/packages/experimental/hooks-codex/tests/config.spec.ts +++ b/packages/experimental/hooks-codex/tests/config.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { parseCodexConfig, CODEX_EVENTS } from '@deepseek-ai/dsh-experimental-hooks-codex/src/config.ts' +import { parseCodexConfig, CODEX_EVENTS } from '@deepseek-ai/dsh-hooks-codex/src/config.ts' describe('parseCodexConfig', () => { it('honors only the five bridge-supported Codex events, dropping the rest', () => { diff --git a/packages/experimental/hooks-codex/tests/coverage-cases.ts b/packages/experimental/hooks-codex/tests/coverage-cases.ts index c193d6d77c..499a4a8fc1 100644 --- a/packages/experimental/hooks-codex/tests/coverage-cases.ts +++ b/packages/experimental/hooks-codex/tests/coverage-cases.ts @@ -13,7 +13,7 @@ import type { Agent } from '@deepseek-ai/dsh-agent' import AgentLoop from '@deepseek-ai/dsh-agent-loop' import { LocalBashExecutor } from '@deepseek-ai/dsh-bash-local' import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local' -import * as HooksCodex from '@deepseek-ai/dsh-experimental-hooks-codex' +import * as HooksCodex from '@deepseek-ai/dsh-hooks-codex' import { MockAdapter, textResponse, toolCallResponse } from '../../../core/agent-loop/tests/mock-adapter.ts' declare module '@deepseek-ai/dsh-llm' { diff --git a/packages/experimental/session-title-all-prompts-llm/README.i18n.yaml b/packages/experimental/session-title-all-prompts-llm/README.i18n.yaml index 7fff2ef7c1..6f51a56e44 100644 --- a/packages/experimental/session-title-all-prompts-llm/README.i18n.yaml +++ b/packages/experimental/session-title-all-prompts-llm/README.i18n.yaml @@ -5,60 +5,60 @@ /: en: 0718b02e4cdd4cc6 zh: 2b5b4a729ce4d97e -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm: - en: 84039f66b655cce8 - zh: 5a9a2b0d3a279bd9 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/summary: - en: 68a4af9049b1ff36 - zh: 4af9408d01ecf8fc -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/table-of-contents: +/deepseek-ai-dsh-session-title-all-prompts-llm: + en: 1ab205ef1ee72cc2 + zh: f82abbf7a2461f27 +/deepseek-ai-dsh-session-title-all-prompts-llm/summary: + en: 9f64c4dd5e30f1c8 + zh: 35cf397596083be5 +/deepseek-ai-dsh-session-title-all-prompts-llm/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/use-this-package: +/deepseek-ai-dsh-session-title-all-prompts-llm/use-this-package: en: 2c0bccf753fe70eb zh: 36b96a547ddddfc1 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/use-this-package/when-titles-are-generated: +/deepseek-ai-dsh-session-title-all-prompts-llm/use-this-package/when-titles-are-generated: en: 3c9e14df96e6000e zh: a13f12a3df426380 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/use-this-package/configuration: - en: 13fc86b28d0d5116 - zh: 4d677bfe375539cc -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/use-this-package/failures-and-recovery: +/deepseek-ai-dsh-session-title-all-prompts-llm/use-this-package/configuration: + en: 1965c9ce7dedb2e7 + zh: 9b9c9b68af995b51 +/deepseek-ai-dsh-session-title-all-prompts-llm/use-this-package/failures-and-recovery: en: 6077a4665a4edb87 zh: 539c4e5969f9bb9b -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/understand-the-implementation: +/deepseek-ai-dsh-session-title-all-prompts-llm/understand-the-implementation: en: 506933ffa7745b7d zh: a9bb6f06a32b7c18 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/understand-the-implementation/design-concept: +/deepseek-ai-dsh-session-title-all-prompts-llm/understand-the-implementation/design-concept: en: 2c307e1480e5c319 zh: 60c7394728f7ff9c -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/understand-the-implementation/source-map: +/deepseek-ai-dsh-session-title-all-prompts-llm/understand-the-implementation/source-map: en: e7ae42597cc501a6 zh: 2e55e9b293b25958 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/understand-the-implementation/scheduling: +/deepseek-ai-dsh-session-title-all-prompts-llm/understand-the-implementation/scheduling: en: ca23821924af2b14 zh: a384479d5e69b0f8 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/further-exploration: +/deepseek-ai-dsh-session-title-all-prompts-llm/further-exploration: en: 05c91c92fa3b1c7d zh: 8e90078647bdb018 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/model-experience: +/deepseek-ai-dsh-session-title-all-prompts-llm/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/model-experience/all-messages-title-request: +/deepseek-ai-dsh-session-title-all-prompts-llm/model-experience/all-messages-title-request: en: 42380e2d029288cf zh: e9c9f21ac00e3c9d -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/model-experience/all-messages-title-request/what-the-model-sees: +/deepseek-ai-dsh-session-title-all-prompts-llm/model-experience/all-messages-title-request/what-the-model-sees: en: 39cb7059a3ab1fe6 zh: a3fd93ac52f12a43 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/model-experience/all-messages-title-request/token-effect: +/deepseek-ai-dsh-session-title-all-prompts-llm/model-experience/all-messages-title-request/token-effect: en: 1a075b8073c16ce3 zh: a51ff16156f9c137 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/model-experience/all-messages-title-request/kv-cache-effect: +/deepseek-ai-dsh-session-title-all-prompts-llm/model-experience/all-messages-title-request/kv-cache-effect: en: 6a70f43f38b8c075 zh: 2b823aff93344134 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/known-limitations-and-deferred-work: +/deepseek-ai-dsh-session-title-all-prompts-llm/known-limitations-and-deferred-work: en: d0486c65afaebb85 zh: 186a77e0d68bd968 -/deepseek-ai-dsh-experimental-session-title-all-prompts-llm/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-session-title-all-prompts-llm/known-limitations-and-deferred-work/dev-note: en: e67f633dc6fe7773 zh: 3bb0c20c93f16f98 diff --git a/packages/experimental/session-title-all-prompts-llm/README.md b/packages/experimental/session-title-all-prompts-llm/README.md index dfba9cfe7f..492f6c4687 100644 --- a/packages/experimental/session-title-all-prompts-llm/README.md +++ b/packages/experimental/session-title-all-prompts-llm/README.md @@ -3,13 +3,13 @@ description: "All-messages LLM session-title provider for users and maintainers kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-session-title-all-prompts-llm +# @deepseek-ai/dsh-session-title-all-prompts-llm English | [中文](README.zh.md) ## Summary -`dsh-experimental-session-title-all-prompts-llm` summarizes every eligible human message through `ctx.llm` as an optional `ctx.sessionTitle` provider. It registers the `all-prompts` cadence and starts a new revision after each new human prompt, using seeded history and child-session prompts. A newer revision aborts and supersedes older work, and even a provider that ignores cancellation cannot commit stale output. It uses the complete required shared LLM configuration from `dsh-session-title-llm`, so route, prompt, budget, and cancellation behavior cannot drift. Automatic behavior and configuration come first; the implementation is a thin registration over the shared policy. +`dsh-session-title-all-prompts-llm` summarizes every eligible human message through `ctx.llm` as an optional `ctx.sessionTitle` provider. It registers the `all-prompts` cadence and starts a new revision after each new human prompt, using seeded history and child-session prompts. A newer revision aborts and supersedes older work, and even a provider that ignores cancellation cannot commit stale output. It uses the complete required shared LLM configuration from `dsh-session-title-llm`, so route, prompt, budget, and cancellation behavior cannot drift. Automatic behavior and configuration come first; the implementation is a thin registration over the shared policy. ## Table of Contents @@ -33,7 +33,7 @@ A new revision starts after each new eligible human prompt, including prompts in ### Configuration -The plugin accepts the complete required [shared LLM configuration](../../session/session-title-llm/README.md#configuration): `targetWords`, `targetCjkCharacters`, `maxInputBytes`, `maxOutputTokens`, `timeoutMs`, and the optional paired `provider`/`model` route. Omit both to inherit the exact route from each current logged main request, or set both to route title generation independently. The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-session-title-all-prompts-llm) is the exhaustive source for every accepted field. +The plugin accepts the complete required [shared LLM configuration](../../session/session-title-llm/README.md#configuration): `targetWords`, `targetCjkCharacters`, `maxInputBytes`, `maxOutputTokens`, `timeoutMs`, and the optional paired `provider`/`model` route. Omit both to inherit the exact route from each current logged main request, or set both to route title generation independently. The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-session-title-all-prompts-llm) is the exhaustive source for every accepted field. ### Failures and recovery diff --git a/packages/experimental/session-title-all-prompts-llm/README.zh.md b/packages/experimental/session-title-all-prompts-llm/README.zh.md index 98da4d9381..be5ef6f6e2 100644 --- a/packages/experimental/session-title-all-prompts-llm/README.zh.md +++ b/packages/experimental/session-title-all-prompts-llm/README.zh.md @@ -3,13 +3,13 @@ description: "面向用户与维护者的全消息 LLM(大语言模型)会 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-session-title-all-prompts-llm +# @deepseek-ai/dsh-session-title-all-prompts-llm [English](README.md) | 中文 ## 概述 -`dsh-experimental-session-title-all-prompts-llm` 作为可选的 `ctx.sessionTitle` 提供方,通过 `ctx.llm` 总结所有符合条件的用户消息。它注册 `all-prompts` 节奏,并在每条新用户提示词后启动新修订,使用预置历史与子会话提示词。较新的修订会中止并取代旧工作,即使提供方忽略取消,也无法提交陈旧输出。它使用 `dsh-session-title-llm` 的完整必填共享 LLM 配置,因此路由、提示词、预算与取消行为不会漂移。本文优先介绍自动行为与配置;实现只是基于共享策略进行的轻量注册。 +`dsh-session-title-all-prompts-llm` 作为可选的 `ctx.sessionTitle` 提供方,通过 `ctx.llm` 总结所有符合条件的用户消息。它注册 `all-prompts` 节奏,并在每条新用户提示词后启动新修订,使用预置历史与子会话提示词。较新的修订会中止并取代旧工作,即使提供方忽略取消,也无法提交陈旧输出。它使用 `dsh-session-title-llm` 的完整必填共享 LLM 配置,因此路由、提示词、预算与取消行为不会漂移。本文优先介绍自动行为与配置;实现只是基于共享策略进行的轻量注册。 ## 目录 @@ -33,7 +33,7 @@ kind: "package-reference" ### 配置 -插件接受完整必填的[共享 LLM 配置](../../session/session-title-llm/README.zh.md#configuration):`targetWords`、`targetCjkCharacters`、`maxInputBytes`、`maxOutputTokens`、`timeoutMs`,以及可选成对的 `provider`/`model` 路由。同时省略二者,会继承每个当前已记录主请求的确切路由;同时设置二者,则让标题生成使用独立路由。生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-session-title-all-prompts-llm)是每个受支持字段的穷尽式真源。 +插件接受完整必填的[共享 LLM 配置](../../session/session-title-llm/README.zh.md#configuration):`targetWords`、`targetCjkCharacters`、`maxInputBytes`、`maxOutputTokens`、`timeoutMs`,以及可选成对的 `provider`/`model` 路由。同时省略二者,会继承每个当前已记录主请求的确切路由;同时设置二者,则让标题生成使用独立路由。生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-session-title-all-prompts-llm)是每个受支持字段的穷尽式真源。 ### 失败与恢复 diff --git a/packages/experimental/session-title-all-prompts-llm/package.json b/packages/experimental/session-title-all-prompts-llm/package.json index f5b7e9e8ed..0768ee82b0 100644 --- a/packages/experimental/session-title-all-prompts-llm/package.json +++ b/packages/experimental/session-title-all-prompts-llm/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-session-title-all-prompts-llm", + "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", "version": "0.2.1-alpha.1", "publishConfig": { diff --git a/packages/experimental/session-title-all-prompts-llm/tests/provider.spec.ts b/packages/experimental/session-title-all-prompts-llm/tests/provider.spec.ts index 09b3d52983..429f1f5bd3 100644 --- a/packages/experimental/session-title-all-prompts-llm/tests/provider.spec.ts +++ b/packages/experimental/session-title-all-prompts-llm/tests/provider.spec.ts @@ -6,7 +6,7 @@ import SessionStore, { Session, SessionId } from '@deepseek-ai/dsh-session' import SessionProjectionRegistry from '@deepseek-ai/dsh-session-projection' import { turnBoundaryProjectionDefinition } from '@deepseek-ai/dsh-agent-loop' import SessionTitleService from '@deepseek-ai/dsh-session-title' -import * as providerPlugin from '@deepseek-ai/dsh-experimental-session-title-all-prompts-llm' +import * as providerPlugin from '@deepseek-ai/dsh-session-title-all-prompts-llm' class RecordingAdapter extends LlmAdapter { readonly requests: GenerateOptions[] = [] diff --git a/packages/experimental/skill-badge/README.i18n.yaml b/packages/experimental/skill-badge/README.i18n.yaml index cead4f011f..1265a6ca82 100644 --- a/packages/experimental/skill-badge/README.i18n.yaml +++ b/packages/experimental/skill-badge/README.i18n.yaml @@ -5,51 +5,51 @@ /: en: c32f79a869ebd48a zh: 44e64fb59fa75e57 -/deepseek-ai-dsh-experimental-skill-badge: - en: 010ea3c872c7967e - zh: 7c2e653c73f0ec24 -/deepseek-ai-dsh-experimental-skill-badge/summary: +/deepseek-ai-dsh-skill-badge: + en: 2e49dd1b621b834d + zh: 1eb37e3b23098c77 +/deepseek-ai-dsh-skill-badge/summary: en: 49bdd760ee9e4370 zh: 2a4e68a7ef28d3e6 -/deepseek-ai-dsh-experimental-skill-badge/table-of-contents: +/deepseek-ai-dsh-skill-badge/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-skill-badge/use-this-package: +/deepseek-ai-dsh-skill-badge/use-this-package: en: a559a5ed8a76e342 zh: 6558f9af8d6c9625 -/deepseek-ai-dsh-experimental-skill-badge/use-this-package/when-to-choose-it: +/deepseek-ai-dsh-skill-badge/use-this-package/when-to-choose-it: en: 4e424f3ab2a8b5b1 zh: e38162f15f0a8354 -/deepseek-ai-dsh-experimental-skill-badge/use-this-package/enable-the-plugin: - en: bdd4d54b093d597b - zh: f1628bc93844f35d -/deepseek-ai-dsh-experimental-skill-badge/use-this-package/what-the-badge-skill-provides: +/deepseek-ai-dsh-skill-badge/use-this-package/enable-the-plugin: + en: a52d308db24e47bc + zh: 4e79dae8fa75e484 +/deepseek-ai-dsh-skill-badge/use-this-package/what-the-badge-skill-provides: en: 7144db5613266a9b zh: d1b7edf6c1253e9a -/deepseek-ai-dsh-experimental-skill-badge/use-this-package/observable-success-and-failures: +/deepseek-ai-dsh-skill-badge/use-this-package/observable-success-and-failures: en: dd749b384f657fa8 zh: d2ab3f5adf29bd33 -/deepseek-ai-dsh-experimental-skill-badge/understand-the-implementation: +/deepseek-ai-dsh-skill-badge/understand-the-implementation: en: 63465b0133f30e85 zh: 84bebb7c1fe0ceba -/deepseek-ai-dsh-experimental-skill-badge/understand-the-implementation/design-concept: +/deepseek-ai-dsh-skill-badge/understand-the-implementation/design-concept: en: 52ff92fad6d26ee9 zh: 071c7859c158513d -/deepseek-ai-dsh-experimental-skill-badge/understand-the-implementation/source-map: +/deepseek-ai-dsh-skill-badge/understand-the-implementation/source-map: en: 259b9b2073da8ddd zh: e0d621f0a3b0470c -/deepseek-ai-dsh-experimental-skill-badge/further-exploration: +/deepseek-ai-dsh-skill-badge/further-exploration: en: 1b5434b8bcbd5b0b zh: d170cddf3837e655 -/deepseek-ai-dsh-experimental-skill-badge/model-experience: +/deepseek-ai-dsh-skill-badge/model-experience: en: b9912bc3f1ba0680 zh: e288cc67b6d079f6 -/deepseek-ai-dsh-experimental-skill-badge/model-experience/kv-cache-effect: +/deepseek-ai-dsh-skill-badge/model-experience/kv-cache-effect: en: 5b5bcb4fc0513bef zh: 67a1d939c6a18c2e -/deepseek-ai-dsh-experimental-skill-badge/known-limitations-and-deferred-work: +/deepseek-ai-dsh-skill-badge/known-limitations-and-deferred-work: en: c7e405ebbc1d4602 zh: 05a57fb4359da265 -/deepseek-ai-dsh-experimental-skill-badge/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-skill-badge/known-limitations-and-deferred-work/dev-note: en: e67f633dc6fe7773 zh: 3bb0c20c93f16f98 diff --git a/packages/experimental/skill-badge/README.md b/packages/experimental/skill-badge/README.md index af6a5748cd..25bc5dd02e 100644 --- a/packages/experimental/skill-badge/README.md +++ b/packages/experimental/skill-badge/README.md @@ -3,7 +3,7 @@ description: "The bundled 'powered by dsh' badge skill for users and maintainers kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-skill-badge +# @deepseek-ai/dsh-skill-badge English | [中文](README.zh.md) @@ -33,12 +33,12 @@ Choose this provider when content produced with DeepSeek Harness should carry of ### Enable the plugin -Install `@deepseek-ai/dsh-experimental-skill-badge` into the profile and insert its plugin row. The default composition does not declare it. +Install `@deepseek-ai/dsh-skill-badge` into the profile and insert its plugin row. The default composition does not declare it. ```yaml - insert: - id: skill-badge - name: '@deepseek-ai/dsh-experimental-skill-badge' + name: '@deepseek-ai/dsh-skill-badge' ``` After enabling, `dsh-badge` appears in the available skills of the session catalog. The skill covers remote Markdown badges (Shields.io-based) and a packaged PNG badge asset for targets that cannot fetch remote images reliably. diff --git a/packages/experimental/skill-badge/README.zh.md b/packages/experimental/skill-badge/README.zh.md index 78ba404e0a..7beeb177e5 100644 --- a/packages/experimental/skill-badge/README.zh.md +++ b/packages/experimental/skill-badge/README.zh.md @@ -3,7 +3,7 @@ description: "随包附带的「powered by dsh」徽章 skill(技能),供 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-skill-badge +# @deepseek-ai/dsh-skill-badge [English](README.md) | 中文 @@ -33,12 +33,12 @@ agent(智能体)可以通过该内置提供方加载官方「powered by dsh ### 启用插件 -将 `@deepseek-ai/dsh-experimental-skill-badge` 安装到 profile,并插入插件行。默认组合不声明该行。 +将 `@deepseek-ai/dsh-skill-badge` 安装到 profile,并插入插件行。默认组合不声明该行。 ```yaml - insert: - id: skill-badge - name: '@deepseek-ai/dsh-experimental-skill-badge' + name: '@deepseek-ai/dsh-skill-badge' ``` 启用后,`dsh-badge` 会出现在会话目录的可用 skill 中。该 skill 覆盖远程 Markdown 徽章(基于 Shields.io)和随包分发的 PNG 徽章资源,后者用于无法可靠获取远程图片的目标环境。 diff --git a/packages/experimental/skill-badge/package.json b/packages/experimental/skill-badge/package.json index 399af02f9b..fdc2588323 100644 --- a/packages/experimental/skill-badge/package.json +++ b/packages/experimental/skill-badge/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-skill-badge", + "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", "version": "0.2.1-alpha.1", "publishConfig": { diff --git a/packages/experimental/skill-badge/src/index.ts b/packages/experimental/skill-badge/src/index.ts index c75b8252c3..753d51f817 100644 --- a/packages/experimental/skill-badge/src/index.ts +++ b/packages/experimental/skill-badge/src/index.ts @@ -1,7 +1,7 @@ /** * Bundled `dsh-badge` skill provider. * - * @module @deepseek-ai/dsh-experimental-skill-badge + * @module @deepseek-ai/dsh-skill-badge */ import { readFile } from 'node:fs/promises' diff --git a/packages/experimental/skill-badge/tests/skill-badge.spec.ts b/packages/experimental/skill-badge/tests/skill-badge.spec.ts index 4243bd3fdf..f66e1bb9dc 100644 --- a/packages/experimental/skill-badge/tests/skill-badge.spec.ts +++ b/packages/experimental/skill-badge/tests/skill-badge.spec.ts @@ -4,9 +4,9 @@ import { fileURLToPath } from 'node:url' import { Context } from '@deepseek-ai/cordis' import { describe, expect, it } from 'vitest' import SkillRegistry from '@deepseek-ai/dsh-skill' -import * as SkillBadge from '@deepseek-ai/dsh-experimental-skill-badge' +import * as SkillBadge from '@deepseek-ai/dsh-skill-badge' -describe('dsh-experimental-skill-badge', () => { +describe('dsh-skill-badge', () => { it('registers and disposes the bundled badge skill', async () => { const ctx = new Context() await ctx.plugin(SkillRegistry) diff --git a/packages/experimental/tool-ralph/README.i18n.yaml b/packages/experimental/tool-ralph/README.i18n.yaml index d0bc4d5933..b3f96e6e46 100644 --- a/packages/experimental/tool-ralph/README.i18n.yaml +++ b/packages/experimental/tool-ralph/README.i18n.yaml @@ -5,96 +5,96 @@ /: en: e2a31cca62823561 zh: c06ff93cf98b67e4 -/deepseek-ai-dsh-experimental-tool-ralph: - en: 58151c8408ee0683 - zh: f82cca40f517d2d4 -/deepseek-ai-dsh-experimental-tool-ralph/summary: +/deepseek-ai-dsh-tool-ralph: + en: f5015432a536b0dd + zh: 57e4f564cd4c966c +/deepseek-ai-dsh-tool-ralph/summary: en: 9821960147153443 zh: 0b24aab94a5dc12b -/deepseek-ai-dsh-experimental-tool-ralph/table-of-contents: +/deepseek-ai-dsh-tool-ralph/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-tool-ralph/use-this-package: +/deepseek-ai-dsh-tool-ralph/use-this-package: en: 13380e1170c6a3b5 zh: 2f2665f2ee5ff6f7 -/deepseek-ai-dsh-experimental-tool-ralph/use-this-package/calling-the-tool: +/deepseek-ai-dsh-tool-ralph/use-this-package/calling-the-tool: en: f43e8fbcf272ac45 zh: 46719b415d9ad4bf -/deepseek-ai-dsh-experimental-tool-ralph/use-this-package/what-each-round-sees: +/deepseek-ai-dsh-tool-ralph/use-this-package/what-each-round-sees: en: 2d8b861c4bcb9424 zh: 63c7b2d00c324727 -/deepseek-ai-dsh-experimental-tool-ralph/use-this-package/config: - en: 45eed16eb7d1a6d0 - zh: a080e65eff58f393 -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation: +/deepseek-ai-dsh-tool-ralph/use-this-package/config: + en: 4f0ba81742e46af0 + zh: e47ba7d9737fa51f +/deepseek-ai-dsh-tool-ralph/understand-the-implementation: en: 0999ea3a4c9da48c zh: 83013ee36a8689af -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation/design-concept: +/deepseek-ai-dsh-tool-ralph/understand-the-implementation/design-concept: en: 3777bac0215c7366 zh: 18240f47506c67bd -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation/fixed-script-and-routing: +/deepseek-ai-dsh-tool-ralph/understand-the-implementation/fixed-script-and-routing: en: fa2cfda2d9d121e6 zh: 75720bd6244a2c96 -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation/report-validation: +/deepseek-ai-dsh-tool-ralph/understand-the-implementation/report-validation: en: 65f90bce7ef1fe5b zh: 04c8d5ad08a9007c -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation/lifecycle-and-cancellation: +/deepseek-ai-dsh-tool-ralph/understand-the-implementation/lifecycle-and-cancellation: en: fdd98f9e2d2ec378 zh: 72e3da1f3c717aa6 -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation/render-intent: +/deepseek-ai-dsh-tool-ralph/understand-the-implementation/render-intent: en: 07e071bd44b1df65 zh: 26f1cb2eab8c25b0 -/deepseek-ai-dsh-experimental-tool-ralph/understand-the-implementation/source-map: +/deepseek-ai-dsh-tool-ralph/understand-the-implementation/source-map: en: 1bc11234792b4e3f zh: 872d2c5f8df37b72 -/deepseek-ai-dsh-experimental-tool-ralph/further-exploration: +/deepseek-ai-dsh-tool-ralph/further-exploration: en: 966417f5c0659ef9 zh: 6c95a000db46ce0f -/deepseek-ai-dsh-experimental-tool-ralph/model-experience: +/deepseek-ai-dsh-tool-ralph/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/system-prompt: +/deepseek-ai-dsh-tool-ralph/model-experience/system-prompt: en: cf78b9dd5596495f zh: bd44560f8c2435e8 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/system-prompt/what-the-model-sees: +/deepseek-ai-dsh-tool-ralph/model-experience/system-prompt/what-the-model-sees: en: bcfb20c5be49c2c4 zh: c666f686a648fc0f -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/system-prompt/what-the-model-sees/ralph-guidance: +/deepseek-ai-dsh-tool-ralph/model-experience/system-prompt/what-the-model-sees/ralph-guidance: en: 4ee32d69a7ae2aba zh: bdf2035f010ab56a -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/system-prompt/token-effect: +/deepseek-ai-dsh-tool-ralph/model-experience/system-prompt/token-effect: en: dab67480bfde6224 zh: 85bbf18da3767aa7 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/system-prompt/kv-cache-effect: +/deepseek-ai-dsh-tool-ralph/model-experience/system-prompt/kv-cache-effect: en: 13e7c6007bf6b5dc zh: 2b0da8b6dc00aa5e -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/tool-schema: +/deepseek-ai-dsh-tool-ralph/model-experience/tool-schema: en: e4c7376d4f29dbd5 zh: 6b7a9eaf69c9ea53 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/tool-schema/what-the-model-sees: - en: 11d15d6c18d57a3c - zh: 41f6ea487cd4d610 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/tool-schema/token-effect: +/deepseek-ai-dsh-tool-ralph/model-experience/tool-schema/what-the-model-sees: + en: d3e219e3f0e507ed + zh: daf8093ed21eb9cf +/deepseek-ai-dsh-tool-ralph/model-experience/tool-schema/token-effect: en: 0af719618f9f99d2 zh: a719a4e5df1406a4 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/tool-schema/kv-cache-effect: +/deepseek-ai-dsh-tool-ralph/model-experience/tool-schema/kv-cache-effect: en: 79a20d1db0f4a32e zh: c72a19d9a6c0bff3 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/child-requests-and-parent-result: +/deepseek-ai-dsh-tool-ralph/model-experience/child-requests-and-parent-result: en: 55181fb745ab8135 zh: ebeea6a8748986d2 -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/child-requests-and-parent-result/what-the-model-sees: +/deepseek-ai-dsh-tool-ralph/model-experience/child-requests-and-parent-result/what-the-model-sees: en: 788029304e88ea74 zh: 0e0281c7cc393dff -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/child-requests-and-parent-result/token-effect: +/deepseek-ai-dsh-tool-ralph/model-experience/child-requests-and-parent-result/token-effect: en: ab2d30ed91979cbc zh: bb074b02c4b05e4f -/deepseek-ai-dsh-experimental-tool-ralph/model-experience/child-requests-and-parent-result/kv-cache-effect: +/deepseek-ai-dsh-tool-ralph/model-experience/child-requests-and-parent-result/kv-cache-effect: en: 8f28959dc87d1f2f zh: c034c5c0bdaf9bba -/deepseek-ai-dsh-experimental-tool-ralph/known-limitations-and-deferred-work: +/deepseek-ai-dsh-tool-ralph/known-limitations-and-deferred-work: en: 4e3629e8de05fe18 zh: 5b33af22079a2ca7 -/deepseek-ai-dsh-experimental-tool-ralph/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-tool-ralph/known-limitations-and-deferred-work/dev-note: en: 8f24c317039e1974 zh: c6209969ad21f16c diff --git a/packages/experimental/tool-ralph/README.md b/packages/experimental/tool-ralph/README.md index 9130fc6358..0a9d944525 100644 --- a/packages/experimental/tool-ralph/README.md +++ b/packages/experimental/tool-ralph/README.md @@ -3,7 +3,7 @@ description: "The model-facing ralph tool: a fixed foreground fresh-agent loop t kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-tool-ralph +# @deepseek-ai/dsh-tool-ralph English | [中文](README.zh.md) @@ -44,7 +44,7 @@ Each child receives only the immutable objective, its current round and cap, a s | `maxHandoffChars` | `16384` | Maximum serialized characters in one round report. | | `maxResultChars` | `16384` | Maximum characters in the complete successful parent result. | -The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-tool-ralph) is the exhaustive source for every accepted field. The configured provider must exist, support structured output, and report `inheritsParentContext: false`; a call against a provider that violates this fails loudly before any round starts. +The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-tool-ralph) is the exhaustive source for every accepted field. The configured provider must exist, support structured output, and report `inheritsParentContext: false`; a call against a provider that violates this fails loudly before any round starts. ----- @@ -127,7 +127,7 @@ Prefix-stable while the plugin scope and guidance text are unchanged. Activation #### What the model sees -The generated [`ralph` schema](../../../docs/tool-catalog.md#deepseek-aidsh-experimental-tool-ralph) exposes one required `objective` string and one optional `maxRounds` number. Provider choice, handoff size, report schema, workflow script, and orchestration behavior are deployment-owned and absent from the call schema. +The generated [`ralph` schema](../../../docs/tool-catalog.md#deepseek-aidsh-tool-ralph) exposes one required `objective` string and one optional `maxRounds` number. Provider choice, handoff size, report schema, workflow script, and orchestration behavior are deployment-owned and absent from the call schema. #### Token effect diff --git a/packages/experimental/tool-ralph/README.zh.md b/packages/experimental/tool-ralph/README.zh.md index 67404e3d83..8eedae966c 100644 --- a/packages/experimental/tool-ralph/README.zh.md +++ b/packages/experimental/tool-ralph/README.zh.md @@ -3,7 +3,7 @@ description: "面向模型的 ralph 工具:固定前台 agent loop(智能体 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-tool-ralph +# @deepseek-ai/dsh-tool-ralph [English](README.md) | 中文 @@ -44,7 +44,7 @@ kind: "package-reference" | `maxHandoffChars` | `16384` | 一份 Round 报告序列化后的最大字符数。 | | `maxResultChars` | `16384` | 返回给父级的完整成功结果最大字符数。 | -生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-tool-ralph)是每个受支持字段的穷尽式真源。配置的提供方必须存在、支持结构化输出,并报告 `inheritsParentContext: false`;针对违反此要求的提供方发起调用时,会在任何 Round 开始前直接报错。 +生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-tool-ralph)是每个受支持字段的穷尽式真源。配置的提供方必须存在、支持结构化输出,并报告 `inheritsParentContext: false`;针对违反此要求的提供方发起调用时,会在任何 Round 开始前直接报错。 ----- @@ -127,7 +127,7 @@ Use the ralph tool ONLY when the direct human explicitly asks for a Ralph loop o #### 模型看到什么 -已生成的 [`ralph` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-experimental-tool-ralph) 公开一个必填 `objective` 字符串与一个可选 `maxRounds` 数字。提供方选择、交接大小、报告 schema、工作流脚本与编排行为均由部署侧控制,不在调用 schema 中。 +已生成的 [`ralph` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-ralph) 公开一个必填 `objective` 字符串与一个可选 `maxRounds` 数字。提供方选择、交接大小、报告 schema、工作流脚本与编排行为均由部署侧控制,不在调用 schema 中。 #### Token 影响 diff --git a/packages/experimental/tool-ralph/package.json b/packages/experimental/tool-ralph/package.json index 8ad56870ca..3458cc12db 100644 --- a/packages/experimental/tool-ralph/package.json +++ b/packages/experimental/tool-ralph/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-tool-ralph", + "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", "version": "0.2.1-alpha.1", "publishConfig": { diff --git a/packages/experimental/tool-ralph/src/index.ts b/packages/experimental/tool-ralph/src/index.ts index a760d23d37..48708c12ca 100644 --- a/packages/experimental/tool-ralph/src/index.ts +++ b/packages/experimental/tool-ralph/src/index.ts @@ -2,7 +2,7 @@ * Model-facing foreground Ralph loop over the workflow and subagent seams. A * fixed script starts one fresh structured-output child per round, carrying * only the immutable objective and the previous bounded handoff between them. - * @module @deepseek-ai/dsh-experimental-tool-ralph + * @module @deepseek-ai/dsh-tool-ralph */ import type { Context } from '@deepseek-ai/cordis' diff --git a/packages/experimental/tool-ralph/tests/integration.spec.ts b/packages/experimental/tool-ralph/tests/integration.spec.ts index f6b774389d..457b1270a1 100644 --- a/packages/experimental/tool-ralph/tests/integration.spec.ts +++ b/packages/experimental/tool-ralph/tests/integration.spec.ts @@ -51,7 +51,7 @@ async function mountRalph(script: MockScript, config: toolRalph.Config) { return { ctx, adapter, parentHandle, parent: parentHandle.agent } } -describe('dsh-experimental-tool-ralph over the real spawn and sandboxed PTC stack', () => { +describe('dsh-tool-ralph over the real spawn and sandboxed PTC stack', () => { it('uses distinct empty-seed children, shared cwd, and only the prior bounded handoff', { timeout: 90_000 }, async () => { const firstReport = { status: 'continue', diff --git a/packages/experimental/tool-ralph/tests/tool-ralph.spec.ts b/packages/experimental/tool-ralph/tests/tool-ralph.spec.ts index 5789cce6d8..b9e3044d9d 100644 --- a/packages/experimental/tool-ralph/tests/tool-ralph.spec.ts +++ b/packages/experimental/tool-ralph/tests/tool-ralph.spec.ts @@ -146,7 +146,7 @@ async function settleCompleted( return pending } -describe('dsh-experimental-tool-ralph', () => { +describe('dsh-tool-ralph', () => { it('starts the fixed workflow through the configured fresh provider and renders completion', async () => { const { ctx, engine, parent } = await setup({ config: { maxRounds: 9, maxHandoffChars: 9000 } }) const pending = execute(ctx, { objective: ' Finish the migration. ', maxRounds: 4 }, { agent: parent }) diff --git a/packages/experimental/tool-terminal/README.i18n.yaml b/packages/experimental/tool-terminal/README.i18n.yaml index d8ff65f534..9c42634e60 100644 --- a/packages/experimental/tool-terminal/README.i18n.yaml +++ b/packages/experimental/tool-terminal/README.i18n.yaml @@ -5,96 +5,96 @@ /: en: fc74eecdf1f2ad5b zh: dc9c2a28ce96ce67 -/deepseek-ai-dsh-experimental-tool-terminal: - en: 5eb5942c44854a88 - zh: 57a1fd4dbc5d05f8 -/deepseek-ai-dsh-experimental-tool-terminal/summary: - en: b355d2eef6e79be3 - zh: 1e5dbafd01f1e601 -/deepseek-ai-dsh-experimental-tool-terminal/table-of-contents: +/deepseek-ai-dsh-tool-terminal: + en: 68d62f7fc80920a7 + zh: 3e8cb4520dbbe933 +/deepseek-ai-dsh-tool-terminal/summary: + en: c0e810d4279333a5 + zh: 7e79b6a63fa10029 +/deepseek-ai-dsh-tool-terminal/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb -/deepseek-ai-dsh-experimental-tool-terminal/use-this-package: - en: dcc6b2ac23494026 - zh: f5b755ec75994458 -/deepseek-ai-dsh-experimental-tool-terminal/use-this-package/the-six-tools: +/deepseek-ai-dsh-tool-terminal/use-this-package: + en: 43b602baf5b35116 + zh: caffb91711393c3b +/deepseek-ai-dsh-tool-terminal/use-this-package/the-six-tools: en: 3e9b6211dd72ec64 zh: aa4cd15195cb43d6 -/deepseek-ai-dsh-experimental-tool-terminal/use-this-package/composition: +/deepseek-ai-dsh-tool-terminal/use-this-package/composition: en: 4ce2a232b60ff77d zh: 3a8a0f13371ca6b9 -/deepseek-ai-dsh-experimental-tool-terminal/use-this-package/configuration: - en: 3bf7e6c40c325fd8 - zh: 6bfe66f9bfc32d0f -/deepseek-ai-dsh-experimental-tool-terminal/use-this-package/background-sends: +/deepseek-ai-dsh-tool-terminal/use-this-package/configuration: + en: 0af09df923fcb322 + zh: 6d9d766c24c530bc +/deepseek-ai-dsh-tool-terminal/use-this-package/background-sends: en: 2ad49d4f69deb06d zh: 5f29972b5feec7e3 -/deepseek-ai-dsh-experimental-tool-terminal/use-this-package/observable-outcomes-and-failures: +/deepseek-ai-dsh-tool-terminal/use-this-package/observable-outcomes-and-failures: en: 321a982fdbbf4ada zh: 8c2636e5379815e1 -/deepseek-ai-dsh-experimental-tool-terminal/understand-the-implementation: +/deepseek-ai-dsh-tool-terminal/understand-the-implementation: en: 6302fca8fef89136 zh: 6327d56edb798ab2 -/deepseek-ai-dsh-experimental-tool-terminal/understand-the-implementation/design-concept: +/deepseek-ai-dsh-tool-terminal/understand-the-implementation/design-concept: en: dc500eeff749a06f zh: 9402f5005d7ca338 -/deepseek-ai-dsh-experimental-tool-terminal/understand-the-implementation/source-map: +/deepseek-ai-dsh-tool-terminal/understand-the-implementation/source-map: en: a59f4e76dc926bed zh: 24813cb1bd8fbf32 -/deepseek-ai-dsh-experimental-tool-terminal/understand-the-implementation/result-bounding: +/deepseek-ai-dsh-tool-terminal/understand-the-implementation/result-bounding: en: c1953779a1617d09 zh: cc6a4a6e76fa021c -/deepseek-ai-dsh-experimental-tool-terminal/understand-the-implementation/ui-render-intents: +/deepseek-ai-dsh-tool-terminal/understand-the-implementation/ui-render-intents: en: 03e5bb37f0c3aada zh: 8d51eeb758eabe9c -/deepseek-ai-dsh-experimental-tool-terminal/further-exploration: - en: eb3aaab52499b332 - zh: e39e5c6e87d7535b -/deepseek-ai-dsh-experimental-tool-terminal/model-experience: +/deepseek-ai-dsh-tool-terminal/further-exploration: + en: 45a0c33ed8104fb1 + zh: ae50c9e583ef4867 +/deepseek-ai-dsh-tool-terminal/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/system-prompt: +/deepseek-ai-dsh-tool-terminal/model-experience/system-prompt: en: cf78b9dd5596495f zh: bd44560f8c2435e8 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/system-prompt/what-the-model-sees: +/deepseek-ai-dsh-tool-terminal/model-experience/system-prompt/what-the-model-sees: en: 99887ae1de81aaeb zh: 4846a1d3ea8a3dc3 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/system-prompt/what-the-model-sees/terminal-guidance: +/deepseek-ai-dsh-tool-terminal/model-experience/system-prompt/what-the-model-sees/terminal-guidance: en: 3ab4211f41e40211 zh: b730cc3f278be17c -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/system-prompt/token-effect: +/deepseek-ai-dsh-tool-terminal/model-experience/system-prompt/token-effect: en: c9d6d1a8238b74ab zh: 7f4b12d6180b9bac -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/system-prompt/kv-cache-effect: +/deepseek-ai-dsh-tool-terminal/model-experience/system-prompt/kv-cache-effect: en: 7fdc10b826aeeb51 zh: 998c86c09efe43bd -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-schemas: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-schemas: en: 3039bc5e7a796b21 zh: 6b7a9eaf69c9ea53 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-schemas/what-the-model-sees: - en: 81df219069f3907a - zh: 4dd03f0ca5618f5a -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-schemas/token-effect: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-schemas/what-the-model-sees: + en: 32127d768242d8c4 + zh: 3095d987d6011f44 +/deepseek-ai-dsh-tool-terminal/model-experience/tool-schemas/token-effect: en: 824644a1f5fe76df zh: b34c7dd78c5ce3cd -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-schemas/kv-cache-effect: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-schemas/kv-cache-effect: en: c8cbbef533bdb90f zh: c0b00813b8419f46 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-results-and-task-context: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-results-and-task-context: en: 54e0c8a019f02479 zh: 7331b10d1a455d59 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-results-and-task-context/what-the-model-sees: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-results-and-task-context/what-the-model-sees: en: cc1e88a508d0679e zh: a219be277705c0ab -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-results-and-task-context/token-effect: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-results-and-task-context/token-effect: en: e4746b7b386944df zh: be52cd2fd38276b5 -/deepseek-ai-dsh-experimental-tool-terminal/model-experience/tool-results-and-task-context/kv-cache-effect: +/deepseek-ai-dsh-tool-terminal/model-experience/tool-results-and-task-context/kv-cache-effect: en: ac583ab16185a93c zh: 78df55a519b2ec1f -/deepseek-ai-dsh-experimental-tool-terminal/known-limitations-and-deferred-work: +/deepseek-ai-dsh-tool-terminal/known-limitations-and-deferred-work: en: ba974b703d6ed0bc zh: 655810d5d338343c -/deepseek-ai-dsh-experimental-tool-terminal/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-tool-terminal/known-limitations-and-deferred-work/dev-note: en: e67f633dc6fe7773 zh: 3bb0c20c93f16f98 diff --git a/packages/experimental/tool-terminal/README.md b/packages/experimental/tool-terminal/README.md index d518ca39e0..03f213dff3 100644 --- a/packages/experimental/tool-terminal/README.md +++ b/packages/experimental/tool-terminal/README.md @@ -3,13 +3,13 @@ description: "Six model-facing persistent terminal tools with owner isolation, b kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-tool-terminal +# @deepseek-ai/dsh-tool-terminal English | [中文](README.zh.md) ## Summary -Use `dsh-experimental-tool-terminal` when an agent needs persistent terminal state or interactive input across calls. It can open, send to, read, signal, close, and list terminal sessions while preventing one agent from operating another agent's sessions. Sends may wait for bounded foreground output or return a background job id for later collection or interruption. `maxResultBytes` caps each result, which remains in session history until compaction. The model is guided to prefer one-shot tools for bounded work. +Use `dsh-tool-terminal` when an agent needs persistent terminal state or interactive input across calls. It can open, send to, read, signal, close, and list terminal sessions while preventing one agent from operating another agent's sessions. Sends may wait for bounded foreground output or return a background job id for later collection or interruption. `maxResultBytes` caps each result, which remains in session history until compaction. The model is guided to prefer one-shot tools for bounded work. ## Table of Contents @@ -45,7 +45,7 @@ Enable these tools when the composition mounts a terminal backend and the model ```yaml - name: '@deepseek-ai/dsh-terminal' - name: '@deepseek-ai/dsh-terminal-bash' -- name: '@deepseek-ai/dsh-experimental-tool-terminal' +- name: '@deepseek-ai/dsh-tool-terminal' ``` The tools need `ctx.terminals` — a backend must be mounted — and the system-prompt service for the guidance section. Background sends additionally require the jobs service and its model-facing controller (`@deepseek-ai/dsh-tool-jobs`). @@ -57,7 +57,7 @@ The tools need `ctx.terminals` — a backend must be mounted — and the system- | `enableRunInBackground` | `true` | Expose and accept `run_in_background`; `false` removes the schema field and rejects the argument | | `maxResultBytes` | `262144` | UTF-8 cap (minimum `64`) for each complete terminal result after wait, session, pagination, truncation, and job-status metadata | -The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-experimental-tool-terminal) and [tool catalog](../../../docs/tool-catalog.md#deepseek-aidsh-experimental-tool-terminal) are the exhaustive sources for config fields and schemas. +The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-tool-terminal) and [tool catalog](../../../docs/tool-catalog.md#deepseek-aidsh-tool-terminal) are the exhaustive sources for config fields and schemas. ### Background sends @@ -105,7 +105,7 @@ Foreground sends use terminal call and result cards; background sends and the ot Read these pages when the package-level contract is not enough. They move from the generated schemas to the service contract, the backend, and the background-job surface. -- [Tool catalog](../../../docs/tool-catalog.md#deepseek-aidsh-experimental-tool-terminal) — the six generated schemas and result shapes. +- [Tool catalog](../../../docs/tool-catalog.md#deepseek-aidsh-tool-terminal) — the six generated schemas and result shapes. - [Terminal subsystem reference](../../../docs/subsystems/terminal.md) — the service contract and shared types behind the tools. - [terminal service](../../terminal/terminal/README.md) — session operations, owner fencing, and cleanup semantics. - [terminal-bash backend](../../terminal/terminal-bash/README.md) — the shipped shell backend that provides sessions. @@ -141,7 +141,7 @@ Prefix-stable while the registration scope and guidance text are unchanged. #### What the model sees -The six generated schemas are listed in the [`dsh-experimental-tool-terminal` catalog section](../../../docs/tool-catalog.md#deepseek-aidsh-experimental-tool-terminal). Their fixed schema tokens are present whenever this plugin is active; agent-scoped tool filtering may hide them. +The six generated schemas are listed in the [`dsh-tool-terminal` catalog section](../../../docs/tool-catalog.md#deepseek-aidsh-tool-terminal). Their fixed schema tokens are present whenever this plugin is active; agent-scoped tool filtering may hide them. #### Token effect diff --git a/packages/experimental/tool-terminal/README.zh.md b/packages/experimental/tool-terminal/README.zh.md index a357b697dc..097ede5cf7 100644 --- a/packages/experimental/tool-terminal/README.zh.md +++ b/packages/experimental/tool-terminal/README.zh.md @@ -3,13 +3,13 @@ description: "面向需要跨调用终端状态的 agent(智能体)的 6 个 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-tool-terminal +# @deepseek-ai/dsh-tool-terminal [English](README.md) | 中文 ## 概述 -当 agent 需要跨调用保留终端状态或提供交互式输入时,使用 `dsh-experimental-tool-terminal`。它可以打开、发送、读取、传递信号、关闭和列出终端会话,同时防止一个 agent 操作其他 agent 的会话。发送可以等待有界的前台输出,也可以返回供后续收集或中断的后台任务 job id。`maxResultBytes` 限制每个结果的大小,而结果会保留在会话历史中直到压缩(compaction)。指引会让模型对有界工作优先使用单次工具。 +当 agent 需要跨调用保留终端状态或提供交互式输入时,使用 `dsh-tool-terminal`。它可以打开、发送、读取、传递信号、关闭和列出终端会话,同时防止一个 agent 操作其他 agent 的会话。发送可以等待有界的前台输出,也可以返回供后续收集或中断的后台任务 job id。`maxResultBytes` 限制每个结果的大小,而结果会保留在会话历史中直到压缩(compaction)。指引会让模型对有界工作优先使用单次工具。 ## 目录 @@ -45,7 +45,7 @@ kind: "package-reference" ```yaml - name: '@deepseek-ai/dsh-terminal' - name: '@deepseek-ai/dsh-terminal-bash' -- name: '@deepseek-ai/dsh-experimental-tool-terminal' +- name: '@deepseek-ai/dsh-tool-terminal' ``` 工具需要 `ctx.terminals`——必须挂载一个后端——以及用于指引章节的系统提示词服务。后台发送还额外要求任务服务及其面向模型的控制器(`@deepseek-ai/dsh-tool-jobs`)。 @@ -57,7 +57,7 @@ kind: "package-reference" | `enableRunInBackground` | `true` | 公开并接受 `run_in_background`;设为 `false` 时移除 schema 字段并拒绝该参数 | | `maxResultBytes` | `262144` | 每个完整终端结果的 UTF-8 上限(最小值 `64`);在等待、会话、分页、截断与任务状态元数据全部加入后计算 | -生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-experimental-tool-terminal)与[工具目录](../../../docs/tool-catalog.zh.md#deepseek-aidsh-experimental-tool-terminal)是配置字段与 schema 的穷尽式真源。 +生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-tool-terminal)与[工具目录](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-terminal)是配置字段与 schema 的穷尽式真源。 ### 后台发送 @@ -105,7 +105,7 @@ kind: "package-reference" 当包级约定不够用时阅读以下页面。它们从生成的 schema 进入服务约定、后端与后台任务接口面。 -- [工具目录](../../../docs/tool-catalog.zh.md#deepseek-aidsh-experimental-tool-terminal)——6 个生成的 schema 与结果形态。 +- [工具目录](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-terminal)——6 个生成的 schema 与结果形态。 - [终端子系统参考](../../../docs/subsystems/terminal.zh.md)——工具背后的服务约定与共享类型。 - [terminal 服务](../../terminal/terminal/README.zh.md)——会话操作、所有者限制与清理语义。 - [terminal-bash 后端](../../terminal/terminal-bash/README.zh.md)——提供会话的随附 shell 后端。 @@ -141,7 +141,7 @@ Use a terminal session only when work needs persistent terminal state or interac #### 模型看到什么 -6 个生成的 schema 列在 [`dsh-experimental-tool-terminal` 目录章节](../../../docs/tool-catalog.zh.md#deepseek-aidsh-experimental-tool-terminal)中。此插件活跃时,请求中会包含它们的固定 schema token;按 agent 范围过滤工具时可能隐藏这些 schema。 +6 个生成的 schema 列在 [`dsh-tool-terminal` 目录章节](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-terminal)中。此插件活跃时,请求中会包含它们的固定 schema token;按 agent 范围过滤工具时可能隐藏这些 schema。 #### Token 影响 diff --git a/packages/experimental/tool-terminal/package.json b/packages/experimental/tool-terminal/package.json index 123c592bd6..c3140c8ea5 100644 --- a/packages/experimental/tool-terminal/package.json +++ b/packages/experimental/tool-terminal/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-tool-terminal", + "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", "version": "0.2.1-alpha.1", "publishConfig": { diff --git a/packages/experimental/tool-terminal/src/background.ts b/packages/experimental/tool-terminal/src/background.ts index 808cd086f4..47494f7cff 100644 --- a/packages/experimental/tool-terminal/src/background.ts +++ b/packages/experimental/tool-terminal/src/background.ts @@ -2,7 +2,7 @@ * Generic-job adaptation for background terminal sends: the registry pull * source over the backend's consuming send reader. * - * @module @deepseek-ai/dsh-experimental-tool-terminal/background + * @module @deepseek-ai/dsh-tool-terminal/background */ import type { JobOutputSource } from '@deepseek-ai/dsh-jobs' diff --git a/packages/experimental/tool-terminal/src/index.ts b/packages/experimental/tool-terminal/src/index.ts index 5d69fb1f8f..c27b7d68d6 100644 --- a/packages/experimental/tool-terminal/src/index.ts +++ b/packages/experimental/tool-terminal/src/index.ts @@ -1,7 +1,7 @@ /** * Six model-facing persistent terminal tools. Owner identity comes from the exact * tool execution Agent; generic `ctx.jobs` owns background ids and collection. - * @module @deepseek-ai/dsh-experimental-tool-terminal + * @module @deepseek-ai/dsh-tool-terminal */ import type {} from '@deepseek-ai/dsh-working-directory' diff --git a/packages/experimental/tool-terminal/tests/loader-composition.spec.ts b/packages/experimental/tool-terminal/tests/loader-composition.spec.ts index ba2d97bd0c..9d2db58481 100644 --- a/packages/experimental/tool-terminal/tests/loader-composition.spec.ts +++ b/packages/experimental/tool-terminal/tests/loader-composition.spec.ts @@ -20,7 +20,7 @@ import SandboxPolicyService from '@deepseek-ai/dsh-sandbox-policy' import SessionProjectionRegistry from '@deepseek-ai/dsh-session-projection' import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local' import * as TerminalLocal from '@deepseek-ai/dsh-terminal-bash' -import * as ToolPty from '@deepseek-ai/dsh-experimental-tool-terminal' +import * as ToolPty from '@deepseek-ai/dsh-tool-terminal' let root: string | undefined let context: Context | undefined @@ -85,7 +85,7 @@ suite('terminal real Loader composition through cordis.yml', () => { ' handoffGraceMs: 250', ' timeoutMs: 2000', ' disposeGraceMs: 500', - "- name: '@deepseek-ai/dsh-experimental-tool-terminal'", + "- name: '@deepseek-ai/dsh-tool-terminal'", '', ].join('\n')) @@ -105,7 +105,7 @@ suite('terminal real Loader composition through cordis.yml', () => { ['@deepseek-ai/dsh-sandbox-policy', SandboxPolicyService], ['@deepseek-ai/dsh-subprocess-local', LocalSubprocessRuntime], ['@deepseek-ai/dsh-terminal-bash', TerminalLocal], - ['@deepseek-ai/dsh-experimental-tool-terminal', ToolPty], + ['@deepseek-ai/dsh-tool-terminal', ToolPty], ]) context.loader.internal = { version: 'v2', diff --git a/packages/experimental/tool-terminal/tests/render.spec.ts b/packages/experimental/tool-terminal/tests/render.spec.ts index 6b0dd94b3b..f247f189ee 100644 --- a/packages/experimental/tool-terminal/tests/render.spec.ts +++ b/packages/experimental/tool-terminal/tests/render.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import { TerminalSessionId } from '@deepseek-ai/dsh-terminal' -import { boundTerminalText, renderList, renderRead, renderSend, renderSendRead, renderSpawn } from '@deepseek-ai/dsh-experimental-tool-terminal/src/render.ts' +import { boundTerminalText, renderList, renderRead, renderSend, renderSendRead, renderSpawn } from '@deepseek-ai/dsh-tool-terminal/src/render.ts' describe('tool-terminal rendering', () => { it('renders spawn with and without names or MOTD', () => { diff --git a/packages/experimental/tool-terminal/tests/tools.spec.ts b/packages/experimental/tool-terminal/tests/tools.spec.ts index c0c8d68d5b..8f6f3a5897 100644 --- a/packages/experimental/tool-terminal/tests/tools.spec.ts +++ b/packages/experimental/tool-terminal/tests/tools.spec.ts @@ -12,7 +12,7 @@ import TerminalSessionService, { TerminalSessionId } from '@deepseek-ai/dsh-term import type { TerminalBackend, TerminalBackendSession, TerminalSendOperation, TerminalSendRead, TerminalSendRequest, TerminalSessionStatus, TerminalSignal } from '@deepseek-ai/dsh-terminal' import LocalJobRegistry from '@deepseek-ai/dsh-jobs-local' import * as ToolJobs from '@deepseek-ai/dsh-tool-jobs' -import * as ToolPty from '@deepseek-ai/dsh-experimental-tool-terminal' +import * as ToolPty from '@deepseek-ai/dsh-tool-terminal' import { sendSource } from '../src/background.ts' async function fakeAgent(ctx: Context, rawId: string): Promise { diff --git a/packages/experimental/webhook-github/README.i18n.yaml b/packages/experimental/webhook-github/README.i18n.yaml index fd92dbc51f..8abb98c590 100644 --- a/packages/experimental/webhook-github/README.i18n.yaml +++ b/packages/experimental/webhook-github/README.i18n.yaml @@ -5,33 +5,33 @@ /: en: 60db7ae899ed9fd9 zh: 4fe10fa8823aa6d1 -/deepseek-ai-dsh-experimental-webhook-github: - en: 1fa2c31f0d7f265b - zh: f0f0d6433816355f -/deepseek-ai-dsh-experimental-webhook-github/summary: - en: f39045a4a4168bbe - zh: 01298bd3e609edc3 -/deepseek-ai-dsh-experimental-webhook-github/table-of-contents: +/deepseek-ai-dsh-webhook-github: + en: 5d7866a2fc1af1ce + zh: dc9c443910df7b07 +/deepseek-ai-dsh-webhook-github/summary: + en: 2db19f03dc3daea7 + zh: 291598d5f67485b9 +/deepseek-ai-dsh-webhook-github/table-of-contents: en: b946752a1c17cd00 zh: cdaaea55e4da6831 -/deepseek-ai-dsh-experimental-webhook-github/configuration: +/deepseek-ai-dsh-webhook-github/configuration: en: a32a5195a6ae6a61 zh: a135089e86948290 -/deepseek-ai-dsh-experimental-webhook-github/http-contract: +/deepseek-ai-dsh-webhook-github/http-contract: en: 2d8b5cb8d44bef8e zh: a98ec470d9d6bc2d -/deepseek-ai-dsh-experimental-webhook-github/dedicated-listener-composition: - en: fec88ad475169c2f - zh: 992572e6fb76a05b -/deepseek-ai-dsh-experimental-webhook-github/model-experience: - en: b5cc7b3fe7fe0cc1 - zh: 196653a3926c68fb -/deepseek-ai-dsh-experimental-webhook-github/model-experience/kv-cache-effect: +/deepseek-ai-dsh-webhook-github/dedicated-listener-composition: + en: a3f54e237a8cbd3d + zh: ce530fabb2036388 +/deepseek-ai-dsh-webhook-github/model-experience: + en: 17c5ff7cc39c5a2e + zh: f6fe32ae981dc4b6 +/deepseek-ai-dsh-webhook-github/model-experience/kv-cache-effect: en: a7c54f451f61179e zh: aaf25d0781ad4d6b -/deepseek-ai-dsh-experimental-webhook-github/known-limitations-and-deferred-work: +/deepseek-ai-dsh-webhook-github/known-limitations-and-deferred-work: en: 0c3192c3e300bb46 zh: 7c84d20e6a8a768e -/deepseek-ai-dsh-experimental-webhook-github/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-webhook-github/known-limitations-and-deferred-work/dev-note: en: e67f633dc6fe7773 zh: e88aeb617ffb74ea diff --git a/packages/experimental/webhook-github/README.md b/packages/experimental/webhook-github/README.md index 1d20bc5a48..f9fbcc3ab6 100644 --- a/packages/experimental/webhook-github/README.md +++ b/packages/experimental/webhook-github/README.md @@ -3,13 +3,13 @@ description: "Signed GitHub webhook adapter for deployments routing authenticate kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-webhook-github +# @deepseek-ai/dsh-webhook-github English | [中文](README.zh.md) ## Summary -`dsh-experimental-webhook-github` registers one exact HTTP route on the injected `ctx.webServer`. It bounds and verifies GitHub's raw JSON body, projects a provider-neutral delivery, calls `ctx.webhookRuntime.dispatch()`, and returns `202` without waiting for rules or Sessions. Use it when a deployment needs authenticated GitHub ingress for the generic webhook runtime. +`dsh-webhook-github` registers one exact HTTP route on the injected `ctx.webServer`. It bounds and verifies GitHub's raw JSON body, projects a provider-neutral delivery, calls `ctx.webhookRuntime.dispatch()`, and returns `202` without waiting for rules or Sessions. Use it when a deployment needs authenticated GitHub ingress for the generic webhook runtime. ## Table of Contents @@ -56,12 +56,12 @@ Only `POST application/json` is accepted. The adapter reads a bounded UTF-8 body The normal Web profile already owns `ctx.webServer`. Mount another `dsh-host-webserver` and this adapter inside a group that isolates only `webServer`; the adapter still inherits credentials and `webhookRuntime`. The [GitHub review guide](../../../docs/user/guide/github-review.md) uses `127.0.0.1:3081/github` behind a TLS reverse proxy while the UI remains on port 3080. -The package distributes the example overlay and rule module under `examples/github-review/`. Install this package and its `dsh-experimental-webhook` peer into the profile before loading that installed overlay; the [guide](../../../docs/user/guide/github-review.md) gives the complete commands. +The package distributes the example overlay and rule module under `examples/github-review/`. Install this package and its `dsh-webhook` peer into the profile before loading that installed overlay; the [guide](../../../docs/user/guide/github-review.md) gives the complete commands. ## Model Experience -Indirectly, through `dsh-experimental-webhook`: this adapter contributes no prompt or tool schema; a matching rule owns the Session request and model-visible text. +Indirectly, through `dsh-webhook`: this adapter contributes no prompt or tool schema; a matching rule owns the Session request and model-visible text. #### KV Cache effect diff --git a/packages/experimental/webhook-github/README.zh.md b/packages/experimental/webhook-github/README.zh.md index 91421abe32..1b41b3cc85 100644 --- a/packages/experimental/webhook-github/README.zh.md +++ b/packages/experimental/webhook-github/README.zh.md @@ -3,13 +3,13 @@ description: "面向把已认证 JSON 事件路由到 webhook 运行时的部署 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-webhook-github +# @deepseek-ai/dsh-webhook-github [English](README.md) | 中文 ## 概述 -`dsh-experimental-webhook-github` 会在注入的 `ctx.webServer` 上注册一条精确 HTTP 路由。它限制并验证 GitHub 原始 JSON body,投影提供方无关的交付,调用 `ctx.webhookRuntime.dispatch()`,并在不等待规则或会话的情况下返回 `202`。部署需要为通用 webhook 运行时提供经过身份验证的 GitHub 入口时,请使用它。 +`dsh-webhook-github` 会在注入的 `ctx.webServer` 上注册一条精确 HTTP 路由。它限制并验证 GitHub 原始 JSON body,投影提供方无关的交付,调用 `ctx.webhookRuntime.dispatch()`,并在不等待规则或会话的情况下返回 `202`。部署需要为通用 webhook 运行时提供经过身份验证的 GitHub 入口时,请使用它。 ## 目录 @@ -56,12 +56,12 @@ kind: "package-reference" 普通 Web profile 已经拥有 `ctx.webServer`。把另一个 `dsh-host-webserver` 和此适配器挂载到仅隔离 `webServer` 的 group 内;适配器仍会继承凭据与 `webhookRuntime`。[GitHub 评审指南](../../../docs/user/guide/github-review.zh.md)在 TLS 反向代理后使用 `127.0.0.1:3081/github`,而 UI 继续位于端口 3080。 -示例的 overlay 与规则模块随本包发布,位于 `examples/github-review/`。先将本包及其 `dsh-experimental-webhook` peer 安装到 profile,再从该安装目录加载 overlay;[指南](../../../docs/user/guide/github-review.zh.md)给出完整命令。 +示例的 overlay 与规则模块随本包发布,位于 `examples/github-review/`。先将本包及其 `dsh-webhook` peer 安装到 profile,再从该安装目录加载 overlay;[指南](../../../docs/user/guide/github-review.zh.md)给出完整命令。 ## 模型体验 -通过 `dsh-experimental-webhook` 间接产生影响:此适配器不贡献提示词或工具 schema;匹配规则拥有会话请求与模型可见文本。 +通过 `dsh-webhook` 间接产生影响:此适配器不贡献提示词或工具 schema;匹配规则拥有会话请求与模型可见文本。 #### KV Cache 影响 diff --git a/packages/experimental/webhook-github/examples/github-review/cordis.yml b/packages/experimental/webhook-github/examples/github-review/cordis.yml index af12155a50..71466d6e9f 100644 --- a/packages/experimental/webhook-github/examples/github-review/cordis.yml +++ b/packages/experimental/webhook-github/examples/github-review/cordis.yml @@ -3,7 +3,7 @@ - insert: - id: webhook-runtime - name: '@deepseek-ai/dsh-experimental-webhook' + name: '@deepseek-ai/dsh-webhook' - id: github-ready-review-rule name: './github-ready-review-rule.mjs' @@ -27,7 +27,7 @@ port: !!js Number(process.env.DSH_GITHUB_WEBHOOK_PORT ?? 3081) - id: github-webhook-adapter - name: '@deepseek-ai/dsh-experimental-webhook-github' + name: '@deepseek-ai/dsh-webhook-github' config: source: primary-github path: /github diff --git a/packages/experimental/webhook-github/examples/github-review/github-ready-review-rule.mjs b/packages/experimental/webhook-github/examples/github-review/github-ready-review-rule.mjs index 084a9df7e8..3b055269fd 100644 --- a/packages/experimental/webhook-github/examples/github-review/github-ready-review-rule.mjs +++ b/packages/experimental/webhook-github/examples/github-review/github-ready-review-rule.mjs @@ -1,5 +1,5 @@ import z from '@deepseek-ai/schemastery' -import { WebhookRuleId } from '@deepseek-ai/dsh-experimental-webhook' +import { WebhookRuleId } from '@deepseek-ai/dsh-webhook' export const name = 'github-ready-review-rule' export const inject = ['webhookRuntime'] diff --git a/packages/experimental/webhook-github/package.json b/packages/experimental/webhook-github/package.json index 83f616fc7a..f1f5c2c14a 100644 --- a/packages/experimental/webhook-github/package.json +++ b/packages/experimental/webhook-github/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-webhook-github", + "name": "@deepseek-ai/dsh-webhook-github", "description": "Signed GitHub HTTP webhook adapter for the DeepSeek Harness webhook runtime", "version": "0.2.1-alpha.1", "publishConfig": { @@ -39,7 +39,7 @@ "@deepseek-ai/dsh-credentials": "workspace:*", "@deepseek-ai/dsh-host-webserver": "workspace:*", "@deepseek-ai/dsh-session": "workspace:*", - "@deepseek-ai/dsh-experimental-webhook": "workspace:*" + "@deepseek-ai/dsh-webhook": "workspace:*" }, "dependencies": { "@deepseek-ai/dsh-util-values": "workspace:*", @@ -53,6 +53,6 @@ "@deepseek-ai/dsh-credentials": "workspace:*", "@deepseek-ai/dsh-host-webserver": "workspace:*", "@deepseek-ai/dsh-session": "workspace:*", - "@deepseek-ai/dsh-experimental-webhook": "workspace:*" + "@deepseek-ai/dsh-webhook": "workspace:*" } } diff --git a/packages/experimental/webhook-github/src/handler.ts b/packages/experimental/webhook-github/src/handler.ts index 7c036f6320..d4ea1fcefa 100644 --- a/packages/experimental/webhook-github/src/handler.ts +++ b/packages/experimental/webhook-github/src/handler.ts @@ -9,7 +9,7 @@ import { WebhookDeliveryId, WebhookSourceId, type VerifiedWebhookDelivery, -} from '@deepseek-ai/dsh-experimental-webhook' +} from '@deepseek-ai/dsh-webhook' import type { WebRoute } from '@deepseek-ai/dsh-host-webserver' import { readBoundedUtf8Body, WebhookHttpError } from './body.ts' import type { GitHubJsonObject } from './types.ts' diff --git a/packages/experimental/webhook-github/src/types.ts b/packages/experimental/webhook-github/src/types.ts index 533a7d9a36..151b2ef715 100644 --- a/packages/experimental/webhook-github/src/types.ts +++ b/packages/experimental/webhook-github/src/types.ts @@ -13,7 +13,7 @@ export interface GitHubWebhookEvent { readonly payload: GitHubJsonObject } -declare module '@deepseek-ai/dsh-experimental-webhook' { +declare module '@deepseek-ai/dsh-webhook' { interface WebhookEventMap { github: GitHubWebhookEvent } diff --git a/packages/experimental/webhook-github/tests/loader-composition.spec.ts b/packages/experimental/webhook-github/tests/loader-composition.spec.ts index 5a3fd23d98..5316e9e35a 100644 --- a/packages/experimental/webhook-github/tests/loader-composition.spec.ts +++ b/packages/experimental/webhook-github/tests/loader-composition.spec.ts @@ -30,7 +30,7 @@ describe('real Loader composition', () => { ' config:', " host: '127.0.0.1'", ' port: 0', - "- name: '@deepseek-ai/dsh-experimental-webhook-github'", + "- name: '@deepseek-ai/dsh-webhook-github'", ' config:', ' source: loader', ' path: /github', @@ -56,7 +56,7 @@ describe('real Loader composition', () => { const modules = new Map([ ['fixture-dependencies', dependencies], ['@deepseek-ai/dsh-host-webserver', WebServer], - ['@deepseek-ai/dsh-experimental-webhook-github', GitHubAdapter], + ['@deepseek-ai/dsh-webhook-github', GitHubAdapter], ]) context.loader.internal = { version: 'v2', diff --git a/packages/experimental/webhook/README.i18n.yaml b/packages/experimental/webhook/README.i18n.yaml index 9c6f312918..aa47a4c522 100644 --- a/packages/experimental/webhook/README.i18n.yaml +++ b/packages/experimental/webhook/README.i18n.yaml @@ -5,42 +5,42 @@ /: en: e4ac1bc2fef159c0 zh: a2d724d2cffb6608 -/deepseek-ai-dsh-experimental-webhook: - en: 26532180f2b36a85 - zh: 2975d07b79822215 -/deepseek-ai-dsh-experimental-webhook/summary: - en: 9bb80560acedf068 - zh: 8cdb82333d601b61 -/deepseek-ai-dsh-experimental-webhook/table-of-contents: +/deepseek-ai-dsh-webhook: + en: 342876b9abe16093 + zh: 48f48c97e57847a6 +/deepseek-ai-dsh-webhook/summary: + en: 406c9bffd5078cb3 + zh: c7e732b80df254a8 +/deepseek-ai-dsh-webhook/table-of-contents: en: 2c6f2175556251ee zh: 753d216d980e1735 -/deepseek-ai-dsh-experimental-webhook/rule-interface: +/deepseek-ai-dsh-webhook/rule-interface: en: d9674188535399ab zh: c52fe9b7ebe8fe79 -/deepseek-ai-dsh-experimental-webhook/session-request: +/deepseek-ai-dsh-webhook/session-request: en: e4d096efc8633575 zh: b1bf7d45fe76c380 -/deepseek-ai-dsh-experimental-webhook/composition: +/deepseek-ai-dsh-webhook/composition: en: 6a19f22997772945 zh: b92bec411e0406bc -/deepseek-ai-dsh-experimental-webhook/model-experience: +/deepseek-ai-dsh-webhook/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 -/deepseek-ai-dsh-experimental-webhook/model-experience/rule-authored-initial-prompt: +/deepseek-ai-dsh-webhook/model-experience/rule-authored-initial-prompt: en: d9d6f7525ae75c28 zh: 981d9ea68b9e884b -/deepseek-ai-dsh-experimental-webhook/model-experience/rule-authored-initial-prompt/what-the-model-sees: +/deepseek-ai-dsh-webhook/model-experience/rule-authored-initial-prompt/what-the-model-sees: en: 44859d5d877a1484 zh: 0f6c96ff6435167b -/deepseek-ai-dsh-experimental-webhook/model-experience/rule-authored-initial-prompt/token-effect: +/deepseek-ai-dsh-webhook/model-experience/rule-authored-initial-prompt/token-effect: en: 13937f95014a6bea zh: c61031459298c4ab -/deepseek-ai-dsh-experimental-webhook/model-experience/rule-authored-initial-prompt/kv-cache-effect: +/deepseek-ai-dsh-webhook/model-experience/rule-authored-initial-prompt/kv-cache-effect: en: 88b78de3ce71698f zh: d13964bad7485d4e -/deepseek-ai-dsh-experimental-webhook/known-limitations-and-deferred-work: +/deepseek-ai-dsh-webhook/known-limitations-and-deferred-work: en: 49d9bd7c7c327cc0 zh: ab94de11bbda1936 -/deepseek-ai-dsh-experimental-webhook/known-limitations-and-deferred-work/dev-note: +/deepseek-ai-dsh-webhook/known-limitations-and-deferred-work/dev-note: en: e67f633dc6fe7773 zh: e88aeb617ffb74ea diff --git a/packages/experimental/webhook/README.md b/packages/experimental/webhook/README.md index 0d677fb149..685bf3befa 100644 --- a/packages/experimental/webhook/README.md +++ b/packages/experimental/webhook/README.md @@ -3,13 +3,13 @@ description: "Webhook rule runtime for maintainers registering trusted external- kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-webhook +# @deepseek-ai/dsh-webhook English | [中文](README.zh.md) ## Summary -`dsh-experimental-webhook` provides the Host `ctx.webhookRuntime`: a registry for trusted programmatic webhook rules plus the one built-in action, creating an ordinary root Session inside a Web Workspace. The interface stays at `register(rule)` and `dispatch(delivery)`; provider authentication belongs to adapter packages. Use it when a trusted rule must turn an external event into a new agent Session. +`dsh-webhook` provides the Host `ctx.webhookRuntime`: a registry for trusted programmatic webhook rules plus the one built-in action, creating an ordinary root Session inside a Web Workspace. The interface stays at `register(rule)` and `dispatch(delivery)`; provider authentication belongs to adapter packages. Use it when a trusted rule must turn an external event into a new agent Session. ## Table of Contents diff --git a/packages/experimental/webhook/README.zh.md b/packages/experimental/webhook/README.zh.md index bbca16b436..db0801fcbd 100644 --- a/packages/experimental/webhook/README.zh.md +++ b/packages/experimental/webhook/README.zh.md @@ -3,13 +3,13 @@ description: "面向注册可信外部事件策略并创建 Workspace 会话的 kind: "package-reference" --- -# @deepseek-ai/dsh-experimental-webhook +# @deepseek-ai/dsh-webhook [English](README.md) | 中文 ## 概述 -`dsh-experimental-webhook` 提供 Host 侧的 `ctx.webhookRuntime`:它既是受信任程序化 webhook 规则的注册表,也拥有唯一内置动作——在 Web Workspace 中创建普通根会话。接口只包含 `register(rule)` 和 `dispatch(delivery)`;提供方身份验证属于适配器包。当受信任规则必须把外部事件变成新的 agent(智能体)会话时,请使用它。 +`dsh-webhook` 提供 Host 侧的 `ctx.webhookRuntime`:它既是受信任程序化 webhook 规则的注册表,也拥有唯一内置动作——在 Web Workspace 中创建普通根会话。接口只包含 `register(rule)` 和 `dispatch(delivery)`;提供方身份验证属于适配器包。当受信任规则必须把外部事件变成新的 agent(智能体)会话时,请使用它。 ## 目录 diff --git a/packages/experimental/webhook/package.json b/packages/experimental/webhook/package.json index 65b68563d7..3674193d07 100644 --- a/packages/experimental/webhook/package.json +++ b/packages/experimental/webhook/package.json @@ -1,5 +1,5 @@ { - "name": "@deepseek-ai/dsh-experimental-webhook", + "name": "@deepseek-ai/dsh-webhook", "description": "Fire-and-forget webhook rule runtime that creates Workspace-backed DeepSeek Harness Sessions", "version": "0.2.1-alpha.1", "publishConfig": { diff --git a/packages/experimental/webhook/tests/loader-composition.spec.ts b/packages/experimental/webhook/tests/loader-composition.spec.ts index b3c1b9629d..1ddd743910 100644 --- a/packages/experimental/webhook/tests/loader-composition.spec.ts +++ b/packages/experimental/webhook/tests/loader-composition.spec.ts @@ -28,7 +28,7 @@ describe('real Loader composition', () => { const configPath = join(root, 'cordis.yml') await writeFile(configPath, [ '- name: fixture-dependencies', - "- name: '@deepseek-ai/dsh-experimental-webhook'", + "- name: '@deepseek-ai/dsh-webhook'", '- name: fixture-rule', '', ].join('\n')) @@ -65,7 +65,7 @@ describe('real Loader composition', () => { context.loader.builtins.include = Include const modules = new Map([ ['fixture-dependencies', dependencies], - ['@deepseek-ai/dsh-experimental-webhook', WebhookRuntime], + ['@deepseek-ai/dsh-webhook', WebhookRuntime], ['fixture-rule', rule], ]) context.loader.internal = { diff --git a/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md b/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md index a8fa454386..6b6d05970b 100644 --- a/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md +++ b/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md @@ -200,6 +200,14 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo | `@deepseek-ai/dsh-experimental-tool-worktree` | no | Model tool that creates and enters a new Git worktree | | `@deepseek-ai/dsh-experimental-translator` | yes | Machine translation with reusable Session results | | `@deepseek-ai/dsh-experimental-worktree` | yes | Creates a named Git worktree and changes the calling Session working directory | +| `@deepseek-ai/dsh-hooks-claude-code` | yes | Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams | +| `@deepseek-ai/dsh-hooks-codex` | yes | Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams | +| `@deepseek-ai/dsh-session-title-all-prompts-llm` | yes | All-user-messages LLM provider plugin for DeepSeek Harness session titles | +| `@deepseek-ai/dsh-skill-badge` | no | Bundled dsh badge skill provider for DeepSeek Harness | +| `@deepseek-ai/dsh-tool-ralph` | yes | Model-facing fresh-agent Ralph loop over the workflow and subagent seams | +| `@deepseek-ai/dsh-tool-terminal` | yes | Six model-facing persistent PTY tools with owner isolation and generic background-job integration | +| `@deepseek-ai/dsh-webhook` | no | Fire-and-forget webhook rule runtime that creates Workspace-backed DeepSeek Harness Sessions | +| `@deepseek-ai/dsh-webhook-github` | yes | Signed GitHub HTTP webhook adapter for the DeepSeek Harness webhook runtime | ## extensions @@ -244,13 +252,6 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo | `@deepseek-ai/dsh-repeat-tool-reminder` | yes | Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls | | `@deepseek-ai/dsh-tool-call-timeout-policy` | no | Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins | -## hooks - -| Package | Config | Description | -|---|---|---| -| `@deepseek-ai/dsh-hooks-claude-code` | yes | Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams | -| `@deepseek-ai/dsh-hooks-codex` | yes | Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams | - ## host | Package | Config | Description | @@ -361,7 +362,6 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo | `@deepseek-ai/dsh-session-stats` | no | Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness | | `@deepseek-ai/dsh-session-telemetry-otel` | yes | Feedback-authorized Session logs over byte-bounded OpenTelemetry HTTP requests | | `@deepseek-ai/dsh-session-title` | yes | Log-backed session title service and provider registry for the DeepSeek Harness | -| `@deepseek-ai/dsh-session-title-all-prompts-llm` | yes | All-user-messages LLM provider plugin for DeepSeek Harness session titles | | `@deepseek-ai/dsh-session-title-first-prompt-llm` | yes | First-message LLM provider plugin for DeepSeek Harness session titles | | `@deepseek-ai/dsh-session-turn-outline` | no | Whole-log turn outline projection (turnOutline) for the DeepSeek Harness | | `@deepseek-ai/dsh-tool-working-directory` | no | Read and change the active Session working directory | @@ -400,7 +400,6 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo | Package | Config | Description | |---|---|---| | `@deepseek-ai/dsh-skill` | yes | Agent skill provider registry for the DeepSeek Harness | -| `@deepseek-ai/dsh-skill-badge` | no | Bundled dsh badge skill provider for DeepSeek Harness | | `@deepseek-ai/dsh-skill-filesystem` | yes | Local filesystem skill provider for the DeepSeek Harness | | `@deepseek-ai/dsh-skill-office` | yes | Bundled Word, PowerPoint, and Excel workflows and structural checks | | `@deepseek-ai/dsh-tool-skill` | yes | Model-facing skill loading tool for the DeepSeek Harness | @@ -463,7 +462,6 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo |---|---|---| | `@deepseek-ai/dsh-terminal` | no | Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup | | `@deepseek-ai/dsh-terminal-bash` | yes | Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive | -| `@deepseek-ai/dsh-tool-terminal` | yes | Six model-facing persistent PTY tools with owner isolation and generic background-job integration | ## test-support @@ -494,18 +492,10 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo | `@deepseek-ai/dsh-web-search-exa` | yes | Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web) | | `@deepseek-ai/dsh-web-search-perplexity` | yes | Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web) | -## webhook - -| Package | Config | Description | -|---|---|---| -| `@deepseek-ai/dsh-webhook` | no | Fire-and-forget webhook rule runtime that creates Workspace-backed DeepSeek Harness Sessions | -| `@deepseek-ai/dsh-webhook-github` | yes | Signed GitHub HTTP webhook adapter for the DeepSeek Harness webhook runtime | - ## workflow | Package | Config | Description | |---|---|---| -| `@deepseek-ai/dsh-tool-ralph` | yes | Model-facing fresh-agent Ralph loop over the workflow and subagent seams | | `@deepseek-ai/dsh-tool-workflow` | yes | Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine | | `@deepseek-ai/dsh-workflow-ptc` | yes | Workflow orchestration in the shared sandboxed Node PTC runtime | diff --git a/packages/terminal/terminal-bash/README.i18n.yaml b/packages/terminal/terminal-bash/README.i18n.yaml index b5d37d1127..ad0ed173d0 100644 --- a/packages/terminal/terminal-bash/README.i18n.yaml +++ b/packages/terminal/terminal-bash/README.i18n.yaml @@ -63,8 +63,8 @@ en: a601a3c4f5b848cd zh: ec617f79f706aaa1 /deepseek-ai-dsh-terminal-bash/model-experience/indirect-consumer/what-the-model-sees: - en: 11e4eb1ce3f242d6 - zh: fc41c83b71556842 + en: ffd1d7a3a65ce703 + zh: 6e892fb3aa6ac293 /deepseek-ai-dsh-terminal-bash/model-experience/indirect-consumer/token-effect: en: 41bd9bec80350376 zh: bdd2db111e86282f diff --git a/packages/terminal/terminal-bash/README.md b/packages/terminal/terminal-bash/README.md index d2d43cdd25..4e8a7a08e3 100644 --- a/packages/terminal/terminal-bash/README.md +++ b/packages/terminal/terminal-bash/README.md @@ -43,7 +43,7 @@ Mount the terminal service, a subprocess provider, the sandbox and policy servic - name: '@deepseek-ai/dsh-sandbox-local' - name: '@deepseek-ai/dsh-sandbox-policy' - name: '@deepseek-ai/dsh-terminal-bash' -- name: '@deepseek-ai/dsh-experimental-tool-terminal' +- name: '@deepseek-ai/dsh-tool-terminal' ``` `danger-full-access` starts the shell directly. Confined modes require a same-world `ctx.sandbox` provider: without one, the spawn fails before the shell starts. Confinement preparation receives the opening signal; cancellation prevents terminal allocation even if the provider returns later. @@ -135,7 +135,7 @@ Read these pages when the package-level contract is not enough. They move from t #### What the model sees -This package registers no prompt or tool. Through `@deepseek-ai/dsh-experimental-tool-terminal` or another PTY consumer, the model may receive bounded startup output, send deltas, scrollback pages, readiness reasons, and cleanup errors. +This package registers no prompt or tool. Through `@deepseek-ai/dsh-tool-terminal` or another PTY consumer, the model may receive bounded startup output, send deltas, scrollback pages, readiness reasons, and cleanup errors. #### Token effect diff --git a/packages/terminal/terminal-bash/README.zh.md b/packages/terminal/terminal-bash/README.zh.md index 7dc81e95f8..265c3b71c2 100644 --- a/packages/terminal/terminal-bash/README.zh.md +++ b/packages/terminal/terminal-bash/README.zh.md @@ -43,7 +43,7 @@ kind: "package-reference" - name: '@deepseek-ai/dsh-sandbox-local' - name: '@deepseek-ai/dsh-sandbox-policy' - name: '@deepseek-ai/dsh-terminal-bash' -- name: '@deepseek-ai/dsh-experimental-tool-terminal' +- name: '@deepseek-ai/dsh-tool-terminal' ``` `danger-full-access` 直接启动 shell。受限模式要求同一执行世界中存在 `ctx.sandbox` 提供方:缺少时,spawn 会在 shell 启动前失败。限制准备过程接收打开操作的取消信号;即使提供方稍后返回,取消仍会阻止终端分配。 @@ -135,7 +135,7 @@ Scrollback 和尚未读取的发送输出保留独立拥有的字符串,并增 #### 模型看到什么 -此包不注册提示词或工具。模型通过 `@deepseek-ai/dsh-experimental-tool-terminal` 或其他 PTY 消费方可能收到有界的启动输出、发送增量、scrollback 页、就绪原因与清理错误。 +此包不注册提示词或工具。模型通过 `@deepseek-ai/dsh-tool-terminal` 或其他 PTY 消费方可能收到有界的启动输出、发送增量、scrollback 页、就绪原因与清理错误。 #### Token 影响 diff --git a/packages/terminal/terminal/README.i18n.yaml b/packages/terminal/terminal/README.i18n.yaml index 9c9889718a..50ce7993cf 100644 --- a/packages/terminal/terminal/README.i18n.yaml +++ b/packages/terminal/terminal/README.i18n.yaml @@ -9,14 +9,14 @@ en: 51faab4a45b4d0a3 zh: c026cbe279584a55 /deepseek-ai-dsh-terminal/summary: - en: 7f75a16057c6d9f6 - zh: 85b1cb0a5ec314b7 + en: b275cca5aa0ccbd6 + zh: 0452420c4b45c7db /deepseek-ai-dsh-terminal/table-of-contents: en: d152484eb41ac6b4 zh: 09388d293f9be9cb /deepseek-ai-dsh-terminal/use-this-package: - en: 1aa2eff13dbcb282 - zh: d56cd093b00bf9c6 + en: 51bfe428d2b44ee2 + zh: 557154468269985e /deepseek-ai-dsh-terminal/use-this-package/when-to-choose-it: en: c4244a1757ca3584 zh: b6fb10e30146b347 @@ -60,14 +60,14 @@ en: a601a3c4f5b848cd zh: ec617f79f706aaa1 /deepseek-ai-dsh-terminal/model-experience/indirect-consumer/what-the-model-sees: - en: 8a6120faf56092b7 - zh: 4267a85c7d3d396f + en: be5049f4851a1b2a + zh: 056ddf9f9f1fc112 /deepseek-ai-dsh-terminal/model-experience/indirect-consumer/token-effect: en: 477da21b0a5be3a6 zh: 3ae1d37fe671ef96 /deepseek-ai-dsh-terminal/model-experience/indirect-consumer/kv-cache-effect: - en: 131c437dcc66af19 - zh: a8e095584e3c87a5 + en: 2d1f12c1eb4164e5 + zh: 7d22b2cd3f9649ff /deepseek-ai-dsh-terminal/known-limitations-and-deferred-work: en: a133ebc47a4df34f zh: 9bb949487ee566d5 diff --git a/packages/terminal/terminal/README.md b/packages/terminal/terminal/README.md index 0ab1f41808..26e8506bd8 100644 --- a/packages/terminal/terminal/README.md +++ b/packages/terminal/terminal/README.md @@ -9,7 +9,7 @@ English | [中文](README.zh.md) ## Summary -`dsh-terminal` provides persistent, owner-scoped terminal sessions to the harness: a session keeps shell or REPL state across tool calls, and every operation is fenced to the exact agent that created it. It provides the `ctx.terminals` service, which mints opaque session ids, routes session creation through registered backends, and waits for quiescent cleanup when an owner or the service disposes. It defines no terminal mechanics itself: backends such as the shipped `dsh-terminal-bash` own spawning and readiness, and the model-facing tools in `dsh-experimental-tool-terminal` own presentation. Sessions are process-local: they do not survive a harness restart. +`dsh-terminal` provides persistent, owner-scoped terminal sessions to the harness: a session keeps shell or REPL state across tool calls, and every operation is fenced to the exact agent that created it. It provides the `ctx.terminals` service, which mints opaque session ids, routes session creation through registered backends, and waits for quiescent cleanup when an owner or the service disposes. It defines no terminal mechanics itself: backends such as the shipped `dsh-terminal-bash` own spawning and readiness, and the model-facing tools in `dsh-tool-terminal` own presentation. Sessions are process-local: they do not survive a harness restart. ## Table of Contents @@ -25,7 +25,7 @@ English | [中文](README.zh.md) ## Use this package -Mount `@deepseek-ai/dsh-terminal` whenever a composition needs terminal sessions whose state survives across tool calls. The service alone does nothing useful: pair it with a backend such as `@deepseek-ai/dsh-terminal-bash` and a tool package such as `@deepseek-ai/dsh-experimental-tool-terminal`, and load all three in one composition. +Mount `@deepseek-ai/dsh-terminal` whenever a composition needs terminal sessions whose state survives across tool calls. The service alone does nothing useful: pair it with a backend such as `@deepseek-ai/dsh-terminal-bash` and a tool package such as `@deepseek-ai/dsh-tool-terminal`, and load all three in one composition. ### When to choose it @@ -38,7 +38,7 @@ Load the session service together with a backend and a tool package: ```yaml - name: '@deepseek-ai/dsh-terminal' - name: '@deepseek-ai/dsh-terminal-bash' -- name: '@deepseek-ai/dsh-experimental-tool-terminal' +- name: '@deepseek-ai/dsh-tool-terminal' ``` A backend provides one stable type — the shipped shell backend provides `shell` — and the tools open sessions by that type. The shell backend additionally requires the sandbox, sandbox-policy, and subprocess providers; see its [README](../terminal-bash/README.md) for the full composition. @@ -114,7 +114,7 @@ Read these pages when the package-level contract is not enough. They move from t #### What the model sees -Nothing directly. This package registers no prompt or tool; `@deepseek-ai/dsh-experimental-tool-terminal` owns visible schemas and result text. +Nothing directly. This package registers no prompt or tool; `@deepseek-ai/dsh-tool-terminal` owns visible schemas and result text. #### Token effect @@ -122,7 +122,7 @@ None directly. Live session state stays process-local until a consumer returns a #### KV Cache effect -No direct invalidation; `@deepseek-ai/dsh-experimental-tool-terminal` owns request-prefix changes. +No direct invalidation; `@deepseek-ai/dsh-tool-terminal` owns request-prefix changes. ## Known Limitations and Deferred Work diff --git a/packages/terminal/terminal/README.zh.md b/packages/terminal/terminal/README.zh.md index f020cffb8a..a185554a9e 100644 --- a/packages/terminal/terminal/README.zh.md +++ b/packages/terminal/terminal/README.zh.md @@ -9,7 +9,7 @@ kind: "package-reference" ## 概述 -`dsh-terminal` 为 harness 提供持久且限定所有者范围的终端会话:会话让 shell 或 REPL 状态跨工具调用存活,且每个操作都被限制在创建它的那个确切 agent(智能体)内。本包提供 `ctx.terminals` 服务,负责生成不透明的会话 id、通过已注册的后端路由会话创建,并在所有者或服务 dispose(资源释放)时等待完全停稳的清理。它本身不定义任何终端机制:`dsh-terminal-bash` 之类的后端负责启动与就绪检测,`dsh-experimental-tool-terminal` 中的面向模型工具负责呈现。会话只存在于进程本地:harness 重启后不会恢复。 +`dsh-terminal` 为 harness 提供持久且限定所有者范围的终端会话:会话让 shell 或 REPL 状态跨工具调用存活,且每个操作都被限制在创建它的那个确切 agent(智能体)内。本包提供 `ctx.terminals` 服务,负责生成不透明的会话 id、通过已注册的后端路由会话创建,并在所有者或服务 dispose(资源释放)时等待完全停稳的清理。它本身不定义任何终端机制:`dsh-terminal-bash` 之类的后端负责启动与就绪检测,`dsh-tool-terminal` 中的面向模型工具负责呈现。会话只存在于进程本地:harness 重启后不会恢复。 ## 目录 @@ -25,7 +25,7 @@ kind: "package-reference" ## 使用本包 -当组合需要状态跨工具调用存活的终端会话时,挂载 `@deepseek-ai/dsh-terminal`。单独的服务本身没有用处:请与 `@deepseek-ai/dsh-terminal-bash` 之类的后端、`@deepseek-ai/dsh-experimental-tool-terminal` 之类的工具包配对,并在同一个组合中一起加载。 +当组合需要状态跨工具调用存活的终端会话时,挂载 `@deepseek-ai/dsh-terminal`。单独的服务本身没有用处:请与 `@deepseek-ai/dsh-terminal-bash` 之类的后端、`@deepseek-ai/dsh-tool-terminal` 之类的工具包配对,并在同一个组合中一起加载。 ### 何时选择 @@ -38,7 +38,7 @@ kind: "package-reference" ```yaml - name: '@deepseek-ai/dsh-terminal' - name: '@deepseek-ai/dsh-terminal-bash' -- name: '@deepseek-ai/dsh-experimental-tool-terminal' +- name: '@deepseek-ai/dsh-tool-terminal' ``` 后端提供一个稳定类型——随附的 shell 后端提供 `shell`——工具按该类型打开会话。shell 后端还额外要求沙箱、沙箱策略与子进程提供方;完整组合见其 [README](../terminal-bash/README.zh.md)。 @@ -114,7 +114,7 @@ kind: "package-reference" #### 模型看到什么 -没有直接可见内容。此包不注册提示词或工具;可见 schema 与结果文本由 `@deepseek-ai/dsh-experimental-tool-terminal` 负责。 +没有直接可见内容。此包不注册提示词或工具;可见 schema 与结果文本由 `@deepseek-ai/dsh-tool-terminal` 负责。 #### Token 影响 @@ -122,7 +122,7 @@ kind: "package-reference" #### KV Cache 影响 -不会直接失效;请求前缀变更由 `@deepseek-ai/dsh-experimental-tool-terminal` 负责。 +不会直接失效;请求前缀变更由 `@deepseek-ai/dsh-tool-terminal` 负责。 ## 已知限制与延期工作 diff --git a/packages/workflow/README.i18n.yaml b/packages/workflow/README.i18n.yaml index 757ed2c52c..8410fc2955 100644 --- a/packages/workflow/README.i18n.yaml +++ b/packages/workflow/README.i18n.yaml @@ -18,8 +18,8 @@ en: e9129c49136545bc zh: c65e319b99b1ef7d /packages-workflow/related-documentation: - en: 6163fe417d1e3128 - zh: ba5d30fc180fdf6d + en: 3df6652066a10ec7 + zh: ae2c0e77aefe667f /packages-workflow/dev-note: en: 5de1d6304e00c58f zh: 8d8225361cfa29e5 diff --git a/packages/workflow/README.md b/packages/workflow/README.md index 320fe77da0..365021c54b 100644 --- a/packages/workflow/README.md +++ b/packages/workflow/README.md @@ -35,7 +35,7 @@ The workflow group lets an agent run orchestration scripts that delegate work to - [Workflow subsystem](../../docs/subsystems/workflow.md) — the seam's types, start request, and `workflow/*` events. - [Generated tool catalog](../../docs/tool-catalog.md#deepseek-aidsh-tool-workflow) — the `workflow` tool schema the model receives. -- [Generated tool catalog](../../docs/tool-catalog.md#deepseek-aidsh-experimental-tool-ralph) — the `ralph` tool schema the model receives. +- [Generated tool catalog](../../docs/tool-catalog.md#deepseek-aidsh-tool-ralph) — the `ralph` tool schema the model receives. - [Generated configuration catalog](../../docs/config-catalog.md#deepseek-aidsh-workflow-ptc) — every accepted engine config field. - [historical Dynamic workflows Agent Note](../../.agents/notes/archived/feature/2026-07-05-dynamic-workflows.md) — the seam design and its decisions. - [Harness-level goal-based execution reference](../experimental/tool-ralph/README.md) — the fixed fresh-agent loop design and deferred work. diff --git a/packages/workflow/README.zh.md b/packages/workflow/README.zh.md index 47c47a9c4c..afe59d4981 100644 --- a/packages/workflow/README.zh.md +++ b/packages/workflow/README.zh.md @@ -35,7 +35,7 @@ workflow 组让 agent(智能体)可以运行编排脚本,将工作委派 - [工作流子系统](../../docs/subsystems/workflow.zh.md)——seam 的类型、启动请求与 `workflow/*` 事件。 - [生成的工具目录](../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-workflow)——模型接收的 `workflow` 工具 schema。 -- [生成的工具目录](../../docs/tool-catalog.zh.md#deepseek-aidsh-experimental-tool-ralph)——模型接收的 `ralph` 工具 schema。 +- [生成的工具目录](../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-ralph)——模型接收的 `ralph` 工具 schema。 - [生成的配置目录](../../docs/config-catalog.zh.md#deepseek-aidsh-workflow-ptc)——每个受支持的引擎配置字段。 - [历史动态工作流 Agent Note](../../.agents/notes/archived/feature/2026-07-05-dynamic-workflows.md)——seam 设计及其决策。 - [Harness 层目标式执行 参考](../experimental/tool-ralph/README.zh.md)——固定全新 agent 循环的设计与暂缓事项。 diff --git a/packages/workflow/workflow-ptc/README.i18n.yaml b/packages/workflow/workflow-ptc/README.i18n.yaml index 68dab81cb8..1cbe0009f8 100644 --- a/packages/workflow/workflow-ptc/README.i18n.yaml +++ b/packages/workflow/workflow-ptc/README.i18n.yaml @@ -15,8 +15,8 @@ en: d152484eb41ac6b4 zh: 09388d293f9be9cb /deepseek-ai-dsh-workflow-ptc/use-this-package: - en: 42a8bbf28fb1369d - zh: 657d724d87735e44 + en: 83b0c102b3c07260 + zh: 7890bb8609063777 /deepseek-ai-dsh-workflow-ptc/use-this-package/minimal-configuration: en: 9c31c6e17ba018ed zh: 85ffe20ce8a5a371 diff --git a/packages/workflow/workflow-ptc/README.md b/packages/workflow/workflow-ptc/README.md index 1f0047d5d6..23ac649d69 100644 --- a/packages/workflow/workflow-ptc/README.md +++ b/packages/workflow/workflow-ptc/README.md @@ -25,7 +25,7 @@ Run JavaScript workflows in fresh Node processes under the calling Session's fil ## Use this package -Mount this engine in a composition that provides subagents, sandbox policy and the [Node PTC runtime](../../ptc-runtime/ptc-runtime-node/README.md). It supplies workflow execution for `dsh-tool-workflow` and for `dsh-experimental-tool-ralph` when explicitly enabled. Ralph remains disabled in shipped defaults. The engine rejects non-TypeScript PTC providers when it loads. Python PTC compositions must disable the `workflow-ptc`, `tool-workflow` and any enabled `tool-ralph` rows. +Mount this engine in a composition that provides subagents, sandbox policy and the [Node PTC runtime](../../ptc-runtime/ptc-runtime-node/README.md). It supplies workflow execution for `dsh-tool-workflow` and for `dsh-tool-ralph` when explicitly enabled. Ralph remains disabled in shipped defaults. The engine rejects non-TypeScript PTC providers when it loads. Python PTC compositions must disable the `workflow-ptc`, `tool-workflow` and any enabled `tool-ralph` rows. ### Minimal configuration diff --git a/packages/workflow/workflow-ptc/README.zh.md b/packages/workflow/workflow-ptc/README.zh.md index 0339a45514..dd6267d497 100644 --- a/packages/workflow/workflow-ptc/README.zh.md +++ b/packages/workflow/workflow-ptc/README.zh.md @@ -25,7 +25,7 @@ kind: "package-reference" ## 使用本包 -在提供 subagent、沙箱策略和 [Node PTC 运行时](../../ptc-runtime/ptc-runtime-node/README.zh.md)的组合中挂载本引擎。它为 `dsh-tool-workflow` 及显式启用时的 `dsh-experimental-tool-ralph` 提供工作流执行。Ralph 在已发布默认组合中保持禁用。引擎在加载时拒绝非 TypeScript 的 PTC 提供方。Python PTC 组合必须禁用 `workflow-ptc`、`tool-workflow` 以及任何已启用的 `tool-ralph` 条目。 +在提供 subagent、沙箱策略和 [Node PTC 运行时](../../ptc-runtime/ptc-runtime-node/README.zh.md)的组合中挂载本引擎。它为 `dsh-tool-workflow` 及显式启用时的 `dsh-tool-ralph` 提供工作流执行。Ralph 在已发布默认组合中保持禁用。引擎在加载时拒绝非 TypeScript 的 PTC 提供方。Python PTC 组合必须禁用 `workflow-ptc`、`tool-workflow` 以及任何已启用的 `tool-ralph` 条目。 ### 最小配置 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0aed15d0ad..afd2da49e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,6 +58,12 @@ importers: '@deepseek-ai/dsh-experimental-worktree': specifier: workspace:* version: link:packages/experimental/worktree + '@deepseek-ai/dsh-hooks-claude-code': + specifier: workspace:* + version: link:packages/experimental/hooks-claude-code + '@deepseek-ai/dsh-hooks-codex': + specifier: workspace:* + version: link:packages/experimental/hooks-codex '@deepseek-ai/dsh-llm-replay': specifier: workspace:* version: link:packages/test-support/llm-replay @@ -67,9 +73,15 @@ importers: '@deepseek-ai/dsh-skill-office': specifier: workspace:* version: link:packages/skill/skill-office + '@deepseek-ai/dsh-tool-ralph': + specifier: workspace:* + version: link:packages/experimental/tool-ralph '@deepseek-ai/dsh-tool-session-query': specifier: workspace:* version: link:packages/session-query/tool-session-query + '@deepseek-ai/dsh-tool-terminal': + specifier: workspace:* + version: link:packages/experimental/tool-terminal '@deepseek-ai/dsh-tool-working-directory': specifier: workspace:* version: link:packages/session/tool-working-directory @@ -301,12 +313,6 @@ importers: '@deepseek-ai/dsh-home-paths': specifier: workspace:* version: link:../../packages/util/home-paths - '@deepseek-ai/dsh-hooks-claude-code': - specifier: workspace:* - version: link:../../packages/hooks/hooks-claude-code - '@deepseek-ai/dsh-hooks-codex': - specifier: workspace:* - version: link:../../packages/hooks/hooks-codex '@deepseek-ai/dsh-http-proxy': specifier: workspace:* version: link:../../packages/util/http-proxy @@ -409,9 +415,6 @@ importers: '@deepseek-ai/dsh-tool-pwsh-persistent': specifier: workspace:* version: link:../../packages/shell/tool-pwsh-persistent - '@deepseek-ai/dsh-tool-ralph': - specifier: workspace:* - version: link:../../packages/workflow/tool-ralph '@deepseek-ai/dsh-tool-schedule': specifier: workspace:* version: link:../../packages/schedule/tool-schedule @@ -442,12 +445,6 @@ importers: '@deepseek-ai/dsh-web-app': specifier: workspace:* version: link:../../packages/bundle/web-app - '@deepseek-ai/dsh-webhook': - specifier: workspace:* - version: link:../../packages/webhook/webhook - '@deepseek-ai/dsh-webhook-github': - specifier: workspace:* - version: link:../../packages/webhook/webhook-github '@deepseek-ai/dsh-workflow-ptc': specifier: workspace:* version: link:../../packages/workflow/workflow-ptc @@ -506,6 +503,12 @@ importers: '@deepseek-ai/dsh-fs-sandbox': specifier: workspace:* version: link:../../packages/fs/fs-sandbox + '@deepseek-ai/dsh-hooks-claude-code': + specifier: workspace:* + version: link:../../packages/experimental/hooks-claude-code + '@deepseek-ai/dsh-hooks-codex': + specifier: workspace:* + version: link:../../packages/experimental/hooks-codex '@deepseek-ai/dsh-host-frontend-static': specifier: workspace:* version: link:../../packages/host/frontend-static @@ -569,6 +572,9 @@ importers: '@deepseek-ai/dsh-shell-env': specifier: workspace:* version: link:../../packages/shell/shell-env + '@deepseek-ai/dsh-skill-badge': + specifier: workspace:* + version: link:../../packages/experimental/skill-badge '@deepseek-ai/dsh-subagent': specifier: workspace:* version: link:../../packages/subagent/subagent @@ -584,12 +590,21 @@ importers: '@deepseek-ai/dsh-system-prompt': specifier: workspace:* version: link:../../packages/core/system-prompt + '@deepseek-ai/dsh-tool-ralph': + specifier: workspace:* + version: link:../../packages/experimental/tool-ralph '@deepseek-ai/dsh-tools': specifier: workspace:* version: link:../../packages/core/tools '@deepseek-ai/dsh-user-approval': specifier: workspace:* version: link:../../packages/interaction/user-approval + '@deepseek-ai/dsh-webhook': + specifier: workspace:* + version: link:../../packages/experimental/webhook + '@deepseek-ai/dsh-webhook-github': + specifier: workspace:* + version: link:../../packages/experimental/webhook-github '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 @@ -2161,9 +2176,6 @@ importers: '@deepseek-ai/dsh-skill': specifier: workspace:* version: link:../../skill/skill - '@deepseek-ai/dsh-skill-badge': - specifier: workspace:* - version: link:../../skill/skill-badge '@deepseek-ai/dsh-skill-filesystem': specifier: workspace:* version: link:../../skill/skill-filesystem @@ -2224,9 +2236,6 @@ importers: '@deepseek-ai/dsh-tool-pwsh': specifier: workspace:* version: link:../../shell/tool-pwsh - '@deepseek-ai/dsh-tool-ralph': - specifier: workspace:* - version: link:../../workflow/tool-ralph '@deepseek-ai/dsh-tool-skill': specifier: workspace:* version: link:../../skill/tool-skill @@ -2807,9 +2816,6 @@ importers: '@deepseek-ai/dsh-tool-pwsh-persistent': specifier: workspace:* version: link:../../shell/tool-pwsh-persistent - '@deepseek-ai/dsh-tool-ralph': - specifier: workspace:* - version: link:../../workflow/tool-ralph '@deepseek-ai/dsh-tool-schedule': specifier: workspace:* version: link:../../schedule/tool-schedule @@ -6057,7 +6063,7 @@ importers: version: link:../../session-query/tool-session-query '@deepseek-ai/dsh-tool-terminal': specifier: workspace:* - version: link:../../terminal/tool-terminal + version: link:../../experimental/tool-terminal '@deepseek-ai/dsh-tools': specifier: workspace:* version: link:../../core/tools @@ -8252,6 +8258,122 @@ importers: specifier: ^4.2.0 version: 4.3.1 + packages/experimental/hook-protocol: + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-shell': + specifier: workspace:* + version: link:../../shell/shell + + packages/experimental/hooks-claude-code: + dependencies: + '@deepseek-ai/schemastery': + specifier: link:../../../vendor/schemastery + version: link:../../../vendor/schemastery + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-agent': + specifier: workspace:* + version: link:../../core/agent + '@deepseek-ai/dsh-agent-loop': + specifier: workspace:* + version: link:../../core/agent-loop + '@deepseek-ai/dsh-agent-loop-testkit': + specifier: workspace:* + version: link:../../test-support/agent-loop-testkit + '@deepseek-ai/dsh-bash-local': + specifier: workspace:* + version: link:../../shell/bash-local + '@deepseek-ai/dsh-fs-local': + specifier: workspace:* + version: link:../../fs/fs-local + '@deepseek-ai/dsh-hook-protocol': + specifier: workspace:* + version: link:../hook-protocol + '@deepseek-ai/dsh-llm': + specifier: workspace:* + version: link:../../llm/llm + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-session-persistence-jsonl': + specifier: workspace:* + version: link:../../session/session-persistence-jsonl + '@deepseek-ai/dsh-session-projection': + specifier: workspace:* + version: link:../../session/session-projection + '@deepseek-ai/dsh-shell': + specifier: workspace:* + version: link:../../shell/shell + '@deepseek-ai/dsh-subagent': + specifier: workspace:* + version: link:../../subagent/subagent + '@deepseek-ai/dsh-subprocess-local': + specifier: workspace:* + version: link:../../subprocess/subprocess-local + '@deepseek-ai/dsh-tools': + specifier: workspace:* + version: link:../../core/tools + '@deepseek-ai/dsh-working-directory': + specifier: workspace:* + version: link:../../session/working-directory + + packages/experimental/hooks-codex: + dependencies: + '@deepseek-ai/schemastery': + specifier: link:../../../vendor/schemastery + version: link:../../../vendor/schemastery + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-agent': + specifier: workspace:* + version: link:../../core/agent + '@deepseek-ai/dsh-agent-loop': + specifier: workspace:* + version: link:../../core/agent-loop + '@deepseek-ai/dsh-agent-loop-testkit': + specifier: workspace:* + version: link:../../test-support/agent-loop-testkit + '@deepseek-ai/dsh-bash-local': + specifier: workspace:* + version: link:../../shell/bash-local + '@deepseek-ai/dsh-hook-protocol': + specifier: workspace:* + version: link:../hook-protocol + '@deepseek-ai/dsh-llm': + specifier: workspace:* + version: link:../../llm/llm + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-session-persistence-jsonl': + specifier: workspace:* + version: link:../../session/session-persistence-jsonl + '@deepseek-ai/dsh-session-projection': + specifier: workspace:* + version: link:../../session/session-projection + '@deepseek-ai/dsh-shell': + specifier: workspace:* + version: link:../../shell/shell + '@deepseek-ai/dsh-subprocess-local': + specifier: workspace:* + version: link:../../subprocess/subprocess-local + '@deepseek-ai/dsh-tools': + specifier: workspace:* + version: link:../../core/tools + '@deepseek-ai/dsh-working-directory': + specifier: workspace:* + version: link:../../session/working-directory + packages/experimental/inspector: dependencies: '@deepseek-ai/dsh-app-boot': @@ -8462,6 +8584,43 @@ importers: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + packages/experimental/session-title-all-prompts-llm: + dependencies: + '@deepseek-ai/schemastery': + specifier: link:../../../vendor/schemastery + version: link:../../../vendor/schemastery + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-agent-loop': + specifier: workspace:* + version: link:../../core/agent-loop + '@deepseek-ai/dsh-llm': + specifier: workspace:* + version: link:../../llm/llm + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-session-projection': + specifier: workspace:* + version: link:../../session/session-projection + '@deepseek-ai/dsh-session-title': + specifier: workspace:* + version: link:../../session/session-title + '@deepseek-ai/dsh-session-title-llm': + specifier: workspace:* + version: link:../../session/session-title-llm + + packages/experimental/skill-badge: + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-skill': + specifier: workspace:* + version: link:../../skill/skill + packages/experimental/speech-to-text: dependencies: '@deepseek-ai/dsh-brand': @@ -8579,6 +8738,125 @@ importers: specifier: workspace:* version: link:../../core/tools + packages/experimental/tool-ralph: + dependencies: + '@deepseek-ai/schemastery': + specifier: link:../../../vendor/schemastery + version: link:../../../vendor/schemastery + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/cordis-plugin-loader': + specifier: workspace:~ + version: link:../../../vendor/loader + '@deepseek-ai/dsh-agent': + specifier: workspace:* + version: link:../../core/agent + '@deepseek-ai/dsh-agent-loop': + specifier: workspace:* + version: link:../../core/agent-loop + '@deepseek-ai/dsh-agent-loop-testkit': + specifier: workspace:* + version: link:../../test-support/agent-loop-testkit + '@deepseek-ai/dsh-llm': + specifier: workspace:* + version: link:../../llm/llm + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-session-persistence-jsonl': + specifier: workspace:* + version: link:../../session/session-persistence-jsonl + '@deepseek-ai/dsh-session-projection': + specifier: workspace:* + version: link:../../session/session-projection + '@deepseek-ai/dsh-subagent': + specifier: workspace:* + version: link:../../subagent/subagent + '@deepseek-ai/dsh-subagent-spawn-in-process': + specifier: workspace:* + version: link:../../subagent/subagent-spawn-in-process + '@deepseek-ai/dsh-system-prompt': + specifier: workspace:* + version: link:../../core/system-prompt + '@deepseek-ai/dsh-tools': + specifier: workspace:* + version: link:../../core/tools + '@deepseek-ai/dsh-workflow': + specifier: workspace:* + version: link:../../workflow/workflow + '@deepseek-ai/dsh-workflow-ptc': + specifier: workspace:* + version: link:../../workflow/workflow-ptc + + packages/experimental/tool-terminal: + dependencies: + '@deepseek-ai/schemastery': + specifier: link:../../../vendor/schemastery + version: link:../../../vendor/schemastery + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/cordis-plugin-include': + specifier: workspace:~ + version: link:../../../vendor/include + '@deepseek-ai/cordis-plugin-loader': + specifier: workspace:~ + version: link:../../../vendor/loader + '@deepseek-ai/dsh-agent': + specifier: workspace:* + version: link:../../core/agent + '@deepseek-ai/dsh-agent-loop-testkit': + specifier: workspace:* + version: link:../../test-support/agent-loop-testkit + '@deepseek-ai/dsh-jobs': + specifier: workspace:* + version: link:../../jobs/jobs + '@deepseek-ai/dsh-jobs-local': + specifier: workspace:* + version: link:../../jobs/jobs-local + '@deepseek-ai/dsh-llm': + specifier: workspace:* + version: link:../../llm/llm + '@deepseek-ai/dsh-output-retention': + specifier: workspace:* + version: link:../../util/output-retention + '@deepseek-ai/dsh-sandbox': + specifier: workspace:* + version: link:../../sandbox/sandbox + '@deepseek-ai/dsh-sandbox-policy': + specifier: workspace:* + version: link:../../sandbox/sandbox-policy + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-session-projection': + specifier: workspace:* + version: link:../../session/session-projection + '@deepseek-ai/dsh-subprocess-local': + specifier: workspace:* + version: link:../../subprocess/subprocess-local + '@deepseek-ai/dsh-system-prompt': + specifier: workspace:* + version: link:../../core/system-prompt + '@deepseek-ai/dsh-terminal': + specifier: workspace:* + version: link:../../terminal/terminal + '@deepseek-ai/dsh-terminal-bash': + specifier: workspace:* + version: link:../../terminal/terminal-bash + '@deepseek-ai/dsh-tool-jobs': + specifier: workspace:* + version: link:../../jobs/tool-jobs + '@deepseek-ai/dsh-tools': + specifier: workspace:* + version: link:../../core/tools + '@deepseek-ai/dsh-working-directory': + specifier: workspace:* + version: link:../../session/working-directory + packages/experimental/tool-worktree: dependencies: '@deepseek-ai/dsh-experimental-worktree': @@ -8723,6 +9001,83 @@ importers: specifier: ^4.2.0 version: 4.3.1 + packages/experimental/webhook: + dependencies: + '@deepseek-ai/dsh-brand': + specifier: workspace:* + version: link:../../util/brand + '@deepseek-ai/dsh-util-values': + specifier: workspace:* + version: link:../../util/values + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/cordis-plugin-include': + specifier: workspace:~ + version: link:../../../vendor/include + '@deepseek-ai/cordis-plugin-loader': + specifier: workspace:~ + version: link:../../../vendor/loader + '@deepseek-ai/dsh-agent': + specifier: workspace:* + version: link:../../core/agent + '@deepseek-ai/dsh-agent-default-model': + specifier: workspace:* + version: link:../../core/agent-default-model + '@deepseek-ai/dsh-agent-preset-registry': + specifier: workspace:* + version: link:../../preset/agent-preset-registry + '@deepseek-ai/dsh-llm': + specifier: workspace:* + version: link:../../llm/llm + '@deepseek-ai/dsh-permission-presets': + specifier: workspace:* + version: link:../../interaction/permission-presets + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-session-title': + specifier: workspace:* + version: link:../../session/session-title + '@deepseek-ai/dsh-workspace': + specifier: workspace:* + version: link:../../workspace/workspace + + packages/experimental/webhook-github: + dependencies: + '@deepseek-ai/dsh-util-values': + specifier: workspace:* + version: link:../../util/values + '@deepseek-ai/schemastery': + specifier: link:../../../vendor/schemastery + version: link:../../../vendor/schemastery + '@octokit/webhooks': + specifier: ^14.2.0 + version: 14.2.0 + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:~ + version: link:../../../vendor/cordis + '@deepseek-ai/cordis-plugin-include': + specifier: workspace:~ + version: link:../../../vendor/include + '@deepseek-ai/cordis-plugin-loader': + specifier: workspace:~ + version: link:../../../vendor/loader + '@deepseek-ai/dsh-credentials': + specifier: workspace:* + version: link:../../credentials/credentials + '@deepseek-ai/dsh-host-webserver': + specifier: workspace:* + version: link:../../host/webserver + '@deepseek-ai/dsh-session': + specifier: workspace:* + version: link:../../core/session + '@deepseek-ai/dsh-webhook': + specifier: workspace:* + version: link:../webhook + packages/experimental/webworker-packer: dependencies: '@deepseek-ai/cordis-plugin-include': @@ -9585,122 +9940,6 @@ importers: specifier: workspace:* version: link:../../core/tools - packages/hooks/hook-protocol: - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-shell': - specifier: workspace:* - version: link:../../shell/shell - - packages/hooks/hooks-claude-code: - dependencies: - '@deepseek-ai/schemastery': - specifier: link:../../../vendor/schemastery - version: link:../../../vendor/schemastery - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-agent': - specifier: workspace:* - version: link:../../core/agent - '@deepseek-ai/dsh-agent-loop': - specifier: workspace:* - version: link:../../core/agent-loop - '@deepseek-ai/dsh-agent-loop-testkit': - specifier: workspace:* - version: link:../../test-support/agent-loop-testkit - '@deepseek-ai/dsh-bash-local': - specifier: workspace:* - version: link:../../shell/bash-local - '@deepseek-ai/dsh-fs-local': - specifier: workspace:* - version: link:../../fs/fs-local - '@deepseek-ai/dsh-hook-protocol': - specifier: workspace:* - version: link:../hook-protocol - '@deepseek-ai/dsh-llm': - specifier: workspace:* - version: link:../../llm/llm - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-session-persistence-jsonl': - specifier: workspace:* - version: link:../../session/session-persistence-jsonl - '@deepseek-ai/dsh-session-projection': - specifier: workspace:* - version: link:../../session/session-projection - '@deepseek-ai/dsh-shell': - specifier: workspace:* - version: link:../../shell/shell - '@deepseek-ai/dsh-subagent': - specifier: workspace:* - version: link:../../subagent/subagent - '@deepseek-ai/dsh-subprocess-local': - specifier: workspace:* - version: link:../../subprocess/subprocess-local - '@deepseek-ai/dsh-tools': - specifier: workspace:* - version: link:../../core/tools - '@deepseek-ai/dsh-working-directory': - specifier: workspace:* - version: link:../../session/working-directory - - packages/hooks/hooks-codex: - dependencies: - '@deepseek-ai/schemastery': - specifier: link:../../../vendor/schemastery - version: link:../../../vendor/schemastery - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-agent': - specifier: workspace:* - version: link:../../core/agent - '@deepseek-ai/dsh-agent-loop': - specifier: workspace:* - version: link:../../core/agent-loop - '@deepseek-ai/dsh-agent-loop-testkit': - specifier: workspace:* - version: link:../../test-support/agent-loop-testkit - '@deepseek-ai/dsh-bash-local': - specifier: workspace:* - version: link:../../shell/bash-local - '@deepseek-ai/dsh-hook-protocol': - specifier: workspace:* - version: link:../hook-protocol - '@deepseek-ai/dsh-llm': - specifier: workspace:* - version: link:../../llm/llm - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-session-persistence-jsonl': - specifier: workspace:* - version: link:../../session/session-persistence-jsonl - '@deepseek-ai/dsh-session-projection': - specifier: workspace:* - version: link:../../session/session-projection - '@deepseek-ai/dsh-shell': - specifier: workspace:* - version: link:../../shell/shell - '@deepseek-ai/dsh-subprocess-local': - specifier: workspace:* - version: link:../../subprocess/subprocess-local - '@deepseek-ai/dsh-tools': - specifier: workspace:* - version: link:../../core/tools - '@deepseek-ai/dsh-working-directory': - specifier: workspace:* - version: link:../../session/working-directory - packages/host/directory-picker: devDependencies: '@deepseek-ai/cordis': @@ -11905,34 +12144,6 @@ importers: specifier: workspace:* version: link:../session-projection - packages/session/session-title-all-prompts-llm: - dependencies: - '@deepseek-ai/schemastery': - specifier: link:../../../vendor/schemastery - version: link:../../../vendor/schemastery - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-agent-loop': - specifier: workspace:* - version: link:../../core/agent-loop - '@deepseek-ai/dsh-llm': - specifier: workspace:* - version: link:../../llm/llm - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-session-projection': - specifier: workspace:* - version: link:../session-projection - '@deepseek-ai/dsh-session-title': - specifier: workspace:* - version: link:../session-title - '@deepseek-ai/dsh-session-title-llm': - specifier: workspace:* - version: link:../session-title-llm - packages/session/session-title-first-prompt-llm: dependencies: '@deepseek-ai/schemastery': @@ -12579,15 +12790,6 @@ importers: specifier: workspace:* version: link:../../core/scope - packages/skill/skill-badge: - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-skill': - specifier: workspace:* - version: link:../skill - packages/skill/skill-filesystem: dependencies: '@deepseek-ai/schemastery': @@ -13718,73 +13920,6 @@ importers: specifier: workspace:* version: link:../../session/working-directory - packages/terminal/tool-terminal: - dependencies: - '@deepseek-ai/schemastery': - specifier: link:../../../vendor/schemastery - version: link:../../../vendor/schemastery - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/cordis-plugin-include': - specifier: workspace:~ - version: link:../../../vendor/include - '@deepseek-ai/cordis-plugin-loader': - specifier: workspace:~ - version: link:../../../vendor/loader - '@deepseek-ai/dsh-agent': - specifier: workspace:* - version: link:../../core/agent - '@deepseek-ai/dsh-agent-loop-testkit': - specifier: workspace:* - version: link:../../test-support/agent-loop-testkit - '@deepseek-ai/dsh-jobs': - specifier: workspace:* - version: link:../../jobs/jobs - '@deepseek-ai/dsh-jobs-local': - specifier: workspace:* - version: link:../../jobs/jobs-local - '@deepseek-ai/dsh-llm': - specifier: workspace:* - version: link:../../llm/llm - '@deepseek-ai/dsh-output-retention': - specifier: workspace:* - version: link:../../util/output-retention - '@deepseek-ai/dsh-sandbox': - specifier: workspace:* - version: link:../../sandbox/sandbox - '@deepseek-ai/dsh-sandbox-policy': - specifier: workspace:* - version: link:../../sandbox/sandbox-policy - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-session-projection': - specifier: workspace:* - version: link:../../session/session-projection - '@deepseek-ai/dsh-subprocess-local': - specifier: workspace:* - version: link:../../subprocess/subprocess-local - '@deepseek-ai/dsh-system-prompt': - specifier: workspace:* - version: link:../../core/system-prompt - '@deepseek-ai/dsh-terminal': - specifier: workspace:* - version: link:../terminal - '@deepseek-ai/dsh-terminal-bash': - specifier: workspace:* - version: link:../terminal-bash - '@deepseek-ai/dsh-tool-jobs': - specifier: workspace:* - version: link:../../jobs/tool-jobs - '@deepseek-ai/dsh-tools': - specifier: workspace:* - version: link:../../core/tools - '@deepseek-ai/dsh-working-directory': - specifier: workspace:* - version: link:../../session/working-directory - packages/test-support/agent-loop-testkit: devDependencies: '@deepseek-ai/cordis': @@ -14475,135 +14610,6 @@ importers: specifier: workspace:* version: link:../web - packages/webhook/webhook: - dependencies: - '@deepseek-ai/dsh-brand': - specifier: workspace:* - version: link:../../util/brand - '@deepseek-ai/dsh-util-values': - specifier: workspace:* - version: link:../../util/values - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/cordis-plugin-include': - specifier: workspace:~ - version: link:../../../vendor/include - '@deepseek-ai/cordis-plugin-loader': - specifier: workspace:~ - version: link:../../../vendor/loader - '@deepseek-ai/dsh-agent': - specifier: workspace:* - version: link:../../core/agent - '@deepseek-ai/dsh-agent-default-model': - specifier: workspace:* - version: link:../../core/agent-default-model - '@deepseek-ai/dsh-agent-preset-registry': - specifier: workspace:* - version: link:../../preset/agent-preset-registry - '@deepseek-ai/dsh-llm': - specifier: workspace:* - version: link:../../llm/llm - '@deepseek-ai/dsh-permission-presets': - specifier: workspace:* - version: link:../../interaction/permission-presets - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-session-title': - specifier: workspace:* - version: link:../../session/session-title - '@deepseek-ai/dsh-workspace': - specifier: workspace:* - version: link:../../workspace/workspace - - packages/webhook/webhook-github: - dependencies: - '@deepseek-ai/dsh-util-values': - specifier: workspace:* - version: link:../../util/values - '@deepseek-ai/schemastery': - specifier: link:../../../vendor/schemastery - version: link:../../../vendor/schemastery - '@octokit/webhooks': - specifier: ^14.2.0 - version: 14.2.0 - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/cordis-plugin-include': - specifier: workspace:~ - version: link:../../../vendor/include - '@deepseek-ai/cordis-plugin-loader': - specifier: workspace:~ - version: link:../../../vendor/loader - '@deepseek-ai/dsh-credentials': - specifier: workspace:* - version: link:../../credentials/credentials - '@deepseek-ai/dsh-host-webserver': - specifier: workspace:* - version: link:../../host/webserver - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-webhook': - specifier: workspace:* - version: link:../webhook - - packages/workflow/tool-ralph: - dependencies: - '@deepseek-ai/schemastery': - specifier: link:../../../vendor/schemastery - version: link:../../../vendor/schemastery - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:~ - version: link:../../../vendor/cordis - '@deepseek-ai/cordis-plugin-loader': - specifier: workspace:~ - version: link:../../../vendor/loader - '@deepseek-ai/dsh-agent': - specifier: workspace:* - version: link:../../core/agent - '@deepseek-ai/dsh-agent-loop': - specifier: workspace:* - version: link:../../core/agent-loop - '@deepseek-ai/dsh-agent-loop-testkit': - specifier: workspace:* - version: link:../../test-support/agent-loop-testkit - '@deepseek-ai/dsh-llm': - specifier: workspace:* - version: link:../../llm/llm - '@deepseek-ai/dsh-session': - specifier: workspace:* - version: link:../../core/session - '@deepseek-ai/dsh-session-persistence-jsonl': - specifier: workspace:* - version: link:../../session/session-persistence-jsonl - '@deepseek-ai/dsh-session-projection': - specifier: workspace:* - version: link:../../session/session-projection - '@deepseek-ai/dsh-subagent': - specifier: workspace:* - version: link:../../subagent/subagent - '@deepseek-ai/dsh-subagent-spawn-in-process': - specifier: workspace:* - version: link:../../subagent/subagent-spawn-in-process - '@deepseek-ai/dsh-system-prompt': - specifier: workspace:* - version: link:../../core/system-prompt - '@deepseek-ai/dsh-tools': - specifier: workspace:* - version: link:../../core/tools - '@deepseek-ai/dsh-workflow': - specifier: workspace:* - version: link:../workflow - '@deepseek-ai/dsh-workflow-ptc': - specifier: workspace:* - version: link:../workflow-ptc - packages/workflow/tool-workflow: dependencies: '@deepseek-ai/schemastery': @@ -14933,15 +14939,6 @@ importers: '@deepseek-ai/dsh-home-paths': specifier: workspace:* version: link:../../packages/util/home-paths - '@deepseek-ai/dsh-hook-protocol': - specifier: workspace:* - version: link:../../packages/hooks/hook-protocol - '@deepseek-ai/dsh-hooks-claude-code': - specifier: workspace:* - version: link:../../packages/hooks/hooks-claude-code - '@deepseek-ai/dsh-hooks-codex': - specifier: workspace:* - version: link:../../packages/hooks/hooks-codex '@deepseek-ai/dsh-host-plugin-inventory': specifier: workspace:* version: link:../../packages/host/plugin-inventory @@ -15176,9 +15173,6 @@ importers: '@deepseek-ai/dsh-tool-pwsh-persistent': specifier: workspace:* version: link:../../packages/shell/tool-pwsh-persistent - '@deepseek-ai/dsh-tool-ralph': - specifier: workspace:* - version: link:../../packages/workflow/tool-ralph '@deepseek-ai/dsh-tool-schedule': specifier: workspace:* version: link:../../packages/schedule/tool-schedule diff --git a/scripts/bundle-input-isolation.ts b/scripts/bundle-input-isolation.ts index 1b6c6ef82f..e711d50cdd 100644 --- a/scripts/bundle-input-isolation.ts +++ b/scripts/bundle-input-isolation.ts @@ -3,6 +3,7 @@ import { existsSync, readFileSync, realpathSync } from 'node:fs' import { dirname, isAbsolute, relative, resolve, sep } from 'node:path' import { fileURLToPath } from 'node:url' +import { hasExperimentalPackageReference, isExperimentalPackageName } from './experimental-package-policy.ts' /** Package identities are cached only within one build. */ export class BundleInputIsolation { @@ -35,7 +36,7 @@ export class BundleInputIsolation { } private checkInput(id: string, allowMissing: boolean): void { - if (/(?:^|[/:\u0000])@deepseek-ai\/dsh-experimental-[^/?#]+/.test(id)) { + if (hasExperimentalPackageReference(id)) { throw new Error(`${this.label}: experimental input ${id}`) } const file = physicalBundleInput(id) @@ -54,7 +55,7 @@ export class BundleInputIsolation { const canonical = resolve(realpathSync(existing), relative(existing, file)) if (canonical !== file) this.checkInput(canonical, allowMissing) const name = this.packageName(dirname(canonical)) - if (name?.startsWith('@deepseek-ai/dsh-experimental-')) { + if (name !== undefined && isExperimentalPackageName(name)) { throw new Error(`${this.label}: ${id} belongs to experimental package ${name}`) } } diff --git a/scripts/check-workspace-constraints.spec.ts b/scripts/check-workspace-constraints.spec.ts index c225c1a59e..6ee447873e 100644 --- a/scripts/check-workspace-constraints.spec.ts +++ b/scripts/check-workspace-constraints.spec.ts @@ -7,6 +7,7 @@ import { describe, expect, it, onTestFinished } from 'vitest' import { isPublicExperimentalPackageDirectory, PRIVATE_EXPERIMENTAL_PACKAGE_DIRECTORIES, + EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS, } from './experimental-package-policy.ts' import { checkDshFamilyVersion, @@ -14,6 +15,7 @@ import { checkWorkspaceProtocol, checkExperimentalDependencyIsolation, checkExperimentalManifest, + checkExperimentalNameExceptions, expectedDshPackageFiles, readWorkspaceManifests, type WorkspaceManifest, @@ -120,10 +122,41 @@ describe('experimental workspace constraints', () => { ...experimental, manifest: { ...experimental.manifest, name: '@deepseek-ai/dsh-prototype' }, })).toEqual([ - '@deepseek-ai/dsh-prototype: experimental package name must start with "@deepseek-ai/dsh-experimental-"', + '@deepseek-ai/dsh-prototype: experimental package name must start with "@deepseek-ai/dsh-experimental-" or match its declared directory exception', ]) }) + it.each(Object.entries(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('retains %s only at its declared directory', (dir, name) => { + expect(checkExperimentalManifest({ dir, manifest: { name, publishConfig: { access: 'public' } } })).toEqual([]) + expect(checkExperimentalManifest({ ...experimental, manifest: { ...experimental.manifest, name } })) + .toEqual([expect.stringContaining('declared directory exception')]) + }) + + it('rejects a missing manifest name even when the directory has no exception', () => { + expect(checkExperimentalManifest({ ...experimental, manifest: { publishConfig: { access: 'public' } } })) + .toEqual([expect.stringContaining('experimental package name must start')]) + }) + + it('rejects stale, moved and duplicated retained-name declarations', () => { + const manifests = Object.entries(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS).map(([dir, name]) => ({ dir, manifest: { name } })) + expect(checkExperimentalNameExceptions(manifests)).toEqual([]) + const [first, ...rest] = manifests + for (const invalid of [ + rest, + [{ ...first!, manifest: { name: '@deepseek-ai/dsh-experimental-replacement' } }, ...rest], + [{ ...first!, dir: 'packages/core/replacement' }, ...rest], + [...manifests, { ...first!, dir: 'packages/experimental/duplicate' }], + ]) expect(checkExperimentalNameExceptions(invalid)).toEqual([expect.stringContaining(first!.manifest.name)]) + }) + + it.each(Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('rejects retained runtime names and aliases: %s', (name) => { + for (const dependencies of [{ [name]: 'workspace:*' }, { alias: `npm:${name}@1.0.0` }, { alias: `workspace:${name}@*` }]) { + expect(checkExperimentalDependencyIsolation([{ + dir: 'apps/cli', manifest: { name: '@deepseek-ai/dsh', dependencies }, + }], [])).toEqual([expect.stringContaining('must not reference an experimental package')]) + } + }) + it('requires public metadata for unlisted experimental packages', () => { expect(checkExperimentalManifest(experimental)).toEqual([]) expect(checkExperimentalManifest({ diff --git a/scripts/check-workspace-constraints.ts b/scripts/check-workspace-constraints.ts index 2415de275c..c670b46f2a 100644 --- a/scripts/check-workspace-constraints.ts +++ b/scripts/check-workspace-constraints.ts @@ -11,6 +11,10 @@ import { pathToFileURL } from 'node:url' import { load as loadYaml } from 'js-yaml' import { isPublicExperimentalPackageDirectory, + isExperimentalPackageName, + hasExperimentalPackageReference, + EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS, + EXPERIMENTAL_PACKAGE_NAME_PREFIX, PRIVATE_EXPERIMENTAL_PACKAGE_DIRECTORIES, } from './experimental-package-policy.ts' import { hasTypertRemoteNavigation, isForbiddenPublicationFile } from './publication-payload.ts' @@ -53,8 +57,6 @@ const publicationSourceAllowlist: Readonly> = const publishedRepositoryUrl = 'git+https://github.com/deepseek-ai/deepseek-harness.git' /** Packages that participate in the experimental policy. */ const experimentalPackageDirectory = /^packages\/experimental\/[^/]+$/ -/** npm namespace reserved for experimental packages. */ -const experimentalPackageNamePrefix = '@deepseek-ai/dsh-experimental-' /** Ordinary directories whose packages this repository publishes: one release member each. */ const standardReleaseMemberDirectory = /^(?:packages\/(?!experimental\/)[^/]+\/[^/]+|apps\/(?!desktop(?:-host)?$)[^/]+|vendor\/[^/]+)$/ /** Installable application assembled by electron-builder rather than published to npm. */ @@ -168,7 +170,7 @@ export function readWorkspaceManifests(repositoryRoot: string): WorkspaceManifes } const packageFileExtras: Readonly> = { - '@deepseek-ai/dsh-experimental-webhook-github': ['examples/github-review/cordis.yml', 'examples/github-review/github-ready-review-rule.mjs'], + '@deepseek-ai/dsh-webhook-github': ['examples/github-review/cordis.yml', 'examples/github-review/github-ready-review-rule.mjs'], // Owned Worker bundles import this public bootstrap before their business entry. '@deepseek-ai/dsh-app-boot': ['lib/worker/profile-resolution-bootstrap.js'], // Statically linked client libraries keep their stylesheets next to the emitted @@ -203,7 +205,7 @@ const packageFileExtras: Readonly> = { // sandbox-local resolves it through the package's ./runner export. tsdown // also shares its generated FFI code through a hashed runtime chunk. '@deepseek-ai/dsh-sandbox-windows-acl': ['lib/runner.js', 'lib/types-*.js', 'assets'], - '@deepseek-ai/dsh-experimental-skill-badge': ['assets'], + '@deepseek-ai/dsh-skill-badge': ['assets'], '@deepseek-ai/dsh-skill-office': ['assets'], '@deepseek-ai/dsh-subprocess': ['lib/control.js'], // SSH launches a private helper and shares wire definitions and TLS setup @@ -343,8 +345,9 @@ export function checkExperimentalManifest( if (!experimentalPackageDirectory.test(dir)) return [] const label = manifest.name ?? dir const errors: string[] = [] - if (manifest.name?.startsWith(experimentalPackageNamePrefix) !== true) { - errors.push(`${label}: experimental package name must start with ${JSON.stringify(experimentalPackageNamePrefix)}`) + if (manifest.name === undefined || !manifest.name.startsWith(EXPERIMENTAL_PACKAGE_NAME_PREFIX) + && manifest.name !== EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS[dir]) { + errors.push(`${label}: experimental package name must start with ${JSON.stringify(EXPERIMENTAL_PACKAGE_NAME_PREFIX)} or match its declared directory exception`) } if (isPublicExperimentalPackageDirectory(dir, privateDirectories)) { if (manifest.private === true) errors.push(`${label}: public experimental package must not set "private": true`) @@ -358,6 +361,22 @@ export function checkExperimentalManifest( return errors } +/** + * Reject missing, renamed, moved, or duplicated retained-name exceptions. + * @param manifests - every workspace manifest, with repository-relative directories. + * @returns Violations of the exact directory/name ownership declarations. + */ +export function checkExperimentalNameExceptions(manifests: readonly WorkspaceManifest[]): string[] { + const errors: string[] = [] + for (const [dir, name] of Object.entries(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS)) { + const owners = manifests.filter(entry => entry.manifest.name === name) + if (owners.length !== 1 || owners[0]?.dir !== dir) { + errors.push(`${dir}: retained experimental name ${name} must have exactly one workspace owner at this directory`) + } + } + return errors +} + function isReleaseMemberDirectory(dir: string): boolean { return standardReleaseMemberDirectory.test(dir) || isPublicExperimentalPackageDirectory(dir) } @@ -560,8 +579,10 @@ export function checkExperimentalDependencyIsolation( if (!standardReleaseMemberDirectory.test(dir) && dir !== 'python/sdk-runtime') continue const offered = manifest.name === '@deepseek-ai/dsh' ? new Set(optionalBundles) : new Set() for (const section of runtimeDependencySections) { - for (const name of Object.keys(manifest[section] ?? {})) { - if (!experimentalNames.has(name)) continue + for (const [name, range] of Object.entries(manifest[section] ?? {})) { + const experimental = experimentalNames.has(name) || isExperimentalPackageName(name) + || /^(?:npm:|workspace:)/.test(range) && hasExperimentalPackageReference(range) + if (!experimental) continue if (section === 'dependencies' && offered.has(name)) continue errors.push(`${manifest.name ?? dir}: ${section}.${name} must not reference an experimental package`) } @@ -608,6 +629,7 @@ export function main(): void { ...checkRepositoryVersion(), ...workspaceManifests().flatMap(checkWorkspaceManifest), ...checkWorkspaceProtocol(manifests), + ...checkExperimentalNameExceptions(manifests), ...checkExperimentalDependencyIsolation(manifests), ...checkHierarchyShape(), ...collectProjectReferenceFaceViolations(root), diff --git a/scripts/client-bundle-purity.spec.ts b/scripts/client-bundle-purity.spec.ts index f8080e4ad9..b172dab5f4 100644 --- a/scripts/client-bundle-purity.spec.ts +++ b/scripts/client-bundle-purity.spec.ts @@ -269,6 +269,15 @@ describe('client bundle experimental input isolation', () => { expect(existsSync(join(owner, 'lib/index.js'))).toBe(false) }) + it.each(['static', 'dynamic'] as const)('keeps retained-name experimental %s inputs outside ordinary artifacts', async (kind) => { + const { root, owner, entry, prototype } = fixture() + const name = '@deepseek-ai/dsh-tool-terminal' + writeFileSync(join(root, 'prototype/package.json'), JSON.stringify({ name, type: 'module' })) + writeFileSync(entry, `export { marker } from ${JSON.stringify(importPath(entry, prototype))}\n`) + await expect(bundle(owner, config(kind))).rejects.toThrow(/client bundle isolation.*experimental/) + await expect(bundle(owner, config(kind, name))).resolves.toContain('experimental sentinel') + }) + it('proves the static library otherwise hides the experimental input in its emitted JavaScript', async () => { const { owner, entry, prototype } = fixture() writeFileSync(entry, `export { marker } from ${JSON.stringify(importPath(entry, prototype))}\n`) diff --git a/scripts/experimental-package-policy.spec.ts b/scripts/experimental-package-policy.spec.ts new file mode 100644 index 0000000000..1af252cde8 --- /dev/null +++ b/scripts/experimental-package-policy.spec.ts @@ -0,0 +1,38 @@ +/** Retained package names keep experimental isolation and persisted record namespaces. */ + +import { describe, expect, it } from 'vitest' +import { + EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS, + experimentalPackageRecordNamespace, + hasExperimentalPackageReference, + isExperimentalPackageName, +} from './experimental-package-policy.ts' + +const names = Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS) + +describe('experimental package identities', () => { + it.each([...names, '@deepseek-ai/dsh-experimental-terminal-bundle'])('recognizes %s independently of installation layout', (name) => { + expect(isExperimentalPackageName(name)).toBe(true) + for (const reference of [name, `${name}/client`, `${name}@1.2.3`, `npm:${name}@1.2.3`, `workspace:${name}@*`, + `\0virtual:${name}/client?raw`, `/node_modules/${name}/lib/index.js`, `C:\\node_modules\\${name}\\lib\\index.js`, `C:\\node_modules\\${name.replaceAll('/', '\\')}\\lib\\index.js`]) { + expect(hasExperimentalPackageReference(reference), reference).toBe(true) + } + }) + + it.each(names)('does not extend the retained-name exception %s to another package', (name) => { + for (const reference of [`${name}-unrelated`, `other-${name}`, name.replace('@deepseek-ai/', '@other/')]) { + expect(isExperimentalPackageName(reference)).toBe(false) + expect(hasExperimentalPackageReference(reference)).toBe(false) + expect(experimentalPackageRecordNamespace(reference)).toBeUndefined() + } + }) + + it('keeps new experimental packages under their prefixed namespaces', () => { + expect(experimentalPackageRecordNamespace('@deepseek-ai/dsh-experimental-bridge')).toBe('bridge') + expect(hasExperimentalPackageReference('@deepseek-ai/dsh-core')).toBe(false) + }) + + it.each(Object.entries(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('keeps %s record names independent of the retained npm name', (directory, name) => { + expect(experimentalPackageRecordNamespace(name)).toBe(directory.split('/').at(-1)) + }) +}) diff --git a/scripts/experimental-package-policy.ts b/scripts/experimental-package-policy.ts index c443d6988b..29aacb08a6 100644 --- a/scripts/experimental-package-policy.ts +++ b/scripts/experimental-package-policy.ts @@ -1,3 +1,52 @@ +/** Experimental package identities, publication policy, and retained npm names. */ + +/** Existing npm names retained by capabilities now housed under experimental/. */ +export const EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS: Readonly> = { + 'packages/experimental/session-title-all-prompts-llm': '@deepseek-ai/dsh-session-title-all-prompts-llm', + 'packages/experimental/tool-terminal': '@deepseek-ai/dsh-tool-terminal', + 'packages/experimental/tool-ralph': '@deepseek-ai/dsh-tool-ralph', + 'packages/experimental/skill-badge': '@deepseek-ai/dsh-skill-badge', + 'packages/experimental/hook-protocol': '@deepseek-ai/dsh-hook-protocol', + 'packages/experimental/hooks-claude-code': '@deepseek-ai/dsh-hooks-claude-code', + 'packages/experimental/hooks-codex': '@deepseek-ai/dsh-hooks-codex', + 'packages/experimental/webhook': '@deepseek-ai/dsh-webhook', + 'packages/experimental/webhook-github': '@deepseek-ai/dsh-webhook-github', +} satisfies Record<`packages/experimental/${string}`, `@deepseek-ai/dsh-${string}`> + +/** npm namespace for experimental packages without retained-name exceptions. */ +export const EXPERIMENTAL_PACKAGE_NAME_PREFIX = '@deepseek-ai/dsh-experimental-' +const retainedNames = new Set(Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS)) + +/** + * Identify an experimental npm package independently of its installed directory. + * @param name - complete npm package name, without a version or subpath. + * @returns Whether the name uses the experimental prefix or a retained name. + */ +export function isExperimentalPackageName(name: string): boolean { + return name.startsWith(EXPERIMENTAL_PACKAGE_NAME_PREFIX) || retainedNames.has(name) +} + +/** + * Find experimental identities in module ids, paths, subpaths, or npm alias specifications. + * @param reference - package reference or bundler/runtime module identifier. + * @returns Whether a delimited package name identifies an experimental capability. + */ +export function hasExperimentalPackageReference(reference: string): boolean { + const normalized = reference.replaceAll('\\', '/') + return [...normalized.matchAll(/(?:^|[/:\u0000])(@deepseek-ai\/[^/@?#:\s]+)(?=$|[/@?#:])/g)] + .some(([, name]) => name !== undefined && isExperimentalPackageName(name)) +} + +/** + * Derive the package-owned plugin record namespace without changing persisted names. + * @param name - complete experimental npm package name. + * @returns Capability suffix, or undefined for a non-experimental name. + */ +export function experimentalPackageRecordNamespace(name: string): string | undefined { + if (!isExperimentalPackageName(name)) return undefined + return name.slice(name.startsWith(EXPERIMENTAL_PACKAGE_NAME_PREFIX) ? EXPERIMENTAL_PACKAGE_NAME_PREFIX.length : '@deepseek-ai/dsh-'.length) +} + /** Experimental packages excluded from public releases and npm baselines. */ export const PRIVATE_EXPERIMENTAL_PACKAGE_DIRECTORIES: readonly string[] = [] diff --git a/scripts/gen-doc-graphs.ts b/scripts/gen-doc-graphs.ts index 97390a7c9a..eedde2ae9a 100644 --- a/scripts/gen-doc-graphs.ts +++ b/scripts/gen-doc-graphs.ts @@ -376,7 +376,7 @@ const SERVICE_ROLES: ServiceRole[] = [ title: 'Durable session persistence seam', mode: 'seam', implementations: ['session-persistence-jsonl'], - consumers: ['agent-loop', 'tool-bash', 'experimental-hooks-claude-code', 'experimental-hooks-codex', 'session-query', 'session-query-sqlite', 'message-feedback'], + consumers: ['agent-loop', 'tool-bash', 'hooks-claude-code', 'hooks-codex', 'session-query', 'session-query-sqlite', 'message-feedback'], note: 'The JSONL backend persists the SessionEvent vocabulary as one artifact per Session.', }, { @@ -531,7 +531,7 @@ const SERVICE_ROLES: ServiceRole[] = [ pkg: 'session-title', title: 'Log-backed session titles', mode: 'seam', - implementations: ['session-title-first-prompt-llm', 'experimental-session-title-all-prompts-llm'], + implementations: ['session-title-first-prompt-llm', 'session-title-all-prompts-llm'], note: 'Owns the deterministic fallback, latest-title fold, and sole optional asynchronous provider registration.', }, { @@ -539,7 +539,7 @@ const SERVICE_ROLES: ServiceRole[] = [ pkg: 'system-prompt', title: 'System prompt assembly registry', mode: 'core', - consumers: ['agent-loop', 'tools', 'tool-fs', 'experimental-tool-terminal', 'tool-web'], + consumers: ['agent-loop', 'tools', 'tool-fs', 'tool-terminal', 'tool-web'], note: 'Collects prompt sections and model-facing tool schemas for each step.', }, { @@ -547,7 +547,7 @@ const SERVICE_ROLES: ServiceRole[] = [ pkg: 'tools', title: 'Tool registry and guarded execution pipeline', mode: 'core', - consumers: ['agent-loop', 'tool-ask-user', 'tool-bash', 'tool-cordis', 'tool-fs', 'experimental-tool-terminal', 'tool-skill', 'tool-subagent', 'tool-todo', 'tool-web'], + consumers: ['agent-loop', 'tool-ask-user', 'tool-bash', 'tool-cordis', 'tool-fs', 'tool-terminal', 'tool-skill', 'tool-subagent', 'tool-todo', 'tool-web'], note: 'Registers capabilities, owns PTC mode transport, and routes calls through pre-policy, monotonic guards, around dispatch, post-policy, and final-result observation.', }, { @@ -600,7 +600,7 @@ const SERVICE_ROLES: ServiceRole[] = [ pkg: 'skill', title: 'Skill provider registry', mode: 'seam', - implementations: ['sandbox-windows-acl', 'experimental-skill-badge', 'skill-filesystem', 'skill-office'], + implementations: ['sandbox-windows-acl', 'skill-badge', 'skill-filesystem', 'skill-office'], consumers: ['tool-skill'], note: 'Merges provider skill catalogs; tool-skill renders the session-prefix catalog and loads complete skill bodies.', }, @@ -665,7 +665,7 @@ const SERVICE_ROLES: ServiceRole[] = [ title: 'Bash executor seam', mode: 'seam', implementations: ['bash-local', 'bash-sandbox', 'pwsh-local'], - consumers: ['tool-bash', 'tool-pwsh', 'experimental-hooks-claude-code', 'experimental-hooks-codex'], + consumers: ['tool-bash', 'tool-pwsh', 'hooks-claude-code', 'hooks-codex'], note: 'The model-facing shell tools and hook bridges consume this seam; sandboxed, remote, or PowerShell executors replace bash-local without touching them.', }, { @@ -682,7 +682,7 @@ const SERVICE_ROLES: ServiceRole[] = [ title: 'Persistent PTY session registry', mode: 'seam', implementations: ['terminal-bash'], - consumers: ['experimental-tool-terminal'], + consumers: ['tool-terminal'], note: 'The registry owns exact-Agent session identity and cleanup; backends own terminal mechanics, while tool-terminal exposes the owner-scoped model tools.', }, { @@ -754,7 +754,7 @@ const SERVICE_ROLES: ServiceRole[] = [ title: 'Subagent provider and continuation service', mode: 'seam', implementations: ['subagent-spawn-in-process', 'subagent-fork-in-process', 'subagent-acp', 'subagent-codex', 'subagent-claude-code', 'subagent-dsh-sdk'], - consumers: ['tool-subagent', 'tool-subagent-control', 'experimental-tool-ralph'], + consumers: ['tool-subagent', 'tool-subagent-control', 'tool-ralph'], note: 'Providers prepare local children or execute external tasks; one activation manager owns both lifecycles. The delegation tool selects a backend, control tools deliver local follow-ups, and workflows await activation results.', }, { @@ -794,7 +794,7 @@ const SERVICE_ROLES: ServiceRole[] = [ title: 'Background job registry', mode: 'seam', implementations: ['jobs-local'], - consumers: ['tool-bash', 'tool-pwsh', 'experimental-tool-terminal', 'tool-jobs', 'api-job-controller'], + consumers: ['tool-bash', 'tool-pwsh', 'tool-terminal', 'tool-jobs', 'api-job-controller'], note: 'Producers (background bash/pwsh and PTY sends) register running work; record-declaring jobs additionally stream raw output for non-consuming observers; tool-jobs is the model-facing controller that reads, lists, and kills it; jobs-local is the process-local registry.', }, { @@ -846,15 +846,15 @@ const SERVICE_ROLES: ServiceRole[] = [ title: 'Workflow script engine', mode: 'seam', implementations: ['workflow-ptc'], - consumers: ['tool-workflow', 'experimental-tool-ralph'], + consumers: ['tool-workflow', 'tool-ralph'], note: 'One engine per context, as in bash, with no named-provider registry; the general workflow and fixed Ralph consumers start runs whose agent() calls fan out through ctx.subagents.', }, { key: 'webhookRuntime', - pkg: 'experimental-webhook', + pkg: 'webhook', title: 'Webhook rule runtime', mode: 'core', - consumers: ['experimental-webhook-github'], + consumers: ['webhook-github'], note: 'Provider adapters dispatch authenticated deliveries; trusted plugins register independent process-local rules, and the runtime turns non-null results into ordinary Workspace-backed Sessions without delivery or completion state.', }, { diff --git a/scripts/gen-tool-catalog.ts b/scripts/gen-tool-catalog.ts index 2b8ddbd383..18272879b2 100644 --- a/scripts/gen-tool-catalog.ts +++ b/scripts/gen-tool-catalog.ts @@ -54,7 +54,7 @@ import * as ToolFs from '@deepseek-ai/dsh-tool-fs' import * as ToolFsSearch from '@deepseek-ai/dsh-tool-fs-search' import * as ToolStrReplaceEditor from '@deepseek-ai/dsh-tool-str-replace-editor' import TerminalSessionService from '@deepseek-ai/dsh-terminal' -import * as ToolPty from '@deepseek-ai/dsh-experimental-tool-terminal' +import * as ToolPty from '@deepseek-ai/dsh-tool-terminal' import * as ToolGoal from '@deepseek-ai/dsh-tool-goal' import * as ToolSchedule from '@deepseek-ai/dsh-tool-schedule' import type ScheduleService from '@deepseek-ai/dsh-schedule' @@ -77,7 +77,7 @@ import { registerListSubagentModels } from '../packages/subagent/tool-subagent/s import * as ToolWeb from '@deepseek-ai/dsh-tool-web' import WorkflowEngine from '@deepseek-ai/dsh-workflow' import type { WorkflowRun, WorkflowStartRequest } from '@deepseek-ai/dsh-workflow' -import * as ToolRalph from '@deepseek-ai/dsh-experimental-tool-ralph' +import * as ToolRalph from '@deepseek-ai/dsh-tool-ralph' import * as ToolWorkflow from '@deepseek-ai/dsh-tool-workflow' import * as ToolWorkspaceDependencies from '@deepseek-ai/dsh-tool-workspace-dependencies' import { githubSlug } from './verify-md-links.ts' @@ -400,7 +400,7 @@ const TOOL_PACKAGES: ToolPackage[] = [ 'glob and grep are unconditional discovery tools that spawn the packaged ripgrep binary (`@vscode/ripgrep`) through ctx.subprocess as ordinary foreground calls (never background jobs) — no host `rg` install and no shell layer. The catalog uses `sampleOverCapGlobResults: true`; deployments must choose that behavior explicitly. Capped results save the complete formatted list through the optional ctx.spillStore backend; returned locators are follow-up-readable/searchable when the backend exposes local paths in co-located deployments.', }, { - pkg: '@deepseek-ai/dsh-experimental-tool-terminal', + pkg: '@deepseek-ai/dsh-tool-terminal', dir: 'tool-terminal', source: 'packages/experimental/tool-terminal/src/index.ts', requires: ['ctx.workingDirectory', 'ctx.tools', 'ctx.terminals', 'ctx.systemPrompt', 'ctx.jobs at call time for run_in_background'], @@ -460,7 +460,7 @@ const TOOL_PACKAGES: ToolPackage[] = [ 'The lsp tool keeps provider selection and language-server subprocesses behind ctx.lsp, so its model-visible schema stays stable across providers. Requires a registered provider (e.g. `@deepseek-ai/dsh-lsp-stdio`) at runtime; without one, a query returns the structured `LSP_UNAVAILABLE` error rather than changing the schema.', }, { - pkg: '@deepseek-ai/dsh-experimental-tool-ralph', + pkg: '@deepseek-ai/dsh-tool-ralph', dir: 'tool-ralph', source: 'packages/experimental/tool-ralph/src/index.ts', requires: ['ctx.tools', 'ctx.workflowEngine', 'ctx.subagents', 'ctx.systemPrompt', 'a calling Agent (exec.agent parents every fresh round)'], diff --git a/scripts/plugin-record-catalog.spec.ts b/scripts/plugin-record-catalog.spec.ts index 15298a31c4..d0fb2def64 100644 --- a/scripts/plugin-record-catalog.spec.ts +++ b/scripts/plugin-record-catalog.spec.ts @@ -4,6 +4,7 @@ import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' +import { EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS } from './experimental-package-policy.ts' import { collectPluginRecords } from './plugin-record-catalog.ts' import { persistenceCatalogArtifacts, render, renderPluginRecordCatalog } from './gen-persistence-catalog.ts' import { extractPersistenceSchema } from './persistence-schema.ts' @@ -43,6 +44,20 @@ function augmentation(members: string, heritage = ''): string { const ENTRY = " /** Retains a bridge entry. */\n 'plugin:bridge/entry': SavedEntry" describe('plugin record declarations', () => { + it.each(Object.entries(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('retains the persisted namespace for %s', (directory, owner) => { + const namespace = directory.split('/').at(-1)! + const source = `${directory}/src/records.ts` + const root = fixture({ + [`${directory}/package.json`]: JSON.stringify({ name: owner }), + [source]: augmentation(`/** Retains the capability event. */\n'plugin:${namespace}/entry': SavedEntry`), + }) + expect(collectPluginRecords(root)).toEqual([{ + name: `plugin:${namespace}/entry`, owner, payload: 'SavedEntry', doc: 'Retains the capability event.', source, + }]) + put(root, source, augmentation("/** Another package event. */\n'plugin:unrelated/entry': SavedEntry")) + expect(() => collectPluginRecords(root)).toThrow(`must use 'plugin:${namespace}/'`) + }) + it('accepts an empty inventory only when the owning empty map exists', () => { expect(collectPluginRecords(fixture())).toEqual([]) expect(() => collectPluginRecords(fixture({ [OWNER]: 'export {}\n' }))) @@ -99,7 +114,7 @@ describe('plugin record declarations', () => { 'packages/core/bridge/package.json': '{"name":"@deepseek-ai/dsh-experimental-bridge"}', 'packages/core/bridge/src/records.ts': augmentation(ENTRY), }) - expect(() => collectPluginRecords(root)).toThrow('must belong to an experimental') + expect(() => collectPluginRecords(root)).toThrow('must belong to a package declared experimental') }) it('requires the types module augmentation and verifiable package ownership', () => { diff --git a/scripts/plugin-record-catalog.ts b/scripts/plugin-record-catalog.ts index 79fb8e1789..07434feb46 100644 --- a/scripts/plugin-record-catalog.ts +++ b/scripts/plugin-record-catalog.ts @@ -3,11 +3,11 @@ import { globSync, readFileSync } from 'node:fs' import { resolve, sep } from 'node:path' import ts from 'typescript' +import { experimentalPackageRecordNamespace } from './experimental-package-policy.ts' import { parseJsDoc, pointer, rawJsDoc, reportViolations } from './jsdoc.ts' const SESSION_PACKAGE = '@deepseek-ai/dsh-session' const SESSION_TYPES_MODULE = `${SESSION_PACKAGE}/types` -const PACKAGE_PREFIX = '@deepseek-ai/dsh-experimental-' const RECORD_NAME = /^plugin:[a-z0-9][a-z0-9._-]*(?:\/[a-z0-9][a-z0-9._-]*)+$/u const printer = ts.createPrinter({ removeComments: true }) @@ -94,11 +94,12 @@ export function collectPluginRecords(scanRoot: string): PluginRecordEntry[] { violations.push(`${where} must augment declare module '${SESSION_TYPES_MODULE}'.`) return } - if (!file.startsWith('packages/experimental/') || owner === undefined || !owner.startsWith(PACKAGE_PREFIX)) { - violations.push(`${where} must belong to an experimental ${PACKAGE_PREFIX} package.`) + const namespace = owner === undefined ? undefined : experimentalPackageRecordNamespace(owner) + if (!file.startsWith('packages/experimental/') || owner === undefined || namespace === undefined) { + violations.push(`${where} must belong to a package declared experimental by the package naming policy.`) return } - const prefix = `plugin:${owner.slice(PACKAGE_PREFIX.length)}/` + const prefix = `plugin:${namespace}/` for (const member of node.members) { const location = pointer(file, source, member) if (!ts.isPropertySignature(member) || member.type === undefined || member.questionToken !== undefined diff --git a/scripts/release/families.spec.ts b/scripts/release/families.spec.ts index e10ebe3ab0..58fbe13911 100644 --- a/scripts/release/families.spec.ts +++ b/scripts/release/families.spec.ts @@ -64,25 +64,25 @@ describe('release families', () => { '@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp', '@deepseek-ai/dsh-experimental-computer-use-cua-driver-native', '@deepseek-ai/dsh-experimental-cot-translation-bundle', - '@deepseek-ai/dsh-experimental-hook-protocol', - '@deepseek-ai/dsh-experimental-hooks-claude-code', - '@deepseek-ai/dsh-experimental-hooks-codex', + '@deepseek-ai/dsh-hook-protocol', + '@deepseek-ai/dsh-hooks-claude-code', + '@deepseek-ai/dsh-hooks-codex', '@deepseek-ai/dsh-experimental-inspector-profile', '@deepseek-ai/dsh-experimental-inspector', '@deepseek-ai/dsh-experimental-ptc-runtime-python', '@deepseek-ai/dsh-experimental-session-inspector', - '@deepseek-ai/dsh-experimental-session-title-all-prompts-llm', - '@deepseek-ai/dsh-experimental-skill-badge', + '@deepseek-ai/dsh-session-title-all-prompts-llm', + '@deepseek-ai/dsh-skill-badge', '@deepseek-ai/dsh-experimental-speech-to-text-sensevoice', '@deepseek-ai/dsh-experimental-speech-to-text', '@deepseek-ai/dsh-experimental-tool-agent-team', - '@deepseek-ai/dsh-experimental-tool-ralph', - '@deepseek-ai/dsh-experimental-tool-terminal', + '@deepseek-ai/dsh-tool-ralph', + '@deepseek-ai/dsh-tool-terminal', '@deepseek-ai/dsh-experimental-tool-worktree', '@deepseek-ai/dsh-experimental-translator', '@deepseek-ai/dsh-experimental-voice-input-bundle', - '@deepseek-ai/dsh-experimental-webhook-github', - '@deepseek-ai/dsh-experimental-webhook', + '@deepseek-ai/dsh-webhook-github', + '@deepseek-ai/dsh-webhook', '@deepseek-ai/dsh-experimental-webworker-packer', '@deepseek-ai/dsh-experimental-webworker-runtime', '@deepseek-ai/dsh-experimental-worktree', diff --git a/scripts/release/installed-product-isolation.spec.ts b/scripts/release/installed-product-isolation.spec.ts index 5d8b4e4f51..f3eaf0e3f8 100644 --- a/scripts/release/installed-product-isolation.spec.ts +++ b/scripts/release/installed-product-isolation.spec.ts @@ -4,6 +4,7 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' +import { EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS } from '../experimental-package-policy.ts' import { verifyInstalledProductIsolation } from './installed-product-isolation.ts' const roots: string[] = [] @@ -26,7 +27,7 @@ afterEach(() => { for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true }) }) -describe('installed default-product isolation', () => { +describe.each([experimental, ...Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS)])('installed default-product isolation: %s', (experimental) => { it('ignores development dependencies and unrelated installed experimental packages', () => { const root = fixture() const entry = writePackage(root, '@deepseek-ai/dsh', { diff --git a/scripts/release/installed-product-isolation.ts b/scripts/release/installed-product-isolation.ts index e2877c23d2..1dd3e5323d 100644 --- a/scripts/release/installed-product-isolation.ts +++ b/scripts/release/installed-product-isolation.ts @@ -3,6 +3,7 @@ import { existsSync, readFileSync, realpathSync } from 'node:fs' import { createRequire } from 'node:module' import { join } from 'node:path' +import { hasExperimentalPackageReference } from '../experimental-package-policy.ts' import { OPTIONAL_BUNDLES } from '../../packages/boot/app-boot/src/profile.ts' interface InstalledManifest { @@ -56,7 +57,7 @@ export function verifyInstalledProductIsolation(directory: string, optionalBundl } function rejectExperimental(name: string, chain: readonly string[]): void { - if (name.startsWith('@deepseek-ai/dsh-experimental-')) { + if (hasExperimentalPackageReference(name)) { throw new Error(`default product includes an experimental package: ${chain.join(' -> ')}`) } } diff --git a/scripts/verify-default-product-isolation.spec.ts b/scripts/verify-default-product-isolation.spec.ts index 9e85a076c5..b11bcedeb0 100644 --- a/scripts/verify-default-product-isolation.spec.ts +++ b/scripts/verify-default-product-isolation.spec.ts @@ -5,6 +5,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { pathToFileURL } from 'node:url' import { afterEach, describe, expect, it } from 'vitest' +import { EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS } from './experimental-package-policy.ts' import { verifyDefaultProductIsolation } from './verify-default-product-isolation.ts' import { writeFixtureFile as write } from './fixture-file.ts' @@ -47,6 +48,32 @@ afterEach(() => { }) describe('default product isolation', () => { + describe.each(Object.entries(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('retained experimental identity %s', (directory, name) => { + it.each(['direct dependency', 'transitive dependency', 'npm alias', 'value import', 'subpath import', 'profile row', 'preset row'])( + 'rejects default product use through a %s', (route) => { + const root = fixture() + write(root, `${directory}/package.json`, { name }) + if (route === 'direct dependency') manifest(root, 'apps/cli/package.json', { dependencies: { [name]: 'workspace:*' } }) + if (route === 'transitive dependency') manifest(root, 'packages/core/core/package.json', { dependencies: { [name]: 'workspace:*' } }) + if (route === 'npm alias') manifest(root, 'packages/core/core/package.json', { dependencies: { alias: `npm:${name}@1.0.0` } }) + if (route === 'value import') write(root, 'apps/cli/src/bin.ts', `import '${name}'\n`) + if (route === 'subpath import') write(root, 'apps/cli/src/bin.ts', `import '${name}/feature'\n`) + if (route === 'profile row') write(root, patch, [{ insert: [{ name }] }]) + if (route === 'preset row') write(root, preset, [{ insert: [{ name: '@deepseek-ai/dsh-agent-preset', config: { id: 'standard', plugins: [{ name }] } }] }]) + expect(verifyDefaultProductIsolation(root).failures).toEqual(expect.arrayContaining([ + expect.stringMatching(new RegExp(`${name}.*default product must not include experimental packages`)), + ])) + }, + ) + + it('allows a type-only reference without promoting it to runtime use', () => { + const root = fixture() + write(root, `${directory}/package.json`, { name }) + write(root, 'apps/cli/src/bin.ts', `import type { Options } from '${name}'\nexport type { Options }\n`) + expect(verifyDefaultProductIsolation(root).failures).toEqual([]) + }) + }) + it.each(['@deepseek-ai/libreoffice-kit'])( 'accepts independently published %s but rejects unknown workspace packages', (name) => { const root = fixture() diff --git a/scripts/verify-default-product-isolation.ts b/scripts/verify-default-product-isolation.ts index 273fb841ec..e2305d9756 100644 --- a/scripts/verify-default-product-isolation.ts +++ b/scripts/verify-default-product-isolation.ts @@ -20,7 +20,7 @@ import { collectRuntimeSourceSpecifiers, } from './verify-client-packages.ts' -const EXPERIMENTAL_PREFIX = '@deepseek-ai/dsh-experimental-' +import { isExperimentalPackageName } from './experimental-package-policy.ts' // The independently published entry package owns platform-engine dependencies. const EXTERNAL_KIT_PACKAGES = new Set(['@deepseek-ai/libreoffice-kit']) const PROFILE_SOURCE = 'packages/boot/app-boot/src/profile.ts' @@ -107,7 +107,7 @@ export function verifyDefaultProductIsolation(root: string): ProductIsolationRes const sources = new Set() const configs = new Set() let webPluginCount = 0 - const isExperimental = (pkg: Package): boolean => pkg.manifest.name.startsWith(EXPERIMENTAL_PREFIX) + const isExperimental = (pkg: Package): boolean => isExperimentalPackageName(pkg.manifest.name) || display(pkg.directory).startsWith('packages/experimental/') const add = (pkg: Package, origin: string): void => { if (isExperimental(pkg)) { @@ -136,7 +136,7 @@ export function verifyDefaultProductIsolation(root: string): ProductIsolationRes return } const packageName = barePackageName(name) - if (packageName.startsWith(EXPERIMENTAL_PREFIX)) { + if (isExperimentalPackageName(packageName)) { failures.push(`${origin} -> ${name}: default product must not include experimental packages`) return } diff --git a/scripts/verify-package-readme-model-experience.ts b/scripts/verify-package-readme-model-experience.ts index 5823f9b671..99c96f919f 100644 --- a/scripts/verify-package-readme-model-experience.ts +++ b/scripts/verify-package-readme-model-experience.ts @@ -170,7 +170,7 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly> = { 'packages/host/directory-picker-browse': { kind: 'none', reason: 'The GUI-host picking backend registers nothing model-facing.' }, 'packages/host/directory-picker-native': { kind: 'none', reason: 'The GUI-host picking backend registers nothing model-facing.' }, 'packages/host/webserver': { kind: 'none', reason: 'The HTTP carrier bridges browser and API handler and registers nothing model-facing.' }, - 'packages/experimental/webhook-github': { kind: 'indirect', reason: 'The adapter delegates model-visible text to matching rules and dsh-experimental-webhook.' }, + 'packages/experimental/webhook-github': { kind: 'indirect', reason: 'The adapter delegates model-visible text to matching rules and dsh-webhook.' }, 'packages/host/frontend-static': { kind: 'none', reason: 'The SPA dist server answers browser asset requests and registers nothing model-facing.' }, 'packages/host/plugin-inventory': { kind: 'none', reason: 'Host-side read-only Loader projection; registers nothing model-facing.' }, 'packages/host/open-in-app': { kind: 'none', reason: 'Host routes opening desktop applications for a human; registers nothing model-facing.' }, diff --git a/scripts/web-product-bundle-isolation.spec.ts b/scripts/web-product-bundle-isolation.spec.ts index 64a4accaf5..8d42fe8e75 100644 --- a/scripts/web-product-bundle-isolation.spec.ts +++ b/scripts/web-product-bundle-isolation.spec.ts @@ -8,6 +8,7 @@ import { pathToFileURL } from 'node:url' import { describe, expect, it, onTestFinished, vi } from 'vitest' import { browserDependencyAnalysis, productWebBundleIsolation } from '../apps/web/product-isolation.ts' import { WebProductBundleIsolation } from './web-product-bundle-isolation.ts' +import { EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS } from './experimental-package-policy.ts' import { BundleInputIsolation } from './bundle-input-isolation.ts' const filesystem = vi.hoisted(() => ({ missingRoot: false })) @@ -120,11 +121,11 @@ describe('default Web bundle input isolation', () => { .rejects.toThrow(/Web product isolation: experimental input/) }) - it('checks npm alias package identity independently of its directory name', async () => { + it.each(['@deepseek-ai/dsh-experimental-aliased', ...Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS)])('checks npm alias package identity %s independently of its directory name', async (name) => { const test = fixture() test.write('apps/web/src/main.js', 'import "ordinary-name"') test.write('apps/web/node_modules/ordinary-name/package.json', - '{"name":"@deepseek-ai/dsh-experimental-aliased","type":"module","main":"index.js"}') + JSON.stringify({ name, type: 'module', main: 'index.js' })) test.write('apps/web/node_modules/ordinary-name/index.js', 'globalThis.aliased = true') await expect(test.run()).rejects.toThrow(/belongs to experimental package/) }) @@ -221,6 +222,19 @@ describe('default Web bundle input isolation', () => { }) describe('bundler input ownership', () => { + it.each(Object.values(EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS))('rejects retained identity %s in unresolved inputs and source-map ownership', (name) => { + const test = fixture() + const ownership = new BundleInputIsolation(test.root, 'fixture') + for (const reference of [name, `${name}/client`, `\u0000virtual:${name}/client?raw`]) { + expect(() => { ownership.assertInput(reference) }).toThrow(/experimental input/) + } + const absentWindowsSource = `C:\\omitted\\node_modules\\${name.replaceAll('/', '\\')}\\src\\index.ts` + expect(() => { ownership.assertSourceMapInput(absentWindowsSource) }).toThrow(/experimental input/) + test.write('apps/web/node_modules/upstream/package.json', JSON.stringify({ name })) + expect(() => { ownership.assertSourceMapInput(join(test.web, 'node_modules/upstream/src/omitted.js')) }) + .toThrow(/belongs to experimental package/) + }) + it('refuses source-map paths whose filesystem root is unavailable', () => { const test = fixture() const ownership = new BundleInputIsolation(test.root, 'fixture') diff --git a/snapshots/acp/escalation-approved/cordis.yml b/snapshots/acp/escalation-approved/cordis.yml index a0bfa2c372..08e9986ee3 100644 --- a/snapshots/acp/escalation-approved/cordis.yml +++ b/snapshots/acp/escalation-approved/cordis.yml @@ -71,12 +71,12 @@ - insert: - id: hooks-claude-code - name: '@deepseek-ai/dsh-experimental-hooks-claude-code' + name: '@deepseek-ai/dsh-hooks-claude-code' config: configPath: ./hooks.json - id: hooks-codex - name: '@deepseek-ai/dsh-experimental-hooks-codex' + name: '@deepseek-ai/dsh-hooks-codex' config: configPath: ./codex-hooks.json diff --git a/snapshots/session/pty-tools-sandbox-backend/cordis.snapshot.yml b/snapshots/session/pty-tools-sandbox-backend/cordis.snapshot.yml index 73e64267f8..a912d7ffbd 100644 --- a/snapshots/session/pty-tools-sandbox-backend/cordis.snapshot.yml +++ b/snapshots/session/pty-tools-sandbox-backend/cordis.snapshot.yml @@ -9,7 +9,7 @@ - id: pty-snapshot-backend name: './pty-snapshot-backend.mjs' - id: tool-terminal - name: '@deepseek-ai/dsh-experimental-tool-terminal' + name: '@deepseek-ai/dsh-tool-terminal' config: maxResultBytes: 64 - id: llm-replay diff --git a/snapshots/session/pty-tools-sandbox-backend/cordis.yml b/snapshots/session/pty-tools-sandbox-backend/cordis.yml index f9bc660180..c8ba76be5a 100644 --- a/snapshots/session/pty-tools-sandbox-backend/cordis.yml +++ b/snapshots/session/pty-tools-sandbox-backend/cordis.yml @@ -13,4 +13,4 @@ timeoutMs: 2000 disposeGraceMs: 500 - id: tool-terminal - name: '@deepseek-ai/dsh-experimental-tool-terminal' + name: '@deepseek-ai/dsh-tool-terminal' diff --git a/snapshots/session/ralph-loop/cordis.snapshot.yml b/snapshots/session/ralph-loop/cordis.snapshot.yml index d23a9727e4..c2be202ac3 100644 --- a/snapshots/session/ralph-loop/cordis.snapshot.yml +++ b/snapshots/session/ralph-loop/cordis.snapshot.yml @@ -46,7 +46,7 @@ - insert: - id: tool-ralph - name: '@deepseek-ai/dsh-experimental-tool-ralph' + name: '@deepseek-ai/dsh-tool-ralph' config: subagentProvider: spawn maxRounds: 64 diff --git a/snapshots/session/ralph-loop/cordis.yml b/snapshots/session/ralph-loop/cordis.yml index 4767d9f166..7ae7e1963e 100644 --- a/snapshots/session/ralph-loop/cordis.yml +++ b/snapshots/session/ralph-loop/cordis.yml @@ -1,7 +1,7 @@ # This scenario adds Ralph over the shared headless composition. - insert: - id: tool-ralph - name: '@deepseek-ai/dsh-experimental-tool-ralph' + name: '@deepseek-ai/dsh-tool-ralph' config: subagentProvider: spawn maxRounds: 64 diff --git a/snapshots/session/text-turn/cordis.yml b/snapshots/session/text-turn/cordis.yml index 5814ffc142..dd4fe733e6 100644 --- a/snapshots/session/text-turn/cordis.yml +++ b/snapshots/session/text-turn/cordis.yml @@ -67,12 +67,12 @@ - insert: - id: hooks-claude-code - name: '@deepseek-ai/dsh-experimental-hooks-claude-code' + name: '@deepseek-ai/dsh-hooks-claude-code' config: configPath: ./hooks.json - id: hooks-codex - name: '@deepseek-ai/dsh-experimental-hooks-codex' + name: '@deepseek-ai/dsh-hooks-codex' config: configPath: ./codex-hooks.json diff --git a/tsconfig.base.json b/tsconfig.base.json index 009ec03dae..28ba3b7891 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -341,15 +341,6 @@ "@deepseek-ai/dsh-compaction-image-offload/projection": ["./packages/compaction/compaction-image-offload/src/projection.ts"], "@deepseek-ai/dsh-session-format-catalog/message-projections": ["./packages/session/session-format-catalog/src/message-projections.ts"], "@deepseek-ai/dsh-native-command/types": ["./packages/util/native-command/src/types.ts"], - "@deepseek-ai/dsh-experimental-hook-protocol": ["./packages/experimental/hook-protocol/src"], - "@deepseek-ai/dsh-experimental-hooks-claude-code": ["./packages/experimental/hooks-claude-code/src"], - "@deepseek-ai/dsh-experimental-hooks-codex": ["./packages/experimental/hooks-codex/src"], - "@deepseek-ai/dsh-experimental-session-title-all-prompts-llm": ["./packages/experimental/session-title-all-prompts-llm/src"], - "@deepseek-ai/dsh-experimental-skill-badge": ["./packages/experimental/skill-badge/src"], - "@deepseek-ai/dsh-experimental-tool-ralph": ["./packages/experimental/tool-ralph/src"], - "@deepseek-ai/dsh-experimental-tool-terminal": ["./packages/experimental/tool-terminal/src"], - "@deepseek-ai/dsh-experimental-webhook": ["./packages/experimental/webhook/src"], - "@deepseek-ai/dsh-experimental-webhook-github": ["./packages/experimental/webhook-github/src"], // BEGIN generated package aliases — pnpm run gen-tsconfig-paths "@deepseek-ai/dsh-acp": ["./packages/acp/acp/src"], "@deepseek-ai/dsh-acp-app": ["./packages/bundle/acp-app/src"], @@ -397,6 +388,9 @@ "@deepseek-ai/dsh-goal-round-driver": ["./packages/goal/goal-round-driver/src"], "@deepseek-ai/dsh-headless": ["./packages/bundle/headless/src"], "@deepseek-ai/dsh-home-paths": ["./packages/util/home-paths/src"], + "@deepseek-ai/dsh-hook-protocol": ["./packages/experimental/hook-protocol/src"], + "@deepseek-ai/dsh-hooks-claude-code": ["./packages/experimental/hooks-claude-code/src"], + "@deepseek-ai/dsh-hooks-codex": ["./packages/experimental/hooks-codex/src"], "@deepseek-ai/dsh-http-proxy": ["./packages/util/http-proxy/src"], "@deepseek-ai/dsh-jobs": ["./packages/jobs/jobs/src"], "@deepseek-ai/dsh-jobs-local": ["./packages/jobs/jobs-local/src"], @@ -460,12 +454,14 @@ "@deepseek-ai/dsh-session-telemetry": ["./packages/session/session-telemetry/src"], "@deepseek-ai/dsh-session-telemetry-otel": ["./packages/session/session-telemetry-otel/src"], "@deepseek-ai/dsh-session-title": ["./packages/session/session-title/src"], + "@deepseek-ai/dsh-session-title-all-prompts-llm": ["./packages/experimental/session-title-all-prompts-llm/src"], "@deepseek-ai/dsh-session-title-first-prompt-llm": ["./packages/session/session-title-first-prompt-llm/src"], "@deepseek-ai/dsh-session-title-llm": ["./packages/session/session-title-llm/src"], "@deepseek-ai/dsh-session-turn-outline": ["./packages/session/session-turn-outline/src"], "@deepseek-ai/dsh-settings": ["./packages/settings/settings/src"], "@deepseek-ai/dsh-shell": ["./packages/shell/shell/src"], "@deepseek-ai/dsh-skill": ["./packages/skill/skill/src"], + "@deepseek-ai/dsh-skill-badge": ["./packages/experimental/skill-badge/src"], "@deepseek-ai/dsh-skill-filesystem": ["./packages/skill/skill-filesystem/src"], "@deepseek-ai/dsh-skill-office": ["./packages/skill/skill-office/src"], "@deepseek-ai/dsh-spill": ["./packages/spill/spill/src"], @@ -504,12 +500,14 @@ "@deepseek-ai/dsh-tool-lsp": ["./packages/lsp/tool-lsp/src"], "@deepseek-ai/dsh-tool-present": ["./packages/deliverables/tool-present/src"], "@deepseek-ai/dsh-tool-pwsh-persistent": ["./packages/shell/tool-pwsh-persistent/src"], + "@deepseek-ai/dsh-tool-ralph": ["./packages/experimental/tool-ralph/src"], "@deepseek-ai/dsh-tool-schedule": ["./packages/schedule/tool-schedule/src"], "@deepseek-ai/dsh-tool-session-query": ["./packages/session-query/tool-session-query/src"], "@deepseek-ai/dsh-tool-skill": ["./packages/skill/tool-skill/src"], "@deepseek-ai/dsh-tool-str-replace-editor": ["./packages/fs/tool-str-replace-editor/src"], "@deepseek-ai/dsh-tool-subagent": ["./packages/subagent/tool-subagent/src"], "@deepseek-ai/dsh-tool-subagent-control": ["./packages/subagent/tool-subagent-control/src"], + "@deepseek-ai/dsh-tool-terminal": ["./packages/experimental/tool-terminal/src"], "@deepseek-ai/dsh-tool-todo": ["./packages/todo/tool-todo/src"], "@deepseek-ai/dsh-tool-web": ["./packages/web/tool-web/src"], "@deepseek-ai/dsh-tool-workflow": ["./packages/workflow/tool-workflow/src"], @@ -524,6 +522,8 @@ "@deepseek-ai/dsh-web-search-deepseek": ["./packages/web/web-search-deepseek/src"], "@deepseek-ai/dsh-web-search-exa": ["./packages/web/web-search-exa/src"], "@deepseek-ai/dsh-web-search-perplexity": ["./packages/web/web-search-perplexity/src"], + "@deepseek-ai/dsh-webhook": ["./packages/experimental/webhook/src"], + "@deepseek-ai/dsh-webhook-github": ["./packages/experimental/webhook-github/src"], "@deepseek-ai/dsh-win32-process": ["./packages/subprocess/win32-process/src"], "@deepseek-ai/dsh-workflow": ["./packages/workflow/workflow/src"], "@deepseek-ai/dsh-workflow-ptc": ["./packages/workflow/workflow-ptc/src"], diff --git a/tsconfig.client.json b/tsconfig.client.json index 8257111fdb..a8f0a9ed96 100644 --- a/tsconfig.client.json +++ b/tsconfig.client.json @@ -39,6 +39,7 @@ "packages/client/tsdown.client.ts", "scripts/client-build-environment.ts", "scripts/bundle-input-isolation.ts", + "scripts/experimental-package-policy.ts", "scripts/*.client.spec.ts", "scripts/client-bundle-css.spec.ts", "scripts/client-bundle-purity.spec.ts"