diff --git a/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.i18n.yaml b/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.i18n.yaml index 2a32b20072..dba5b6f446 100644 --- a/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.i18n.yaml @@ -9,8 +9,8 @@ en: a9984a594cdac98d zh: 38768e7699bc8d39 /agent-note-progressive-office-skills-with-ordinary-shell-execution/decision: - en: 391c5d75994ab7e7 - zh: f820f407eb2d8769 + en: 2c10d0dc58ddf3ec + zh: fb36de700669afec /agent-note-progressive-office-skills-with-ordinary-shell-execution/alternatives-considered: en: 0689e709dc1ff48d zh: 5d2108ccdd13f093 diff --git a/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.md b/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.md index 2b0d0a9db9..ae97a9b583 100644 --- a/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.md +++ b/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.md @@ -11,7 +11,7 @@ Combined authoring and rendering instructions spend context on operations unrela ## Decision -The [Office provider](../../../../packages/skill/skill-office/README.md) lists a compact router and three format-specific authoring skills; the operation skills this decision introduced are replaced by the [on-demand Office tools](2026-10-31-native-office-tool.md). The model loads full instructions by name and selects rendering for appearance-focused changes unless the user explicitly skips it. Rendering uses a private, randomly named temporary directory inside the task workspace and removes it after inspection. Skills invoke the shared Python checker and configured LibreOffice Kit CLI through ordinary Bash or PowerShell. SDK and Desktop own their Office composition separately; ordinary Web and the shared base do not mount these plugins. [Office skills in every deployment](2026-10-26-cross-deployment-office-kit.md) supersedes this mounting decision, and the [on-demand Office tools](2026-10-31-native-office-tool.md) supersede the shell execution and renderer-tool rejection. +The [Office provider](../../../../packages/skill/skill-office/README.md) lists a compact router and three format-specific authoring skills; the operation skills this decision introduced are replaced by the [on-demand Office tools](2026-10-31-native-office-tool.md). The model loads full instructions by name and selects rendering for appearance-focused changes unless the user explicitly skips it. Rendering uses a private, randomly named temporary directory inside the task workspace and removes it after inspection. Skills invoke the shared Python checker and configured LibreOffice Kit CLI through ordinary Bash or PowerShell. SDK and Desktop own their Office composition separately; ordinary Web and the shared base do not mount these plugins. The [on-demand Office tools](2026-10-31-native-office-tool.md) supersede the shell execution and renderer-tool rejection. Carriers own interpreter and resource locations. Operation skills append the configured Node and CLI paths only when their bodies are loaded; authoring skills use the selected Python and shared checker resource. Loading instructions does not prepare engines or authoring payloads. Ordinary shell execution retains its existing permissions and process management. diff --git a/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.zh.md b/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.zh.md index 32a752f09c..f62944873c 100644 --- a/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.zh.md +++ b/.agents/notes/implemented/architecture/2026-09-27-progressive-office-skills.zh.md @@ -11,7 +11,7 @@ Status: implemented ## 决策 -[Office 提供者](../../../../packages/skill/skill-office/README.zh.md) 列出精简路由和三个各格式创作技能;本决策引入的操作技能已由[按需激活的 Office 工具](2026-10-31-native-office-tool.zh.md)取代。模型按名称加载完整说明;以外观为目标的修改会选择渲染,除非用户明确要求跳过。渲染使用任务工作区内随机命名的私有临时目录,并在检查后删除。技能通过普通 Bash 或 PowerShell 调用共享 Python 检查器和配置的 LibreOffice Kit CLI。SDK 和 Desktop 分别拥有 Office 组合;普通 Web 和共享 base 不挂载这些插件。[Office 技能在所有部署中可用](2026-10-26-cross-deployment-office-kit.zh.md)取代此挂载决策,[按需激活的 Office 工具](2026-10-31-native-office-tool.zh.md)取代其 shell 执行方式和对渲染工具的否决。 +[Office 提供者](../../../../packages/skill/skill-office/README.zh.md) 列出精简路由和三个各格式创作技能;本决策引入的操作技能已由[按需激活的 Office 工具](2026-10-31-native-office-tool.zh.md)取代。模型按名称加载完整说明;以外观为目标的修改会选择渲染,除非用户明确要求跳过。渲染使用任务工作区内随机命名的私有临时目录,并在检查后删除。技能通过普通 Bash 或 PowerShell 调用共享 Python 检查器和配置的 LibreOffice Kit CLI。SDK 和 Desktop 分别拥有 Office 组合;普通 Web 和共享 base 不挂载这些插件。[按需激活的 Office 工具](2026-10-31-native-office-tool.zh.md)取代其 shell 执行方式和对渲染工具的否决。 载体负责解释器和资源位置。操作技能仅在加载正文时附加配置的 Node 与 CLI 路径;创作技能使用选定的 Python 和共享检查器资源。加载说明不准备引擎或创作 payload。普通 shell 执行保留现有权限和进程管理。 diff --git a/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.i18n.yaml b/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.i18n.yaml index 4df818fcc8..368f6213b0 100644 --- a/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.i18n.yaml @@ -2,18 +2,18 @@ # 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 .agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.md -/agent-note-office-skills-in-every-deployment-with-one-office-kit-package: - en: aef0b589f3562990 - zh: c2227dd19e282c6f -/agent-note-office-skills-in-every-deployment-with-one-office-kit-package/problem: - en: 129d30508926bbc5 - zh: 15feff44556fc9b7 -/agent-note-office-skills-in-every-deployment-with-one-office-kit-package/decision: - en: 2605a9eddd6f91e6 - zh: 08536ad09042586d -/agent-note-office-skills-in-every-deployment-with-one-office-kit-package/alternatives-considered: - en: 167c52da0171028f - zh: 9c87c2370d0719df -/agent-note-office-skills-in-every-deployment-with-one-office-kit-package/consequences: - en: ffd13aad24ca750c - zh: a22f513e123f31b4 +/agent-note-one-office-kit-package-across-deployments: + en: a4558b56d2a49f7f + zh: cb62eb5b6c762eba +/agent-note-one-office-kit-package-across-deployments/problem: + en: f27bccc8c9d6e5e5 + zh: 4fc2454bbea7f17d +/agent-note-one-office-kit-package-across-deployments/decision: + en: 6b097c3ce6288717 + zh: c305c5bf03de4e02 +/agent-note-one-office-kit-package-across-deployments/alternatives-considered: + en: 57fbc447be854953 + zh: da5867587c93a2a1 +/agent-note-one-office-kit-package-across-deployments/consequences: + en: c4220369acceab74 + zh: c8a78727ef28abdd diff --git a/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.md b/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.md index e28923712a..e06f8814a8 100644 --- a/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.md +++ b/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.md @@ -1,4 +1,4 @@ -# Agent Note: Office skills in every deployment with one Office Kit package +# Agent Note: One Office Kit package across deployments Status: implemented @@ -6,13 +6,13 @@ English | [中文](2026-10-26-cross-deployment-office-kit.zh.md) ## Problem -Office skills were mounted only by Desktop and the Python SDK, so ordinary `dsh web` users could not create or inspect Office documents with the same guidance. Each deployment located LibreOffice Kit differently: the conversion provider, the skills, and the Desktop shell each held their own lookup, and an absent Kit made the conversion row fail to load. A Python SDK executable without its downloaded Office sidecar, or a source checkout without native engines, is a deployment that lacks Kit, not a misconfigured composition; failing the row hid the provider and the skills even though most of their behavior did not need Kit. +Each deployment located LibreOffice Kit differently: the conversion provider, the skills, and the Desktop shell each held their own lookup, and an absent Kit made the conversion row fail to load. A Python SDK executable without its downloaded Office sidecar, or a source checkout without native engines, is a deployment that lacks Kit, not a misconfigured composition; failing the row hid the provider and the skills even though most of their behavior did not need Kit. ## Decision -The [Web bundle](../../../../packages/bundle/web-app/cordis.patch.yml) and the [SDK bundle](../../../../packages/bundle/sdk-app/cordis.patch.yml) mount [`skill-office`](../../../../packages/skill/skill-office/README.md) in Desktop, ordinary `dsh web`, and the SDK. This supersedes the mounting decision of [progressive Office skills](2026-09-27-progressive-office-skills.md); its skill structure remains current, and the [on-demand Office tools](2026-10-31-native-office-tool.md) replace its shell execution. +The [Web bundle](../../../../packages/bundle/web-app/cordis.patch.yml) mounts [`skill-office`](../../../../packages/skill/skill-office/README.md) only in Desktop, and the [SDK bundle](../../../../packages/bundle/sdk-app/cordis.patch.yml) only with a primary runtime, following the mounting decision of [progressive Office skills](2026-09-27-progressive-office-skills.md). -The bundled Python environment ([`tool-workspace-dependencies`](../../../../packages/skill/tool-workspace-dependencies/README.md)) mounts only in Desktop and in the SDK when a primary runtime is available. `skill-office` declares `pythonEnvironment: 'workspace-dependencies' | 'user'` explicitly; each bundle row selects the value for its deployment. The default is `'workspace-dependencies'` because older SDK patches replace the complete `config` of the `skill-office` row; such a patch omits the new key and keeps the bundled-environment instructions it was written for. +The bundled Python environment ([`tool-workspace-dependencies`](../../../../packages/skill/tool-workspace-dependencies/README.md)) mounts only in Desktop and in the SDK when a primary runtime is available. `skill-office` declares `pythonEnvironment: 'workspace-dependencies' | 'user'` explicitly; a Desktop profile launched without a primary runtime selects `'user'`. The default is `'workspace-dependencies'` because older SDK patches replace the complete `config` of the `skill-office` row; such a patch omits the new key and keeps the bundled-environment instructions it was written for. [`@deepseek-ai/dsh-office-kit`](../../../../packages/document/office-kit/README.md) owns Kit location and the shared conversion service. Kit location is an internal implementation of the provider and is not exported: the provider passes its own `import.meta.resolve` lookup, and native engine paths use ASAR-unpacked mapping. Location reads no environment variables. The [on-demand Office tools](2026-10-31-native-office-tool.md) run Kit operations inside the Host, so no deployment publishes Kit CLI paths or Office executable variables. @@ -22,9 +22,7 @@ An absent Kit degrades instead of failing a load. The conversion service registe ## Alternatives considered -**Keep Office skills out of ordinary Web.** This keeps ordinary Web free of Office guidance it might not execute, but leaves Web users without document authoring that needs only Python libraries. Skills now direct the model to the user's Python when no bundled environment exists. - -**Default `pythonEnvironment` to `'user'`.** This matches ordinary Web, but an older SDK patch that replaces the row's `config` would silently switch Desktop-like SDK deployments to the user's Python. +**Default `pythonEnvironment` to `'user'`.** This matches a Desktop launch without a primary runtime, but an older SDK patch that replaces the row's `config` would silently switch SDK deployments with a primary runtime to the user's Python. **Read deployment environment variables inside the locator.** This removes the `cordis.yml` expressions, but hides deployment configuration inside a library and makes source, Web, Desktop, and SDK behavior depend on ambient variables. Bundles already own deployment-specific expressions. @@ -34,8 +32,8 @@ An absent Kit degrades instead of failing a load. The conversion service registe ## Consequences -Ordinary Web and SDK sessions without a bundled environment list the four Office skills, which adds their summaries to the first context. Deployments without Kit see `unavailable` previews and `office_*` tools that report the missing Kit instead of failing at startup; skill loading does not check for Kit; a later Kit installation takes effect for conversion without reloading the provider. External compositions migrate from the `office-to-pdf` row, `ctx.officeToPdf`, and the `officeToPdf/*` Remote methods to the `office-kit` package through the [upgrade guide](../../../../docs/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.md). +Deployments without Kit see `unavailable` previews and `office_*` tools that report the missing Kit instead of failing at startup; skill loading does not check for Kit; a later Kit installation takes effect for conversion without reloading the provider. External compositions migrate from the `office-to-pdf` row, `ctx.officeToPdf`, and the `officeToPdf/*` Remote methods to the `office-kit` package through the [upgrade guide](../../../../docs/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.md). Processes launched from the Desktop built-in terminal inherit `DSH_PRIMARY_RUNTIME`, so the SDK uses its bundled environment. The shell publishes no Kit location; child applications resolve their own Kit. -Verification covers Kit lookup from the provider's Kit entry ([kit-lookup.spec.ts](../../../../packages/document/office-kit/tests/kit-lookup.spec.ts)), engine resolution and ASAR-unpacked path mapping ([engine-package.spec.ts](../../../../packages/document/office-kit/tests/engine-package.spec.ts)), independent engine resolution per Kit installation ([anchors.spec.ts](../../../../packages/document/office-kit/tests/anchors.spec.ts)), conversion retry after a missing or unloadable Kit, deduplicated warnings, the `office_*` tools' `unavailable` results with an absent Kit, recorded Web and SDK sessions that list the Office skills, and Office profile end-to-end tests. +Verification covers Kit lookup from the provider's Kit entry ([kit-lookup.spec.ts](../../../../packages/document/office-kit/tests/kit-lookup.spec.ts)), engine resolution and ASAR-unpacked path mapping ([engine-package.spec.ts](../../../../packages/document/office-kit/tests/engine-package.spec.ts)), independent engine resolution per Kit installation ([anchors.spec.ts](../../../../packages/document/office-kit/tests/anchors.spec.ts)), conversion retry after a missing or unloadable Kit, deduplicated warnings, the `office_*` tools' `unavailable` results with an absent Kit, and Office profile end-to-end tests. diff --git a/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.zh.md b/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.zh.md index 5ff18f05d4..c9f9228a3f 100644 --- a/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.zh.md +++ b/.agents/notes/implemented/architecture/2026-10-26-cross-deployment-office-kit.zh.md @@ -1,4 +1,4 @@ -# Agent Note: Office 技能在所有部署中可用,由单一 Office Kit 包提供 Kit +# Agent Note: 各部署共用单一 Office Kit 包 Status: implemented @@ -6,13 +6,13 @@ Status: implemented ## 问题 -原先只有 Desktop 和 Python SDK 挂载 Office 技能,普通 `dsh web` 用户无法借助同样的指导创建或检查 Office 文档。各部署定位 LibreOffice Kit 的方式也不同:转换提供方、技能和 Desktop 壳各自查找 Kit,Kit 缺失时转换配置行加载失败。没有下载 Office sidecar 的 Python SDK 可执行程序、没有原生引擎的源码检出,都属于部署缺少 Kit,而不是组合配置错误;让配置行失败会隐藏提供方和技能,而它们的大部分行为并不需要 Kit。 +各部署定位 LibreOffice Kit 的方式不同:转换提供方、技能和 Desktop 壳各自查找 Kit,Kit 缺失时转换配置行加载失败。没有下载 Office sidecar 的 Python SDK 可执行程序、没有原生引擎的源码检出,都属于部署缺少 Kit,而不是组合配置错误;让配置行失败会隐藏提供方和技能,而它们的大部分行为并不需要 Kit。 ## 决策 -[Web bundle](../../../../packages/bundle/web-app/cordis.patch.yml) 和 [SDK bundle](../../../../packages/bundle/sdk-app/cordis.patch.yml) 在 Desktop、普通 `dsh web` 和 SDK 中都挂载 [`skill-office`](../../../../packages/skill/skill-office/README.zh.md)。这取代了[渐进式 Office 技能](2026-09-27-progressive-office-skills.zh.md)中的挂载决策;其技能结构仍然有效,[按需激活的 Office 工具](2026-10-31-native-office-tool.zh.md)取代了其 shell 执行方式。 +[Web bundle](../../../../packages/bundle/web-app/cordis.patch.yml) 只在 Desktop 中挂载 [`skill-office`](../../../../packages/skill/skill-office/README.zh.md),[SDK bundle](../../../../packages/bundle/sdk-app/cordis.patch.yml) 只在有主运行时时挂载,沿用[渐进式 Office 技能](2026-09-27-progressive-office-skills.zh.md)中的挂载决策。 -内置 Python 环境([`tool-workspace-dependencies`](../../../../packages/skill/tool-workspace-dependencies/README.zh.md))只在 Desktop 以及有主运行时的 SDK 中挂载。`skill-office` 显式声明 `pythonEnvironment: 'workspace-dependencies' | 'user'`,由各 bundle 的配置行按部署选择取值。默认值为 `'workspace-dependencies'`,因为旧 SDK patch 会整体替换 `skill-office` 行的 `config`;这样的 patch 不含新键,仍保留它所针对的内置环境说明。 +内置 Python 环境([`tool-workspace-dependencies`](../../../../packages/skill/tool-workspace-dependencies/README.zh.md))只在 Desktop 以及有主运行时的 SDK 中挂载。`skill-office` 显式声明 `pythonEnvironment: 'workspace-dependencies' | 'user'`;没有主运行时启动的 Desktop profile 选择 `'user'`。默认值为 `'workspace-dependencies'`,因为旧 SDK patch 会整体替换 `skill-office` 行的 `config`;这样的 patch 不含新键,仍保留它所针对的内置环境说明。 [`@deepseek-ai/dsh-office-kit`](../../../../packages/document/office-kit/README.zh.md) 负责 Kit 定位和共享转换服务。Kit 定位是提供方的内部实现,不对外导出:提供方传入自己的 `import.meta.resolve` 查找函数,原生引擎路径使用 ASAR 解包映射。定位不读取环境变量。[按需激活的 Office 工具](2026-10-31-native-office-tool.zh.md)在 Host 内执行 Kit 操作,因此任何部署都不发布 Kit CLI 路径或 Office 可执行文件变量。 @@ -22,9 +22,7 @@ Kit 缺失时降级,而不是加载失败。转换服务照常注册,以代 ## 考虑过的替代方案 -**普通 Web 继续不挂载 Office 技能。** 这样普通 Web 不会出现它可能无法执行的 Office 指导,但 Web 用户也无法使用只需要 Python 库的文档创作。现在没有内置环境时,技能会引导模型使用用户的 Python。 - -**`pythonEnvironment` 默认取 `'user'`。** 这与普通 Web 一致,但整体替换该行 `config` 的旧 SDK patch 会让类似 Desktop 的 SDK 部署悄然改用用户的 Python。 +**`pythonEnvironment` 默认取 `'user'`。** 这与没有主运行时启动的 Desktop 一致,但整体替换该行 `config` 的旧 SDK patch 会让有主运行时的 SDK 部署悄然改用用户的 Python。 **在定位函数中读取部署环境变量。** 这样可以去掉 `cordis.yml` 表达式,但会把部署配置藏进库中,使源码、Web、Desktop 和 SDK 的行为依赖环境变量。bundle 本来就负责部署专有的表达式。 @@ -34,8 +32,8 @@ Kit 缺失时降级,而不是加载失败。转换服务照常注册,以代 ## 影响 -没有内置环境的普通 Web 和 SDK 会话会列出四个 Office 技能,首个上下文因此增加它们的摘要。没有 Kit 的部署看到的是 `unavailable` 预览和报告 Kit 缺失的 `office_*` 工具,而不是启动失败;加载技能时不检查 Kit;之后安装的 Kit 无需重新加载提供方即可用于转换。外部组合按[升级指南](../../../../docs/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.zh.md)从 `office-to-pdf` 配置行、`ctx.officeToPdf` 和 `officeToPdf/*` Remote 方法迁移到 `office-kit` 包。 +没有 Kit 的部署看到的是 `unavailable` 预览和报告 Kit 缺失的 `office_*` 工具,而不是启动失败;加载技能时不检查 Kit;之后安装的 Kit 无需重新加载提供方即可用于转换。外部组合按[升级指南](../../../../docs/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.zh.md)从 `office-to-pdf` 配置行、`ctx.officeToPdf` 和 `officeToPdf/*` Remote 方法迁移到 `office-kit` 包。 从 Desktop 内置终端启动的进程会继承 `DSH_PRIMARY_RUNTIME`,因此 SDK 使用其内置环境。Desktop 壳不发布 Kit 位置;子应用自行解析自己的 Kit。 -验证覆盖从提供方 Kit 入口查找 Kit([kit-lookup.spec.ts](../../../../packages/document/office-kit/tests/kit-lookup.spec.ts))、引擎解析与 ASAR 解包路径映射([engine-package.spec.ts](../../../../packages/document/office-kit/tests/engine-package.spec.ts))、按 Kit 安装独立解析引擎([anchors.spec.ts](../../../../packages/document/office-kit/tests/anchors.spec.ts))、Kit 缺失或无法加载后的转换重试、去重后的警告、Kit 缺失时 `office_*` 工具的 `unavailable` 结果、列出 Office 技能的录制 Web 与 SDK 会话,以及 Office profile 端到端测试。 +验证覆盖从提供方 Kit 入口查找 Kit([kit-lookup.spec.ts](../../../../packages/document/office-kit/tests/kit-lookup.spec.ts))、引擎解析与 ASAR 解包路径映射([engine-package.spec.ts](../../../../packages/document/office-kit/tests/engine-package.spec.ts))、按 Kit 安装独立解析引擎([anchors.spec.ts](../../../../packages/document/office-kit/tests/anchors.spec.ts))、Kit 缺失或无法加载后的转换重试、去重后的警告、Kit 缺失时 `office_*` 工具的 `unavailable` 结果,以及 Office profile 端到端测试。 diff --git a/apps/cli/tests/profiles/sdk/keyless-smoke.e2e.ts b/apps/cli/tests/profiles/sdk/keyless-smoke.e2e.ts index a3d76cb33d..df71ffe2a6 100644 --- a/apps/cli/tests/profiles/sdk/keyless-smoke.e2e.ts +++ b/apps/cli/tests/profiles/sdk/keyless-smoke.e2e.ts @@ -545,6 +545,7 @@ it.each(['unset', 'empty', 'full', 'python-only', 'python-only-patched', 'missin const root = await mkdtemp(join(tmpdir(), 'sdk-office-')) onTestFinished(() => rm(root, { recursive: true, force: true })) const enabled = mode !== 'unset' && mode !== 'empty' + const skills = enabled && mode !== 'missing-assets' const { source, paths } = await officeFixture(root, mode.startsWith('python-only')) if (mode === 'missing-assets') await rm(join(root, 'resources', 'office-skills'), { recursive: true }) if (mode === 'wrong-type') { @@ -554,7 +555,7 @@ it.each(['unset', 'empty', 'full', 'python-only', 'python-only-patched', 'missin const requests: Record[] = [] const toolUses = [ ...enabled ? [{ type: 'tool_use', id: 'workspace-dependencies', name: 'load_workspace_dependencies', input: {} } as const] : [], - ...mode === 'missing-assets' ? [] : [{ type: 'tool_use', id: 'office-docx', name: 'skill', input: { name: 'office-docx' } } as const], + ...skills ? [{ type: 'tool_use', id: 'office-docx', name: 'skill', input: { name: 'office-docx' } } as const] : [], ] const server = createServer((request, response) => { let body = '' @@ -605,23 +606,23 @@ it.each(['unset', 'empty', 'full', 'python-only', 'python-only-patched', 'missin }, () => stderr) const names = (requests[0]!.tools as { name: string }[]).map(value => value.name) expect(names.includes('load_workspace_dependencies')).toBe(enabled) - expect(JSON.stringify(requests[0]!.messages).includes('`office`')).toBe(mode !== 'missing-assets') + expect(JSON.stringify(requests[0]!.messages).includes('`office`')).toBe(skills) const officeTools = ['office_convert', 'office_recalculate', 'office_render'] expect(names.filter(name => name.startsWith('office'))).toEqual([]) const lastNames = (requests.at(-1)!.tools as { name: string }[]).map(value => value.name) // Loading an Office skill declares the Office tools from the following request. - expect(lastNames.filter(name => name.startsWith('office')).sort()).toEqual(mode === 'missing-assets' ? [] : officeTools) + expect(lastNames.filter(name => name.startsWith('office')).sort()).toEqual(skills ? officeTools : []) expect(names).not.toContain('render_document') for (const name of ['office-docx', 'office-pptx', 'office-xlsx']) { - expect(JSON.stringify(requests[0]!.messages).includes(name)).toBe(mode !== 'missing-assets') + expect(JSON.stringify(requests[0]!.messages).includes(name)).toBe(skills) } expect(requests).toHaveLength(toolUses.length + 1) - if (mode !== 'missing-assets') { + if (skills) { const messages = requests.at(-1)!.messages as { content: { type: string; tool_use_id?: string; content?: unknown }[] }[] const skill = JSON.stringify(messages.flatMap(message => message.content).find(block => block.tool_use_id === 'office-docx')) expect(skill).toContain('## Python environment') - expect(skill.includes('Otherwise call `load_workspace_dependencies`')).toBe(enabled) - expect(skill.includes('`python3` or `python` on PATH')).toBe(!enabled) + expect(skill).toContain('Otherwise call `load_workspace_dependencies`') + expect(skill).not.toContain('`python3` or `python` on PATH') } if (mode === 'wrong-type') { const messages = requests[1]!.messages as { content: { type: string; tool_use_id?: string; content?: unknown }[] }[] diff --git a/apps/cli/tests/profiles/web/tests/office.expected.e2e.ts b/apps/cli/tests/profiles/web/tests/office.expected.e2e.ts index 5f09f2fdc9..9c47584c49 100644 --- a/apps/cli/tests/profiles/web/tests/office.expected.e2e.ts +++ b/apps/cli/tests/profiles/web/tests/office.expected.e2e.ts @@ -1,12 +1,11 @@ -/** Ordinary Web mounts Office skills over the user's Python and leaves the bundled Python environment to Desktop. */ +/** Ordinary Web leaves Office authoring composition to its carrier. */ import { expect, it } from 'vitest' import { withDefaultWeb } from './default-web-process.ts' -it('mounts Office skills without bundled authoring dependencies in ordinary Web', async (test) => { +it('does not mount Office skills, commands, or authoring dependencies in ordinary Web', async (test) => { await withDefaultWeb(test, async ({ request }) => { const roster = await request('roster') - expect(roster.plugins.some(plugin => plugin.name === 'skill-office')).toBe(true) - for (const name of ['office-commands', 'tool-workspace-dependencies']) { + for (const name of ['skill-office', 'office-commands', 'tool-workspace-dependencies']) { expect(roster.plugins.some(plugin => plugin.name === name)).toBe(false) } }) diff --git a/apps/desktop/packaging/README.i18n.yaml b/apps/desktop/packaging/README.i18n.yaml index b5b0d00f07..6cc857a75c 100644 --- a/apps/desktop/packaging/README.i18n.yaml +++ b/apps/desktop/packaging/README.i18n.yaml @@ -45,8 +45,8 @@ en: b42f103358d0dfd7 zh: a534164ad9eb00da /desktop-packaging/runtime-file-selection-and-installation-checks: - en: 15f31e576a1dda3e - zh: a8b589657ad73179 + en: fbbb948d0a921f44 + zh: 5dd8d1c31509b8ca /desktop-packaging/desktop-runtime-preparation: en: 84be38ab3136fff7 zh: bb4ed12ee0e1dfa0 diff --git a/apps/desktop/packaging/README.md b/apps/desktop/packaging/README.md index b0b317319a..9c3848094b 100644 --- a/apps/desktop/packaging/README.md +++ b/apps/desktop/packaging/README.md @@ -252,7 +252,7 @@ Desktop packs workspace packages locally and installs external dependencies thro The [Electron shell file list](../scripts/electron-builder-config.mjs) excludes recognized JavaScript/CSS/TypeScript source maps and TypeScript build caches from the separate `resources/app.asar/node_modules` dependency collection. These exclusions preserve runtime code, native modules, WASM, data files (including ordinary `.map` assets), licenses, and notices; [shell archive tests](../tests/shell-file-selection.spec.ts) check retained bytes and exclusions. -The [Office conversion provider](../../../packages/document/office-kit/README.md) is a Host service mounted by web-app, so every application that loads web-app, including `dsh web` and Desktop, provides it together with the [Office tools](../../../packages/document/tool-office/README.md). The provider [resolves the Kit's engine itself](../../../packages/document/office-kit/README.md#understand-the-implementation), including the mapping of native engine manifests to unpacked physical directories. Desktop packaging only carries and unpacks the engine: it carries the target’s declared native engine, or WASM when the kit declares no matching native target, and preparation rejects a missing target engine before packaging. The complete Office dependencies, including the JavaScript libraries and the selected engine’s executables, data, licenses, and notices, are unpacked under `resources/app.asar.unpacked/dsh/node_modules/`. The Desktop shell passes the primary runtime location to the Host in [main.ts](../src/main.ts), and the Host sets it as `DSH_PRIMARY_RUNTIME`; neither passes a Kit location. Office skills are available in every application that loads web-app; only Desktop mounts the bundled Python environment (`workspace-dependencies`). On macOS, the native helper receives the JIT entitlement required by [LibreOffice’s UNO bridge](https://github.com/LibreOffice/core/blob/master/sysui/desktop/macosx/hardened_runtime.xcent.in). The Computer Use helper applications under `@deepseek-ai/dsh-experimental-cua-macos/native/bin` are also unpacked whole under `resources/app.asar.unpacked/dsh/node_modules/`, and the provider opens that copy. +The [Office conversion provider](../../../packages/document/office-kit/README.md) is a Host service mounted by web-app, so every application that loads web-app, including `dsh web` and Desktop, provides it together with the [Office tools](../../../packages/document/tool-office/README.md). The provider [resolves the Kit's engine itself](../../../packages/document/office-kit/README.md#understand-the-implementation), including the mapping of native engine manifests to unpacked physical directories. Desktop packaging only carries and unpacks the engine: it carries the target’s declared native engine, or WASM when the kit declares no matching native target, and preparation rejects a missing target engine before packaging. The complete Office dependencies, including the JavaScript libraries and the selected engine’s executables, data, licenses, and notices, are unpacked under `resources/app.asar.unpacked/dsh/node_modules/`. The Desktop shell passes the primary runtime location to the Host in [main.ts](../src/main.ts), and the Host sets it as `DSH_PRIMARY_RUNTIME`; neither passes a Kit location. Among applications that load web-app, only Desktop mounts the Office skills and the bundled Python environment (`workspace-dependencies`). On macOS, the native helper receives the JIT entitlement required by [LibreOffice’s UNO bridge](https://github.com/LibreOffice/core/blob/master/sysui/desktop/macosx/hardened_runtime.xcent.in). The Computer Use helper applications under `@deepseek-ai/dsh-experimental-cua-macos/native/bin` are also unpacked whole under `resources/app.asar.unpacked/dsh/node_modules/`, and the provider opens that copy. The packaged application runs compiled JavaScript and pre-generated Typert metadata; it does not compile TypeScript plugins. Source-level debugger navigation and editor declarations remain available in development packages. [Copy-policy tests](../tests/runtime-file-policy.spec.ts) cover exclusions and retained assets; The [payload smoke](../tests/fixtures/runtime-payload-smoke.mjs) runs under Electron RunAsNode before the Host smoke and final inventory verification. The payload smoke resolves the search tool’s ripgrep executable and verifies text search and file enumeration. Signed Windows builds run these checks after dependency signing; other builds run them during `prepare:dsh`. The [Host smoke](../scripts/smoke-runtime.ts) creates DOCX, XLSX, and PPTX inputs with bundled Python and runs each through the real Office provider: PDF conversion, PNG rendering, conversion to the matching OpenDocument format, and, for XLSX, recalculation, checking each output's signature. Every assembled application, including directory and unsigned builds, repeats the payload and Host checks against ASAR. Archive integrity checks compare the complete archived descriptor with preparation, file bytes and membership in both archive and unpacked trees, recorded executable flags for archived files, and physical permissions for unpacked files. Conversion failures stop packaging before a release record is written; macOS DMG/ZIP builds run these checks before notarization. diff --git a/apps/desktop/packaging/README.zh.md b/apps/desktop/packaging/README.zh.md index ee71982700..b20fef670d 100644 --- a/apps/desktop/packaging/README.zh.md +++ b/apps/desktop/packaging/README.zh.md @@ -252,7 +252,7 @@ Desktop 在本地打包工作区包,并通过目标捆绑的 Node 和 pnpm 安 [Electron 外壳文件清单](../scripts/electron-builder-config.mjs)从单独收集的 `resources/app.asar/node_modules` 依赖中排除已识别的 JavaScript/CSS/TypeScript source map 和 TypeScript 构建缓存。这些排除规则保留运行时代码、原生模块、WASM、数据文件(包括普通 `.map` 资源)、许可证和 notices;[外壳归档测试](../tests/shell-file-selection.spec.ts)检查保留文件的字节和排除项。 -[Office 转换提供方](../../../packages/document/office-kit/README.zh.md)是 web-app 挂载的 Host 服务,因此所有加载 web-app 的应用(包括 `dsh web` 和 Desktop)都提供它以及 [Office 工具](../../../packages/document/tool-office/README.zh.md)。该提供方[自行解析 Kit 的引擎](../../../packages/document/office-kit/README.zh.md#understand-the-implementation),包括把原生引擎清单映射到解包后的实体目录。Desktop 打包只负责携带和解包引擎:携带目标声明的原生引擎;kit 未声明匹配的原生目标时携带 WASM;目标引擎缺失时,准备阶段在打包前拒绝。完整的 Office 依赖(包括 JavaScript 库以及所选引擎的可执行文件、数据、许可证和声明)解包到 `resources/app.asar.unpacked/dsh/node_modules/` 下。Desktop 壳在 [main.ts](../src/main.ts) 中把主运行时位置传给 Host,由 Host 设为 `DSH_PRIMARY_RUNTIME`;两者都不传 Kit 位置。所有加载 web-app 的应用都提供 Office 技能;只有 Desktop 挂载内置 Python 环境(`workspace-dependencies`)。在 macOS 上,原生 helper 获得 [LibreOffice UNO 桥](https://github.com/LibreOffice/core/blob/master/sysui/desktop/macosx/hardened_runtime.xcent.in)所需的 JIT 权限。`@deepseek-ai/dsh-experimental-cua-macos/native/bin` 下的 Computer Use helper 应用也整体解包到 `resources/app.asar.unpacked/dsh/node_modules/` 下,提供方打开该副本。 `@deepseek-ai/dsh-experimental-cua-macos/native/bin` 下的 Computer Use helper 应用也整体解包到 `resources/app.asar.unpacked/dsh/node_modules/` 下,提供方打开该副本。 +[Office 转换提供方](../../../packages/document/office-kit/README.zh.md)是 web-app 挂载的 Host 服务,因此所有加载 web-app 的应用(包括 `dsh web` 和 Desktop)都提供它以及 [Office 工具](../../../packages/document/tool-office/README.zh.md)。该提供方[自行解析 Kit 的引擎](../../../packages/document/office-kit/README.zh.md#understand-the-implementation),包括把原生引擎清单映射到解包后的实体目录。Desktop 打包只负责携带和解包引擎:携带目标声明的原生引擎;kit 未声明匹配的原生目标时携带 WASM;目标引擎缺失时,准备阶段在打包前拒绝。完整的 Office 依赖(包括 JavaScript 库以及所选引擎的可执行文件、数据、许可证和声明)解包到 `resources/app.asar.unpacked/dsh/node_modules/` 下。Desktop 壳在 [main.ts](../src/main.ts) 中把主运行时位置传给 Host,由 Host 设为 `DSH_PRIMARY_RUNTIME`;两者都不传 Kit 位置。在加载 web-app 的应用中,只有 Desktop 挂载 Office 技能和内置 Python 环境(`workspace-dependencies`)。在 macOS 上,原生 helper 获得 [LibreOffice UNO 桥](https://github.com/LibreOffice/core/blob/master/sysui/desktop/macosx/hardened_runtime.xcent.in)所需的 JIT 权限。`@deepseek-ai/dsh-experimental-cua-macos/native/bin` 下的 Computer Use helper 应用也整体解包到 `resources/app.asar.unpacked/dsh/node_modules/` 下,提供方打开该副本。 `@deepseek-ai/dsh-experimental-cua-macos/native/bin` 下的 Computer Use helper 应用也整体解包到 `resources/app.asar.unpacked/dsh/node_modules/` 下,提供方打开该副本。 打包应用运行编译后的 JavaScript 和预生成的 Typert 元数据,不编译 TypeScript 插件。源码级调试导航和编辑器声明仍可从开发包中获取。[复制规则测试](../tests/runtime-file-policy.spec.ts)覆盖排除项和保留资源;[产物 smoke](../tests/fixtures/runtime-payload-smoke.mjs) 在 Host smoke 和最终清单验证之前,使用 Electron RunAsNode 执行。产物 smoke 解析搜索工具使用的 ripgrep 可执行文件,并验证文本搜索和文件枚举。Windows 签名构建在依赖签名后运行这些检查;其他构建在 `prepare:dsh` 中运行。[Host smoke](../scripts/smoke-runtime.ts) 使用捆绑的 Python 创建 DOCX、XLSX 和 PPTX 输入,并通过真实 Office 提供方逐一执行:PDF 转换、PNG 渲染、转换为对应的 OpenDocument 格式,以及针对 XLSX 的重算,检查每个输出的签名。每个组装后的应用(包括目录包和未签名构建)都会针对 ASAR 重复产物和 Host 检查。归档完整性检查将归档内完整描述符与准备结果比对,并核对归档和解包目录中的文件内容与清单、归档内文件记录的执行标志,以及解包文件的物理权限。转换失败会在写入发布记录前终止打包;macOS DMG/ZIP 构建在公证前执行这些检查。 diff --git a/apps/web/tests/expected/github-ready-review/conversation-expanded.expected.md b/apps/web/tests/expected/github-ready-review/conversation-expanded.expected.md index b0546d4998..5d29a1bb88 100644 --- a/apps/web/tests/expected/github-ready-review/conversation-expanded.expected.md +++ b/apps/web/tests/expected/github-ready-review/conversation-expanded.expected.md @@ -24,7 +24,6 @@ - button "Completed in {{duration}}" [expanded] - button "Injected context" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: "Review complete: no actionable findings." - button "Copy" diff --git a/apps/web/tests/expected/retained-steering/trajectory.expected.md b/apps/web/tests/expected/retained-steering/trajectory.expected.md index 889ea9f4d2..a38822a043 100644 --- a/apps/web/tests/expected/retained-steering/trajectory.expected.md +++ b/apps/web/tests/expected/retained-steering/trajectory.expected.md @@ -9,9 +9,6 @@ - 'row "CONTEXT, Current runtime context. This snapshot supersedes earlier runtime-context snapshots. Current working directory: \"{{cwd}}/workspace\". Current DSH file policy: workspace-write. Any available operation enforced by the DSH file sandbox may modify files under the session workspace: \"{{cwd}}/workspace\". Some pl…"': - cell "CONTEXT" - 'cell "Current runtime context. This snapshot supersedes earlier runtime-context snapshots. Current working directory: \"{{cwd}}/workspace\". Current DSH file policy: workspace-write. Any available operation enforced by the DSH file sandbox may modify files under the session workspace: \"{{cwd}}/workspace\". Some pl…"' - - 'row "CONTEXT, A skill is a reusable set of task-specific instructions. The following skills are available in this session: office: Create or edit Office files; inspect Office files and PDFs. Load before rendering, conversion, or recalculation to enable office_render, office_convert, and office_recalculate next step. office-docx: Create, read, edit, and validate Word documents (.docx). office-pptx: Create, read, edit, and validate PowerPoint presentations (.pptx). office-xlsx: Read, cr…"': - - cell "CONTEXT" - - 'cell " A skill is a reusable set of task-specific instructions. The following skills are available in this session: office: Create or edit Office files; inspect Office files and PDFs. Load before rendering, conversion, or recalculation to enable office_render, office_convert, and office_recalculate next step. office-docx: Create, read, edit, and validate Word documents (.docx). office-pptx: Create, read, edit, and validate PowerPoint presentations (.pptx). office-xlsx: Read, cr…"' - 'row "CONTEXT, Time sampled while preparing turn 1, step 1: 2026-01-15T{{clock}}+{{clock}}[Asia/Shanghai] Browser time zone for this request: Asia/Shanghai. Interpret otherwise-unqualified dates and times in this zone. Elapsed since the preceding model-visible message: unavailable."': - cell "CONTEXT" - 'cell "Time sampled while preparing turn 1, step 1: 2026-01-15T{{clock}}+{{clock}}[Asia/Shanghai] Browser time zone for this request: Asia/Shanghai. Interpret otherwise-unqualified dates and times in this zone. Elapsed since the preceding model-visible message: unavailable."' diff --git a/apps/web/tests/expected/skill-user-invoke/ui-expanded.expected.md b/apps/web/tests/expected/skill-user-invoke/ui-expanded.expected.md index 4c06982b08..6bd1adcfbd 100644 --- a/apps/web/tests/expected/skill-user-invoke/ui-expanded.expected.md +++ b/apps/web/tests/expected/skill-user-invoke/ui-expanded.expected.md @@ -15,7 +15,6 @@ - button "Completed in {{duration}}" [expanded] - button "Injected context" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection user-invoke-demo" - button "Context injection time-context" - paragraph: USER_INVOKE_REPLY acknowledged; following the injected skill. diff --git a/apps/web/tests/expected/steer-all/mid-steer.expected.md b/apps/web/tests/expected/steer-all/mid-steer.expected.md index dd9afda70c..a3a0ed7930 100644 --- a/apps/web/tests/expected/steer-all/mid-steer.expected.md +++ b/apps/web/tests/expected/steer-all/mid-steer.expected.md @@ -10,7 +10,6 @@ - text: Use the ask_user_question tool to ask me exactly one question with id "checkpoint", question "Ready to continue?", header "Checkpoint", and options labeled "Yes" and "No". After I answer, reply with one short sentence acknowledging my answer and stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to ask them a checkpoint question first, then continue with whatever they interject. Let me do exactly that." - status: Deep diving diff --git a/apps/web/tests/expected/steer-all/settled-expanded.expected.md b/apps/web/tests/expected/steer-all/settled-expanded.expected.md index 3977249952..10873c5f69 100644 --- a/apps/web/tests/expected/steer-all/settled-expanded.expected.md +++ b/apps/web/tests/expected/steer-all/settled-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [disabled] - button "Asked questions" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to ask them a checkpoint question first, then continue with whatever they interject. Let me do exactly that." - button "Ask question 1/1 answered" diff --git a/apps/web/tests/lifecycle-chrome.e2e.ts b/apps/web/tests/lifecycle-chrome.e2e.ts index d5c560e4cf..a0259aa131 100644 --- a/apps/web/tests/lifecycle-chrome.e2e.ts +++ b/apps/web/tests/lifecycle-chrome.e2e.ts @@ -104,7 +104,7 @@ describe('web e2e: lifecycle & chrome (workspace flow / reload / dark mode)', () expect(Math.abs( launchedBox!.y + launchedBox!.height - typedBox!.y - typedBox!.height, )).toBeLessThan(1) - await writeComposerDraft(page, input, '/cmpt') + await writeComposerDraft(page, input, '/cpt') await expect.poll(() => menu.getByRole('option').allTextContents()).toEqual([ 'CompactCompact older conversation history', ]) diff --git a/apps/web/tests/snapshots/streaming-fence-highlight/mid-stream.expected.md b/apps/web/tests/snapshots/streaming-fence-highlight/mid-stream.expected.md index 94a7638c3f..6162e9e477 100644 --- a/apps/web/tests/snapshots/streaming-fence-highlight/mid-stream.expected.md +++ b/apps/web/tests/snapshots/streaming-fence-highlight/mid-stream.expected.md @@ -10,7 +10,6 @@ - text: Stream one TypeScript fence for the highlighting snapshot. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - text: ts - button "Wrap lines" [pressed] diff --git a/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.i18n.yaml b/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.i18n.yaml index ddde55fa65..4a909b30f6 100644 --- a/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.i18n.yaml +++ b/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.i18n.yaml @@ -9,8 +9,8 @@ en: 6c5aaef399e15878 zh: 92c4ae1a8d812790 /office-operation-skills-are-replaced-by-office-tools/change: - en: 0781bed511c577fc - zh: 046098b87627786e + en: 15aecdd095c94e45 + zh: 3e66af9a87f6c75e /office-operation-skills-are-replaced-by-office-tools/migration: - en: 9646620e0c4636c3 - zh: be896458a90937ba + en: ab2ec8f8b8599e16 + zh: bc6bd0447221e2ca diff --git a/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md b/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md index 3e2a8118c6..b3b4d4bb82 100644 --- a/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md +++ b/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md @@ -23,9 +23,7 @@ Configuration changes: The Office tools parse untrusted documents with the native LibreOffice Kit engine in the Host process, outside the shell sandbox and PTC permissions, with the Host user's permissions; the filesystem backend still authorizes inputs. The `office-kit` row gains `outputDirectory` (default `$DSH_HOME/office-kit/outputs`), `outputRetentionMs`, and `maxOutputStoreBytes`. -The Web profile, and the SDK profile without a primary runtime, list the Office skills in the first request context and `/` menu. - -This affects users and prompts of the removed skills, compositions and launchers setting the removed keys or variables, `assetRoot` skill copies, saved `standard` or `ptc` presets, deployments relying on the shell sandbox for document parsing, and tests pinning the first request context or `/` menu. +This affects users and prompts of the removed skills, compositions and launchers setting the removed keys or variables, `assetRoot` skill copies, saved `standard` or `ptc` presets, and deployments relying on the shell sandbox for document parsing. ## Migration @@ -45,5 +43,4 @@ This affects users and prompts of the removed skills, compositions and launchers ``` 7. Deployments that require sandboxed document parsing omit `@deepseek-ai/dsh-tool-office`. -8. Update expected first request contexts and `/` menus with the Office skills. -9. Confirm: in a new `standard` or `ptc` Session, send `/office`, then a separate PDF export request; it produces an `office_convert` call that returns a temporary PDF path or the `unavailable` message. +8. Confirm: in a new Desktop `standard` or `ptc` Session, send `/office`, then a separate PDF export request; it produces an `office_convert` call that returns a temporary PDF path or the `unavailable` message. diff --git a/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md b/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md index 246460b801..97b6a576bc 100644 --- a/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md +++ b/docs/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md @@ -23,9 +23,7 @@ description: "删除 `office-render`、`office-recalculate` 和 `office-export-p Office 工具在 Host 进程内用原生 LibreOffice Kit 引擎解析不可信的文档,不受 shell 沙箱和 PTC 权限约束,并具有 Host 用户的权限;输入仍由文件系统后端授权。`office-kit` 条目新增 `outputDirectory`(默认 `$DSH_HOME/office-kit/outputs`)、`outputRetentionMs` 和 `maxOutputStoreBytes`。 -Web profile,以及没有 primary runtime 的 SDK profile,会在首次请求上下文和 `/` 菜单中列出 Office 技能。 - -受影响的有:使用已删除技能的用户和提示词,设置了已删除配置键或环境变量的组合和启动器,`assetRoot` 技能副本,已保存的 `standard` 或 `ptc` 预设,依赖 shell 沙箱解析文档的部署,以及固定了首次请求上下文或 `/` 菜单的测试。 +受影响的有:使用已删除技能的用户和提示词,设置了已删除配置键或环境变量的组合和启动器,`assetRoot` 技能副本,已保存的 `standard` 或 `ptc` 预设,以及依赖 shell 沙箱解析文档的部署。 ## 迁移 @@ -45,5 +43,4 @@ Web profile,以及没有 primary runtime 的 SDK profile,会在首次请求 ``` 7. 需要在沙箱中解析文档的部署不挂载 `@deepseek-ai/dsh-tool-office`。 -8. 更新首次请求上下文和 `/` 菜单的预期结果,使其包含 Office 技能。 -9. 确认:在 `standard` 或 `ptc` 的新 Session 中发送 `/office`,再另发一条导出 PDF 的请求;该请求会产生一次 `office_convert` 调用,返回临时 PDF 路径或 `unavailable` 消息。 +8. 确认:在 Desktop 的 `standard` 或 `ptc` 新 Session 中发送 `/office`,再另发一条导出 PDF 的请求;该请求会产生一次 `office_convert` 调用,返回临时 PDF 路径或 `unavailable` 消息。 diff --git a/packages/bundle/sdk-app/README.i18n.yaml b/packages/bundle/sdk-app/README.i18n.yaml index dcab0df6ce..a30722d0a9 100644 --- a/packages/bundle/sdk-app/README.i18n.yaml +++ b/packages/bundle/sdk-app/README.i18n.yaml @@ -15,8 +15,8 @@ en: 4e53164159b5ce41 zh: 89582dc0294d0776 /deepseek-ai-dsh-sdk-app/use-this-package: - en: b8bd8cefbb8c12a0 - zh: 2a3df8cb862a3f7f + en: c5f8136b9a5fb27d + zh: d0940bcca4648146 /deepseek-ai-dsh-sdk-app/model-experience: en: 215e7ba838619b7b zh: a311da3843709f90 @@ -24,8 +24,8 @@ en: 4f88e647c6df4f42 zh: 2bd3e4b0bdfe9412 /deepseek-ai-dsh-sdk-app/model-experience/sdk-model-context/what-the-model-sees: - en: 2beeaec08b6e1a6d - zh: 9b98b0ae6be6c1bc + en: 26a411832987c845 + zh: 5949917a415e50be /deepseek-ai-dsh-sdk-app/model-experience/sdk-model-context/token-effect: en: cef8efe97fe1ff16 zh: c052ab3e6706efa6 diff --git a/packages/bundle/sdk-app/README.md b/packages/bundle/sdk-app/README.md index 3d47e503b4..8e04df35e3 100644 --- a/packages/bundle/sdk-app/README.md +++ b/packages/bundle/sdk-app/README.md @@ -37,7 +37,7 @@ The SDK uses the base `read`, `write`, and `edit` defaults. To add `str_replace_ The model can use [`plugin_manager`](../../boot/plugin-manager/README.md) in native and PTC modes. Every action, including listing, requires full access or approval for that call. The default workspace-write/ask policy needs a client approval responder: enable `approvalRequests` and handle `approval/request` through `harness.client.onRequest()`, or supply an approver in the composition. Without one, the operation is refused as unavailable. For Python package installation/removal, explicitly prepare Node and pnpm with `download_primary_runtime()` before starting the runtime; the packaged launcher then supplies them to plugin management without requiring system pnpm. Without a selected payload, package operations need `pnpm` on `PATH` or an explicit `plugin-manager.pnpmCommand`. See the [interactive approval example](../../../python/sdk/examples/manage_plugins.py). Saved profile changes report `restart-required` with `no-hmr`; the current runtime and its sessions retain their tools until the caller closes and starts the runtime again. Set `tool-plugin-manager.disabled: true` through a profile patch to hide this tool. The standalone `sdk-minimal` profile does not include it. -The Python runtime exposes explicitly downloaded authoring resources and Office sidecars to this profile. `DSH_PRIMARY_RUNTIME` overrides the authoring payload; an empty value disables its query. Office skills, the Office kit, and the [Office tools](../../document/tool-office/README.md) always load: with an authoring payload the skills use its Office assets and bundled Python environment; without one they use the packaged assets and direct the model to the user's existing Python. The tool reports an unavailable LibreOffice Kit until an Office sidecar is downloaded or selected. Profile patches can disable `skill-office` or replace its `assetRoot` independently of `workspace-dependencies`; filesystem skills with the same name take precedence. See the [runtime package](../../../python/sdk-runtime/README.md) for downloads and configuration. +The Python runtime exposes explicitly downloaded authoring resources and Office sidecars to this profile. `DSH_PRIMARY_RUNTIME` overrides the authoring payload; an empty value disables its query. The Office kit and the [Office tools](../../document/tool-office/README.md) always load; Office skills load only with an authoring payload and use its Office assets and bundled Python environment. The tool reports an unavailable LibreOffice Kit until an Office sidecar is downloaded or selected. Profile patches can disable `skill-office` or replace its `assetRoot` independently of `workspace-dependencies`; filesystem skills with the same name take precedence. See the [runtime package](../../../python/sdk-runtime/README.md) for downloads and configuration. ----- @@ -48,7 +48,7 @@ The Python runtime exposes explicitly downloaded authoring resources and Office #### What the model sees -The profile inherits the base system prompt, including the `You are an AI agent powered by DeepSeek Harness.` identity, and adds the same model-interpolated coding persona as the Web and headless profiles. Each Session receives its current directory in required user-role context from [`dsh-working-directory`](../../session/working-directory/README.md). Default file tool schemas include `read`, `write`, and `edit`; they omit `str_replace_editor`. The model also receives `present`, `ask_user_question`, `plugin_manager`, schedule tools, shared file-reference guidance, and time context. Child agents cannot use schedule tools. The [`time-context`](../../context/time-context/README.md) row accepts a fallback time zone. The skill catalog always lists the Office skills; their Python environment section names `load_workspace_dependencies` with an authoring payload and the user's existing Python without one. +The profile inherits the base system prompt, including the `You are an AI agent powered by DeepSeek Harness.` identity, and adds the same model-interpolated coding persona as the Web and headless profiles. Each Session receives its current directory in required user-role context from [`dsh-working-directory`](../../session/working-directory/README.md). Default file tool schemas include `read`, `write`, and `edit`; they omit `str_replace_editor`. The model also receives `present`, `ask_user_question`, `plugin_manager`, schedule tools, shared file-reference guidance, and time context. Child agents cannot use schedule tools. The [`time-context`](../../context/time-context/README.md) row accepts a fallback time zone. With an authoring payload, the skill catalog lists the Office skills, and their Python environment section names `load_workspace_dependencies`; without one, the catalog lists no Office skills. #### Token effect diff --git a/packages/bundle/sdk-app/README.zh.md b/packages/bundle/sdk-app/README.zh.md index 5568f9b3c7..4558415b90 100644 --- a/packages/bundle/sdk-app/README.zh.md +++ b/packages/bundle/sdk-app/README.zh.md @@ -37,7 +37,7 @@ SDK 使用 base 默认提供的 `read`、`write` 和 `edit`。要添加 `str_rep 模型可以在 native 和 PTC 模式下使用 [`plugin_manager`](../../boot/plugin-manager/README.zh.md)。每个操作(包括列举)都要求完整权限或本次调用的批准。默认 workspace-write/ask 策略需要客户端审批应答方:启用 `approvalRequests`,并通过 `harness.client.onRequest()` 处理 `approval/request`,或在组合中提供审批器。没有应答方时,操作因 unavailable 被拒绝。Python 安装/移除包时,先显式调用 `download_primary_runtime()` 准备 Node 和 pnpm,再启动运行时;打包启动器会将它们提供给插件管理,无需系统 pnpm。未选择载荷时,包操作仍要求 `PATH` 中有 `pnpm`,或显式配置 `plugin-manager.pnpmCommand`。可运行的接入方式见[交互审批示例](../../../python/sdk/examples/manage_plugins.py)。保存的 profile 变更返回 `restart-required` 和 `no-hmr`;当前运行时及其会话保留原有工具,直到调用方关闭并重新启动运行时。通过 profile patch 设置 `tool-plugin-manager.disabled: true` 可隐藏此工具。独立的 `sdk-minimal` profile 不包含它。 -Python 运行时向本 profile 提供显式下载的创作资源和 Office sidecar。`DSH_PRIMARY_RUNTIME` 覆盖创作载荷;空值禁用其查询。Office skills、Office 套件和 [Office 工具](../../document/tool-office/README.zh.md)总是加载:有创作载荷时 skills 使用其 Office assets 和内置 Python 环境;没有时使用包内 assets,并指引模型使用用户已有的 Python。下载或选择 Office sidecar 之前,工具报告 LibreOffice Kit 不可用。Profile patch 可独立于 `workspace-dependencies` 禁用 `skill-office` 或替换其 `assetRoot`;同名文件系统 skills 优先。下载与配置见[运行时包](../../../python/sdk-runtime/README.zh.md)。 +Python 运行时向本 profile 提供显式下载的创作资源和 Office sidecar。`DSH_PRIMARY_RUNTIME` 覆盖创作载荷;空值禁用其查询。Office 套件和 [Office 工具](../../document/tool-office/README.zh.md)总是加载;Office skills 只在有创作载荷时加载,并使用其 Office assets 和内置 Python 环境。下载或选择 Office sidecar 之前,工具报告 LibreOffice Kit 不可用。Profile patch 可独立于 `workspace-dependencies` 禁用 `skill-office` 或替换其 `assetRoot`;同名文件系统 skills 优先。下载与配置见[运行时包](../../../python/sdk-runtime/README.zh.md)。 ----- @@ -48,7 +48,7 @@ Python 运行时向本 profile 提供显式下载的创作资源和 Office sidec #### 模型看到什么 -profile 继承 base 系统提示词,包括 `You are an AI agent powered by DeepSeek Harness.` 身份说明,并添加与 Web 和 headless profile 相同、按当前模型插值的 coding persona。每个 Session 通过 [`dsh-working-directory`](../../session/working-directory/README.zh.md) 提供的必需 user-role 上下文接收当前目录。默认文件工具 schema 包含 `read`、`write` 和 `edit`,不包含 `str_replace_editor`。模型还会收到 `present`、`ask_user_question`、`plugin_manager`、定时任务工具、共用文件引用说明和时间上下文。子 agent 不能使用定时任务工具。[`time-context`](../../context/time-context/README.zh.md) 配置项接受回退时区。技能目录总是列出 Office skills;有创作载荷时其 Python 环境说明指向 `load_workspace_dependencies`,没有时指向用户已有的 Python。 +profile 继承 base 系统提示词,包括 `You are an AI agent powered by DeepSeek Harness.` 身份说明,并添加与 Web 和 headless profile 相同、按当前模型插值的 coding persona。每个 Session 通过 [`dsh-working-directory`](../../session/working-directory/README.zh.md) 提供的必需 user-role 上下文接收当前目录。默认文件工具 schema 包含 `read`、`write` 和 `edit`,不包含 `str_replace_editor`。模型还会收到 `present`、`ask_user_question`、`plugin_manager`、定时任务工具、共用文件引用说明和时间上下文。子 agent 不能使用定时任务工具。[`time-context`](../../context/time-context/README.zh.md) 配置项接受回退时区。有创作载荷时,技能目录列出 Office skills,其 Python 环境说明指向 `load_workspace_dependencies`;没有时,技能目录不列出 Office skills。 #### Token 影响 diff --git a/packages/bundle/sdk-app/cordis.patch.yml b/packages/bundle/sdk-app/cordis.patch.yml index b8f8bc9b15..20541b5cd7 100644 --- a/packages/bundle/sdk-app/cordis.patch.yml +++ b/packages/bundle/sdk-app/cordis.patch.yml @@ -28,11 +28,10 @@ # DSH_PRIMARY_RUNTIME names the primary runtime; the packaged launcher fills it # from its download cache when unset, and an empty value opts out. Each row can -# be patched independently. Office skills and the Office tools always load. With -# a primary runtime the skills use its Office assets and Python environment; -# without one the expressions evaluate to `undefined`, which the skill-office -# schema treats as unset, so the packaged assets and the user's Python apply. -# A nonempty DSH_BUNDLED_OFFICE_SKILLS overrides the skill directory. +# be patched independently. The Office tools always load; the Office skills and +# the runtime's Python environment load only with a primary runtime, and the +# skills then use its Office assets. A nonempty DSH_BUNDLED_OFFICE_SKILLS +# overrides the skill directory. - insert: - id: office-kit name: '@deepseek-ai/dsh-office-kit' @@ -51,9 +50,9 @@ - id: skill-office name: '@deepseek-ai/dsh-skill-office' + disabled: !!js "!process.env.DSH_PRIMARY_RUNTIME" config: - assetRoot: !!js "process.env.DSH_BUNDLED_OFFICE_SKILLS || (process.env.DSH_PRIMARY_RUNTIME ? process.getBuiltinModule('node:path').resolve(process.env.DSH_PRIMARY_RUNTIME, '..', 'office-skills') : undefined)" - pythonEnvironment: !!js "process.env.DSH_PRIMARY_RUNTIME ? undefined : 'user'" + assetRoot: !!js "process.env.DSH_BUNDLED_OFFICE_SKILLS || process.getBuiltinModule('node:path').resolve(process.env.DSH_PRIMARY_RUNTIME ?? '', '..', 'office-skills')" # Share native desktop tools and model context without starting a Web server. - insert: diff --git a/packages/bundle/web-app/README.i18n.yaml b/packages/bundle/web-app/README.i18n.yaml index 8f085826af..f5f09d5b58 100644 --- a/packages/bundle/web-app/README.i18n.yaml +++ b/packages/bundle/web-app/README.i18n.yaml @@ -33,8 +33,8 @@ en: fdf38cb6e1b24464 zh: c14a8bcac9d4e5cd /deepseek-ai-dsh-web-app/understand-the-implementation: - en: 495b52ed02770027 - zh: 4d8c676220125691 + en: 8c3f4626415aef87 + zh: 26912ea657ece82b /deepseek-ai-dsh-web-app/understand-the-implementation/patch-semantics: en: a6d126f30b1594d7 zh: 7f0ccc8a55d6f743 @@ -69,11 +69,11 @@ en: 8732b94114bef9e0 zh: ab5f53bf541fae12 /deepseek-ai-dsh-web-app/model-experience/office-skills/what-the-model-sees: - en: b6dc92ddf435f514 - zh: b907228a20afbd96 + en: d3dbfd131f0641d2 + zh: 04622740faa94016 /deepseek-ai-dsh-web-app/model-experience/office-skills/token-effect: - en: 9d9154d07ac52174 - zh: fcc6938b68025409 + en: 747d03642e1f1600 + zh: 8720238749483b30 /deepseek-ai-dsh-web-app/model-experience/office-skills/kv-cache-effect: en: 43f28f4e120df7bb zh: 3b4e0d384986b293 diff --git a/packages/bundle/web-app/README.md b/packages/bundle/web-app/README.md index c61599cf5b..c314fe7f83 100644 --- a/packages/bundle/web-app/README.md +++ b/packages/bundle/web-app/README.md @@ -102,7 +102,7 @@ Each browser session selects a shipped preset (`standard` by default). The Agent The bundle is one patch layer of five files plus one runtime glue plugin: `cordis.patch.yml` carries the host rows and the preset registry, and each `presets/.patch.yml` inserts one shipped preset declaration, applied in the order `dsh.bundle.patch` lists them. The storage stack and projection cache come from `dsh-base`; the web overlay's workspace and message-feedback rows consume that shared `storageDomain` service. The patch restates the surface-specific values the base deliberately omits, inserts the web-only host rows and browser roster, then moves the agent plane behind presets. The glue plugin owns dist serving, the advertised application URL, the plain-HTTP exposure warning, the bash variable, and the readiness announcements. The `office-kit` row mounts one lazy [Office conversion provider](../../document/office-kit/README.md) for Host consumers, including Desktop compositions using this bundle, and keeps converted files under `$DSH_HOME/office-kit/outputs`. The `standard` and `ptc` presets mount the [Office tools](../../document/tool-office/README.md) in every profile, whether or not Kit is installed, and declare them after an Office skill loads; the `minimal` preset omits them. The conversion service's Remote methods authorize preview reads, while Document Preview owns the Office viewer and Client cache. -The `skill-office` row mounts the [Office skills](../../skill/skill-office/README.md) in every profile. Outside Desktop it selects `pythonEnvironment: 'user'` and reads `DSH_BUNDLED_OFFICE_SKILLS`, which only the [Python SDK launcher](../../../python/sdk-runtime/README.md) sets; an unset variable keeps the packaged assets. Desktop also mounts the bundled dependency-query row, reads the skills from the carrier's primary runtime, and keeps the default `pythonEnvironment: 'workspace-dependencies'`; other profiles leave the dependency-query row disabled. The [Desktop application](../../../apps/desktop/README.md#bundled-workspace-dependencies) owns resource packaging. +The `skill-office` row mounts the [Office skills](../../skill/skill-office/README.md) only in the Desktop profile; other profiles leave it and the bundled dependency-query row disabled. With a nonempty `DSH_PRIMARY_RUNTIME`, Desktop also mounts the dependency-query row, reads the skills from the carrier's primary runtime, and keeps the default `pythonEnvironment: 'workspace-dependencies'`; without one it keeps the packaged assets and selects `pythonEnvironment: 'user'`. The [Desktop application](../../../apps/desktop/README.md#bundled-workspace-dependencies) owns resource packaging. ### Patch semantics @@ -168,11 +168,11 @@ None; the plugin contributes no system-prompt text. #### What the model sees -The skill catalog lists the Office router and three Office authoring skills in every profile. The loaded Python skills end with a Python environment section: on Desktop it directs the model to `load_workspace_dependencies`; elsewhere it directs the model to the project's or user's existing Python. +In the Desktop profile, the skill catalog lists the Office router and three Office authoring skills; other profiles list none. The loaded Python skills end with a Python environment section: with a primary runtime it directs the model to `load_workspace_dependencies`; without one it directs the model to the project's or user's existing Python. #### Token effect -The four catalog summaries in each initial catalog; loaded skill bodies only when the model requests them. +In the Desktop profile, the four catalog summaries in each initial catalog; loaded skill bodies only when the model requests them. Other profiles: none. #### KV Cache effect diff --git a/packages/bundle/web-app/README.zh.md b/packages/bundle/web-app/README.zh.md index 0f8dbc35b4..427c820d4f 100644 --- a/packages/bundle/web-app/README.zh.md +++ b/packages/bundle/web-app/README.zh.md @@ -102,7 +102,7 @@ dsh --profile web --no-open --host "$(hostname -i | awk '{print $1}')" --public- 此 bundle 由一层五个文件的补丁和一个运行时胶水插件组成:`cordis.patch.yml` 承载宿主行和 preset 注册表,每个 `presets/.patch.yml` 插入一条随发行版交付的 preset 声明,按 `dsh.bundle.patch` 列出的顺序应用。存储栈与投影缓存来自 `dsh-base`;Web 叠加层的工作区和消息反馈条目消费共享的 `storageDomain` 服务。补丁重述 base 有意省略的界面专用值,插入 Web 专用宿主条目和浏览器插件列表,再将 Agent 层移到预设后面。胶水插件负责 dist 服务、公告应用 URL、明文 HTTP 暴露警告、bash 变量和就绪通知。`office-kit` 条目为宿主消费者挂载一个延迟创建引擎的 [Office 转换提供方](../../document/office-kit/README.zh.md),使用此 bundle 的 Desktop 组合也共享该提供方,转换后的文件保存在 `$DSH_HOME/office-kit/outputs`。`standard` 和 `ptc` 预设在所有 profile 中挂载 [Office 工具](../../document/tool-office/README.zh.md),无论是否安装 Kit,并在加载 Office 技能后声明它们;`minimal` 预设不挂载它们。转换服务的 Remote 方法负责预览读取授权,Document Preview 负责 Office 查看器和客户端缓存。 -`skill-office` 行在所有 profile 中挂载 [Office 技能](../../skill/skill-office/README.zh.md)。Desktop 之外选择 `pythonEnvironment: 'user'`,并读取 `DSH_BUNDLED_OFFICE_SKILLS`;只有 [Python SDK 启动器](../../../python/sdk-runtime/README.zh.md)会设置该变量,未设置时保留包内 assets。Desktop 还挂载内置依赖查询行,从载体的主运行时读取技能,并保留默认的 `pythonEnvironment: 'workspace-dependencies'`;其他 profile 禁用依赖查询行。资源打包由 [Desktop 应用](../../../apps/desktop/README.zh.md#bundled-workspace-dependencies)负责。 +`skill-office` 行只在 Desktop profile 中挂载 [Office 技能](../../skill/skill-office/README.zh.md);其他 profile 禁用该行和内置依赖查询行。`DSH_PRIMARY_RUNTIME` 非空时,Desktop 还挂载依赖查询行,从载体的主运行时读取技能,并保留默认的 `pythonEnvironment: 'workspace-dependencies'`;没有主运行时则保留包内 assets,并选择 `pythonEnvironment: 'user'`。资源打包由 [Desktop 应用](../../../apps/desktop/README.zh.md#bundled-workspace-dependencies)负责。 ### patch 语义 @@ -168,11 +168,11 @@ URL 行与浏览器交接都是就绪信号:监督方一观察到该行就发 #### 模型看到什么 -所有 profile 的技能目录都列出 Office 路由和三个 Office 创作技能。加载的 Python 技能末尾带一节 Python 环境说明:Desktop 上指引模型调用 `load_workspace_dependencies`;其他 profile 指引模型使用项目或用户已有的 Python。 +Desktop profile 的技能目录列出 Office 路由和三个 Office 创作技能;其他 profile 不列出。加载的 Python 技能末尾带一节 Python 环境说明:有主运行时时指引模型调用 `load_workspace_dependencies`;没有时指引模型使用项目或用户已有的 Python。 #### Token 影响 -每个初始目录包含四条目录摘要;仅在模型请求时加载技能正文。 +Desktop profile 中每个初始目录包含四条目录摘要;仅在模型请求时加载技能正文。其他 profile:无。 #### KV Cache 影响 diff --git a/packages/bundle/web-app/cordis.patch.yml b/packages/bundle/web-app/cordis.patch.yml index 67e810defe..c4306b725a 100644 --- a/packages/bundle/web-app/cordis.patch.yml +++ b/packages/bundle/web-app/cordis.patch.yml @@ -293,12 +293,11 @@ config: outputDirectory: !!js dshHomePath('office-kit', 'outputs') - # Desktop supplies its Office skills and Python environment through the primary - # runtime named by DSH_PRIMARY_RUNTIME. A Desktop profile launched without a - # nonempty value disables workspace-dependencies and, like the other profiles, - # uses the packaged skills and directs the model to the user's Python. Outside - # Desktop, a nonempty DSH_BUNDLED_OFFICE_SKILLS selects the skill directory; - # otherwise the packaged skills apply. + # Office skills and their Python environment load only in the Desktop + # profile. Desktop supplies its Office skills and Python environment through + # the primary runtime named by DSH_PRIMARY_RUNTIME. A Desktop profile launched + # without a nonempty value disables workspace-dependencies, uses the packaged + # skills, and directs the model to the user's Python. - id: workspace-dependencies name: '@deepseek-ai/dsh-tool-workspace-dependencies' disabled: !!js "ctx.get('profileContext')?.name !== 'desktop' || !process.env.DSH_PRIMARY_RUNTIME" @@ -308,9 +307,10 @@ - id: skill-office name: '@deepseek-ai/dsh-skill-office' + disabled: !!js "ctx.get('profileContext')?.name !== 'desktop'" config: - assetRoot: !!js "(ctx.get('profileContext')?.name === 'desktop' ? process.env.DSH_PRIMARY_RUNTIME && process.getBuiltinModule('node:path').join(process.env.DSH_PRIMARY_RUNTIME, '..', 'office-skills') : process.env.DSH_BUNDLED_OFFICE_SKILLS) || undefined" - pythonEnvironment: !!js "ctx.get('profileContext')?.name === 'desktop' && process.env.DSH_PRIMARY_RUNTIME ? undefined : 'user'" + assetRoot: !!js "process.env.DSH_PRIMARY_RUNTIME ? process.getBuiltinModule('node:path').join(process.env.DSH_PRIMARY_RUNTIME, '..', 'office-skills') : undefined" + pythonEnvironment: !!js "process.env.DSH_PRIMARY_RUNTIME ? undefined : 'user'" # The right Sidebar's document tab: bounded file reads with selectable # Markdown, code, HTML, PDF, Office, and plain-text renderers. diff --git a/packages/bundle/web-app/tests/desktop-office.spec.ts b/packages/bundle/web-app/tests/desktop-office.spec.ts index a37be2cb7d..1916135462 100644 --- a/packages/bundle/web-app/tests/desktop-office.spec.ts +++ b/packages/bundle/web-app/tests/desktop-office.spec.ts @@ -166,17 +166,12 @@ it('mounts the preset Office tools without the Office kit row and reaches the se expect(resolveKitModule).toHaveBeenCalled() }) -it('mounts Office skills with packaged defaults and the user Python outside the Desktop profile without launcher variables', async () => { - const { ctx } = await boot('web', () => undefined) - expect(ctx.loader.resolve('skill-office').disabled).toBe(false) - // The path expression evaluates to `undefined`; the schema leaves it unset so skill-office applies its packaged default. - expect(ctx.loader.resolve('skill-office').fiber?.effectiveConfig).toStrictEqual({ assetRoot: undefined, pythonEnvironment: 'user' }) +it('mounts neither Office skills nor the bundled Python outside the Desktop profile, even with launcher variables', async () => { + const { ctx } = await boot('web', root => join(root, 'primary-runtime'), root => join(root, 'office-skills')) + expect(ctx.loader.resolve('skill-office').disabled).toBe(true) + expect(ctx.loader.resolve('skill-office').fiber).toBeUndefined() expect(ctx.loader.resolve('workspace-dependencies').disabled).toBe(true) - expect((await ctx.skills.list()).map(skill => skill.name)).toEqual(names) - expect((await ctx.skills.get('office-docx'))?.resourceBase).toEqual({ kind: 'directory', path: join(assets, 'office-docx').split(sep).join('/') }) - const docx = (await ctx.skills.get('office-docx'))?.content - expect(docx).toMatch(/## Python environment\n\n.*`python3` or `python` on PATH/u) - expect(docx).not.toContain('load_workspace_dependencies') + expect(await ctx.skills.list()).toEqual([]) expect(ctx.tools.schemas().map(tool => tool.name).sort()).toEqual(OFFICE_TOOLS) }) @@ -195,19 +190,8 @@ it('mounts packaged Office skills with the user Python in a Desktop profile laun expect(ctx.tools.schemas().map(tool => tool.name).sort()).toEqual(OFFICE_TOOLS) }) -it('reads Office skills from the launcher skill directory outside the Desktop profile', async () => { - const { ctx, root } = await boot('web', () => undefined, root => join(root, 'office-skills')) - expect(ctx.loader.resolve('skill-office').fiber?.effectiveConfig).toStrictEqual({ assetRoot: join(root, 'office-skills'), pythonEnvironment: 'user' }) - expect((await ctx.skills.list()).map(skill => skill.name)).toEqual(names) - expect((await ctx.skills.get('office-docx'))?.resourceBase) - .toEqual({ kind: 'directory', path: join(root, 'office-skills', 'office-docx').split(sep).join('/') }) -}) - -it.each([ - ['desktop', (): string => '', (): undefined => undefined], - ['web', (): undefined => undefined, (): string => ''], -] as const)('treats empty launcher variables as unset in the %s profile', async (profile, primaryRuntime, skills) => { - const { ctx } = await boot(profile, primaryRuntime, skills) +it('treats an empty primary runtime as unset in the Desktop profile', async () => { + const { ctx } = await boot('desktop', () => '') await ctx.loader.resolve('skill-office').fiber!.await() expect(ctx.loader.resolve('workspace-dependencies').disabled).toBe(true) expect(ctx.loader.resolve('skill-office').fiber?.effectiveConfig).toStrictEqual({ assetRoot: undefined, pythonEnvironment: 'user' }) diff --git a/packages/skill/skill-office/README.i18n.yaml b/packages/skill/skill-office/README.i18n.yaml index 65387c109a..0502ec570a 100644 --- a/packages/skill/skill-office/README.i18n.yaml +++ b/packages/skill/skill-office/README.i18n.yaml @@ -9,8 +9,8 @@ en: f855ac5e12b4e604 zh: b2e875d31d56cb2e /deepseek-ai-dsh-skill-office/summary: - en: 964193f66f5fa7be - zh: 5a9a9dd9cb8575b4 + en: b1a022cea54f3d52 + zh: cbf7912c4e4d7269 /deepseek-ai-dsh-skill-office/table-of-contents: en: c361195a73cf5755 zh: 745b04e7be0be369 diff --git a/packages/skill/skill-office/README.md b/packages/skill/skill-office/README.md index ca29d33f56..587bd4755b 100644 --- a/packages/skill/skill-office/README.md +++ b/packages/skill/skill-office/README.md @@ -9,7 +9,7 @@ English | [中文](README.zh.md) ## Summary -The catalog lists the Office router and three authoring skills. Full instructions load on demand. The authoring skills append the configured Python environment; the skills direct operations to [`office_render`, `office_convert`, and `office_recalculate`](../../document/tool-office/README.md), with shell copies of output files. The Web application and SDK profiles mount the provider; only Desktop, or an SDK with a primary runtime, also mounts the bundled dependency query. +The catalog lists the Office router and three authoring skills. Full instructions load on demand. The authoring skills append the configured Python environment; the skills direct operations to [`office_render`, `office_convert`, and `office_recalculate`](../../document/tool-office/README.md), with shell copies of output files. Desktop and an SDK with a primary runtime mount the provider; the bundled dependency query mounts beside it whenever a primary runtime is available. ## Table of Contents diff --git a/packages/skill/skill-office/README.zh.md b/packages/skill/skill-office/README.zh.md index 4e81d3fc87..139a5524e4 100644 --- a/packages/skill/skill-office/README.zh.md +++ b/packages/skill/skill-office/README.zh.md @@ -9,7 +9,7 @@ kind: "package-reference" ## 概述 -目录列出 Office 路由及三个创作技能,完整说明按需加载。创作技能追加配置的 Python 环境说明;技能把操作交给 [`office_render`、`office_convert` 和 `office_recalculate`](../../document/tool-office/README.zh.md),并用 shell 复制输出文件。Web 应用和 SDK profile 挂载该提供者;只有 Desktop 或带主运行时的 SDK 还挂载内置依赖查询。 +目录列出 Office 路由及三个创作技能,完整说明按需加载。创作技能追加配置的 Python 环境说明;技能把操作交给 [`office_render`、`office_convert` 和 `office_recalculate`](../../document/tool-office/README.zh.md),并用 shell 复制输出文件。Desktop 和带主运行时的 SDK 挂载该提供者;有主运行时时,内置依赖查询也挂载在它旁边。 ## 目录 diff --git a/packages/skill/tool-workspace-dependencies/README.i18n.yaml b/packages/skill/tool-workspace-dependencies/README.i18n.yaml index f8249ac979..6570c8ae98 100644 --- a/packages/skill/tool-workspace-dependencies/README.i18n.yaml +++ b/packages/skill/tool-workspace-dependencies/README.i18n.yaml @@ -21,8 +21,8 @@ en: 97b1f99b4e9c2569 zh: bf6c6ce74073413f /deepseek-ai-dsh-tool-workspace-dependencies/use-this-package/payload-layout: - en: 0575105cbe07c108 - zh: 125d54d45a72bf43 + en: f15f9c196e6bf5b3 + zh: d7ff3ae422231fab /deepseek-ai-dsh-tool-workspace-dependencies/use-this-package/build-a-carrier-payload: en: 0f3e570525053f09 zh: 1b0cd3b653e1bd5d diff --git a/packages/skill/tool-workspace-dependencies/README.md b/packages/skill/tool-workspace-dependencies/README.md index f61887c31f..8e465771a0 100644 --- a/packages/skill/tool-workspace-dependencies/README.md +++ b/packages/skill/tool-workspace-dependencies/README.md @@ -46,7 +46,7 @@ Mount the plugin beside the tool registry with the payload directory. Configurat On macOS and Linux, the builder retains `python` and `python3` as relative links to the sibling versioned interpreter (for example, `python3.12`). Installation preserves these two aliases and materializes other links. Alias validation requires the exact sibling filename and a regular target file; carriers that cannot preserve links, including Python wheels, retain supported regular command files. Windows keeps its ordinary `python.exe` file. -The packaged `sdk` profile uses its bundled Python and Office skills by default; `DSH_PRIMARY_RUNTIME` overrides the resource location, and an empty value opts out of the bundled environment. Without a primary runtime, including source launches, the `sdk` profile leaves this tool unmounted and still mounts the Office skills, which direct the model to the user's Python. See [runtime configuration](../../../python/sdk-runtime/README.md) for independent skill selection. Missing skill resources are reported once through `ctx.logger.warn` during catalog discovery; invalid or incomplete external runtime payloads fail the first tool call. Profile configuration changes require restarting the SDK process. +The packaged `sdk` profile uses its bundled Python and Office skills by default; `DSH_PRIMARY_RUNTIME` overrides the resource location, and an empty value opts out of both. Without a primary runtime, including source launches, the `sdk` profile mounts neither this tool nor the Office skills. See [runtime configuration](../../../python/sdk-runtime/README.md) for independent skill selection. Missing skill resources are reported once through `ctx.logger.warn` during catalog discovery; invalid or incomplete external runtime payloads fail the first tool call. Profile configuration changes require restarting the SDK process. ### Build a carrier payload diff --git a/packages/skill/tool-workspace-dependencies/README.zh.md b/packages/skill/tool-workspace-dependencies/README.zh.md index 45ce1bceef..b5c02752fe 100644 --- a/packages/skill/tool-workspace-dependencies/README.zh.md +++ b/packages/skill/tool-workspace-dependencies/README.zh.md @@ -46,7 +46,7 @@ kind: "package-reference" 在 macOS 和 Linux 上,构建器将 `python` 和 `python3` 保留为指向同目录版本化解释器(例如 `python3.12`)的相对链接。安装时保留这两个别名,其他链接展开为实际文件。别名校验要求目标名称与同目录解释器文件名完全一致,且目标为普通文件;Python wheel 等无法保留链接的载体使用普通命令文件,同样受支持。Windows 保留普通的 `python.exe` 文件。 -打包的 `sdk` profile 默认使用随包 Python 和 Office skills;`DSH_PRIMARY_RUNTIME` 覆盖资源位置,空值表示不使用随包环境。没有主运行时(包括源码启动)时,`sdk` profile 不挂载此工具,但仍挂载 Office skills,由它们引导模型使用用户的 Python。独立选择 skills 的方式见[运行时配置](../../../python/sdk-runtime/README.zh.md)。缺少 skill 资源时,目录发现阶段通过 `ctx.logger.warn` 报告一次;无效或不完整的外部运行时 payload 在首次工具调用时失败。profile 配置变更需要重启 SDK 进程。 +打包的 `sdk` profile 默认使用随包 Python 和 Office skills;`DSH_PRIMARY_RUNTIME` 覆盖资源位置,空值表示两者都不使用。没有主运行时(包括源码启动)时,`sdk` profile 既不挂载此工具,也不挂载 Office skills。独立选择 skills 的方式见[运行时配置](../../../python/sdk-runtime/README.zh.md)。缺少 skill 资源时,目录发现阶段通过 `ctx.logger.warn` 报告一次;无效或不完整的外部运行时 payload 在首次工具调用时失败。profile 配置变更需要重启 SDK 进程。 ### 构建载体 payload diff --git a/python/sdk-runtime/README.i18n.yaml b/python/sdk-runtime/README.i18n.yaml index 5500593458..a7655a5f70 100644 --- a/python/sdk-runtime/README.i18n.yaml +++ b/python/sdk-runtime/README.i18n.yaml @@ -6,8 +6,8 @@ en: 1ea1d8e6d2c14b02 zh: 8e0b9903158667a1 /deepseek-harness-runtime-bin/installed-commands-and-artifacts: - en: 2d4c437113482e00 - zh: c40aac1cbb55951a + en: dd46aafb16ff2cfc + zh: d885604d0a90a98c /deepseek-harness-runtime-bin/python-module-api: en: 78a200e328d96637 zh: f3b7a0b69b7a39e0 diff --git a/python/sdk-runtime/README.md b/python/sdk-runtime/README.md index f7dc40f096..18e02f80d3 100644 --- a/python/sdk-runtime/README.md +++ b/python/sdk-runtime/README.md @@ -25,7 +25,7 @@ primary_runtime = download_primary_runtime() `DSH_RESOURCE_CACHE` selects an absolute cache root, defaulting to `~/.cache/deepseek-harness/resources`. Resource identities include the release's locked inputs. Downloads verify archive hashes and package identities, preserve executable permissions, and publish completed directories atomically. Failed downloads can be retried. `DSH_RESOURCE_DOWNLOAD_TIMEOUT_MS` bounds each archive download, including its body; the default is `300000`, and accepted values are integers from `1` to `2147483647`. Downloads follow the Harness proxy environment policy. Installed wheel files are never modified. Release versions have separate cache directories; unused versions require manual removal. Downloads use the locked upstream URLs without a registry or mirror override. -On subsequent launches the packaged bootstrap exposes downloaded resources to the SDK profile. `DSH_PRIMARY_RUNTIME` overrides the cached authoring environment; an empty value disables its query and package-manager selection. `DSH_OFFICE_SIDECAR` can select an absolute sidecar directory with its standalone Node. Users may provide their own Python environment and document libraries without downloading the authoring environment. Office skills are always available: with the authoring environment they direct the model to its bundled Python and libraries, and without it to the user's existing Python. Without a selected Office sidecar the Office tools report LibreOffice Kit as unavailable. External authoring payloads retain the `primary-runtime/` plus sibling `office-skills/` layout. The SDK reads resources in place without copying them into `DSH_HOME`. The `sdk-minimal` profile does not mount these providers. +On subsequent launches the packaged bootstrap exposes downloaded resources to the SDK profile. `DSH_PRIMARY_RUNTIME` overrides the cached authoring environment; an empty value disables its query and package-manager selection. `DSH_OFFICE_SIDECAR` can select an absolute sidecar directory with its standalone Node. Users may provide their own Python environment and document libraries without downloading the authoring environment. Office skills are available only with the authoring environment and direct the model to its bundled Python and libraries. Without a selected Office sidecar the Office tools report LibreOffice Kit as unavailable. External authoring payloads retain the `primary-runtime/` plus sibling `office-skills/` layout. The SDK reads resources in place without copying them into `DSH_HOME`. The `sdk-minimal` profile does not mount these providers. Skill selection is independent of delivery: project, custom-directory, and user filesystem skills override same-name bundled skills. An SDK patch can disable only the Office provider while retaining the Python query: diff --git a/python/sdk-runtime/README.zh.md b/python/sdk-runtime/README.zh.md index 4cc5b9c824..f1c6d9a3a0 100644 --- a/python/sdk-runtime/README.zh.md +++ b/python/sdk-runtime/README.zh.md @@ -25,7 +25,7 @@ primary_runtime = download_primary_runtime() `DSH_RESOURCE_CACHE` 指定绝对缓存根目录,默认为 `~/.cache/deepseek-harness/resources`。资源身份包含发布版本锁定的输入。下载会校验归档哈希和包身份、保留执行权限,并原子发布完整目录。下载失败后可重试。`DSH_RESOURCE_DOWNLOAD_TIMEOUT_MS` 限制每个归档的下载耗时,包含响应内容;默认值为 `300000`,接受 `1` 到 `2147483647` 的整数。下载遵循 Harness 代理环境策略。已安装的 wheel 文件不会被修改。不同发布版本使用独立缓存目录;不再使用的版本需手动删除。下载使用锁定的上游 URL,不提供 registry 或镜像覆盖。 -后续启动时,打包 bootstrap 将已下载资源提供给 SDK profile。`DSH_PRIMARY_RUNTIME` 覆盖缓存中的创作环境;空值禁用其查询和包管理器选择。`DSH_OFFICE_SIDECAR` 可选择包含独立 Node 的绝对 sidecar 目录。用户可自行提供 Python 环境和文档库,无需下载创作环境。Office skills 总是可用:有创作环境时指引模型使用其内置 Python 与库,没有时指引模型使用用户已有的 Python。未选择 Office sidecar 时,Office 工具报告 LibreOffice Kit 不可用。外部创作载荷保留 `primary-runtime/` 及同级 `office-skills/` 布局。SDK 原位读取资源,不复制到 `DSH_HOME`。`sdk-minimal` profile 不挂载这些提供方。 +后续启动时,打包 bootstrap 将已下载资源提供给 SDK profile。`DSH_PRIMARY_RUNTIME` 覆盖缓存中的创作环境;空值禁用其查询和包管理器选择。`DSH_OFFICE_SIDECAR` 可选择包含独立 Node 的绝对 sidecar 目录。用户可自行提供 Python 环境和文档库,无需下载创作环境。Office skills 只在有创作环境时可用,并指引模型使用其内置 Python 与库。未选择 Office sidecar 时,Office 工具报告 LibreOffice Kit 不可用。外部创作载荷保留 `primary-runtime/` 及同级 `office-skills/` 布局。SDK 原位读取资源,不复制到 `DSH_HOME`。`sdk-minimal` profile 不挂载这些提供方。 选择 skills 与交付资源相互独立:项目、自定义目录和用户文件系统 skills 优先于同名随包 skills。SDK patch 可以仅禁用 Office 提供方,同时保留 Python 查询: diff --git a/snapshots/web/changed-files-turn/ui.expected.md b/snapshots/web/changed-files-turn/ui.expected.md index 5b6ff10331..be66dc79a6 100644 --- a/snapshots/web/changed-files-turn/ui.expected.md +++ b/snapshots/web/changed-files-turn/ui.expected.md @@ -4,7 +4,6 @@ - button "已完成,用时 {{duration}}" [expanded] - button "执行了命令,已写入文件,已读取文件等" [expanded] - button "上下文注入 runtime-context" -- button "上下文注入 skill-catalog" - button "上下文注入 time-context" - button "思考 The user wants four things done directly. But I need to read intro.md before editing (fs-observation-policy requires reading existing file first). The user says don't look at the directory first, but reading intro.md is needed for the edit tool. Let me just do it." - button "读取 intro.md": diff --git a/snapshots/web/collapse-timing/next-message.expected.md b/snapshots/web/collapse-timing/next-message.expected.md index 8e6393f8ec..34faef9a3c 100644 --- a/snapshots/web/collapse-timing/next-message.expected.md +++ b/snapshots/web/collapse-timing/next-message.expected.md @@ -12,7 +12,6 @@ - status: Completed - button "Completed in {{duration}}" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Tools updated 34 added" - button "Think Both files have been read. a.txt contains \"alpha\" and b.txt contains \"beta\". I'll now reply with DONE as instructed." diff --git a/snapshots/web/collapse-timing/verbose.expected.md b/snapshots/web/collapse-timing/verbose.expected.md index 6652729078..7962157874 100644 --- a/snapshots/web/collapse-timing/verbose.expected.md +++ b/snapshots/web/collapse-timing/verbose.expected.md @@ -20,7 +20,6 @@ - status: Completed - button "Completed in {{duration}}" [disabled] [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Tools updated 34 added" - button "Think Both files have been read. a.txt contains \"alpha\" and b.txt contains \"beta\". I'll now reply with DONE as instructed." diff --git a/snapshots/web/feedback-command/ack-expanded.expected.md b/snapshots/web/feedback-command/ack-expanded.expected.md index eb65a5453b..1824b546ca 100644 --- a/snapshots/web/feedback-command/ack-expanded.expected.md +++ b/snapshots/web/feedback-command/ack-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Analysis completed" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to reply with a single word. Let me comply." - paragraph: LIGHTHOUSE diff --git a/snapshots/web/feedback-release/ack-expanded.expected.md b/snapshots/web/feedback-release/ack-expanded.expected.md index eb65a5453b..1824b546ca 100644 --- a/snapshots/web/feedback-release/ack-expanded.expected.md +++ b/snapshots/web/feedback-release/ack-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Analysis completed" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to reply with a single word. Let me comply." - paragraph: LIGHTHOUSE diff --git a/snapshots/web/fresh-round-trip/ui-expanded.expected.md b/snapshots/web/fresh-round-trip/ui-expanded.expected.md index 919216af28..11c631d938 100644 --- a/snapshots/web/fresh-round-trip/ui-expanded.expected.md +++ b/snapshots/web/fresh-round-trip/ui-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Ran commands" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to run a simple bash command and reply with \"DONE\"." - button "Bash Echo the test string" diff --git a/snapshots/web/goal-multi-turn-actions/ui-expanded.expected.md b/snapshots/web/goal-multi-turn-actions/ui-expanded.expected.md index f3573f01d2..c63f6ab49d 100644 --- a/snapshots/web/goal-multi-turn-actions/ui-expanded.expected.md +++ b/snapshots/web/goal-multi-turn-actions/ui-expanded.expected.md @@ -19,7 +19,6 @@ - button "Completed in {{duration}}" [expanded] - button "Ran commands and updated the plan" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - 'button "Think The user''s goal is: \"做两个turn,每个turn输出随机一个包的文件结构。注意你做完一个turn之后,直接输出内容,停止,我们的系统会帮你再开一个turn,你看着做一个类似的\" — which translates to: \"Do two turns, each turn output the file structure of a random package. Note that after you finish one turn, directly output the content and stop; our system will help you open another turn, and you just do something similar.\""' - button "Bash List package directories deterministically" diff --git a/snapshots/web/lifecycle-chrome/reloaded-expanded.expected.md b/snapshots/web/lifecycle-chrome/reloaded-expanded.expected.md index c4820a8dc9..ae946d6ae4 100644 --- a/snapshots/web/lifecycle-chrome/reloaded-expanded.expected.md +++ b/snapshots/web/lifecycle-chrome/reloaded-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Analysis completed" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to reply with a single word. Let me comply." - paragraph: LIGHTHOUSE diff --git a/snapshots/web/live-interactions/cancel-expanded.expected.md b/snapshots/web/live-interactions/cancel-expanded.expected.md index 2d5c0c5bba..1a063fe476 100644 --- a/snapshots/web/live-interactions/cancel-expanded.expected.md +++ b/snapshots/web/live-interactions/cancel-expanded.expected.md @@ -13,7 +13,6 @@ - button "Stopped" [disabled] [expanded] - button "Injected context" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - text: Stopped diff --git a/snapshots/web/live-interactions/loading.expected.md b/snapshots/web/live-interactions/loading.expected.md index 28141fb63e..87c8fe4fb7 100644 --- a/snapshots/web/live-interactions/loading.expected.md +++ b/snapshots/web/live-interactions/loading.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/live-interactions/retry-expanded.expected.md b/snapshots/web/live-interactions/retry-expanded.expected.md index ff0b7922ca..1fab7287f1 100644 --- a/snapshots/web/live-interactions/retry-expanded.expected.md +++ b/snapshots/web/live-interactions/retry-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Injected context" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - group: - status: Retried model request (1/5) · {{duration}} diff --git a/snapshots/web/live-interactions/running-draft.expected.md b/snapshots/web/live-interactions/running-draft.expected.md index 5da9965d81..c9262ded75 100644 --- a/snapshots/web/live-interactions/running-draft.expected.md +++ b/snapshots/web/live-interactions/running-draft.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/official-subagent-bundle/ui.expected.md b/snapshots/web/official-subagent-bundle/ui.expected.md index bf46ea2756..35244615ff 100644 --- a/snapshots/web/official-subagent-bundle/ui.expected.md +++ b/snapshots/web/official-subagent-bundle/ui.expected.md @@ -4,7 +4,6 @@ - button "Completed in {{duration}}" [expanded] - button "Ran code and coordinated subagents" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Code Delegate through the official Claude bundle" - button "Tool call subagent_claude_code · Read the fixture response" diff --git a/snapshots/web/optional-string-editor/ui.expected.md b/snapshots/web/optional-string-editor/ui.expected.md index c0b5682351..18125091f9 100644 --- a/snapshots/web/optional-string-editor/ui.expected.md +++ b/snapshots/web/optional-string-editor/ui.expected.md @@ -4,7 +4,6 @@ - button "Completed in {{duration}}" [expanded] - button "Ran code and called tools" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Code Create a file with the optional editor" - button "Tool call str_replace_editor · create" diff --git a/snapshots/web/plan-review/approved-expanded.expected.md b/snapshots/web/plan-review/approved-expanded.expected.md index a1a5c163cb..e615c7d7cd 100644 --- a/snapshots/web/plan-review/approved-expanded.expected.md +++ b/snapshots/web/plan-review/approved-expanded.expected.md @@ -12,7 +12,6 @@ - button "Completed in {{duration}}" [expanded] - button "Analysis completed" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - 'button "Think The user wants me to plan a small change to add a `--greeting` flag to a CLI. They explicitly told me not to read or write any files, and to call exit_plan_mode with a short plan. Let me do that directly."' - paragraph: diff --git a/snapshots/web/present-svg/ui.expected.md b/snapshots/web/present-svg/ui.expected.md index 7f82d4d678..75e58cd9ab 100644 --- a/snapshots/web/present-svg/ui.expected.md +++ b/snapshots/web/present-svg/ui.expected.md @@ -4,7 +4,6 @@ - button "已完成,用时 {{duration}}" [expanded] - button "已完成分析" [expanded] - button "上下文注入 runtime-context" -- button "上下文注入 skill-catalog" - button "上下文注入 time-context" - button "思考 The user wants a simple SVG diagram of the von Neumann architecture, saved as von-neumann.svg. Let me create a clean SVG showing CPU (control unit, ALU), memory, input, and output with bidirectional data/control buses." - paragraph: 我来创建一个冯诺依曼架构的 SVG 示意图。 diff --git a/snapshots/web/present/ui.expected.md b/snapshots/web/present/ui.expected.md index 26a7e07dd0..e236fdacd4 100644 --- a/snapshots/web/present/ui.expected.md +++ b/snapshots/web/present/ui.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Called tools, ran code, ran commands" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants one run_code program that:" - text: Failed diff --git a/snapshots/web/ptc-round/preparing.expected.md b/snapshots/web/ptc-round/preparing.expected.md index 2e7dfd5f31..d4c000d608 100644 --- a/snapshots/web/ptc-round/preparing.expected.md +++ b/snapshots/web/ptc-round/preparing.expected.md @@ -1,5 +1,4 @@ - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - 'button "Think The user wants me to write a single `run_code` program that:"' - text: Preparing tool call Code diff --git a/snapshots/web/ptc-round/ui-ja.expected.md b/snapshots/web/ptc-round/ui-ja.expected.md index 74494139d7..547966b6e3 100644 --- a/snapshots/web/ptc-round/ui-ja.expected.md +++ b/snapshots/web/ptc-round/ui-ja.expected.md @@ -13,7 +13,6 @@ - button "完了まで {{duration}}" [expanded] - button "コードを実行しました、コマンドを実行しました、ファイルを読み取りました" [expanded] - button "コンテキスト注入 runtime-context" -- button "コンテキスト注入 skill-catalog" - button "コンテキスト注入 time-context" - 'button "思考 The user wants me to write a single `run_code` program that:"' - button "コード Run bash echo and catch missing file read" diff --git a/snapshots/web/ptc-round/ui.expected.md b/snapshots/web/ptc-round/ui.expected.md index f0fe4d20a3..b9509eca3c 100644 --- a/snapshots/web/ptc-round/ui.expected.md +++ b/snapshots/web/ptc-round/ui.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Ran code, ran commands, read files" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - 'button "Think The user wants me to write a single `run_code` program that:"' - button "Code Run bash echo and catch missing file read" diff --git a/snapshots/web/question-composer/answered-expanded.expected.md b/snapshots/web/question-composer/answered-expanded.expected.md index 8b3e7c398e..30f5649644 100644 --- a/snapshots/web/question-composer/answered-expanded.expected.md +++ b/snapshots/web/question-composer/answered-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Asked questions" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to use the ask_user_question tool with specific parameters. Let me do exactly that." - button "Ask question 1/1 answered" [expanded] diff --git a/snapshots/web/queue-actions/collapsed.expected.md b/snapshots/web/queue-actions/collapsed.expected.md index 272b71d385..f4d62b20ab 100644 --- a/snapshots/web/queue-actions/collapsed.expected.md +++ b/snapshots/web/queue-actions/collapsed.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/queue-actions/editing.expected.md b/snapshots/web/queue-actions/editing.expected.md index 2fc14ac64d..d2d47e3c04 100644 --- a/snapshots/web/queue-actions/editing.expected.md +++ b/snapshots/web/queue-actions/editing.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/queue-actions/layout.expected.md b/snapshots/web/queue-actions/layout.expected.md index b79770e640..80e2726c72 100644 --- a/snapshots/web/queue-actions/layout.expected.md +++ b/snapshots/web/queue-actions/layout.expected.md @@ -13,7 +13,6 @@ - text: Continuing goal - time: {{clock}} - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/queue-actions/preserved-expanded.expected.md b/snapshots/web/queue-actions/preserved-expanded.expected.md index 94d44ce9f8..8b1db5985c 100644 --- a/snapshots/web/queue-actions/preserved-expanded.expected.md +++ b/snapshots/web/queue-actions/preserved-expanded.expected.md @@ -13,7 +13,6 @@ - button "Stopped" [disabled] [expanded] - button "Injected context" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - text: Stopped diff --git a/snapshots/web/queue-actions/sending.expected.md b/snapshots/web/queue-actions/sending.expected.md index 0ce88945b0..9db66f9631 100644 --- a/snapshots/web/queue-actions/sending.expected.md +++ b/snapshots/web/queue-actions/sending.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/queue-actions/ui.expected.md b/snapshots/web/queue-actions/ui.expected.md index 07b3fa10d5..28c23a419f 100644 --- a/snapshots/web/queue-actions/ui.expected.md +++ b/snapshots/web/queue-actions/ui.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/queued-image/queued.expected.md b/snapshots/web/queued-image/queued.expected.md index 4f5cdbcf4e..913ff74ce3 100644 --- a/snapshots/web/queued-image/queued.expected.md +++ b/snapshots/web/queued-image/queued.expected.md @@ -10,7 +10,6 @@ - text: Reply with a one-sentence description of event sourcing, then stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/session-inspector/log.expected.md b/snapshots/web/session-inspector/log.expected.md index 5b8b6d4034..4621741cb4 100644 --- a/snapshots/web/session-inspector/log.expected.md +++ b/snapshots/web/session-inspector/log.expected.md @@ -51,11 +51,3 @@ - cell "{{time}}" - 'cell "data: content: [1] · source: {…} · role: user · id: {{uuid}} · surfaceOp: append"': - 'button "data: content: [1] · source: {…} · role: user · id: {{uuid}} · surfaceOp: append"' - - 'row "11 user/message {{time}} data: content: [1] · source: {…} · role: user · id: {{uuid}} · surfaceOp: append"': - - cell "11" - - cell "user/message": - - button "user/message" - - cell - - cell "{{time}}" - - 'cell "data: content: [1] · source: {…} · role: user · id: {{uuid}} · surfaceOp: append"': - - 'button "data: content: [1] · source: {…} · role: user · id: {{uuid}} · surfaceOp: append"' diff --git a/snapshots/web/steering/mid-steer.expected.md b/snapshots/web/steering/mid-steer.expected.md index ccb5f7bae1..993f4bbc8a 100644 --- a/snapshots/web/steering/mid-steer.expected.md +++ b/snapshots/web/steering/mid-steer.expected.md @@ -10,7 +10,6 @@ - text: Use the ask_user_question tool to ask me exactly one question with id "checkpoint", question "Ready to continue?", header "Checkpoint", and options labeled "Yes" and "No". After I answer, reply with one short sentence acknowledging my answer and stop. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - text: Running - button "Ask question waiting" diff --git a/snapshots/web/steering/settled-expanded.expected.md b/snapshots/web/steering/settled-expanded.expected.md index 7841c63d07..4e39491b33 100644 --- a/snapshots/web/steering/settled-expanded.expected.md +++ b/snapshots/web/steering/settled-expanded.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [disabled] - button "Asked questions" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Ask question 1/1 answered" - group "Questions and answers": diff --git a/snapshots/web/steering/trajectory.expected.md b/snapshots/web/steering/trajectory.expected.md index 0b839bcb8c..2619bacdd9 100644 --- a/snapshots/web/steering/trajectory.expected.md +++ b/snapshots/web/steering/trajectory.expected.md @@ -25,9 +25,6 @@ - 'row "CONTEXT, Current runtime context. This snapshot supersedes earlier runtime-context snapshots. Current working directory: \"{{cwd}}/workspace\". Current DSH file policy: workspace-write. Any available operation enforced by the DSH file sandbox may modify files under the session workspace: \"{{cwd}}/workspace\". Some pl…"': - cell "CONTEXT" - 'cell "Current runtime context. This snapshot supersedes earlier runtime-context snapshots. Current working directory: \"{{cwd}}/workspace\". Current DSH file policy: workspace-write. Any available operation enforced by the DSH file sandbox may modify files under the session workspace: \"{{cwd}}/workspace\". Some pl…"' - - 'row "CONTEXT, A skill is a reusable set of task-specific instructions. The following skills are available in this session: office: Create or edit Office files; inspect Office files and PDFs. Load before rendering, conversion, or recalculation to enable office_render, office_convert, and office_recalculate next step. office-docx: Create, read, edit, and validate Word documents (.docx). office-pptx: Create, read, edit, and validate PowerPoint presentations (.pptx). office-xlsx: Read, cr…"': - - cell "CONTEXT" - - 'cell " A skill is a reusable set of task-specific instructions. The following skills are available in this session: office: Create or edit Office files; inspect Office files and PDFs. Load before rendering, conversion, or recalculation to enable office_render, office_convert, and office_recalculate next step. office-docx: Create, read, edit, and validate Word documents (.docx). office-pptx: Create, read, edit, and validate PowerPoint presentations (.pptx). office-xlsx: Read, cr…"' - 'row "CONTEXT, Time sampled while preparing turn 1, step 1: 2026-01-15T{{clock}}+{{clock}}[Asia/Shanghai] Browser time zone for this request: Asia/Shanghai. Interpret otherwise-unqualified dates and times in this zone. Elapsed since the preceding model-visible message: unavailable."': - cell "CONTEXT" - 'cell "Time sampled while preparing turn 1, step 1: 2026-01-15T{{clock}}+{{clock}}[Asia/Shanghai] Browser time zone for this request: Asia/Shanghai. Interpret otherwise-unqualified dates and times in this zone. Elapsed since the preceding model-visible message: unavailable."' diff --git a/snapshots/web/subagent-conversation/ui-expanded.expected.md b/snapshots/web/subagent-conversation/ui-expanded.expected.md index fb99690fa6..b2d6ebb79d 100644 --- a/snapshots/web/subagent-conversation/ui-expanded.expected.md +++ b/snapshots/web/subagent-conversation/ui-expanded.expected.md @@ -20,7 +20,6 @@ - button "Completed in {{duration}}" [expanded] - button "Analysis completed" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user is asking for a one-sentence description of event sourcing. This is a straightforward knowledge question that doesn't require any skill loading or tool calls." - paragraph: Event sourcing is a pattern where all changes to an application's state are stored as an immutable, append-only sequence of events, rather than persisting only the current state, enabling full auditability, temporal queries, and event-driven architectures. diff --git a/snapshots/web/subagent-interrupt/offline-composer.expected.md b/snapshots/web/subagent-interrupt/offline-composer.expected.md index f2b066b262..7dd7f11d69 100644 --- a/snapshots/web/subagent-interrupt/offline-composer.expected.md +++ b/snapshots/web/subagent-interrupt/offline-composer.expected.md @@ -13,7 +13,6 @@ - text: Explain event sourcing in one sentence.Your final answer is delivered automatically if your parent is still online. Include the result and relevant evidence in that answer; the parent does not receive your full transcript, tool output, or reasoning. If your last action is a message to your parent, the completion notice omits your final answer; include the result and relevant evidence in that message. {{clock}} - button "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - paragraph: partial - status: Deep diving diff --git a/snapshots/web/turn-tail-actions/running.expected.md b/snapshots/web/turn-tail-actions/running.expected.md index e4834f582a..af1de6cbf9 100644 --- a/snapshots/web/turn-tail-actions/running.expected.md +++ b/snapshots/web/turn-tail-actions/running.expected.md @@ -11,7 +11,6 @@ - button "Copy" - tooltip "Copy" - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to begin with \"Reading the workspace now.\" and call bash with \"echo alpha\" in the same message. Then after the tool result, reply with the single word DONE and stop." - paragraph: Reading the workspace now. diff --git a/snapshots/web/web-search-round/ui.expected.md b/snapshots/web/web-search-round/ui.expected.md index 33b37f5230..4de8eaf7f4 100644 --- a/snapshots/web/web-search-round/ui.expected.md +++ b/snapshots/web/web-search-round/ui.expected.md @@ -13,7 +13,6 @@ - button "Completed in {{duration}}" [expanded] - button "Searched the web" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Search DeepSeek Harness snapshot search, DeepSeek Harness multi-query search" - paragraph: SEARCH_DONE diff --git a/snapshots/web/workflow-run/ui.expected.md b/snapshots/web/workflow-run/ui.expected.md index 14344707eb..64aa2f8e7d 100644 --- a/snapshots/web/workflow-run/ui.expected.md +++ b/snapshots/web/workflow-run/ui.expected.md @@ -4,7 +4,6 @@ - button "Completed in {{duration}}" [expanded] - button "Called tools" [expanded] - button "Context injection runtime-context" -- button "Context injection skill-catalog" - button "Context injection time-context" - button "Think The user wants me to use the workflow tool exactly once with specific parameters. Let me carefully follow the instructions:" - button "Run workflow snapshot-flow"