Merge remote-tracking branch 'origin/master' into xtr/session-model-selection

# Conflicts:
#	docs/persistence-schema.json
This commit is contained in:
_Kerman committed 2026-10-21 13:56:41 +08:00
commit 62a1075fe7
258 files changed
+15635 -662658

No files matched your search

@@ -9,8 +9,8 @@
en: 6bb727a659ba1503
zh: d2ebf5c8164a807e
/agent-note-current-profile-plugin-management-shares-cli-transactions/decision:
en: 863b4369c39f3933
zh: 7dd44a91ccaaef8f
en: d2e13562b5aef903
zh: 07face30189c07fc
/agent-note-current-profile-plugin-management-shares-cli-transactions/alternatives-considered:
en: 30c609de89084351
zh: 27f2747ad9d9b752
@@ -16,7 +16,7 @@ Configuration watches use Chokidar write stabilization by default. Its ordinary
Profile files remain the persisted state: entry toggles edit only `disabled` in the last override matching the entry id and any module-name assertion, appending when none matches, and bundle toggles edit the ordered string list. Dependency updates do not reactivate retained disabled bundles. A service removal first applies the composition without the bundle and waits for old fibers to finish before deleting the dependency. Saved configuration, pnpm completion and runtime activation have separate outcomes; a failed removal preserves the actual partial state and a diagnostic path, while a failed or cancelled installation restores the profile files it snapshotted.
This extends the [profile bundle composition decision](2026-08-05-profile-plugin-bundles.md). Profiles without HMR keep their process composition, and Desktop package management remains shell-owned. Web controls and explicitly enabled agent tools call the same service. Management operations return results to callers without adding messages to live Agents. The agent tool is enabled in Creator mode and disabled by default in the base bundle and other shipped presets. The browser-only worker preview has no host package installer; its module-proxy table refuses `execa` calls explicitly while retaining the management module for inventory discovery.
This extends the [profile bundle composition decision](2026-08-05-profile-plugin-bundles.md). Profiles without HMR keep their process composition, and Desktop package management remains shell-owned. Web controls and explicitly enabled agent tools call the same service. Management operations return results to callers without adding messages to live Agents. The agent tool is enabled in Standard and Creator modes and disabled by default in the base bundle and other shipped presets. The browser-only worker preview has no host package installer; its module-proxy table refuses `execa` calls explicitly while retaining the management module for inventory discovery.
CLI calls inherit the terminal and authentication environment; service calls retain the subprocess credential scrub and bounded diagnostics. Management records carry error codes and parameters for locale-owned Web presentation. Reconciliation compares entry identity, fiber identity, configuration and diagnostics before and after updating: unchanged inactive entries remain warnings, while newly affected failures reject the operation. Explicit enablement targets must activate.
@@ -16,7 +16,7 @@ Web 和 Agent 控件需要修改运行中的 profile,同时避免另建包安
profile 文件保持为持久状态:条目开关只修改最后一条符合条目 id 及模块名称断言的覆盖项中的 `disabled`,没有匹配项时追加,组合包开关修改有序字符串列表。更新依赖不会重新激活保留的已停用组合包。service 删除组合包时,先应用去掉该组合包的配置,等待旧 fiber 完成卸载后再删除依赖。已保存配置、pnpm 完成状态与运行时激活分别报告;失败的删除保留实际的部分状态与诊断路径,失败或被取消的安装则恢复它快照的 profile 文件。
这扩展了[profile 组合包决策](2026-08-05-profile-plugin-bundles.zh.md)。startup profile 保留进程组合,Desktop 包管理仍由 shell 持有。Web 控件与显式启用的 Agent 工具调用同一 service。管理操作向调用方返回结果,不向存活 Agent 添加消息。创造模式启用该 Agent 工具;base 组合包和其他内置预设默认禁用。纯浏览器 worker 预览没有宿主包安装器;其模块代理表明确拒绝 `execa` 调用,同时保留管理模块用于清单发现。
这扩展了[profile 组合包决策](2026-08-05-profile-plugin-bundles.zh.md)。startup profile 保留进程组合,Desktop 包管理仍由 shell 持有。Web 控件与显式启用的 Agent 工具调用同一 service。管理操作向调用方返回结果,不向存活 Agent 添加消息。标准模式和创造模式启用该 Agent 工具;base 组合包和其他内置预设默认禁用。纯浏览器 worker 预览没有宿主包安装器;其模块代理表明确拒绝 `execa` 调用,同时保留管理模块用于清单发现。
CLI 调用继承终端和认证环境;service 调用保留子进程凭据清理与有界诊断。管理结果提供错误码和参数,由 Web 词典呈现文案。重载前后比较 entry、fiber、配置与诊断:未变化的已有故障保留为警告,本次影响到的新故障使操作失败。显式启用的目标必须成功激活。
@@ -9,8 +9,8 @@
en: 44615a7a0939054e
zh: b8efa721321ba0d7
/agent-note-creator-mode-installs-persistent-plugin-bundles/decision:
en: c0d74db1b2b16576
zh: b8713a6aadf007f9
en: 38ecabc170c418c7
zh: d380f53fa508328e
/agent-note-creator-mode-installs-persistent-plugin-bundles/alternatives-considered:
en: af527d8aabdfd59c
zh: 34388da992d2ab56
@@ -12,6 +12,8 @@ Agents need to install capabilities and use them during the same conversation. G
Creator mode enables the existing `plugin_manager` tool. Agents author packages and Loader YAML patches as workspace files, then install them through `install_bundle`. An MCP connection is a configuration-only bundle inserting the installed `dsh-mcp-client`; a UI bundle includes a Host entry and a Client artifact. Profile locking, package installation, enablement and HMR remain owned by the existing manager. The entire management tool requires `danger-full-access` or approval for one call: profile changes can load code with host permissions and affect other sessions. Each execution, including inventory reads, uses the shared sandbox escalation helper and approval service before accessing the manager. Under lower sandbox modes, `ask` requests approval and `never` denies; a full-access session needs no additional approval. A grant does not change session permissions, but its profile changes persist. This keeps shell-equivalent Host access explicit without requiring a permanent session-wide elevation. Human-operated Web and CLI controls retain their existing behavior.
The default Standard mode enables the same tool under the same profile condition and approval gate. Without it, Standard sessions did not install plugins directly and spent extra turns and tokens working around the missing tool; the change also moves Standard and Creator toward one capability set. A full-access Standard session can therefore install Host code without a separate prompt, as its shell already can. PTC and Minimal keep the tool disabled.
The model sees two read-only Cordis inspection tools. Generated-code define/run/stop/undefine and dynamic self-inspection tool APIs are absent. Existing runtime and Client consumers retain their services; historical session cards remain readable. This supersedes only the model-facing mutation workflow in the [self-referential toolset reference](../../../../packages/extensions/cordis-host-runner/README.md); its runtime ownership and sandbox rationale remain independently relevant. The [profile transaction decision](2026-09-14-current-profile-plugin-management.md) continues to govern locking, package installation, and partial failures.
Visual creation requests default to an installed Client plugin rendered in the current Web page unless the user names another destination. The development skill supplies a minimal package and effect-owned Client registration. Discovery ends when the required APIs are known; a working first version is installed before optional visual refinement. Verification uses the connected page where available. Browser authentication or operating-system setup is not a prerequisite for plugin installation, and a mock preview cannot establish an in-app result.
@@ -12,6 +12,8 @@ agent 需要安装能力并在同一段对话中使用。生成代码工具在
创造模式启用现有的 `plugin_manager` 工具。agent 将包和 Loader YAML patch 写入工作区文件,再通过 `install_bundle` 安装。MCP 连接是插入已安装 `dsh-mcp-client` 的纯配置组合包;UI 组合包包含 Host 入口和 Client 产物。profile 锁、包安装、启停和 HMR 继续由现有管理器负责。 整个管理工具要求 `danger-full-access` 或单次调用的批准:profile 变更能以宿主权限加载代码,并影响其他会话。每次执行(包括查询列表)都会先使用共享沙箱提权函数和审批服务,再访问管理器。在较低沙箱模式下,`ask` 请求审批,`never` 拒绝;完整权限会话无需额外审批。批准不改变会话权限,但本次操作的 profile 变更会持久化。这让与 shell 等价的宿主访问需要明确授权,同时不必永久提升整个会话的权限。由用户直接操作的 Web 和 CLI 控件保持原有行为。
默认的标准模式以相同的 profile 条件和审批门槛启用同一工具。缺少该工具时,标准模式会话不会直接安装插件,而要额外花费轮次和 token 绕过;此改动也让标准模式和创造模式朝同一能力集收敛。因此,完整权限的标准模式会话无需单独审批即可安装 Host 代码,与其 shell 已有的能力一致。PTC 和 Minimal 仍禁用该工具。
模型可见两个只读 Cordis 检查工具,不再提供生成代码的 define/run/stop/undefine 和动态自省工具 API。现有运行时和 Client 消费者保留其服务;历史会话卡片仍然可读。这仅取代[自引用工具集参考](../../../../packages/extensions/cordis-host-runner/README.zh.md)中的模型侧变更流程;其运行时所有权和沙箱依据仍有独立价值。[profile 事务决策](2026-09-14-current-profile-plugin-management.zh.md)继续规定锁、包安装和部分失败行为。
除非用户指定其他目标,视觉创建请求默认通过已安装的 Client 插件显示在当前 Web 页面。开发 skill 提供最小包和由 effect 管理的 Client 注册示例。已知所需 API 后结束探查,在可选视觉优化之前先安装能工作的初版。有条件时使用已连接页面验证。浏览器认证或操作系统设置不是安装插件的前提,mock 预览不能证明应用内结果。
@@ -9,8 +9,8 @@
en: 2ba6c43b20a3d347
zh: 5647179ddaa38ad9
/agent-note-ship-experimental-capabilities-as-optional-bundles/decision:
en: d6328ba2b218f2ac
zh: 3731561313b1ad5e
en: 191ca8bffb101db2
zh: 1365bef5cd830a5c
/agent-note-ship-experimental-capabilities-as-optional-bundles/alternatives-considered:
en: d6f40bf02df37ab7
zh: e5b85ce9d41e8754
@@ -10,7 +10,7 @@ The Web plugin page offered two optional bundles, Agent Teams and voice input. A
## Decision
`OPTIONAL_BUNDLES` owns the installation's default-off selections, including maintained optional capabilities and experimental capabilities. Every bundle declares `icon` and exports `./locale/*.json` with `meta.title` and `meta.description`; the Official group displays that metadata. A bundle's presentation does not determine its [experimental status](../../../../packages/experimental/README.md#status). The isolation check validates admission and still rejects experimental dependencies of nonexperimental bundles.
`OPTIONAL_BUNDLES` owns the installation's default-off selections, including maintained optional capabilities and experimental capabilities. Every bundle declares `icon` and exports `./locale/*.json` with `meta.title` and `meta.description`; the [plugin manager page](../../../../packages/client/ui-plugin-manager/README.md#use-this-package) displays that metadata for eligible bundles and retains explicit activation for default-hidden ones. A bundle's presentation does not determine its [experimental status](../../../../packages/experimental/README.md#status). The isolation check validates admission and still rejects experimental dependencies of nonexperimental bundles.
An optional bundle's dependencies are downloaded with every `dsh` installation. [Reasoning translation](2026-10-05-anonymous-reasoning-translation.md) uses three experimental packages without adding third-party runtime dependencies. Admission therefore considers installation cost and whether a switch supplies a usable composition without an additional configuration form. External browser and Cua Driver providers remain explicit compositions because they add substantial runtimes or require an external executable. Stagehand requires model credentials; Python PTC replaces a core provider and conflicts with TypeScript workflow consumers. Demonstrative hooks, webhooks, and mods stay outside the list. [Session Inspector](../feature/2026-09-24-session-inspector.md) owns the Inspector's distinct activation behavior.
@@ -10,7 +10,7 @@ Web 插件页只提供两个可选 bundle:Agent Teams 与语音输入。Auto r
## 决策
`OPTIONAL_BUNDLES` 管理安装随附且默认关闭的选项,包括维护中的可选能力与实验性能力。每个 bundle 声明 `icon`,并导出带 `meta.title` 与 `meta.description` 的 `./locale/*.json`;官方分组显示这些元数据。Bundle 的展示方式不决定其[实验性状态](../../../../packages/experimental/README.zh.md#status)。隔离检查校验准入,并继续拒绝非实验 bundle 的实验性依赖。
`OPTIONAL_BUNDLES` 管理安装随附且默认关闭的选项,包括维护中的可选能力与实验性能力。每个 bundle 声明 `icon`,并导出带 `meta.title` 与 `meta.description` 的 `./locale/*.json`;[插件管理页](../../../../packages/client/ui-plugin-manager/README.zh.md#use-this-package)为符合展示条件的组合包显示这些元数据,并保留默认隐藏项的显式启用入口。Bundle 的展示方式不决定其[实验性状态](../../../../packages/experimental/README.zh.md#status)。隔离检查校验准入,并继续拒绝非实验 bundle 的实验性依赖。
可选 bundle 的依赖随每次 `dsh` 安装下载。[思考过程翻译](2026-10-05-anonymous-reasoning-translation.zh.md)使用三个实验包,不增加第三方运行时依赖。因此准入需要考虑安装成本,以及开关能否在不增加配置表单的情况下提供可用组合。外部浏览器与 Cua Driver 提供方仍使用显式组合,因为它们会增加较大的运行时或要求外部可执行文件。Stagehand 需要模型凭据;Python PTC 替换核心提供方,并与 TypeScript workflow 消费方冲突。演示性钩子、webhook 与模组不进入名单。[Session Inspector](../feature/2026-09-24-session-inspector.zh.md) 管理 Inspector 特有的激活行为。
@@ -9,14 +9,14 @@
en: c8e926bfc65d7195
zh: e0e007960b68fe80
/agent-note-in-tree-persistence-type-history/decision:
en: 94be3d6c7df3063b
zh: 7e8fb08d7fd95f85
en: 3d4b2935c4db54b2
zh: eb0da7083e301ef4
/agent-note-in-tree-persistence-type-history/decision/finalized-checkpoints:
en: b508035a163340a3
zh: ba5b2b7e8cef4b2f
/agent-note-in-tree-persistence-type-history/alternatives-considered:
en: 1cf6d0a5555ae50a
zh: 70ea1ba535e09442
en: a581d63455788d48
zh: 0a3781d2f827e35d
/agent-note-in-tree-persistence-type-history/consequences:
en: 672c8cb59d291dc2
zh: cbec90fbca92320a
@@ -16,6 +16,8 @@ One normalized type model supplies the readable persistence catalog, the complet
The dedicated [persistence-change records](../../../../docs/persistence-changes/README.md) bind acknowledgement to the after digest of each affected root. A generated companion stores complete after schemas. The initial record covers all roots; later records name each root's predecessor. A predecessor's after schema supplies the next before schema. Verification rejects ambiguous history and requires current source to match the terminal recorded state without consulting Git history or remote services.
Every schema file stores one node table keyed by a 16-hexadecimal-digit prefix of each node's canonical subgraph digest; roots and types locate their graphs through their own digests. A type change therefore rewrites only the changed nodes, their ancestors, and the affected digests. Parsers accept only the exact generated text, and all committed files share this layout.
Automatic classification permits optional body additions, required-to-optional body changes, and ordinary event additions within one version. The scoped [source-attribution policy](2026-09-17-persistence-schema-review.md) also permits qualified new producer kinds when both saved schemas opt in. The [event-payload version rule](../../../../docs/persistence-changes/README.md#compatibility-rules) admits higher numeric payload versions when every old alternative remains readable and records the older-reader limitation. Other structural changes require an explicit same-version choice in the recording CLI or an increasing header version. Every structural difference needs an acknowledgement; its Compatibility and Verification sections explain both reader directions and executed checks. CI validates saved decisions without inferring how they were authored. The [format-version procedure](../../../../docs/cookbook/adding-a-session-format-version.md) owns adjacent migration work when a bump is required.
The persistence-change document kind preserves compatibility reasoning and evidence for a historical type transition. Agent Notes retain mechanism-level decisions; they do not become a growing inventory of individual acknowledgements. Machine declarations remain identical across the bilingual pair and are parsed once.
@@ -44,6 +46,8 @@ Finalization records acceptance independently of publication. The [status record
**Infer behavior from types or require proof of human review.** A type graph cannot establish replay semantics, and a recorded choice cannot establish how it was authored. The checker validates declared transitions and header-version constraints. Reviewers inspect actual reader behavior and the acknowledgement’s explanation independently.
**Keep positional node indices or also read the previous layout.** Positional indices renumber every later node when a union gains a variant, and per-root graphs repeat shared types, so a one-variant change rewrote thousands of lines. Digest-keyed nodes keep diffs proportional to the change. Reading two layouts would leave two parsers to maintain and two accepted texts per inventory; migrating every committed file once keeps a single format.
## Consequences
Authors retain one snapshot per affected root per accepted transition and resolve history forks when integrating competing changes to that root. Independent roots can advance without rewriting unrelated acknowledgements. The [cookbook](../../../../docs/cookbook/reviewing-persistence-type-changes.md) provides the local authoring and verification procedure.
@@ -16,6 +16,8 @@ Status: implemented
专用的[持久化变更记录](../../../../docs/persistence-changes/README.zh.md)将确认绑定到每个受影响根的变更后摘要。生成的伴随文件保存完整的变更后 schema。初始记录覆盖所有根;后续记录为每个根指定前驱。前驱的变更后 schema 提供下一次的变更前 schema。验证拒绝有歧义的历史,并要求当前源码匹配最终记录状态,无需查询 Git 历史或远端服务。
每个 schema 文件保存一张节点表,以每个节点规范子图摘要的 16 位十六进制前缀为键;根与类型通过各自的摘要定位其图。因此类型变更只改写发生变化的节点、其祖先节点以及受影响的摘要。解析器只接受精确生成的文本,所有已提交文件共用此布局。
自动分类允许可选事件体新增、事件体属性从必选改为可选,以及普通事件新增保持同一版本。当双方保存的 schema 均声明支持时,受限的[消息源归属策略](2026-09-17-persistence-schema-review.zh.md)也允许添加符合条件的生产者 kind。[事件载荷版本规则](../../../../docs/persistence-changes/README.zh.md#compatibility-rules)允许在每个旧分支仍可读取时增加更高的数字载荷版本,并记录旧读取器限制。其他结构变更要求在记录 CLI 中显式选择同版本,或递增头版本。每个结构差异都需要确认;其兼容性与验证部分说明两个方向的读取器行为及已执行检查。CI 验证保存的决策,不推断其编写方式。需要升版本时,[格式版本流程](../../../../docs/cookbook/adding-a-session-format-version.zh.md)负责相邻迁移工作。
持久化变更文档类型保留历史类型转换的兼容性说明和证据。Agent Note 保留机制层面的决策,不积累单次确认清单。双语对中的机器声明保持相同,且只解析一次。
@@ -44,6 +46,8 @@ Status: implemented
**从类型推断行为,或要求人类评审证明。** 类型图无法证明回放语义,所记录的选择也无法证明其编写方式。检查器验证声明的转换与头版本约束。评审者独立检查实际读取器行为与确认说明。
**保留按位置编号的节点索引,或同时读取旧布局。** 联合类型新增分支时,按位置编号的索引会为其后的每个节点重新编号,而逐根图会重复共享类型,因此单个分支变更曾改写数千行。以摘要为键的节点使差异规模与变更成正比。同时读取两种布局需要维护两个解析器,且每个清单会有两种可接受文本;将所有已提交文件一次性迁移后只保留单一格式。
## 影响
作者为每次已接受转换中的每个受影响根保留一份快照,并在集成该根的竞争变更时解决历史分叉。独立根可以演进而不改写无关确认。[实操手册](../../../../docs/cookbook/reviewing-persistence-type-changes.zh.md)提供本地编写与验证流程。
@@ -9,8 +9,8 @@
en: dc43ba84345e1405
zh: dbc03572ab7710d2
/agent-note-ship-optional-bundles-with-the-installation/decision:
en: 5210b3b746cfee78
zh: f1907f4807ae0098
en: 1362533f342b31f4
zh: 90689262acefb43d
/agent-note-ship-optional-bundles-with-the-installation/alternatives-considered:
en: 95b48b61757f1f13
zh: e9fb2d6ea492a4bc
@@ -10,7 +10,7 @@ The Web plugin page manages only the bundles a person installed into the profile
## Decision
The launcher names in `OPTIONAL_BUNDLES` (`packages/boot/app-boot/src/profile.ts`, beside the profile templates) the bundles the installation ships for a person to switch on. Each must be a runtime dependency of `apps/cli` that declares `dsh.bundle.patch`, and no shipped profile template selects it. The plugin manager's `listBundles` reports such a bundle as `optional`: switched off until selected, never removable, resolved from the installation like any installation-supplied bundle. The Web plugin page opens its Official group with the optional bundles, tagged experimental when the package is experimental, ahead of the profile's own installed bundles.
The launcher names in `OPTIONAL_BUNDLES` (`packages/boot/app-boot/src/profile.ts`, beside the profile templates) the bundles the installation ships for a person to switch on. Each must be a runtime dependency of `apps/cli` that declares `dsh.bundle.patch`, and no shipped profile template selects it. The plugin manager's `listBundles` reports such a bundle as `optional`: switched off until selected, never removable, resolved from the installation like any installation-supplied bundle. The Web plugin page presents offered optional bundles in its Official group, tagged experimental when the package is experimental, ahead of the profile's own installed bundles. The [persistent-terminal bundle](../../../../packages/experimental/terminal-bundle/README.md) remains available to the Host but has no page switch, even when enabled; its existing profile selection remains intact.
Default-product isolation keeps its rules with one declared exception: an optional bundle's dependency graph is outside the default product. The static gate skips the `dependencies` edge from `@deepseek-ai/dsh` to a listed bundle and still rejects a runtime import, a shipped composition, a preset, or a default template that names it, an experimental dependency the list does not name, and a listed name that is not a runtime dependency or not a bundle. The workspace-constraints check accepts the same `dependencies` edges and no other runtime section, and the packed-install release check skips them from the installed entry package while requiring each listed bundle to be installed.
@@ -10,7 +10,7 @@ Web 插件页只管理用户装进 profile 的组合包。像 Agent Teams 这样
## 决策
启动器在 `OPTIONAL_BUNDLES`(`packages/boot/app-boot/src/profile.ts`,与 profile 模板并列)里点名安装随附、供用户开启的组合包。每一个都必须是 `apps/cli` 声明了 `dsh.bundle.patch` 的运行时依赖,且不被任何随附 profile 模板选中。插件管理器的 `listBundles` 把这类组合包报告为 `optional`:选中前保持关闭、永不可卸载、像其他安装提供的组合包一样从安装目录解析。Web 插件页以可选组合包开启「官方」分组,属于实验包的带实验性标签,排在 profile 自己已安装的组合包之前。
启动器在 `OPTIONAL_BUNDLES`(`packages/boot/app-boot/src/profile.ts`,与 profile 模板并列)里点名安装随附、供用户开启的组合包。每一个都必须是 `apps/cli` 声明了 `dsh.bundle.patch` 的运行时依赖,且不被任何随附 profile 模板选中。插件管理器的 `listBundles` 把这类组合包报告为 `optional`:选中前保持关闭、永不可卸载、像其他安装提供的组合包一样从安装目录解析。Web 插件页在「官方」分组展示可供选择的可选组合包,属于实验包的带实验性标签,排在 profile 自己已安装的组合包之前。[持久终端组合包](../../../../packages/experimental/terminal-bundle/README.zh.md)仍可供 Host 使用,但即使已启用也不提供页面开关;已有的 profile 选择保持不变。
默认产品隔离的规则保持不变,只声明一个例外:可选组合包的依赖图在默认产品之外。静态门禁跳过从 `@deepseek-ai/dsh` 到列表中组合包的 `dependencies` 边,仍然拒绝运行时 import、随附组合、preset 或默认模板对它的引用,拒绝列表没有点名的实验依赖,也拒绝不是运行时依赖或不是组合包的列表项。workspace 约束检查接受同样的 `dependencies` 边而不接受其他运行时依赖段;发布时的 packed-install 检查对已安装入口包跳过这些边,并要求列表中的每个组合包都已安装。
@@ -0,0 +1,22 @@
# Bilingual-pair consistency record for 2026-10-20-weighted-approval-status-gate-with-check-run-label.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-10-20-weighted-approval-status-gate-with-check-run-label.md
/agent-note-weighted-approval-keeps-its-commit-status-gate-and-adds-a-decision-check-run:
en: a1f0f9fd657c7d35
zh: e8fa02fb5bde6075
/agent-note-weighted-approval-keeps-its-commit-status-gate-and-adds-a-decision-check-run/problem:
en: 8e854872edfc0729
zh: 6f3ed495fcb690a4
/agent-note-weighted-approval-keeps-its-commit-status-gate-and-adds-a-decision-check-run/decision:
en: 03de94946d7532d7
zh: cf2f585f715d3295
/agent-note-weighted-approval-keeps-its-commit-status-gate-and-adds-a-decision-check-run/verification:
en: 8298cff64cce6467
zh: a121d509c2302c00
/agent-note-weighted-approval-keeps-its-commit-status-gate-and-adds-a-decision-check-run/alternatives-considered:
en: 197255cd82aabef7
zh: dc03f4bf77150f22
/agent-note-weighted-approval-keeps-its-commit-status-gate-and-adds-a-decision-check-run/consequences:
en: 25e1ac1c8cab089a
zh: 84e10cccb1b9eda7
@@ -0,0 +1,37 @@
# Agent Note: Weighted approval keeps its commit status gate and adds a decision check run
Status: implemented
English | [中文](2026-10-20-weighted-approval-status-gate-with-check-run-label.zh.md)
## Problem
The `weighted approval` commit status is the record this repository's branch rules require, and below the approval threshold it stays `pending`. A commit status has no action-required state, so readers cannot tell an approval wait from running work. Moving the gate to a check run does not work: after that change, the check run completed as `success` on the pull-request head and both the REST API and `gh pr checks` listed it, while the merge box kept reporting the same `weighted approval decision` context as `Expected — Waiting for status to be reported`, and two pull requests needed an administrator bypass. That change was reverted.
## Decision
The publisher keeps writing the `weighted approval` commit status exactly as before: `pending` while the policy is unmet, `success` when it holds, and `error` when setup or evaluation fails. Branch rules keep requiring that status. That behavior, including keeping an unmet policy `pending`, is what the [archived decision](../../archived/process/2026-09-09-blocked-weighted-approvals-remain-pending.md) records; this change adds the label beside it instead of changing the gate.
The publisher additionally writes a `weighted approval decision` check run for the same evaluation: `action_required` while the policy is unmet, `success` when it holds, and `failure` when setup or evaluation fails. The check run's title carries the score or the blocker. Branch rules do not require it, so it never blocks a merge; it names the blocked state beside the status that does.
A head keeps one GitHub Actions run with the check-run name: the publisher updates the head's existing run and creates one only when none exists. The setup phase creates the run as `in_progress` on a head without one and deals with a published success by rewriting its conclusion to `action_required`, because GitHub accepts but does not apply a return to `in_progress`. A failed check-run write is logged and never changes the status, so a token without the checks permission, or a check-run API failure, leaves the gate as the status wrote it. The publisher identifies its own runs by the `external_id` marker it sets on creation, which excludes check runs that workflow jobs produce for a same-named job. It revokes a published `success` before dependency setup, because GitHub accepts but does not apply a return to `in_progress`.
## Verification
[Approval policy tests](../../../../.github/review-ownership/check-approval.test.mjs) pin the unchanged status states, the check-run conclusion for a met and an unmet policy, the phase writes, revoking a published success through its conclusion, one run per head, and invalid list responses. [Workflow tests](../../../../scripts/ci-workflow.spec.ts) pin the `checks: write` and `statuses: write` permissions and the setup phase commands.
The check-run limit was measured on 2026-10-20 with the reverted attempt on this repository: the `weighted approval decision` check run completed as `success` on the pull-request head, the REST API and `gh pr checks` listed it, and the merge box kept reporting the same context as expected.
## Alternatives considered
**Require the check run instead of the commit status.** Measured above: the ruleset does not match a check run published through the default-branch workflow's token, so the gate cannot be satisfied.
**Publish the commit status as `failure` while the policy is unmet.** The status would complete, but this changes the required record's meaning and would report an unmet, reversible condition as a malfunction.
**Publish only the check run and leave the status untouched.** The status would keep its last state from an earlier evaluation, so the gate and the label could disagree.
**Publish the required check run from a dedicated GitHub App.** A check run whose app the ruleset names would let the required entry carry the action-required conclusion itself. The repository has no App with the checks permission; with one, the label could move onto the required record and the status could be retired.
## Consequences
A job that ends between the `pending` write and the fallback step, such as a lost runner or a cancellation that skips the final step, leaves the status `pending`; that is the original symptom of this status, not a regression from the added label. While reviewers are pending, the merge box reports `weighted approval` as pending (the gate) and the `weighted approval decision` entry as `action_required`, with the score or blocker in its title; `gh pr checks` lists both. A published success is revoked by rewriting the check run's conclusion, and the status follows the unchanged policy states.
@@ -0,0 +1,37 @@
# Agent Note: Weighted approval 保留其 commit status 门禁并新增决策 check run
Status: implemented
[English](2026-10-20-weighted-approval-status-gate-with-check-run-label.md) | 中文
## 问题
`weighted approval` commit status 是本仓库分支规则要求的记录,在批准阈值下方时保持 `pending`。commit status 没有 action-required 状态,读者无法区分等待批准与正在运行的工作。把门禁改成 check run 并不可行:该改动后 check run 在 PR head 上以 `success` 完成,REST API 与 `gh pr checks` 都能列出它,而合并框始终把同一上下文报告为 `Expected — Waiting for status to be reported`,两个 PR 需要管理员绕过才能合并。该改动已回退。
## 决定
publisher 继续完全按原样写 `weighted approval` commit status:策略未满足时为 `pending`,满足时为 `success`,安装或评估失败时为 `error`。分支规则继续要求该 status。该行为——包括未满足的策略保持 `pending`——正是[已归档决定](../../archived/process/2026-09-09-blocked-weighted-approvals-remain-pending.md)记录的;本次变更在该门禁旁边新增标签,而不改变门禁。
publisher 为同一次评估额外写一个 `weighted approval decision` check run:策略未满足时为 `action_required`,满足时为 `success`,安装或评估失败时为 `failure`。check run 的标题携带分数或 blocker。分支规则不要求它,因此它从不阻止合并;它在会阻止合并的那条 status 旁边命名被阻止的状态。
每个 head 只保留一个同名 GitHub Actions run:publisher 更新 head 上已有的 run,仅在不存在时创建。setup 阶段对没有 run 的 head 以 `in_progress` 创建,并把已发布的 success 的 conclusion 改写为 `action_required`,因为 GitHub 接受但不执行改回 `in_progress` 的更新。check run 写入失败会被记录,且从不改变 status,因此没有 checks 权限的 token 或 check-run API 失败时,门禁保持 status 写入的结果。publisher 用创建时设置的 `external_id` 标记识别自己的 run,从而排除 workflow job 为同名 job 产生的 check run。它在依赖安装前撤销已发布的 `success`,因为 GitHub 接受但不执行改回 `in_progress` 的更新。
## 验证
[批准策略测试](../../../../.github/review-ownership/check-approval.test.mjs)锁定未改动的 status 状态、策略满足与未满足两种情况下 check run 的 conclusion、阶段写入、通过 conclusion 撤销已发布的成功、每个 head 只有一个 run,以及无效的列表响应。[工作流测试](../../../../scripts/ci-workflow.spec.ts)锁定 `checks: write` 与 `statuses: write` 权限以及 setup 阶段命令。
check run 的限制于 2026-10-20 在本仓库用被回退的尝试实测:`weighted approval decision` check run 在 PR head 上以 `success` 完成,REST API 与 `gh pr checks` 都能列出它,而合并框始终把同一个 `weighted approval decision` 上下文报告为 expected。
## 考虑过的替代方案
**把 check run 作为必需检查。** 见上面的实测:ruleset 不匹配默认分支 workflow 的 token 发布的 check run,门禁无法满足。
**策略未满足时把 commit status 发布为 `failure`。** status 会完成,但改变了必需记录的含义,并把尚未满足且可撤销的条件报告为故障。
**只发布 check run 而不动 status。** status 会保留上一次评估的状态,门禁与标签可能不一致。
**由专用 GitHub App 发布必需 check run。** 由 ruleset 指定 app 的 check run 可以让必需条目本身携带 action-required 结论。本仓库没有具备 checks 权限的 App;有了之后可以把标签移到必需记录上并停用 status。
## 后果
job 在 `pending` 写入与兜底步骤之间结束(例如 runner 丢失,或取消导致最后一步未执行)会让 status 保持 `pending`;这是该 status 既有的表现,不是新增标签带来的回归。评审未完成时,合并框把 `weighted approval` 报告为 pending(门禁),并把 `weighted approval decision` 条目报告为 `action_required`,标题里是分数或 blocker;`gh pr checks` 会列出两者。已发布的 success 通过改写 check run 的 conclusion 撤销,status 继续按未改动的策略状态变化。
+1 -1
View File
@@ -16,7 +16,7 @@ The [`weighted-approval` workflow](../workflows/weighted-approval.yml) publishes
## Approval scoring
The weighted approval workflow exposes two pull-request checks. The `weighted approval publisher` Actions job reports whether evaluation and status publication completed, while the `weighted approval` commit status carries the approval decision on the pull request head. Branch rules must require only the commit status with GitHub Actions as its expected source; a context-only requirement can accept a same-named status from another integration. The publisher marks the head pending before Python setup or lexer installation, so failed setup or an interrupted history fetch cannot leave a previous success in place. Setup and evaluation failures publish an error status. A completed evaluation returns `pending` below two approval points, while the pull request is a draft, or while a write-capable reviewer has an effective `CHANGES_REQUESTED` review; the blocker keeps the status pending even when counted approvals reach the threshold. It returns `success` only when the threshold is met, the pull request is ready, and no such blocker exists. If evaluation fails, the publisher writes an `error` status.
The weighted approval workflow exposes two pull-request checks. The `weighted approval publisher` Actions job reports whether evaluation and status publication completed, while the `weighted approval` commit status carries the approval decision on the pull request head. Branch rules must require only the commit status with GitHub Actions as its expected source; a context-only requirement can accept a same-named status from another integration. The publisher marks the head pending before Python setup or lexer installation, so failed setup or an interrupted history fetch cannot leave a previous success in place. Setup and evaluation failures publish an error status. A completed evaluation returns `pending` below two approval points, while the pull request is a draft, or while a write-capable reviewer has an effective `CHANGES_REQUESTED` review; the blocker keeps the status pending even when counted approvals reach the threshold. It returns `success` only when the threshold is met, the pull request is ready, and no such blocker exists. If evaluation fails, the publisher writes an `error` status. The publisher also writes a `weighted approval decision` check run that reports the same decision as a conclusion — `action_required` while the policy is unmet, `success` when it holds, and `failure` on setup or evaluation failures — with the score or blocker in its title. Branch rules do not require that check run, so it never blocks a merge; it names the blocked state beside the status that gates the merge. A failed check-run write is logged and never changes the status.
Reviewers whose calculated base repository permission is `write` or `admin` count. The [approval policy](approval-policy.json) gives `@07akioni`, `@imccyu`, `@tianyicui`, `@tianyicui-bot`, `@turtle1999`, and `@turtle2099` two points each; every other write-capable reviewer gets one point. The pull-request author’s own review and reviewers without write permission do not count.
+89 -6
View File
@@ -11,6 +11,8 @@ const API_VERSION = '2026-03-10'
const MAX_PULL_REQUEST_RECORDS = 3_000
const PAGE_SIZE = 100
const STATUS_CONTEXT = 'weighted approval'
const CHECK_NAME = 'weighted approval decision'
const CHECK_RUN_MARKER = 'weighted-approval-decision'
const WRITABLE_PERMISSIONS = new Set(['admin', 'write'])
const REVIEW_STATES = new Set(['APPROVED', 'CHANGES_REQUESTED', 'COMMENTED', 'DISMISSED', 'PENDING'])
@@ -332,6 +334,7 @@ export async function runApprovalCheck({ event, policySource, api, runUrl, getOw
}
} catch (error) {
await publishStatus(api, pull, 'error', 'Approval evaluation failed.', runUrl)
await tryPublishCheck(api, pull, 'failure', 'Approval evaluation failed.', runUrl, write)
throw error
}
write(result.authorCredit
@@ -343,6 +346,7 @@ export async function runApprovalCheck({ event, policySource, api, runUrl, getOw
writeList(write, 'Blocking change requests', result.blockers.map(login => `@${login}`))
writeList(write, 'Ignored reviewers without write access', result.ignoredReviewers.map(login => `@${login}`))
await publishStatus(api, pull, result.state, result.description, runUrl)
await tryPublishCheck(api, pull, result.state === 'success' ? 'success' : 'action_required', result.description, runUrl, write)
write(`Published ${JSON.stringify(STATUS_CONTEXT)} status ${JSON.stringify(result.state)}.`)
try {
await requestDelegatedReviews(result, api, write)
@@ -354,13 +358,25 @@ export async function runApprovalCheck({ event, policySource, api, runUrl, getOw
/**
* Revoke a previous success before dependency installation, or report its failure.
* @param {{event: unknown, api: (path: string, options: object) => Promise<unknown>, runUrl: string, phase: string}} options Publication inputs.
* @returns {Promise<void>} Completion of the status write.
* @param {{event: unknown, api: (path: string, options: object) => Promise<unknown>, runUrl: string, phase: string, write?: (line: string) => void}} options Publication inputs.
* @returns {Promise<void>} Completion of the status write and the corresponding check-run write.
*/
export async function publishApprovalPhase({ event, api, runUrl, phase }) {
if (!['pending', 'error'].includes(phase)) throw new Error('invalid approval setup phase')
await publishStatus(api, pullRequestFromEvent(event), phase,
phase === 'pending' ? 'Preparing approval evaluation.' : 'Approval setup or evaluation failed.', runUrl)
export async function publishApprovalPhase({ event, api, runUrl, phase, write = line => process.stdout.write(`${line}\n`) }) {
const pull = pullRequestFromEvent(event)
if (phase === 'pending') {
await publishStatus(api, pull, 'pending', 'Preparing approval evaluation.', runUrl)
try {
await revokeApproval(api, pull, runUrl)
} catch (error) {
write(`Decision check run not revoked; the commit status is unchanged: ${JSON.stringify(error instanceof Error ? error.message : String(error))}`)
}
return
}
if (phase === 'error') {
await publishStatus(api, pull, 'error', 'Approval setup or evaluation failed.', runUrl)
return tryPublishCheck(api, pull, 'failure', 'Approval setup or evaluation failed.', runUrl, write)
}
throw new Error('invalid approval setup phase')
}
/**
@@ -467,6 +483,73 @@ async function reviewerPermission(api, repository, login) {
return response.permission.toLowerCase()
}
// The required gate is the commit status; this check run reports the same decision as a conclusion
// label and is not required. A failed label write is reported and never changes the gate, including
// for a replayed workflow whose token has no checks permission.
async function tryPublishCheck(api, pull, conclusion, title, runUrl, write) {
try {
await publishCheck(api, pull, conclusion, title, runUrl)
} catch (error) {
write(`Decision check run not published; the commit status is unchanged: ${JSON.stringify(error instanceof Error ? error.message : String(error))}`)
}
}
async function publishCheck(api, pull, conclusion, title, runUrl) {
requireHttpsRunUrl(runUrl)
const body = { status: 'completed', conclusion, details_url: runUrl, output: { title, summary: `${title} [Workflow run](${runUrl})` } }
const runs = await decisionRuns(api, pull)
if (runs.length === 0) {
await api(`/repos/${pull.repository}/check-runs`, {
method: 'POST',
body: { name: CHECK_NAME, head_sha: pull.headSha, external_id: CHECK_RUN_MARKER, ...body },
})
return
}
for (const run of runs) {
if (!Number.isSafeInteger(run.id)) throw new Error('check run has no valid id')
await api(`/repos/${pull.repository}/check-runs/${run.id}`, { method: 'PATCH', body })
}
}
// A head without a decision starts in progress; a published success becomes action_required, so an
// interrupted evaluation cannot leave a success that its current inputs no longer support.
async function revokeApproval(api, pull, runUrl) {
requireHttpsRunUrl(runUrl)
const title = 'Preparing approval evaluation.'
const output = { title, summary: `${title} [Workflow run](${runUrl})` }
const runs = await decisionRuns(api, pull)
if (runs.length === 0) {
await api(`/repos/${pull.repository}/check-runs`, {
method: 'POST',
body: { name: CHECK_NAME, head_sha: pull.headSha, status: 'in_progress', details_url: runUrl, output },
})
return
}
for (const run of runs) {
if (!Number.isSafeInteger(run.id)) throw new Error('check run has no valid id')
// The label is not a gate; only a published success has to stop claiming the policy holds.
if (run.conclusion !== 'success') continue
await api(`/repos/${pull.repository}/check-runs/${run.id}`, {
method: 'PATCH',
body: { status: 'completed', conclusion: 'action_required', details_url: runUrl, output },
})
}
}
// A completed check run never returns to in_progress: GitHub answers 200 and leaves it completed.
async function decisionRuns(api, pull) {
const listed = await api(`/repos/${pull.repository}/commits/${pull.headSha}/check-runs?check_name=${encodeURIComponent(CHECK_NAME)}&filter=all&per_page=100`)
if (!isRecord(listed) || !Array.isArray(listed.check_runs) || listed.total_count !== listed.check_runs.length) {
throw new Error('check-run list response is invalid or incomplete')
}
return listed.check_runs.filter(run => isRecord(run) && isRecord(run.app) && run.app.slug === 'github-actions'
&& (run.external_id === CHECK_RUN_MARKER || run.external_id === ''))
}
function requireHttpsRunUrl(runUrl) {
if (!/^https:\/\/[^\s]+$/u.test(runUrl)) throw new Error('workflow run URL must use HTTPS')
}
async function publishStatus(api, pull, state, description, runUrl) {
if (!/^https:\/\/[^\s]+$/u.test(runUrl)) throw new Error('workflow run URL must use HTTPS')
if (description.length > 140) throw new Error('commit status description exceeds 140 characters')
@@ -11,13 +11,18 @@ import {
evaluateApproval as evaluateWithHistory,
listPullRequestReviews,
parseApprovalPolicy,
runApprovalCheck as runWithHistory,
runApprovalCheck as runPublisher,
publishApprovalPhase,
} from './check-approval.mjs'
const policySource = readFileSync(new URL('approval-policy.json', import.meta.url), 'utf8')
const withoutComments = api => (path, options) => path.includes('/comments?') ? [] : api(path, options)
const emptyCheckRuns = { total_count: 0, check_runs: [] }
const isCheckRunsList = path => path.includes('/commits/') && path.includes('/check-runs?')
const withoutChecks = api => (path, options) =>
isCheckRunsList(path) ? emptyCheckRuns : path.includes('/check-runs') ? {} : api(path, options)
const withoutComments = api => withoutChecks((path, options) => path.includes('/comments?') ? [] : api(path, options))
const evaluateApproval = options => evaluateWithHistory({ getMergedCount: async () => 0, ...options, api: withoutComments(options.api) })
const runWithHistory = options => runPublisher({ ...options, api: withoutChecks(options.api) })
const runApprovalCheck = options => runWithHistory({ getMergedCount: async () => 0, ...options, api: withoutComments(options.api) })
const HEAD_SHA = '1234567890abcdef1234567890abcdef12345678'
@@ -475,16 +480,94 @@ test('uses policy endpoints and formats only the displayed score', async () => {
test('publishes setup phases without evaluating or installing dependencies', async () => {
const states = []
const phases = []
const options = {
event: pullRequestEvent(), runUrl: 'https://github.example/run/1',
api: async (path, { body }) => { assert.match(path, /\/statuses\//u); states.push(body.state) },
api: async (path, options = {}) => {
if (isCheckRunsList(path)) return emptyCheckRuns
if (path.includes('/check-runs')) { phases.push(options.body?.conclusion ?? options.body?.status); return {} }
assert.match(path, /\/statuses\//u)
states.push(options.body.state)
},
}
await publishApprovalPhase({ ...options, phase: 'pending' })
await publishApprovalPhase({ ...options, phase: 'error' })
assert.deepEqual(states, ['pending', 'error'])
assert.deepEqual(phases, ['in_progress', 'failure'])
await assert.rejects(publishApprovalPhase({ ...options, phase: 'success' }), /invalid approval setup phase/u)
})
test('keeps the status gate when the label write fails', async () => {
const writes = []
const states = []
await runPublisher({
event: pullRequestEvent(), policySource, runUrl: 'https://github.example/run/1',
write: line => writes.push(line),
getOwnership: async () => ({ totalLines: 100, reviewerLines: { turtle2099: 25 } }),
api: async (path, options = {}) => {
if (path.includes('/reviews?')) return [review('turtle2099', 'APPROVED')]
if (path.includes('/collaborators/turtle2099/permission')) return { permission: 'write' }
if (path.includes('/comments?')) return []
if (path.includes('/statuses/')) { states.push(options.body.state); return {} }
if (path.includes('/check-runs')) throw new Error('check runs unavailable')
throw new Error(`unexpected API path ${path}`)
},
})
assert.deepEqual(states, ['pending', 'success'])
assert.ok(writes.some(line => /Decision check run not published/.test(line)))
})
test('reports the decision on a non-required check run beside the status', async () => {
const calls = []
const api = async (path, options = {}) => {
calls.push({ path, method: options.method, body: options.body })
if (path.includes('/reviews?')) return [review('writer', 'APPROVED')]
if (path.includes('/collaborators/writer/permission')) return { permission: 'write' }
if (path.includes('/comments?')) return []
if (isCheckRunsList(path)) return emptyCheckRuns
if (path.includes('/check-runs') || path.includes('/statuses/')) return {}
throw new Error(`unexpected API path ${path}`)
}
const result = await runPublisher({
event: pullRequestEvent(), policySource, runUrl: 'https://github.example/run/1', write: () => {},
getOwnership: async () => ({ totalLines: 0, reviewerLines: {} }),
getMergedCount: async () => 0,
api,
})
const status = calls.filter(call => call.path.includes('/statuses/')).at(-1)
const check = calls.filter(call => call.path.endsWith('/check-runs')).at(-1)
assert.equal(result.state, 'pending')
assert.equal(status.body.state, 'pending')
assert.equal(check.body.name, 'weighted approval decision')
assert.equal(check.body.conclusion, 'action_required')
})
test('revokes a published success check run and updates one run per head', async () => {
const calls = []
const checkRuns = [
{ id: 7, app: { slug: 'github-actions' }, conclusion: 'success', external_id: '' },
{ id: 8, app: { slug: 'github-actions' }, conclusion: 'action_required', external_id: 'weighted-approval-decision' },
{ id: 9, app: { slug: 'other-app' }, conclusion: 'success', external_id: '' },
{ id: 10, app: { slug: 'github-actions' }, conclusion: 'success', external_id: 'a-job-check-run' },
]
await publishApprovalPhase({
event: pullRequestEvent(), runUrl: 'https://github.example/run/1', phase: 'pending',
api: async (path, options = {}) => {
calls.push({ path, method: options.method, body: options.body })
return isCheckRunsList(path) ? { total_count: checkRuns.length, check_runs: checkRuns } : {}
},
})
assert.deepEqual(calls.map(call => call.path), [
`/repos/deepseek-harness/deepseek-harness/statuses/${HEAD_SHA}`,
`/repos/deepseek-harness/deepseek-harness/commits/${HEAD_SHA}/check-runs?check_name=weighted%20approval%20decision&filter=all&per_page=100`,
'/repos/deepseek-harness/deepseek-harness/check-runs/7',
])
for (const call of calls.slice(2)) {
assert.equal(call.method, 'PATCH')
assert.equal(call.body.conclusion, 'action_required')
}
})
for (const [mergedCount, credit] of [[0, 0], [1, 0.011], [50, 0.55], [99, 1.089], [100, 1.1], [101, 1.1], [200, 1.1]]) {
test(`author with ${mergedCount} merged PRs contributes ${credit} points but cannot approve alone`, async () => {
const result = await evaluateApproval({
+1
View File
@@ -10,6 +10,7 @@ on:
types: [completed]
permissions:
checks: write
contents: read
pull-requests: write
statuses: write
+1 -1
View File
@@ -300,7 +300,7 @@ describe('the shipped Web composition', () => {
// depend on ripgrep being present on the machine.
expect(toolNames(ctx, handle.agent).filter(name => name !== 'glob' && name !== 'grep')).toEqual([
'ask_user_question', 'bash', 'create_goal', 'edit', 'exit_plan_mode',
'get_goal', 'interrupt_agent', 'job_kill', 'job_list', 'job_output', 'list_agents', 'list_subagent_models', 'present', 'read', 'read_image',
'get_goal', 'interrupt_agent', 'job_kill', 'job_list', 'job_output', 'list_agents', 'list_subagent_models', 'plugin_manager', 'present', 'read', 'read_image',
'schedule_create', 'schedule_delete', 'schedule_list', 'schedule_update',
'send_message', 'skill',
'subagent', 'subagent_fork', 'todo_write', 'update_goal', 'web_fetch', 'web_search',
+11
View File
@@ -112,6 +112,17 @@ describe.each(MODE === 'record' ? ['button'] as const : ['button', 'keyboard'] a
await panel.waitFor({ timeout: MODE === 'record' ? 180_000 : 60_000 })
const scroll = panel.locator('[data-approval-scroll]')
await expect.poll(() => scroll.getByText(/tok/).count(), { timeout: 15_000 }).toBeGreaterThan(0)
const defaults = await panel.evaluate((root: HTMLElement) => {
const before = root.style.textAlign
root.style.textAlign = 'center'
try {
return {
alignment: getComputedStyle(root.querySelector('[data-approval-scroll]')!).textAlign,
wrapping: getComputedStyle(root.querySelector('button')!.parentElement!).flexWrap,
}
} finally { root.style.textAlign = before }
})
expect(defaults).toEqual({ alignment: 'center', wrapping: 'nowrap' })
if (MODE !== 'record') {
const snapshot = await captureStableAria(page, '[data-approval-key]', scaffold.workspaceCwd)
+14 -5
View File
@@ -59,13 +59,20 @@ it.skipIf(process.platform !== 'darwin')('keeps system requests pending until fr
callId: ToolCallId('cua-app-approval'), name: 'run_code',
arguments: { code: 'return await tools.cua({ method: "getApp", params: { selector: "Fixture" } })',
description: 'Request application access' } })
const approval = page.locator('[data-question-key]')
const approval = page.locator('[data-approval-key]')
await Promise.race([approval.waitFor(), grant.then((result) => {
throw new Error(`Application selection completed before consent: ${JSON.stringify(result)}`)
})])
expect(await approval.textContent()).toContain('Fixture')
await approval.getByRole('radio', { name: 'Always allow', exact: true }).click()
await approval.getByRole('button', { name: 'Submit', exact: true }).click()
expect(await approval.getByText('Fixture', { exact: true }).count()).toBe(1)
expect(await approval.getByRole('textbox').count()).toBe(0)
expect(await approval.locator('[data-approval-scroll]').evaluate(element => getComputedStyle(element).textAlign)).toBe('left')
expect(await approval.getByRole('button', { name: 'Always allow', exact: true })
.evaluate(button => getComputedStyle(button.parentElement!).flexWrap)).toBe('wrap')
await expect.poll(() => approval.locator('img').evaluate((image: HTMLImageElement) => image.naturalWidth)).toBe(1)
expect(await approval.getByText('/Applications/Fixture.app', { exact: true }).count()).toBe(0)
await compareOrRefreshGolden(fileURLToPath(new URL('./expected/cua-permissions/application-approval.expected.md', import.meta.url)),
await captureStableAria(page, '[data-approval-key]', scaffold.workspaceCwd), webSnapshotMode())
await approval.getByRole('button', { name: 'Always allow', exact: true }).click()
expect((await grant).isError).toBe(false)
await approval.waitFor({ state: 'hidden' })
await page.getByRole('button', { name: 'Plugins', exact: true }).click()
@@ -146,7 +153,9 @@ it.skipIf(process.platform !== 'darwin')('keeps system requests pending until fr
{ method: 'openPermissionSettings', params: { permission: 'accessibility' } },
])
expect(events.every(event => ['permissionStatus', 'requestPermission', 'openPermissionSettings', 'applicationIcons', 'getApp'].includes(event.method))).toBe(true)
await plugins.locator('[data-detail-document] h1').waitFor()
const preview = plugins.locator('[data-detail-document] img')
await preview.waitFor()
await preview.evaluate(async (image: HTMLImageElement) => { await image.decode() })
const trace = await page.evaluateHandle(() => {
const errors: string[] = []
const stable = [...document.querySelectorAll('[data-cua-settings] [role="alert"]')].map(node => node.textContent?.trim())
@@ -0,0 +1,8 @@
- text: Waiting for approval
- group "Approval details":
- strong: Fixture
- text: Allow Computer Use to launch, read, capture and control this application?
- paragraph: Session access lasts until DSH restarts or Computer Use is disabled.
- button "Reject"
- button "Allow for this session"
- button "Always allow"
@@ -72,7 +72,7 @@
- region "Approval area":
- heading "Approval area" [level=3]
- list:
- listitem: Allow once Enter
- listitem: Allow Enter
- listitem: Reject Esc
- contentinfo:
- button "Restore all defaults" [disabled]
@@ -72,7 +72,7 @@
- region "Approval area":
- heading "Approval area" [level=3]
- list:
- listitem: Allow once Enter
- listitem: Allow Enter
- listitem: Reject Esc
- contentinfo:
- button "Restore all defaults" [disabled]
@@ -72,7 +72,7 @@
- region "审批区域":
- heading "审批区域" [level=3]
- list:
- listitem: 允许一次 Enter
- listitem: 允许 Enter
- listitem: 拒绝 Esc
- contentinfo:
- button "恢复全部默认" [disabled]
+3 -2
View File
@@ -9,7 +9,6 @@ import { readFile } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import type { Browser, Locator, Page } from 'playwright'
import { chromium } from 'playwright'
import { ON_DEMAND_BUNDLES, OPTIONAL_BUNDLES } from '@deepseek-ai/dsh-app-boot'
import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest'
import { join } from 'node:path'
import {
@@ -111,8 +110,10 @@ describe('web e2e: plugin configuration pages', () => {
await more.focus()
await page.keyboard.press('Enter')
await panel.getByRole('heading', { name: '实验性插件', exact: true, level: 1 }).waitFor()
const bundles = await scaffold.ctx.pluginManager.listBundles()
expect(await panel.locator('[data-plugin-group="more"] [data-plugin-package]').count())
.toBe(OPTIONAL_BUNDLES.length + ON_DEMAND_BUNDLES.length)
.toBe(bundles.filter(bundle => bundle.name !== '@deepseek-ai/dsh-experimental-terminal-bundle'
&& bundle.official && (bundle.listedByDefault !== false || bundle.enabled || bundle.installed)).length)
expect(await basic.count()).toBe(0)
expect(await extensions.count()).toBe(0)
expect(await panel.locator('[data-plugin-group="bundles"]').count()).toBe(0)
+41 -5
View File
@@ -8,7 +8,7 @@ import { fileURLToPath } from 'node:url'
import type { Browser, Locator, Page } from 'playwright'
import { chromium } from 'playwright'
import { FiberState } from '@deepseek-ai/cordis'
import { ON_DEMAND_BUNDLES, OPTIONAL_BUNDLES } from '@deepseek-ai/dsh-app-boot'
import { readProfileManifest } from '@deepseek-ai/dsh-app-boot'
import { createUserMessage } from '@deepseek-ai/dsh-llm'
import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished, vi } from 'vitest'
import { join } from 'node:path'
@@ -664,8 +664,17 @@ describe('web e2e: plugin manager', () => {
expect(await panel.getByText(/Cordis|Chrome DevTools/).count()).toBe(0)
await panel.getByRole('button', { name: '更多', exact: true }).click()
await panel.getByRole('heading', { name: '实验性插件', exact: true, level: 1 }).waitFor()
const bundles = await scaffold.ctx.pluginManager.listBundles()
expect(bundles.some(bundle => bundle.name === '@deepseek-ai/dsh-experimental-terminal-bundle')).toBe(true)
expect(await panel.getByRole('switch', { name: '启用 持久终端', exact: true }).count()).toBe(0)
expect(await panel.locator('[data-plugin-group="more"] [data-plugin-package]').count())
.toBe(OPTIONAL_BUNDLES.length + ON_DEMAND_BUNDLES.length)
.toBe(bundles.filter(bundle => bundle.name !== '@deepseek-ai/dsh-experimental-terminal-bundle'
&& bundle.official && (bundle.listedByDefault !== false || bundle.enabled || bundle.installed)).length)
for (const name of ['@deepseek-ai/dsh-experimental-session-search', '@deepseek-ai/dsh-experimental-ralph-bundle']) {
expect((await scaffold.ctx.pluginManager.listBundles()).find(bundle => bundle.name === name))
.toMatchObject({ enabled: false, optional: true, availability: 'installation', listedByDefault: false })
expect(await panel.locator(`[data-plugin-package="${name}"]`).count()).toBe(0)
}
const cards = await panel.locator('[data-plugin-group="more"] [data-plugin-package]').all()
expect(await Promise.all(cards.map(async card => [
await card.getAttribute('data-plugin-package'),
@@ -678,11 +687,8 @@ describe('web e2e: plugin manager', () => {
['@deepseek-ai/dsh-cua-bundle', 1],
['@deepseek-ai/dsh-experimental-tool-worktree', 1],
['@deepseek-ai/dsh-experimental-cot-translation-bundle', 1],
['@deepseek-ai/dsh-experimental-terminal-bundle', 1],
['@deepseek-ai/dsh-experimental-session-search', 1],
['@deepseek-ai/dsh-experimental-session-titles-bundle', 1],
['@deepseek-ai/dsh-experimental-badge-skill-bundle', 1],
['@deepseek-ai/dsh-experimental-ralph-bundle', 1],
['@deepseek-ai/dsh-experimental-plugin-market-bundle', 1],
['@deepseek-ai/dsh-subagent-codex', 0],
['@deepseek-ai/dsh-subagent-claude-code', 0],
@@ -703,6 +709,36 @@ describe('web e2e: plugin manager', () => {
expect(tripwire.pageErrors).toEqual([])
}, 60_000)
it('enables both default-hidden shipped bundles by name without adding a profile dependency', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-plugin-manager-bundled-enable'))
const profileDir = join(scaffold.harnessHome, 'profiles', 'scaffold')
const before = readProfileManifest('dsh', profileDir).dependencies
for (const [name, title] of [
['@deepseek-ai/dsh-experimental-session-search', '会话搜索'],
['@deepseek-ai/dsh-experimental-ralph-bundle', 'Ralph 循环'],
] as const) {
const panel = await openPluginsPanel()
expect(await panel.locator(`[data-plugin-package="${name}"]`).count()).toBe(0)
await panel.getByRole('button', { name: '添加插件', exact: true }).click()
const dialog = page.getByRole('dialog', { name: '添加插件', exact: true })
await dialog.getByRole('textbox', { name: '包名或地址', exact: true }).fill(name)
await dialog.getByRole('button', { name: '安装', exact: true }).click()
const ready = page.getByRole('dialog', { name: '插件已随 DSH 提供', exact: true })
await ready.waitFor()
expect((await scaffold.ctx.pluginManager.listBundles()).find(bundle => bundle.name === name)?.enabled).toBe(false)
expect(await ready.getByText('无需下载,启用即可使用', { exact: true }).count()).toBe(1)
await ready.getByRole('button', { name: '立即启用', exact: true }).click()
const card = panel.locator(`[data-plugin-package="${name}"]`)
await card.waitFor()
expect((await scaffold.ctx.pluginManager.listBundles()).find(bundle => bundle.name === name)?.enabled).toBe(true)
expect(readProfileManifest('dsh', profileDir).dependencies).toEqual(before)
await card.getByRole('switch', { name: `启用 ${title}`, exact: true }).click()
await card.waitFor({ state: 'hidden' })
expect((await scaffold.ctx.pluginManager.listBundles()).find(bundle => bundle.name === name)?.enabled).toBe(false)
}
expect(tripwire.pageErrors).toEqual([])
}, 60_000)
it('keeps off-state switch thumbs light in both themes', async () => {
// The off-state thumb must stay light so an operable toggle cannot read as
// disabled, whose only other difference is reduced opacity.
+35 -1
View File
@@ -12,7 +12,7 @@ import { fileURLToPath } from 'node:url'
import { join } from 'node:path'
import type { Browser, Locator, Page } from 'playwright'
import { chromium } from 'playwright'
import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest'
import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished } from 'vitest'
import type { SessionEvent } from '@deepseek-ai/dsh-session'
import type { SessionId } from '@deepseek-ai/dsh-session/types'
import { TIMED_WAIT_PARAMETER } from '@deepseek-ai/dsh-user-questions'
@@ -700,3 +700,37 @@ describe.skipIf(MODE === 'record')('web e2e: late-answered question transcript',
])
})
})
it.each(['another-feature', 'cua-app-access'])('answers %s approval without a specialized composer', async (id) => {
const resources: { scaffold?: WebScaffold; browser?: Browser; waiting?: Promise<unknown> } = {}
const controller = new AbortController()
onTestFinished(async () => {
controller.abort()
await resources.waiting
await resources.browser?.close()
await resources.scaffold?.close()
})
const scaffold = await launchWebScaffold()
resources.scaffold = scaffold
const browser = await chromium.launch()
resources.browser = browser
const page = await newEnglishPage(browser)
const tripwire = watchConsole(page)
onTestFailed(() => saveFailureShot(page, `web-approval-fallback-${id}`))
await page.goto(scaffold.authenticatedUrl)
await connectFreshWorkspace(page, scaffold.workspaceCwd)
const agent = scaffold.ctx.agents.list()[0]!
const result = scaffold.ctx.userQuestions.ask({ agent, signal: controller.signal, questions: [{
id, question: 'Allow fixture access?', detail: 'Only this request.',
options: [{ label: 'Allow' }, { label: 'Deny' }],
intent: { kind: 'approval', approve: 'Allow', reject: 'Deny' },
}] })
resources.waiting = Promise.allSettled([result])
const question = page.locator('[data-question-key]')
await question.getByRole('radio', { name: 'Deny', exact: true }).click()
await question.getByRole('button', { name: 'Submit', exact: true }).click()
expect(await result).toEqual({ answers: [{ id, selected: ['Deny'] }] })
await question.waitFor({ state: 'hidden' })
expect(tripwire.pageErrors).toEqual([])
})
@@ -484,6 +484,7 @@ const EXPECTED_TOOLS = [
'job_output',
'list_agents',
'list_subagent_models',
'plugin_manager',
'present',
'read',
'read_image',
@@ -15,8 +15,8 @@
en: 5fca19ac2bb1ddac
zh: 00d78fe7e80ba4f7
/cookbook-reviewing-persistence-type-changes/optional-inspect-the-change:
en: 14049617e3de750d
zh: 200456cf72bef77b
en: 841a75ed33db17bd
zh: ed4e80aae708bfb9
/cookbook-reviewing-persistence-type-changes/1-record-the-change:
en: de16b6e1ac883317
zh: 21d367bb78e799d1
@@ -43,7 +43,7 @@ A recorded decision does not hide the transition from this comparison. `--check`
Record the commits supplying those files with the report. Add `--json` for structured output. This read-only comparison groups shared changes with their affected roots and uses actual literal `kind`/`form` values instead of union positions. Ambiguous alternatives remain separate additions and removals. Its compatibility section copies every root's authoritative classifier result; the structural explanation does not replace acknowledgement checks. Current catalog labels and declaration names are descriptive metadata; structural anchors and fingerprints identify types.
The current machine inventory stores complete graphs in `roots`. A `types` entry contains `digest`, `names`, and `sources`, plus an explicit `schema` when roots cannot reconstruct that graph exactly. Readers resolve omitted graphs from root subgraphs by digest and validate explicit graphs directly, preserving every type and its metadata. Historical full entries remain readable. `formatVersion` identifies normalization rules; storage compaction does not change root fingerprints or require an acknowledgement.
Every inventory uses the [node-table layout](../persistence-changes/README.md#files-and-ownership); both comparison inputs must be generated by the current tooling. `formatVersion` identifies normalization rules; the storage layout does not change root fingerprints or require an acknowledgement.
<a id="acknowledge"></a>
## 1. Record the change
@@ -43,7 +43,7 @@ pnpm --silent run persistence-review --before .artifacts/base.schema.json --afte
在报告旁记录这些文件对应的 commit。添加 `--json` 可获取结构化输出。此只读比较将共享变更与受影响的根类型归组,使用实际字面量 `kind`/`form` 值代替联合类型位置。无法唯一匹配的候选项保留为独立的新增与删除。兼容性部分复制每个根类型的权威分类结果;结构说明不替代确认检查。当前目录标签和声明名称是描述元数据;结构锚点和指纹标识类型。
当前机器清单在 `roots` 中保存完整图。每个 `types` 条目包含 `digest`、`names` 和 `sources`;若根无法精确重建该图,条目还会保存显式 `schema`。读取器按摘要从根的子图恢复省略的图,并直接验证显式图,保留每个类型及其元数据。历史完整条目仍然可读。`formatVersion` 标识规范化规则;存储压缩不改变根指纹,也不需要确认记录。
所有清单都使用[节点表布局](../persistence-changes/README.zh.md#files-and-ownership);两个比较输入都必须由当前工具生成。`formatVersion` 标识规范化规则;存储布局不改变根指纹,也不需要确认记录。
<a id="acknowledge"></a>
## 1. 记录变更
+5 -5
View File
@@ -55,10 +55,10 @@ This matrix shows which packages dispatch each harness-owned event and which pac
| `llm/adapters-updated` | `emit` | [`packages/llm/llm/src/types.ts:23`](../packages/llm/llm/src/types.ts) | [`llm`](../packages/llm/llm) (`events.dispatch`) | [`acp`](../packages/acp/acp), `remotes` |
| `llm/stream` | `waterfall` | [`packages/llm/llm/src/index.ts:75`](../packages/llm/llm/src/index.ts) | [`llm`](../packages/llm/llm) (`waterfall`) | [`llm-replay`](../packages/test-support/llm-replay), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), [`session-title`](../packages/session/session-title) |
| `permission-presets/catalog-changed` | `emit` | [`packages/interaction/permission-presets/src/types.ts:48`](../packages/interaction/permission-presets/src/types.ts) | [`permission-presets`](../packages/interaction/permission-presets) (`events.dispatch`) | `remotes` |
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:392`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:398`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:405`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/update-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:412`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:394`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:400`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:407`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/update-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:414`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-market/changed` | `emit` | [`packages/boot/plugin-market/src/types.ts:168`](../packages/boot/plugin-market/src/types.ts) | [`plugin-market`](../packages/boot/plugin-market) (`emit`) | `remotes` |
| `schedule/changed` | `emit` | [`packages/schedule/schedule/src/types.ts:478`](../packages/schedule/schedule/src/types.ts) | [`schedule`](../packages/schedule/schedule) (`emit`) | `remotes` |
| `schedule/resolve-agent` | `waterfall` | [`packages/schedule/schedule/src/index.ts:74`](../packages/schedule/schedule/src/index.ts) | [`schedule`](../packages/schedule/schedule) (`waterfall`) | `server` |
@@ -81,7 +81,7 @@ This matrix shows which packages dispatch each harness-owned event and which pac
| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:154`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `auto-review`, [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`tool-jobs`](../packages/jobs/tool-jobs), [`workspace-changes`](../packages/deliverables/workspace-changes) |
| `tools/ptc-dispatch-log` | `waterfall` | [`packages/core/tools/src/index.ts:191`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`spill-policy`](../packages/spill/spill-policy) |
| `tools/result` | `emit` | [`packages/core/tools/src/index.ts:199`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`events.dispatch`) | [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`subagent`](../packages/subagent/subagent), [`tool-present`](../packages/deliverables/tool-present) |
| `user-questions/request` | `waterfall` | [`packages/interaction/user-questions/src/types.ts:157`](../packages/interaction/user-questions/src/types.ts) | [`user-questions`](../packages/interaction/user-questions) (`waterfall`) | `remotes`, `server` |
| `user-questions/request` | `waterfall` | [`packages/interaction/user-questions/src/types.ts:174`](../packages/interaction/user-questions/src/types.ts) | [`user-questions`](../packages/interaction/user-questions) (`waterfall`) | `remotes`, `server` |
| `webserver/index-inject` | `emit` | [`packages/host/webserver/src/index.ts:39`](../packages/host/webserver/src/index.ts) | `webserver` (`emit`) | `connection`, `inspector`, `modules`, `remote-access`, `shortcuts`, `ui-sidebar-documentpreview`, `ui-theme` |
| `workflow/agent-end` | `emit` | [`packages/workflow/workflow/src/index.ts:79`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | [`tool-workflow`](../packages/workflow/tool-workflow) |
| `workflow/agent-start` | `emit` | [`packages/workflow/workflow/src/index.ts:68`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | [`tool-workflow`](../packages/workflow/tool-workflow) |
+5 -5
View File
@@ -57,10 +57,10 @@
| `llm/adapters-updated` | `emit` | [`packages/llm/llm/src/types.ts:23`](../packages/llm/llm/src/types.ts) | [`llm`](../packages/llm/llm) (`events.dispatch`) | [`acp`](../packages/acp/acp), `remotes` |
| `llm/stream` | `waterfall` | [`packages/llm/llm/src/index.ts:75`](../packages/llm/llm/src/index.ts) | [`llm`](../packages/llm/llm) (`waterfall`) | [`llm-replay`](../packages/test-support/llm-replay), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), [`session-title`](../packages/session/session-title) |
| `permission-presets/catalog-changed` | `emit` | [`packages/interaction/permission-presets/src/types.ts:48`](../packages/interaction/permission-presets/src/types.ts) | [`permission-presets`](../packages/interaction/permission-presets) (`events.dispatch`) | `remotes` |
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:392`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:398`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:405`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/update-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:412`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:394`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:400`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:407`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-manager/update-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:414`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
| `plugin-market/changed` | `emit` | [`packages/boot/plugin-market/src/types.ts:168`](../packages/boot/plugin-market/src/types.ts) | [`plugin-market`](../packages/boot/plugin-market) (`emit`) | `remotes` |
| `schedule/changed` | `emit` | [`packages/schedule/schedule/src/types.ts:478`](../packages/schedule/schedule/src/types.ts) | [`schedule`](../packages/schedule/schedule) (`emit`) | `remotes` |
| `schedule/resolve-agent` | `waterfall` | [`packages/schedule/schedule/src/index.ts:74`](../packages/schedule/schedule/src/index.ts) | [`schedule`](../packages/schedule/schedule) (`waterfall`) | `server` |
@@ -83,7 +83,7 @@
| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:154`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | `auto-review`, [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), [`tool-jobs`](../packages/jobs/tool-jobs), [`workspace-changes`](../packages/deliverables/workspace-changes) |
| `tools/ptc-dispatch-log` | `waterfall` | [`packages/core/tools/src/index.ts:191`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`spill-policy`](../packages/spill/spill-policy) |
| `tools/result` | `emit` | [`packages/core/tools/src/index.ts:199`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`events.dispatch`) | [`agent-instructions`](../packages/context/agent-instructions), `claude-code-mods`, [`subagent`](../packages/subagent/subagent), [`tool-present`](../packages/deliverables/tool-present) |
| `user-questions/request` | `waterfall` | [`packages/interaction/user-questions/src/types.ts:157`](../packages/interaction/user-questions/src/types.ts) | [`user-questions`](../packages/interaction/user-questions) (`waterfall`) | `remotes`, `server` |
| `user-questions/request` | `waterfall` | [`packages/interaction/user-questions/src/types.ts:174`](../packages/interaction/user-questions/src/types.ts) | [`user-questions`](../packages/interaction/user-questions) (`waterfall`) | `remotes`, `server` |
| `webserver/index-inject` | `emit` | [`packages/host/webserver/src/index.ts:39`](../packages/host/webserver/src/index.ts) | `webserver` (`emit`) | `connection`, `inspector`, `modules`, `remote-access`, `shortcuts`, `ui-sidebar-documentpreview`, `ui-theme` |
| `workflow/agent-end` | `emit` | [`packages/workflow/workflow/src/index.ts:79`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | [`tool-workflow`](../packages/workflow/tool-workflow) |
| `workflow/agent-start` | `emit` | [`packages/workflow/workflow/src/index.ts:68`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | [`tool-workflow`](../packages/workflow/tool-workflow) |
+2 -2
View File
@@ -1857,8 +1857,8 @@
en: 993991e8f05665bb
zh: a03931839e647bac
/session-persistence-event-catalog/resolved-persistence-types/kind-user-question-reply:
en: 77a8fc6a2f3a9319
zh: 4dc1de1358b51a8d
en: 246940ea354e5493
zh: 9f3f462ec3bc2000
/session-persistence-event-catalog/resolved-persistence-types/kind-webhook-form-notice:
en: 0b74295f7c5c8f11
zh: 5f1213cec87f6be0
+1 -1
View File
@@ -7647,7 +7647,7 @@ SHA-256: `5654685d7557ec747e74887237065e626a5bdfa426ca43f7fbb0b6fee9b0916c`
SHA-256: `c55827fba7018198772c50e37cb7d3f60a3d8bb6e94b07de72dee0d9f8968005`
Sources: [`packages/interaction/user-questions/src/types.ts:117`](../packages/interaction/user-questions/src/types.ts)
Sources: [`packages/interaction/user-questions/src/types.ts:134`](../packages/interaction/user-questions/src/types.ts)
| Property | Presence | Type |
|---|---|---|
+1 -1
View File
@@ -7649,7 +7649,7 @@ SHA-256: `5654685d7557ec747e74887237065e626a5bdfa426ca43f7fbb0b6fee9b0916c`
SHA-256: `c55827fba7018198772c50e37cb7d3f60a3d8bb6e94b07de72dee0d9f8968005`
来源:[`packages/interaction/user-questions/src/types.ts:117`](../packages/interaction/user-questions/src/types.ts)
来源:[`packages/interaction/user-questions/src/types.ts:134`](../packages/interaction/user-questions/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
File diff suppressed because it is too large. Load diff
@@ -1,910 +1,58 @@
{
"formatVersion": 1,
"roots": [
{
"key": "event:tool/ptc-dispatch",
"kind": "event",
"event": "tool/ptc-dispatch",
"surface": false,
"digest": "b5d66eaebed4da391b13498623b11142222149fbf5e025975dbc6d94f0d06796",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 29,
"optional": true
},
{
"name": "seq",
"type": 17,
"optional": false
},
{
"name": "time",
"type": 17,
"optional": false
},
{
"name": "type",
"type": 30,
"optional": false
}
{"key":"event:tool/ptc-dispatch","kind":"event","event":"tool/ptc-dispatch","surface":false,"digest":"b5d66eaebed4da391b13498623b11142222149fbf5e025975dbc6d94f0d06796"},
{"key":"event:tool/result","kind":"event","event":"tool/result","surface":true,"digest":"3a803805bdeb805f32b229e399fb7258be8e32a89f89063a7c99957cfea942f7"}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "arguments",
"type": 2,
"optional": false
},
{
"name": "content",
"type": 3,
"optional": false
},
{
"name": "error",
"type": 28,
"optional": true
},
{
"name": "isError",
"type": 6,
"optional": false
},
{
"name": "name",
"type": 7,
"optional": false
},
{
"name": "parentCallId",
"type": 7,
"optional": false
},
{
"name": "rootCallId",
"type": 7,
"optional": false
},
{
"name": "subCallId",
"type": 7,
"optional": false
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"0e560aad8fa9f338": {"kind":"array","element":"e1161343902a8da6"},
"0f46153645c29784": {"kind":"object","properties":[{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
"1f0133217eeeffd8": {"kind":"literal","value":"tool-call"},
"277b61f9c6f81704": {"kind":"literal","value":"file"},
"28aa673866746f44": {"kind":"object","properties":[{"name":"error","type":"a81059ca06999da1","optional":true},{"name":"message","type":"966fad765834f620","optional":false},{"name":"meta","type":"c592ce75aab73fca","optional":true},{"name":"step","type":"0657d3ca5ac4e7bf","optional":false},{"name":"turn","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
"2f1e6a7ebace43d7": {"kind":"union","types":["3f74ba74acd10644","58f94390b982f8a5","de30b1fa12c75f81","ebb768d85ec87fb6"]},
"335e242de1fcc17b": {"kind":"union","types":["bcf0caf62d964b2f","e438a9d4fb883b3e"]},
"3a803805bdeb805f": {"kind":"object","properties":[{"name":"data","type":"28aa673866746f44","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"sourceEventSeqs","type":"5d03ba38734809bc","optional":true},{"name":"surfaceOp","type":"335e242de1fcc17b","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"570e850224346133","optional":false}],"indices":[]},
"3c2535ca0a2062f1": {"kind":"literal","value":"reasoning"},
"3f74ba74acd10644": {"kind":"literal","value":"image/jpeg"},
"4c12ebe118c00be8": {"kind":"object","properties":[{"name":"arguments","type":"bbc5696e3f13c758","optional":false},{"name":"content","type":"0e560aad8fa9f338","optional":false},{"name":"error","type":"a81059ca06999da1","optional":true},{"name":"isError","type":"aa93010d0e521ad7","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"parentCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"rootCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"subCallId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"4e44c9118152f682": {"kind":"literal","value":"text"},
"4e88776858652856": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"4e44c9118152f682","optional":false}],"indices":[]},
"529e0ccd0e34079a": {"kind":"object","properties":[],"indices":[{"key":"4cd48f3e5108bd6e","value":"c592ce75aab73fca"}]},
"570e850224346133": {"kind":"literal","value":"tool/result"},
"58f94390b982f8a5": {"kind":"literal","value":"image/png"},
"5d03ba38734809bc": {"kind":"array","element":"0657d3ca5ac4e7bf"},
"5eedf09e88b5ed9c": {"kind":"tuple","elements":[{"type":"9bdd77f2b39d9ae4","optional":false,"rest":false}]},
"68f44f59e91c4139": {"kind":"literal","value":"user"},
"72ec79127a9c0d02": {"kind":"array","element":"c592ce75aab73fca"},
"814d9434e1ddf907": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"3c2535ca0a2062f1","optional":false}],"indices":[]},
"8ef06dd236128246": {"kind":"object","properties":[{"name":"attachment","type":"b0b0eb1b16490f6b","optional":false},{"name":"type","type":"fb8b6a2e53cb9cf4","optional":false}],"indices":[]},
"938f7c7357bc403e": {"kind":"primitive","type":"null"},
"966fad765834f620": {"kind":"object","properties":[{"name":"content","type":"5eedf09e88b5ed9c","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"role","type":"68f44f59e91c4139","optional":false},{"name":"source","type":"d9c462b9f62fdd3e","optional":false}],"indices":[]},
"9bdd77f2b39d9ae4": {"kind":"object","properties":[{"name":"content","type":"0e560aad8fa9f338","optional":false},{"name":"isError","type":"aa93010d0e521ad7","optional":true},{"name":"toolCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"e5244812c495a80c","optional":false}],"indices":[]},
"a13d8f379222ece8": {"kind":"literal","value":"tool"},
"a81059ca06999da1": {"kind":"object","properties":[{"name":"code","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"reason","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
"b0b0eb1b16490f6b": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"mediaType","type":"2f1e6a7ebace43d7","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":true},{"name":"originalDimensions","type":"0f46153645c29784","optional":true},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
"b5d66eaebed4da39": {"kind":"object","properties":[{"name":"data","type":"4c12ebe118c00be8","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"fb5e0517050d2c6d","optional":false}],"indices":[]},
"bbc5696e3f13c758": {"kind":"opaque","reason":"unknown"},
"bcf0caf62d964b2f": {"kind":"object","properties":[{"name":"endSeq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"op","type":"f6cb462f808309e3","optional":false},{"name":"startSeq","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
"c1f0f17b6493b85d": {"kind":"object","properties":[{"name":"arguments","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"1f0133217eeeffd8","optional":false}],"indices":[]},
"c592ce75aab73fca": {"kind":"union","types":["0657d3ca5ac4e7bf","4cd48f3e5108bd6e","529e0ccd0e34079a","72ec79127a9c0d02","938f7c7357bc403e","aa93010d0e521ad7"]},
"d9c462b9f62fdd3e": {"kind":"object","properties":[{"name":"callId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"a13d8f379222ece8","optional":false}],"indices":[]},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"de30b1fa12c75f81": {"kind":"literal","value":"image/gif"},
"e1161343902a8da6": {"kind":"union","types":["4e88776858652856","814d9434e1ddf907","8ef06dd236128246","9bdd77f2b39d9ae4","c1f0f17b6493b85d","f2da0f27c1e6add5"]},
"e438a9d4fb883b3e": {"kind":"literal","value":"append"},
"e5244812c495a80c": {"kind":"literal","value":"tool-result"},
"ebb768d85ec87fb6": {"kind":"literal","value":"image/webp"},
"f19bee84bf3d2090": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"f2da0f27c1e6add5": {"kind":"object","properties":[{"name":"attachment","type":"f19bee84bf3d2090","optional":false},{"name":"type","type":"277b61f9c6f81704","optional":false}],"indices":[]},
"f6cb462f808309e3": {"kind":"literal","value":"replace"},
"fb5e0517050d2c6d": {"kind":"literal","value":"tool/ptc-dispatch"},
"fb8b6a2e53cb9cf4": {"kind":"literal","value":"image"}
}
],
"indices": []
},
{
"kind": "opaque",
"reason": "unknown"
},
{
"kind": "array",
"element": 4
},
{
"kind": "union",
"types": [
5,
9,
11,
13,
15,
25
]
},
{
"kind": "object",
"properties": [
{
"name": "content",
"type": 3,
"optional": false
},
{
"name": "isError",
"type": 6,
"optional": true
},
{
"name": "toolCallId",
"type": 7,
"optional": false
},
{
"name": "type",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "boolean"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": "tool-result"
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 7,
"optional": false
},
{
"name": "type",
"type": 10,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "reasoning"
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 7,
"optional": false
},
{
"name": "type",
"type": 12,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "text"
},
{
"kind": "object",
"properties": [
{
"name": "arguments",
"type": 7,
"optional": false
},
{
"name": "id",
"type": 7,
"optional": false
},
{
"name": "name",
"type": 7,
"optional": false
},
{
"name": "type",
"type": 14,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "tool-call"
},
{
"kind": "object",
"properties": [
{
"name": "attachment",
"type": 16,
"optional": false
},
{
"name": "type",
"type": 24,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "attachmentId",
"type": 7,
"optional": false
},
{
"name": "bytes",
"type": 17,
"optional": false
},
{
"name": "height",
"type": 17,
"optional": false
},
{
"name": "mediaType",
"type": 18,
"optional": false
},
{
"name": "name",
"type": 7,
"optional": true
},
{
"name": "originalDimensions",
"type": 23,
"optional": true
},
{
"name": "width",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "union",
"types": [
19,
20,
21,
22
]
},
{
"kind": "literal",
"value": "image/gif"
},
{
"kind": "literal",
"value": "image/jpeg"
},
{
"kind": "literal",
"value": "image/png"
},
{
"kind": "literal",
"value": "image/webp"
},
{
"kind": "object",
"properties": [
{
"name": "height",
"type": 17,
"optional": false
},
{
"name": "width",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "image"
},
{
"kind": "object",
"properties": [
{
"name": "attachment",
"type": 26,
"optional": false
},
{
"name": "type",
"type": 27,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "attachmentId",
"type": 7,
"optional": false
},
{
"name": "bytes",
"type": 17,
"optional": false
},
{
"name": "name",
"type": 7,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "file"
},
{
"kind": "object",
"properties": [
{
"name": "code",
"type": 7,
"optional": false
},
{
"name": "name",
"type": 7,
"optional": false
},
{
"name": "reason",
"type": 7,
"optional": true
}
],
"indices": []
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "tool/ptc-dispatch"
}
]
}
},
{
"key": "event:tool/result",
"kind": "event",
"event": "tool/result",
"surface": true,
"digest": "3a803805bdeb805f32b229e399fb7258be8e32a89f89063a7c99957cfea942f7",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 37,
"optional": true
},
{
"name": "seq",
"type": 17,
"optional": false
},
{
"name": "sourceEventSeqs",
"type": 38,
"optional": true
},
{
"name": "surfaceOp",
"type": 39,
"optional": false
},
{
"name": "time",
"type": 17,
"optional": false
},
{
"name": "type",
"type": 43,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "error",
"type": 2,
"optional": true
},
{
"name": "message",
"type": 4,
"optional": false
},
{
"name": "meta",
"type": 33,
"optional": true
},
{
"name": "step",
"type": 17,
"optional": false
},
{
"name": "turn",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "code",
"type": 3,
"optional": false
},
{
"name": "name",
"type": 3,
"optional": false
},
{
"name": "reason",
"type": 3,
"optional": true
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "object",
"properties": [
{
"name": "content",
"type": 5,
"optional": false
},
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "role",
"type": 30,
"optional": false
},
{
"name": "source",
"type": 31,
"optional": false
}
],
"indices": []
},
{
"kind": "tuple",
"elements": [
{
"type": 6,
"optional": false,
"rest": false
}
]
},
{
"kind": "object",
"properties": [
{
"name": "content",
"type": 7,
"optional": false
},
{
"name": "isError",
"type": 28,
"optional": true
},
{
"name": "toolCallId",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 29,
"optional": false
}
],
"indices": []
},
{
"kind": "array",
"element": 8
},
{
"kind": "union",
"types": [
6,
9,
11,
13,
15,
25
]
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 10,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "text"
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 12,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "reasoning"
},
{
"kind": "object",
"properties": [
{
"name": "arguments",
"type": 3,
"optional": false
},
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "name",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 14,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "tool-call"
},
{
"kind": "object",
"properties": [
{
"name": "attachment",
"type": 16,
"optional": false
},
{
"name": "type",
"type": 24,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "attachmentId",
"type": 3,
"optional": false
},
{
"name": "bytes",
"type": 17,
"optional": false
},
{
"name": "height",
"type": 17,
"optional": false
},
{
"name": "mediaType",
"type": 18,
"optional": false
},
{
"name": "name",
"type": 3,
"optional": true
},
{
"name": "originalDimensions",
"type": 23,
"optional": true
},
{
"name": "width",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "union",
"types": [
19,
20,
21,
22
]
},
{
"kind": "literal",
"value": "image/gif"
},
{
"kind": "literal",
"value": "image/jpeg"
},
{
"kind": "literal",
"value": "image/png"
},
{
"kind": "literal",
"value": "image/webp"
},
{
"kind": "object",
"properties": [
{
"name": "height",
"type": 17,
"optional": false
},
{
"name": "width",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "image"
},
{
"kind": "object",
"properties": [
{
"name": "attachment",
"type": 26,
"optional": false
},
{
"name": "type",
"type": 27,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "attachmentId",
"type": 3,
"optional": false
},
{
"name": "bytes",
"type": 17,
"optional": false
},
{
"name": "name",
"type": 3,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "file"
},
{
"kind": "primitive",
"type": "boolean"
},
{
"kind": "literal",
"value": "tool-result"
},
{
"kind": "literal",
"value": "user"
},
{
"kind": "object",
"properties": [
{
"name": "callId",
"type": 3,
"optional": false
},
{
"name": "kind",
"type": 32,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "tool"
},
{
"kind": "union",
"types": [
3,
17,
28,
34,
35,
36
]
},
{
"kind": "array",
"element": 33
},
{
"kind": "primitive",
"type": "null"
},
{
"kind": "object",
"properties": [],
"indices": [
{
"key": 3,
"value": 33
}
]
},
{
"kind": "literal",
"value": true
},
{
"kind": "array",
"element": 17
},
{
"kind": "union",
"types": [
40,
41
]
},
{
"kind": "literal",
"value": "append"
},
{
"kind": "object",
"properties": [
{
"name": "endSeq",
"type": 17,
"optional": false
},
{
"name": "op",
"type": 42,
"optional": false
},
{
"name": "startSeq",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "replace"
},
{
"kind": "literal",
"value": "tool/result"
}
]
}
}
],
"types": []
}
@@ -1,76 +1,15 @@
{
"formatVersion": 1,
"roots": [
{
"key": "event:working-directory/change",
"kind": "event",
"event": "working-directory/change",
"surface": false,
"digest": "124aa62078ca3311353b39cc3bf6c75da281338be6bbf672f8b361d828cddca3",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 3,
"optional": true
},
{
"name": "seq",
"type": 4,
"optional": false
},
{
"name": "time",
"type": 4,
"optional": false
},
{
"name": "type",
"type": 5,
"optional": false
}
{"key":"event:working-directory/change","kind":"event","event":"working-directory/change","surface":false,"digest":"124aa62078ca3311353b39cc3bf6c75da281338be6bbf672f8b361d828cddca3"}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "cwd",
"type": 2,
"optional": false
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"124aa62078ca3311": {"kind":"object","properties":[{"name":"data","type":"da60ed58a8fa23d7","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"d4c799e3d51cae10","optional":false}],"indices":[]},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"d4c799e3d51cae10": {"kind":"literal","value":"working-directory/change"},
"da60ed58a8fa23d7": {"kind":"object","properties":[{"name":"cwd","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"dacf3d5f3e4ff619": {"kind":"literal","value":true}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": true
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "working-directory/change"
}
]
}
}
],
"types": []
}
File diff suppressed because it is too large. Load diff
@@ -1,72 +1,14 @@
{
"formatVersion": 1,
"roots": [
{
"key": "event:workspace/changes",
"kind": "event",
"event": "workspace/changes",
"surface": false,
"digest": "e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 3,
"optional": true
},
{
"name": "seq",
"type": 2,
"optional": false
},
{
"name": "time",
"type": 2,
"optional": false
},
{
"name": "type",
"type": 4,
"optional": false
}
{"key":"event:workspace/changes","kind":"event","event":"workspace/changes","surface":false,"digest":"e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72"}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "turn",
"type": 2,
"optional": false
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"8e8155594e078123": {"kind":"literal","value":"workspace/changes"},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"e308ccf867a5398e": {"kind":"object","properties":[{"name":"data","type":"f90eb4ab2d3897bc","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"8e8155594e078123","optional":false}],"indices":[]},
"f90eb4ab2d3897bc": {"kind":"object","properties":[{"name":"turn","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "workspace/changes"
}
]
}
}
],
"types": []
}
File diff suppressed because it is too large. Load diff
@@ -1,302 +1,30 @@
{
"formatVersion": 1,
"roots": [
{
"key": "event:schedule/change",
"kind": "event",
"event": "schedule/change",
"surface": false,
"digest": "a0a2e5c42e1c929445ecd1cd70f49be6b66441894ec72c08e8ae332821d4a3cb",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 19,
"optional": true
},
{
"name": "seq",
"type": 13,
"optional": false
},
{
"name": "time",
"type": 13,
"optional": false
},
{
"name": "type",
"type": 20,
"optional": false
}
{"key":"event:schedule/change","kind":"event","event":"schedule/change","surface":false,"digest":"a0a2e5c42e1c929445ecd1cd70f49be6b66441894ec72c08e8ae332821d4a3cb"}
],
"indices": []
},
{
"kind": "union",
"types": [
2,
6,
8,
9
]
},
{
"kind": "object",
"properties": [
{
"name": "acceptedAt",
"type": 3,
"optional": false
},
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "operation",
"type": 4,
"optional": false
},
{
"name": "version",
"type": 5,
"optional": false
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"0e7b2a97f54f1afd": {"kind":"literal","value":"schedule/change"},
"17aae616ef020b8b": {"kind":"literal","value":"at"},
"18dc21f12bbac8ad": {"kind":"object","properties":[{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"operation","type":"d0fbb0ca1bbba059","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"26c879bdd130e8b8": {"kind":"literal","value":"dispatch"},
"2e3523541e942ef6": {"kind":"union","types":["18dc21f12bbac8ad","8e8e91646a5cae3f","e6063d0451dc0202","eea687d437880bd5"]},
"3fdf9582c3b5597d": {"kind":"object","properties":[{"name":"afterSeconds","type":"0657d3ca5ac4e7bf","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"5b232a9b9bfcc0fc","optional":false},{"name":"prompt","type":"4cd48f3e5108bd6e","optional":false},{"name":"scheduledAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"title","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
"4b1e632e05776982": {"kind":"union","types":["3fdf9582c3b5597d","a926dc71814edd01","b63b089a00b3b935"]},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"5b232a9b9bfcc0fc": {"kind":"literal","value":"after"},
"7624ca28c61ca0ea": {"kind":"literal","value":"create"},
"8e8e91646a5cae3f": {"kind":"object","properties":[{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"operation","type":"26c879bdd130e8b8","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"a0a2e5c42e1c9294": {"kind":"object","properties":[{"name":"data","type":"2e3523541e942ef6","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"0e7b2a97f54f1afd","optional":false}],"indices":[]},
"a926dc71814edd01": {"kind":"object","properties":[{"name":"everySeconds","type":"0657d3ca5ac4e7bf","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"e42b0f40b5d0b628","optional":false},{"name":"prompt","type":"4cd48f3e5108bd6e","optional":false},{"name":"scheduledAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"title","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
"b63b089a00b3b935": {"kind":"object","properties":[{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"17aae616ef020b8b","optional":false},{"name":"prompt","type":"4cd48f3e5108bd6e","optional":false},{"name":"scheduledAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"title","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
"d0fbb0ca1bbba059": {"kind":"literal","value":"delete"},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"e42b0f40b5d0b628": {"kind":"literal","value":"every"},
"e6063d0451dc0202": {"kind":"object","properties":[{"name":"acceptedAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"operation","type":"26c879bdd130e8b8","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"eea687d437880bd5": {"kind":"object","properties":[{"name":"operation","type":"7624ca28c61ca0ea","optional":false},{"name":"schedule","type":"4b1e632e05776982","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"f88f1b7b6bb733f6": {"kind":"literal","value":1}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": "dispatch"
},
{
"kind": "literal",
"value": 1
},
{
"kind": "object",
"properties": [
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "operation",
"type": 7,
"optional": false
},
{
"name": "version",
"type": 5,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "delete"
},
{
"kind": "object",
"properties": [
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "operation",
"type": 4,
"optional": false
},
{
"name": "version",
"type": 5,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "operation",
"type": 10,
"optional": false
},
{
"name": "schedule",
"type": 11,
"optional": false
},
{
"name": "version",
"type": 5,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "create"
},
{
"kind": "union",
"types": [
12,
15,
17
]
},
{
"kind": "object",
"properties": [
{
"name": "afterSeconds",
"type": 13,
"optional": false
},
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "kind",
"type": 14,
"optional": false
},
{
"name": "prompt",
"type": 3,
"optional": false
},
{
"name": "scheduledAt",
"type": 3,
"optional": false
},
{
"name": "title",
"type": 3,
"optional": true
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "after"
},
{
"kind": "object",
"properties": [
{
"name": "everySeconds",
"type": 13,
"optional": false
},
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "kind",
"type": 16,
"optional": false
},
{
"name": "prompt",
"type": 3,
"optional": false
},
{
"name": "scheduledAt",
"type": 3,
"optional": false
},
{
"name": "title",
"type": 3,
"optional": true
}
],
"indices": []
},
{
"kind": "literal",
"value": "every"
},
{
"kind": "object",
"properties": [
{
"name": "id",
"type": 3,
"optional": false
},
{
"name": "kind",
"type": 18,
"optional": false
},
{
"name": "prompt",
"type": 3,
"optional": false
},
{
"name": "scheduledAt",
"type": 3,
"optional": false
},
{
"name": "title",
"type": 3,
"optional": true
}
],
"indices": []
},
{
"kind": "literal",
"value": "at"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "schedule/change"
}
]
}
}
],
"types": []
}
@@ -1,290 +1,28 @@
{
"formatVersion": 2,
"roots": [
{
"key": "event:subagent/catalog",
"kind": "event",
"event": "subagent/catalog",
"surface": false,
"digest": "53750b9abf61efb7992b0aadc3e247ec927449c63266df28230fd1139f5590ac",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 17,
"optional": true
},
{
"name": "seq",
"type": 3,
"optional": false
},
{
"name": "time",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 18,
"optional": false
}
{"key":"event:subagent/catalog","kind":"event","event":"subagent/catalog","surface":false,"digest":"53750b9abf61efb7992b0aadc3e247ec927449c63266df28230fd1139f5590ac"}
],
"indices": []
},
{
"kind": "union",
"types": [
2,
7,
9,
12,
14,
15
]
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": false
},
{
"name": "mode",
"type": 5,
"optional": false
},
{
"name": "version",
"type": 6,
"optional": false
"types": [],
"nodes": {
"05a2796621b1ee6c": {"kind":"literal","value":"unknown"},
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"0e10d7c096b47e61": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
"44c8c77aa9aa100b": {"kind":"literal","value":"subagent/catalog"},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"53750b9abf61efb7": {"kind":"object","properties":[{"name":"data","type":"f731ffe80810b028","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"44c8c77aa9aa100b","optional":false}],"indices":[]},
"5d542ac7bdf13310": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
"93d38436347f67c9": {"kind":"literal","value":0},
"a0f25b5aeeebf2bf": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"05a2796621b1ee6c","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"a0f906856fc06f1c": {"kind":"literal","value":2},
"b6896938660a1dfe": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"cbbe8377ee744964": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"fc351843b8ecbd05","optional":false},{"name":"version","type":"a0f906856fc06f1c","optional":false}],"indices":[]},
"d28765f87d6b6ab4": {"kind":"literal","value":"one-shot"},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"e2ad8f5bcd813f26": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"e5d3828df1ec3e2a": {"kind":"literal","value":"continuable"},
"f731ffe80810b028": {"kind":"union","types":["0e10d7c096b47e61","5d542ac7bdf13310","a0f25b5aeeebf2bf","b6896938660a1dfe","cbbe8377ee744964","e2ad8f5bcd813f26"]},
"f88f1b7b6bb733f6": {"kind":"literal","value":1},
"fc351843b8ecbd05": {"kind":"literal","value":"external"}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": "continuable"
},
{
"kind": "literal",
"value": 0
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": false
},
{
"name": "mode",
"type": 5,
"optional": false
},
{
"name": "version",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": 1
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 10,
"optional": false
},
{
"name": "version",
"type": 11,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "external"
},
{
"kind": "literal",
"value": 2
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 13,
"optional": false
},
{
"name": "version",
"type": 6,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "one-shot"
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 13,
"optional": false
},
{
"name": "version",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 16,
"optional": false
},
{
"name": "version",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "unknown"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "subagent/catalog"
}
]
}
}
],
"types": []
}
@@ -1,250 +1,25 @@
{
"formatVersion": 2,
"roots": [
{
"key": "event:subagent/catalog",
"kind": "event",
"event": "subagent/catalog",
"surface": false,
"digest": "3abae7324356f155cb42450c00b806d134ec93bd6439d2063b8d724162d58604",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 14,
"optional": true
},
{
"name": "seq",
"type": 3,
"optional": false
},
{
"name": "time",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 15,
"optional": false
}
{"key":"event:subagent/catalog","kind":"event","event":"subagent/catalog","surface":false,"digest":"3abae7324356f155cb42450c00b806d134ec93bd6439d2063b8d724162d58604"}
],
"indices": []
},
{
"kind": "union",
"types": [
2,
7,
9,
11,
12
]
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": false
},
{
"name": "mode",
"type": 5,
"optional": false
},
{
"name": "version",
"type": 6,
"optional": false
"types": [],
"nodes": {
"05a2796621b1ee6c": {"kind":"literal","value":"unknown"},
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"0e10d7c096b47e61": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
"1de64ea9a0849ce6": {"kind":"union","types":["0e10d7c096b47e61","5d542ac7bdf13310","a0f25b5aeeebf2bf","b6896938660a1dfe","e2ad8f5bcd813f26"]},
"3abae7324356f155": {"kind":"object","properties":[{"name":"data","type":"1de64ea9a0849ce6","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"44c8c77aa9aa100b","optional":false}],"indices":[]},
"44c8c77aa9aa100b": {"kind":"literal","value":"subagent/catalog"},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"5d542ac7bdf13310": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
"93d38436347f67c9": {"kind":"literal","value":0},
"a0f25b5aeeebf2bf": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"05a2796621b1ee6c","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"b6896938660a1dfe": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"d28765f87d6b6ab4": {"kind":"literal","value":"one-shot"},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"e2ad8f5bcd813f26": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
"e5d3828df1ec3e2a": {"kind":"literal","value":"continuable"},
"f88f1b7b6bb733f6": {"kind":"literal","value":1}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": "continuable"
},
{
"kind": "literal",
"value": 0
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": false
},
{
"name": "mode",
"type": 5,
"optional": false
},
{
"name": "version",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": 1
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 10,
"optional": false
},
{
"name": "version",
"type": 6,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "one-shot"
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 10,
"optional": false
},
{
"name": "version",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "childCreatedAt",
"type": 3,
"optional": false
},
{
"name": "childId",
"type": 4,
"optional": false
},
{
"name": "label",
"type": 4,
"optional": true
},
{
"name": "mode",
"type": 13,
"optional": false
},
{
"name": "version",
"type": 8,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "unknown"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "subagent/catalog"
}
]
}
}
],
"types": []
}
File diff suppressed because it is too large. Load diff
@@ -1,297 +1,29 @@
{
"formatVersion": 2,
"roots": [
{
"key": "event:job/registered",
"kind": "event",
"event": "job/registered",
"surface": false,
"digest": "f5520c1d261ca86ea03735799c311a0a9ede8babb588cf0a65422576d2ee0ad1",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 5,
"optional": true
},
{
"name": "seq",
"type": 3,
"optional": false
},
{
"name": "time",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 6,
"optional": false
}
{"key":"event:job/registered","kind":"event","event":"job/registered","surface":false,"digest":"f5520c1d261ca86ea03735799c311a0a9ede8babb588cf0a65422576d2ee0ad1"},
{"key":"event:job/settled","kind":"event","event":"job/settled","surface":false,"digest":"edd37b1e4974af648633014435572089b1e8fb71910468a0767a7e28fdd22abf"}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "jobId",
"type": 2,
"optional": false
},
{
"name": "kind",
"type": 2,
"optional": false
},
{
"name": "label",
"type": 2,
"optional": false
},
{
"name": "owner",
"type": 2,
"optional": false
},
{
"name": "startedAt",
"type": 3,
"optional": false
},
{
"name": "toolCall",
"type": 4,
"optional": true
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"1ebc6f9ff3aa9e3a": {"kind":"literal","value":"completed"},
"24a8188c4d61b70a": {"kind":"literal","value":"job/registered"},
"347de3380f2da308": {"kind":"literal","value":"job/settled"},
"39cf2d3ff8bac81c": {"kind":"object","properties":[{"name":"callId","type":"4cd48f3e5108bd6e","optional":false},{"name":"rootCallId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"5cb63db9fe57dc09": {"kind":"literal","value":"teardown"},
"611d82d2dc50df70": {"kind":"object","properties":[{"name":"cause","type":"750a2b129d67704d","optional":false},{"name":"detail","type":"4cd48f3e5108bd6e","optional":true},{"name":"finishedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"jobId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"owner","type":"4cd48f3e5108bd6e","optional":false},{"name":"producerReported","type":"aa93010d0e521ad7","optional":false},{"name":"startedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"status","type":"c2f49004d9ae38a9","optional":false},{"name":"toolCall","type":"39cf2d3ff8bac81c","optional":true}],"indices":[]},
"6cf082d0fb6034de": {"kind":"literal","value":"producer"},
"750a2b129d67704d": {"kind":"union","types":["5cb63db9fe57dc09","6cf082d0fb6034de","bab6865794007548"]},
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
"b57a2889408de36e": {"kind":"literal","value":"failed"},
"bab6865794007548": {"kind":"literal","value":"kill"},
"c2f49004d9ae38a9": {"kind":"union","types":["1ebc6f9ff3aa9e3a","b57a2889408de36e","ef226a90ddac6cd8"]},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"e3056e0dda3a379e": {"kind":"object","properties":[{"name":"jobId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"owner","type":"4cd48f3e5108bd6e","optional":false},{"name":"startedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"toolCall","type":"39cf2d3ff8bac81c","optional":true}],"indices":[]},
"edd37b1e4974af64": {"kind":"object","properties":[{"name":"data","type":"611d82d2dc50df70","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"347de3380f2da308","optional":false}],"indices":[]},
"ef226a90ddac6cd8": {"kind":"literal","value":"killed"},
"f5520c1d261ca86e": {"kind":"object","properties":[{"name":"data","type":"e3056e0dda3a379e","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"24a8188c4d61b70a","optional":false}],"indices":[]}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "object",
"properties": [
{
"name": "callId",
"type": 2,
"optional": false
},
{
"name": "rootCallId",
"type": 2,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "job/registered"
}
]
}
},
{
"key": "event:job/settled",
"kind": "event",
"event": "job/settled",
"surface": false,
"digest": "edd37b1e4974af648633014435572089b1e8fb71910468a0767a7e28fdd22abf",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 14,
"optional": true
},
{
"name": "seq",
"type": 7,
"optional": false
},
{
"name": "time",
"type": 7,
"optional": false
},
{
"name": "type",
"type": 15,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "cause",
"type": 2,
"optional": false
},
{
"name": "detail",
"type": 6,
"optional": true
},
{
"name": "finishedAt",
"type": 7,
"optional": false
},
{
"name": "jobId",
"type": 6,
"optional": false
},
{
"name": "kind",
"type": 6,
"optional": false
},
{
"name": "label",
"type": 6,
"optional": false
},
{
"name": "owner",
"type": 6,
"optional": false
},
{
"name": "producerReported",
"type": 8,
"optional": false
},
{
"name": "startedAt",
"type": 7,
"optional": false
},
{
"name": "status",
"type": 9,
"optional": false
},
{
"name": "toolCall",
"type": 13,
"optional": true
}
],
"indices": []
},
{
"kind": "union",
"types": [
3,
4,
5
]
},
{
"kind": "literal",
"value": "producer"
},
{
"kind": "literal",
"value": "teardown"
},
{
"kind": "literal",
"value": "kill"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "boolean"
},
{
"kind": "union",
"types": [
10,
11,
12
]
},
{
"kind": "literal",
"value": "completed"
},
{
"kind": "literal",
"value": "failed"
},
{
"kind": "literal",
"value": "killed"
},
{
"kind": "object",
"properties": [
{
"name": "callId",
"type": 6,
"optional": false
},
{
"name": "rootCallId",
"type": 6,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "job/settled"
}
]
}
}
],
"types": []
}
@@ -1,457 +1,47 @@
{
"formatVersion": 2,
"roots": [
{
"key": "event:tool/ptc-dispatch",
"kind": "event",
"event": "tool/ptc-dispatch",
"surface": false,
"digest": "d66e11dddf5dfa3c71547e2cbd7b0608824cd8d6243fc16f532017ff28e8fba5",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 29,
"optional": true
},
{
"name": "seq",
"type": 17,
"optional": false
},
{
"name": "time",
"type": 17,
"optional": false
},
{
"name": "type",
"type": 37,
"optional": false
}
{"key":"event:tool/ptc-dispatch","kind":"event","event":"tool/ptc-dispatch","surface":false,"digest":"d66e11dddf5dfa3c71547e2cbd7b0608824cd8d6243fc16f532017ff28e8fba5"}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "arguments",
"type": 2,
"optional": false
},
{
"name": "content",
"type": 3,
"optional": false
},
{
"name": "error",
"type": 31,
"optional": true
},
{
"name": "isError",
"type": 32,
"optional": false
},
{
"name": "meta",
"type": 33,
"optional": true
},
{
"name": "name",
"type": 6,
"optional": false
},
{
"name": "parentCallId",
"type": 6,
"optional": false
},
{
"name": "rootCallId",
"type": 6,
"optional": false
},
{
"name": "subCallId",
"type": 6,
"optional": false
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"0f46153645c29784": {"kind":"object","properties":[{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
"12d5808fac1996b9": {"kind":"object","properties":[{"name":"attachment","type":"b0b0eb1b16490f6b","optional":false},{"name":"offloaded","type":"dacf3d5f3e4ff619","optional":true},{"name":"type","type":"fb8b6a2e53cb9cf4","optional":false}],"indices":[]},
"1f0133217eeeffd8": {"kind":"literal","value":"tool-call"},
"277b61f9c6f81704": {"kind":"literal","value":"file"},
"2f1e6a7ebace43d7": {"kind":"union","types":["3f74ba74acd10644","58f94390b982f8a5","de30b1fa12c75f81","ebb768d85ec87fb6"]},
"3c2535ca0a2062f1": {"kind":"literal","value":"reasoning"},
"3f74ba74acd10644": {"kind":"literal","value":"image/jpeg"},
"43e311235aa537df": {"kind":"object","properties":[{"name":"toolName","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"83d6916021eede8f","optional":false}],"indices":[]},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"4e44c9118152f682": {"kind":"literal","value":"text"},
"4e88776858652856": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"4e44c9118152f682","optional":false}],"indices":[]},
"529e0ccd0e34079a": {"kind":"object","properties":[],"indices":[{"key":"4cd48f3e5108bd6e","value":"c592ce75aab73fca"}]},
"58f94390b982f8a5": {"kind":"literal","value":"image/png"},
"72ec79127a9c0d02": {"kind":"array","element":"c592ce75aab73fca"},
"8064c03c87c357fd": {"kind":"union","types":["12d5808fac1996b9","43e311235aa537df","4e88776858652856","814d9434e1ddf907","8e611bf46821e500","c1f0f17b6493b85d","f2da0f27c1e6add5"]},
"814d9434e1ddf907": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"3c2535ca0a2062f1","optional":false}],"indices":[]},
"83d6916021eede8f": {"kind":"literal","value":"tool-removal"},
"85f9b505b7bdff1f": {"kind":"literal","value":"tool-addition"},
"8e611bf46821e500": {"kind":"object","properties":[{"name":"tool","type":"fcf427290c6213c2","optional":true},{"name":"toolName","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"85f9b505b7bdff1f","optional":false}],"indices":[]},
"938f7c7357bc403e": {"kind":"primitive","type":"null"},
"a81059ca06999da1": {"kind":"object","properties":[{"name":"code","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"reason","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
"b0b0eb1b16490f6b": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"mediaType","type":"2f1e6a7ebace43d7","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":true},{"name":"originalDimensions","type":"0f46153645c29784","optional":true},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
"b52f215a6cd69105": {"kind":"array","element":"8064c03c87c357fd"},
"bbc5696e3f13c758": {"kind":"opaque","reason":"unknown"},
"c1f0f17b6493b85d": {"kind":"object","properties":[{"name":"arguments","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"1f0133217eeeffd8","optional":false}],"indices":[]},
"c592ce75aab73fca": {"kind":"union","types":["0657d3ca5ac4e7bf","4cd48f3e5108bd6e","529e0ccd0e34079a","72ec79127a9c0d02","938f7c7357bc403e","aa93010d0e521ad7"]},
"cef171adf021a186": {"kind":"object","properties":[{"name":"arguments","type":"bbc5696e3f13c758","optional":false},{"name":"content","type":"b52f215a6cd69105","optional":false},{"name":"error","type":"a81059ca06999da1","optional":true},{"name":"isError","type":"aa93010d0e521ad7","optional":false},{"name":"meta","type":"c592ce75aab73fca","optional":true},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"parentCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"rootCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"subCallId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"d66e11dddf5dfa3c": {"kind":"object","properties":[{"name":"data","type":"cef171adf021a186","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"fb5e0517050d2c6d","optional":false}],"indices":[]},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"de30b1fa12c75f81": {"kind":"literal","value":"image/gif"},
"ebb768d85ec87fb6": {"kind":"literal","value":"image/webp"},
"f19bee84bf3d2090": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"f2da0f27c1e6add5": {"kind":"object","properties":[{"name":"attachment","type":"f19bee84bf3d2090","optional":false},{"name":"type","type":"277b61f9c6f81704","optional":false}],"indices":[]},
"fb5e0517050d2c6d": {"kind":"literal","value":"tool/ptc-dispatch"},
"fb8b6a2e53cb9cf4": {"kind":"literal","value":"image"},
"fcf427290c6213c2": {"kind":"primitive","type":"never"}
}
],
"indices": []
},
{
"kind": "opaque",
"reason": "unknown"
},
{
"kind": "array",
"element": 4
},
{
"kind": "union",
"types": [
5,
8,
10,
13,
15,
19,
21
]
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 6,
"optional": false
},
{
"name": "type",
"type": 7,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": "reasoning"
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 6,
"optional": false
},
{
"name": "type",
"type": 9,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "text"
},
{
"kind": "object",
"properties": [
{
"name": "tool",
"type": 11,
"optional": true
},
{
"name": "toolName",
"type": 6,
"optional": false
},
{
"name": "type",
"type": 12,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "never"
},
{
"kind": "literal",
"value": "tool-addition"
},
{
"kind": "object",
"properties": [
{
"name": "toolName",
"type": 6,
"optional": false
},
{
"name": "type",
"type": 14,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "tool-removal"
},
{
"kind": "object",
"properties": [
{
"name": "attachment",
"type": 16,
"optional": false
},
{
"name": "type",
"type": 18,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "attachmentId",
"type": 6,
"optional": false
},
{
"name": "bytes",
"type": 17,
"optional": false
},
{
"name": "name",
"type": 6,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "file"
},
{
"kind": "object",
"properties": [
{
"name": "arguments",
"type": 6,
"optional": false
},
{
"name": "id",
"type": 6,
"optional": false
},
{
"name": "name",
"type": 6,
"optional": false
},
{
"name": "type",
"type": 20,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "tool-call"
},
{
"kind": "object",
"properties": [
{
"name": "attachment",
"type": 22,
"optional": false
},
{
"name": "offloaded",
"type": 29,
"optional": true
},
{
"name": "type",
"type": 30,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "attachmentId",
"type": 6,
"optional": false
},
{
"name": "bytes",
"type": 17,
"optional": false
},
{
"name": "height",
"type": 17,
"optional": false
},
{
"name": "mediaType",
"type": 23,
"optional": false
},
{
"name": "name",
"type": 6,
"optional": true
},
{
"name": "originalDimensions",
"type": 28,
"optional": true
},
{
"name": "width",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "union",
"types": [
24,
25,
26,
27
]
},
{
"kind": "literal",
"value": "image/gif"
},
{
"kind": "literal",
"value": "image/jpeg"
},
{
"kind": "literal",
"value": "image/png"
},
{
"kind": "literal",
"value": "image/webp"
},
{
"kind": "object",
"properties": [
{
"name": "height",
"type": 17,
"optional": false
},
{
"name": "width",
"type": 17,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "image"
},
{
"kind": "object",
"properties": [
{
"name": "code",
"type": 6,
"optional": false
},
{
"name": "name",
"type": 6,
"optional": false
},
{
"name": "reason",
"type": 6,
"optional": true
}
],
"indices": []
},
{
"kind": "primitive",
"type": "boolean"
},
{
"kind": "union",
"types": [
6,
17,
32,
34,
35,
36
]
},
{
"kind": "array",
"element": 33
},
{
"kind": "primitive",
"type": "null"
},
{
"kind": "object",
"properties": [],
"indices": [
{
"key": 6,
"value": 33
}
]
},
{
"kind": "literal",
"value": "tool/ptc-dispatch"
}
]
}
}
],
"types": []
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,231 +1,28 @@
{
"formatVersion": 2,
"roots": [
{
"key": "event:web/deepseek-search-llm-request",
"kind": "event",
"event": "web/deepseek-search-llm-request",
"surface": false,
"digest": "0c556c9b9f2a96238a6b9bbb99e748206cbff2ed6203041c9571f04ae5802f52",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 17,
"optional": true
},
{
"name": "seq",
"type": 4,
"optional": false
},
{
"name": "time",
"type": 4,
"optional": false
},
{
"name": "type",
"type": 18,
"optional": false
}
{"key":"event:web/deepseek-search-llm-request","kind":"event","event":"web/deepseek-search-llm-request","surface":false,"digest":"0c556c9b9f2a96238a6b9bbb99e748206cbff2ed6203041c9571f04ae5802f52"}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "apiVersion",
"type": 2,
"optional": false
},
{
"name": "body",
"type": 3,
"optional": false
},
{
"name": "endpoint",
"type": 2,
"optional": false
"types": [],
"nodes": {
"0116b1f89c05221d": {"kind":"literal","value":"web_search_20250305"},
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"0b9b8facbe2c1977": {"kind":"literal","value":"disabled"},
"0c556c9b9f2a9623": {"kind":"object","properties":[{"name":"data","type":"abd6ca62a5ab1665","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"6f611bed14b21065","optional":false}],"indices":[]},
"2d11ca7b0d4493e2": {"kind":"object","properties":[{"name":"max_uses","type":"0657d3ca5ac4e7bf","optional":false},{"name":"name","type":"935c8d486292b13c","optional":false},{"name":"type","type":"0116b1f89c05221d","optional":false}],"indices":[]},
"37ff65426bcf130f": {"kind":"object","properties":[{"name":"type","type":"0b9b8facbe2c1977","optional":false}],"indices":[]},
"4aed17ec726b5397": {"kind":"tuple","elements":[{"type":"2d11ca7b0d4493e2","optional":false,"rest":false}]},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"4e44c9118152f682": {"kind":"literal","value":"text"},
"4e88776858652856": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"4e44c9118152f682","optional":false}],"indices":[]},
"68f44f59e91c4139": {"kind":"literal","value":"user"},
"6f611bed14b21065": {"kind":"literal","value":"web/deepseek-search-llm-request"},
"8f6d609794bf5afc": {"kind":"tuple","elements":[{"type":"4e88776858652856","optional":false,"rest":false}]},
"935c8d486292b13c": {"kind":"literal","value":"web_search"},
"9a2a9029f8d7ede0": {"kind":"object","properties":[{"name":"content","type":"8f6d609794bf5afc","optional":false},{"name":"role","type":"68f44f59e91c4139","optional":false}],"indices":[]},
"9c001ecb5e1d3c38": {"kind":"object","properties":[{"name":"max_tokens","type":"0657d3ca5ac4e7bf","optional":false},{"name":"messages","type":"b993441f8ce7d27b","optional":false},{"name":"model","type":"4cd48f3e5108bd6e","optional":false},{"name":"thinking","type":"37ff65426bcf130f","optional":true},{"name":"tools","type":"4aed17ec726b5397","optional":false}],"indices":[]},
"abd6ca62a5ab1665": {"kind":"object","properties":[{"name":"apiVersion","type":"4cd48f3e5108bd6e","optional":false},{"name":"body","type":"9c001ecb5e1d3c38","optional":false},{"name":"endpoint","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"b993441f8ce7d27b": {"kind":"tuple","elements":[{"type":"9a2a9029f8d7ede0","optional":false,"rest":false}]},
"dacf3d5f3e4ff619": {"kind":"literal","value":true}
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "object",
"properties": [
{
"name": "max_tokens",
"type": 4,
"optional": false
},
{
"name": "messages",
"type": 5,
"optional": false
},
{
"name": "model",
"type": 2,
"optional": false
},
{
"name": "thinking",
"type": 11,
"optional": true
},
{
"name": "tools",
"type": 13,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "tuple",
"elements": [
{
"type": 6,
"optional": false,
"rest": false
}
]
},
{
"kind": "object",
"properties": [
{
"name": "content",
"type": 7,
"optional": false
},
{
"name": "role",
"type": 10,
"optional": false
}
],
"indices": []
},
{
"kind": "tuple",
"elements": [
{
"type": 8,
"optional": false,
"rest": false
}
]
},
{
"kind": "object",
"properties": [
{
"name": "text",
"type": 2,
"optional": false
},
{
"name": "type",
"type": 9,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "text"
},
{
"kind": "literal",
"value": "user"
},
{
"kind": "object",
"properties": [
{
"name": "type",
"type": 12,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "disabled"
},
{
"kind": "tuple",
"elements": [
{
"type": 14,
"optional": false,
"rest": false
}
]
},
{
"kind": "object",
"properties": [
{
"name": "max_uses",
"type": 4,
"optional": false
},
{
"name": "name",
"type": 15,
"optional": false
},
{
"name": "type",
"type": 16,
"optional": false
}
],
"indices": []
},
{
"kind": "literal",
"value": "web_search"
},
{
"kind": "literal",
"value": "web_search_20250305"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "web/deepseek-search-llm-request"
}
]
}
}
],
"types": []
}
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -15,8 +15,8 @@
en: 1ba6efaa0b5d6e47
zh: 6e216391ad24c541
/persistence-type-change-records/files-and-ownership:
en: 6cd0f79a9455bdf2
zh: a5978b7834c0802b
en: 41d4ab88aac68e7e
zh: 062d65578a1dbb53
/persistence-type-change-records/compatibility-rules:
en: 218b28a5096b5e7d
zh: 5b987c852e204893
+2
View File
@@ -28,6 +28,8 @@ For complete schemas grouped by Session format, use the [format references](hist
The generated [catalog](../persistence-catalog.md) provides readable declarations and digests; the [schema inventory](../persistence-schema.json) contains the normalized types. Roots cover the logical Session header, the physical JSONL header line, the event envelope, and every repository-declared event. Referenced types contribute transitively to each affected root's digest.
Each `.schema.json` file stores one node table keyed by the first 16 hexadecimal digits of each node's subgraph digest, with one root, type, or node per line. Roots and types locate their graphs through their own digests, so a type change rewrites only the changed nodes, their ancestors, and the affected digests. Generators own the exact text; verifiers reject any other layout.
Each dated record has four sibling files:
| File | Owner |
+2
View File
@@ -28,6 +28,8 @@ description: "审阅和维护已记录的会话持久化类型变更、对应 sc
生成的[目录](../persistence-catalog.zh.md)提供可读声明和摘要;[schema 清单](../persistence-schema.json)包含规范化类型。根覆盖逻辑会话头、物理 JSONL 头行、事件封装以及每个仓库内声明的事件。被引用类型的变更会传递到每个受影响根的摘要。
每个 `.schema.json` 文件存储一张节点表,键为节点子图摘要的前 16 位十六进制字符,每个根、类型或节点占一行。根和类型通过自身摘要定位其图,因此类型变更只改写变化的节点、其祖先节点以及受影响的摘要。生成器决定确切文本;校验器拒绝其他布局。
每条带日期的记录有四个同目录文件:
| 文件 | 职责 |
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+22 -409
View File
@@ -1,417 +1,30 @@
{
"formatVersion": 1,
"roots": [
{
"key": "event:permission/preset",
"kind": "event",
"event": "permission/preset",
"surface": false,
"digest": "7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 7,
"optional": true
},
{
"name": "seq",
"type": 8,
"optional": false
},
{
"name": "time",
"type": 8,
"optional": false
},
{
"name": "type",
"type": 9,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "origin",
"type": 2,
"optional": true
},
{
"name": "preset",
"type": 6,
"optional": false
}
],
"indices": []
},
{
"kind": "union",
"types": [
3,
4,
5
]
},
{
"kind": "literal",
"value": "default"
},
{
"kind": "literal",
"value": "inferred"
},
{
"kind": "literal",
"value": "selection"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": true
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "permission/preset"
}
]
}
}
{"key":"event:permission/preset","kind":"event","event":"permission/preset","surface":false,"digest":"7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22"}
],
"types": [
{
"digest": "0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7",
"schema": {
"root": 0,
"nodes": [
{
"kind": "primitive",
"type": "number"
}
]
},
"names": [],
"sources": []
},
{
"digest": "19a9088b778dbc75c9c3158d0145b3e1d3b9bba253821e249f869db82e98b713",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "inferred"
}
]
},
"names": [],
"sources": []
},
{
"digest": "4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b",
"schema": {
"root": 0,
"nodes": [
{
"kind": "primitive",
"type": "string"
}
]
},
"names": [
"packages/attachment/attachment/src/brand.ts#AttachmentId",
"packages/compaction/compaction/src/brand.ts#CompactionId",
"packages/core/session/src/types.ts#SessionId",
"packages/experimental/agent-team/src/types.ts#TeamId",
"packages/experimental/agent-team/src/types.ts#TeamMessageId",
"packages/experimental/agent-team/src/types.ts#TeamTaskId",
"packages/goal/goal/src/types.ts#GoalId",
"packages/host/apiproxy/src/api/rpc.ts#RpcId",
"packages/interaction/commands/src/brand.ts#CommandId",
"packages/interaction/user-approval/src/types.ts#ApprovalRequestId",
"packages/llm/llm-retry/src/brand.ts#RetryId",
"packages/llm/llm/src/brand.ts#CallId",
"packages/llm/llm/src/brand.ts#MessageId",
"packages/llm/llm/src/brand.ts#ProviderRequestId",
"packages/llm/llm/src/brand.ts#ReasoningEffortId",
"packages/schedule/schedule/src/types.ts#ScheduleId",
"packages/session/session-title/src/index.ts#SessionTitleProviderId",
"packages/workflow/workflow/src/types.ts#WorkflowRunId"
{"digest":"0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7","names":[],"sources":[]},
{"digest":"19a9088b778dbc75c9c3158d0145b3e1d3b9bba253821e249f869db82e98b713","names":[],"sources":[]},
{"digest":"4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b","names":["packages/attachment/attachment/src/brand.ts#AttachmentId","packages/compaction/compaction/src/brand.ts#CompactionId","packages/core/session/src/types.ts#SessionId","packages/experimental/agent-team/src/types.ts#TeamId","packages/experimental/agent-team/src/types.ts#TeamMessageId","packages/experimental/agent-team/src/types.ts#TeamTaskId","packages/goal/goal/src/types.ts#GoalId","packages/host/apiproxy/src/api/rpc.ts#RpcId","packages/interaction/commands/src/brand.ts#CommandId","packages/interaction/user-approval/src/types.ts#ApprovalRequestId","packages/llm/llm-retry/src/brand.ts#RetryId","packages/llm/llm/src/brand.ts#CallId","packages/llm/llm/src/brand.ts#MessageId","packages/llm/llm/src/brand.ts#ProviderRequestId","packages/llm/llm/src/brand.ts#ReasoningEffortId","packages/schedule/schedule/src/types.ts#ScheduleId","packages/session/session-title/src/index.ts#SessionTitleProviderId","packages/workflow/workflow/src/types.ts#WorkflowRunId"],"sources":["packages/attachment/attachment/src/brand.ts","packages/compaction/compaction/src/brand.ts","packages/core/session/src/types.ts","packages/experimental/agent-team/src/types.ts","packages/goal/goal/src/types.ts","packages/host/apiproxy/src/api/rpc.ts","packages/interaction/commands/src/brand.ts","packages/interaction/user-approval/src/types.ts","packages/llm/llm-retry/src/brand.ts","packages/llm/llm/src/brand.ts","packages/schedule/schedule/src/types.ts","packages/session/session-title/src/index.ts","packages/workflow/workflow/src/types.ts"]},
{"digest":"6c5d5215ad72616561350f3be63f968e321e75360d9de2a9408994d45d3be76f","names":["event:permission/preset[0].data.origin"],"sources":[]},
{"digest":"7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22","names":["event:permission/preset","event:permission/preset[0]"],"sources":["packages/core/session/src/types.ts"]},
{"digest":"78d7455eb6b3c8da4d70c104eadd69d4a60df1c449e855517a60673b889e03fa","names":[],"sources":[]},
{"digest":"ae63d9d1080ed8945031594d93f8d96651d7101b848719cc3e1475875cd3d649","names":[],"sources":[]},
{"digest":"d66ba5eb62ddba9fc264067c47d1152ca3bd8c2bdf2ededb66695e04ab588550","names":[],"sources":[]},
{"digest":"dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521","names":[],"sources":[]},
{"digest":"ebaac53bc4e8eb2ef8870c1ac58976a8a54987e3e412126b9f617f42bcd49829","names":["event:permission/preset[0].data"],"sources":["packages/interaction/permission-presets/src/index.ts"]}
],
"sources": [
"packages/attachment/attachment/src/brand.ts",
"packages/compaction/compaction/src/brand.ts",
"packages/core/session/src/types.ts",
"packages/experimental/agent-team/src/types.ts",
"packages/goal/goal/src/types.ts",
"packages/host/apiproxy/src/api/rpc.ts",
"packages/interaction/commands/src/brand.ts",
"packages/interaction/user-approval/src/types.ts",
"packages/llm/llm-retry/src/brand.ts",
"packages/llm/llm/src/brand.ts",
"packages/schedule/schedule/src/types.ts",
"packages/session/session-title/src/index.ts",
"packages/workflow/workflow/src/types.ts"
]
},
{
"digest": "6c5d5215ad72616561350f3be63f968e321e75360d9de2a9408994d45d3be76f",
"schema": {
"root": 0,
"nodes": [
{
"kind": "union",
"types": [
1,
2,
3
]
},
{
"kind": "literal",
"value": "default"
},
{
"kind": "literal",
"value": "inferred"
},
{
"kind": "literal",
"value": "selection"
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"19a9088b778dbc75": {"kind":"literal","value":"inferred"},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"6c5d5215ad726165": {"kind":"union","types":["19a9088b778dbc75","78d7455eb6b3c8da","d66ba5eb62ddba9f"]},
"7271e4b771406aaf": {"kind":"object","properties":[{"name":"data","type":"ebaac53bc4e8eb2e","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"ae63d9d1080ed894","optional":false}],"indices":[]},
"78d7455eb6b3c8da": {"kind":"literal","value":"selection"},
"ae63d9d1080ed894": {"kind":"literal","value":"permission/preset"},
"d66ba5eb62ddba9f": {"kind":"literal","value":"default"},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"ebaac53bc4e8eb2e": {"kind":"object","properties":[{"name":"origin","type":"6c5d5215ad726165","optional":true},{"name":"preset","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]}
}
]
},
"names": [
"event:permission/preset[0].data.origin"
],
"sources": []
},
{
"digest": "7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 7,
"optional": true
},
{
"name": "seq",
"type": 8,
"optional": false
},
{
"name": "time",
"type": 8,
"optional": false
},
{
"name": "type",
"type": 9,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "origin",
"type": 2,
"optional": true
},
{
"name": "preset",
"type": 6,
"optional": false
}
],
"indices": []
},
{
"kind": "union",
"types": [
3,
4,
5
]
},
{
"kind": "literal",
"value": "default"
},
{
"kind": "literal",
"value": "inferred"
},
{
"kind": "literal",
"value": "selection"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": true
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "permission/preset"
}
]
},
"names": [
"event:permission/preset",
"event:permission/preset[0]"
],
"sources": [
"packages/core/session/src/types.ts"
]
},
{
"digest": "78d7455eb6b3c8da4d70c104eadd69d4a60df1c449e855517a60673b889e03fa",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "selection"
}
]
},
"names": [],
"sources": []
},
{
"digest": "ae63d9d1080ed8945031594d93f8d96651d7101b848719cc3e1475875cd3d649",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "permission/preset"
}
]
},
"names": [],
"sources": []
},
{
"digest": "d66ba5eb62ddba9fc264067c47d1152ca3bd8c2bdf2ededb66695e04ab588550",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "default"
}
]
},
"names": [],
"sources": []
},
{
"digest": "dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": true
}
]
},
"names": [],
"sources": []
},
{
"digest": "ebaac53bc4e8eb2ef8870c1ac58976a8a54987e3e412126b9f617f42bcd49829",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "origin",
"type": 1,
"optional": true
},
{
"name": "preset",
"type": 5,
"optional": false
}
],
"indices": []
},
{
"kind": "union",
"types": [
2,
3,
4
]
},
{
"kind": "literal",
"value": "default"
},
{
"kind": "literal",
"value": "inferred"
},
{
"kind": "literal",
"value": "selection"
},
{
"kind": "primitive",
"type": "string"
}
]
},
"names": [
"event:permission/preset[0].data"
],
"sources": [
"packages/interaction/permission-presets/src/index.ts"
]
}
]
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
File diff suppressed because it is too large. Load diff
+29 -775
View File
@@ -1,783 +1,37 @@
{
"formatVersion": 1,
"roots": [
{
"key": "event:feedback/message-delete",
"kind": "event",
"event": "feedback/message-delete",
"surface": false,
"digest": "3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 3,
"optional": true
},
{
"name": "seq",
"type": 4,
"optional": false
},
{
"name": "time",
"type": 4,
"optional": false
},
{
"name": "type",
"type": 5,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "messageId",
"type": 2,
"optional": false
},
{
"name": "sessionId",
"type": 2,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": true
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "feedback/message-delete"
}
]
}
},
{
"key": "event:feedback/message-put",
"kind": "event",
"event": "feedback/message-put",
"surface": false,
"digest": "3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 8,
"optional": true
},
{
"name": "seq",
"type": 3,
"optional": false
},
{
"name": "time",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 9,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "item",
"type": 2,
"optional": false
},
{
"name": "sessionId",
"type": 4,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "createdAt",
"type": 3,
"optional": false
},
{
"name": "messageId",
"type": 4,
"optional": false
},
{
"name": "note",
"type": 4,
"optional": true
},
{
"name": "rating",
"type": 5,
"optional": false
},
{
"name": "updatedAt",
"type": 3,
"optional": false
},
{
"name": "version",
"type": 4,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "union",
"types": [
6,
7
]
},
{
"kind": "literal",
"value": "negative"
},
{
"kind": "literal",
"value": "positive"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "feedback/message-put"
}
]
}
}
{"key":"event:feedback/message-delete","kind":"event","event":"feedback/message-delete","surface":false,"digest":"3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796"},
{"key":"event:feedback/message-put","kind":"event","event":"feedback/message-put","surface":false,"digest":"3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1"}
],
"types": [
{
"digest": "0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7",
"schema": {
"root": 0,
"nodes": [
{
"kind": "primitive",
"type": "number"
}
]
},
"names": [
"packages/core/session/src/types.ts#SessionSeq"
{"digest":"0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7","names":["packages/core/session/src/types.ts#SessionSeq"],"sources":["packages/core/session/src/types.ts"]},
{"digest":"390eed1028aba02774f14408647acec10ec5516e97d4f15ecde2b9989d5a69f2","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackRating"],"sources":["packages/feedback/message-feedback/src/types.ts"]},
{"digest":"3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1","names":["event:feedback/message-put","event:feedback/message-put[0]"],"sources":["packages/core/session/src/types.ts"]},
{"digest":"3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796","names":["event:feedback/message-delete","event:feedback/message-delete[0]"],"sources":["packages/core/session/src/types.ts"]},
{"digest":"44818000e56acb97afdb5045ce235eb55e3fb1ccabc9fc7d0750bb38f36a7f8e","names":[],"sources":[]},
{"digest":"4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b","names":["packages/api/session-controller/src/types.ts#SessionRequestId","packages/attachment/attachment/src/brand.ts#AttachmentId","packages/compaction/compaction/src/brand.ts#CompactionId","packages/core/session/src/types.ts#SessionId","packages/experimental/agent-team/src/types.ts#TeamId","packages/experimental/agent-team/src/types.ts#TeamMessageId","packages/experimental/agent-team/src/types.ts#TeamTaskId","packages/feedback/message-feedback/src/types.ts#MessageFeedbackVersion","packages/goal/goal/src/types.ts#GoalId","packages/interaction/commands/src/brand.ts#CommandId","packages/interaction/user-approval/src/types.ts#ApprovalRequestId","packages/llm/llm-retry/src/brand.ts#RetryId","packages/llm/llm/src/brand.ts#MessageId","packages/llm/llm/src/brand.ts#ProviderRequestId","packages/llm/llm/src/brand.ts#ReasoningEffortId","packages/llm/llm/src/brand.ts#ToolCallId","packages/schedule/schedule/src/types.ts#ScheduleId","packages/session/session-title/src/index.ts#SessionTitleProviderId","packages/session/session-title/src/types.ts#SessionTitleProviderId","packages/webhook/webhook/src/brand.ts#WebhookDeliveryId","packages/webhook/webhook/src/brand.ts#WebhookRuleId","packages/webhook/webhook/src/brand.ts#WebhookSourceId","packages/workflow/workflow/src/types.ts#WorkflowRunId"],"sources":["packages/api/session-controller/src/types.ts","packages/attachment/attachment/src/brand.ts","packages/compaction/compaction/src/brand.ts","packages/core/session/src/types.ts","packages/experimental/agent-team/src/types.ts","packages/feedback/message-feedback/src/types.ts","packages/goal/goal/src/types.ts","packages/interaction/commands/src/brand.ts","packages/interaction/user-approval/src/types.ts","packages/llm/llm-retry/src/brand.ts","packages/llm/llm/src/brand.ts","packages/schedule/schedule/src/types.ts","packages/session/session-title/src/index.ts","packages/session/session-title/src/types.ts","packages/webhook/webhook/src/brand.ts","packages/workflow/workflow/src/types.ts"]},
{"digest":"6cda0d6d3b4336d83998fe580628426df81c2afbab5d768b8813b56d569120e8","names":[],"sources":[]},
{"digest":"7c6129b6961cf4b2a030f36c78d2b0a5be38617651a9b81322e054ee512bee06","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackDelete"],"sources":["packages/feedback/message-feedback/src/types.ts"]},
{"digest":"b1f62380f6746fedd629e71065e3583cef83334875b499ac9665c2eb87acfbf5","names":[],"sources":[]},
{"digest":"cb1df23dfd315032b6d34b3c5fe2c4e3d07f7b60334ab9afd9f17da48ad09379","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackPut"],"sources":["packages/feedback/message-feedback/src/types.ts"]},
{"digest":"dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521","names":[],"sources":[]},
{"digest":"df5d9709b7db2a72510dc52052a23f0c38f39730af1504bab8bccabc14fae528","names":[],"sources":[]},
{"digest":"e68568d70fde1c0701e8d3e7645e5bb796f856ca42f349b5479032c254f27375","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackItem"],"sources":["packages/feedback/message-feedback/src/types.ts"]}
],
"sources": [
"packages/core/session/src/types.ts"
]
},
{
"digest": "390eed1028aba02774f14408647acec10ec5516e97d4f15ecde2b9989d5a69f2",
"schema": {
"root": 0,
"nodes": [
{
"kind": "union",
"types": [
1,
2
]
},
{
"kind": "literal",
"value": "negative"
},
{
"kind": "literal",
"value": "positive"
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"390eed1028aba027": {"kind":"union","types":["b1f62380f6746fed","df5d9709b7db2a72"]},
"3b04fde0dc763cf8": {"kind":"object","properties":[{"name":"data","type":"cb1df23dfd315032","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"6cda0d6d3b4336d8","optional":false}],"indices":[]},
"3ee93b06f3a12585": {"kind":"object","properties":[{"name":"data","type":"7c6129b6961cf4b2","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"44818000e56acb97","optional":false}],"indices":[]},
"44818000e56acb97": {"kind":"literal","value":"feedback/message-delete"},
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
"6cda0d6d3b4336d8": {"kind":"literal","value":"feedback/message-put"},
"7c6129b6961cf4b2": {"kind":"object","properties":[{"name":"messageId","type":"4cd48f3e5108bd6e","optional":false},{"name":"sessionId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"b1f62380f6746fed": {"kind":"literal","value":"negative"},
"cb1df23dfd315032": {"kind":"object","properties":[{"name":"item","type":"e68568d70fde1c07","optional":false},{"name":"sessionId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
"df5d9709b7db2a72": {"kind":"literal","value":"positive"},
"e68568d70fde1c07": {"kind":"object","properties":[{"name":"createdAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"messageId","type":"4cd48f3e5108bd6e","optional":false},{"name":"note","type":"4cd48f3e5108bd6e","optional":true},{"name":"rating","type":"390eed1028aba027","optional":false},{"name":"updatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"version","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]}
}
]
},
"names": [
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackRating"
],
"sources": [
"packages/feedback/message-feedback/src/types.ts"
]
},
{
"digest": "3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 8,
"optional": true
},
{
"name": "seq",
"type": 3,
"optional": false
},
{
"name": "time",
"type": 3,
"optional": false
},
{
"name": "type",
"type": 9,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "item",
"type": 2,
"optional": false
},
{
"name": "sessionId",
"type": 4,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "createdAt",
"type": 3,
"optional": false
},
{
"name": "messageId",
"type": 4,
"optional": false
},
{
"name": "note",
"type": 4,
"optional": true
},
{
"name": "rating",
"type": 5,
"optional": false
},
{
"name": "updatedAt",
"type": 3,
"optional": false
},
{
"name": "version",
"type": 4,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "union",
"types": [
6,
7
]
},
{
"kind": "literal",
"value": "negative"
},
{
"kind": "literal",
"value": "positive"
},
{
"kind": "literal",
"value": true
},
{
"kind": "literal",
"value": "feedback/message-put"
}
]
},
"names": [
"event:feedback/message-put",
"event:feedback/message-put[0]"
],
"sources": [
"packages/core/session/src/types.ts"
]
},
{
"digest": "3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "data",
"type": 1,
"optional": false
},
{
"name": "ignorable",
"type": 3,
"optional": true
},
{
"name": "seq",
"type": 4,
"optional": false
},
{
"name": "time",
"type": 4,
"optional": false
},
{
"name": "type",
"type": 5,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "messageId",
"type": 2,
"optional": false
},
{
"name": "sessionId",
"type": 2,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "literal",
"value": true
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "literal",
"value": "feedback/message-delete"
}
]
},
"names": [
"event:feedback/message-delete",
"event:feedback/message-delete[0]"
],
"sources": [
"packages/core/session/src/types.ts"
]
},
{
"digest": "44818000e56acb97afdb5045ce235eb55e3fb1ccabc9fc7d0750bb38f36a7f8e",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "feedback/message-delete"
}
]
},
"names": [],
"sources": []
},
{
"digest": "4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b",
"schema": {
"root": 0,
"nodes": [
{
"kind": "primitive",
"type": "string"
}
]
},
"names": [
"packages/api/session-controller/src/types.ts#SessionRequestId",
"packages/attachment/attachment/src/brand.ts#AttachmentId",
"packages/compaction/compaction/src/brand.ts#CompactionId",
"packages/core/session/src/types.ts#SessionId",
"packages/experimental/agent-team/src/types.ts#TeamId",
"packages/experimental/agent-team/src/types.ts#TeamMessageId",
"packages/experimental/agent-team/src/types.ts#TeamTaskId",
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackVersion",
"packages/goal/goal/src/types.ts#GoalId",
"packages/interaction/commands/src/brand.ts#CommandId",
"packages/interaction/user-approval/src/types.ts#ApprovalRequestId",
"packages/llm/llm-retry/src/brand.ts#RetryId",
"packages/llm/llm/src/brand.ts#MessageId",
"packages/llm/llm/src/brand.ts#ProviderRequestId",
"packages/llm/llm/src/brand.ts#ReasoningEffortId",
"packages/llm/llm/src/brand.ts#ToolCallId",
"packages/schedule/schedule/src/types.ts#ScheduleId",
"packages/session/session-title/src/index.ts#SessionTitleProviderId",
"packages/session/session-title/src/types.ts#SessionTitleProviderId",
"packages/webhook/webhook/src/brand.ts#WebhookDeliveryId",
"packages/webhook/webhook/src/brand.ts#WebhookRuleId",
"packages/webhook/webhook/src/brand.ts#WebhookSourceId",
"packages/workflow/workflow/src/types.ts#WorkflowRunId"
],
"sources": [
"packages/api/session-controller/src/types.ts",
"packages/attachment/attachment/src/brand.ts",
"packages/compaction/compaction/src/brand.ts",
"packages/core/session/src/types.ts",
"packages/experimental/agent-team/src/types.ts",
"packages/feedback/message-feedback/src/types.ts",
"packages/goal/goal/src/types.ts",
"packages/interaction/commands/src/brand.ts",
"packages/interaction/user-approval/src/types.ts",
"packages/llm/llm-retry/src/brand.ts",
"packages/llm/llm/src/brand.ts",
"packages/schedule/schedule/src/types.ts",
"packages/session/session-title/src/index.ts",
"packages/session/session-title/src/types.ts",
"packages/webhook/webhook/src/brand.ts",
"packages/workflow/workflow/src/types.ts"
]
},
{
"digest": "6cda0d6d3b4336d83998fe580628426df81c2afbab5d768b8813b56d569120e8",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "feedback/message-put"
}
]
},
"names": [],
"sources": []
},
{
"digest": "7c6129b6961cf4b2a030f36c78d2b0a5be38617651a9b81322e054ee512bee06",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "messageId",
"type": 1,
"optional": false
},
{
"name": "sessionId",
"type": 1,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "string"
}
]
},
"names": [
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackDelete"
],
"sources": [
"packages/feedback/message-feedback/src/types.ts"
]
},
{
"digest": "b1f62380f6746fedd629e71065e3583cef83334875b499ac9665c2eb87acfbf5",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "negative"
}
]
},
"names": [],
"sources": []
},
{
"digest": "cb1df23dfd315032b6d34b3c5fe2c4e3d07f7b60334ab9afd9f17da48ad09379",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "item",
"type": 1,
"optional": false
},
{
"name": "sessionId",
"type": 3,
"optional": false
}
],
"indices": []
},
{
"kind": "object",
"properties": [
{
"name": "createdAt",
"type": 2,
"optional": false
},
{
"name": "messageId",
"type": 3,
"optional": false
},
{
"name": "note",
"type": 3,
"optional": true
},
{
"name": "rating",
"type": 4,
"optional": false
},
{
"name": "updatedAt",
"type": 2,
"optional": false
},
{
"name": "version",
"type": 3,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "union",
"types": [
5,
6
]
},
{
"kind": "literal",
"value": "negative"
},
{
"kind": "literal",
"value": "positive"
}
]
},
"names": [
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackPut"
],
"sources": [
"packages/feedback/message-feedback/src/types.ts"
]
},
{
"digest": "dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": true
}
]
},
"names": [],
"sources": []
},
{
"digest": "df5d9709b7db2a72510dc52052a23f0c38f39730af1504bab8bccabc14fae528",
"schema": {
"root": 0,
"nodes": [
{
"kind": "literal",
"value": "positive"
}
]
},
"names": [],
"sources": []
},
{
"digest": "e68568d70fde1c0701e8d3e7645e5bb796f856ca42f349b5479032c254f27375",
"schema": {
"root": 0,
"nodes": [
{
"kind": "object",
"properties": [
{
"name": "createdAt",
"type": 1,
"optional": false
},
{
"name": "messageId",
"type": 2,
"optional": false
},
{
"name": "note",
"type": 2,
"optional": true
},
{
"name": "rating",
"type": 3,
"optional": false
},
{
"name": "updatedAt",
"type": 1,
"optional": false
},
{
"name": "version",
"type": 2,
"optional": false
}
],
"indices": []
},
{
"kind": "primitive",
"type": "number"
},
{
"kind": "primitive",
"type": "string"
},
{
"kind": "union",
"types": [
4,
5
]
},
{
"kind": "literal",
"value": "negative"
},
{
"kind": "literal",
"value": "positive"
}
]
},
"names": [
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackItem"
],
"sources": [
"packages/feedback/message-feedback/src/types.ts"
]
}
]
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
@@ -1,5 +1,6 @@
{
"formatVersion": 1,
"roots": [],
"types": []
"types": [],
"nodes": {}
}
+1297 -26172
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -9,8 +9,8 @@
en: 88cceb3cf383248e
zh: 8e1d2627823b1ffc
/user-interaction/presentation-intent:
en: aca3811ea3f0c2ef
zh: 6cf2aea40c7dece8
en: 9aa9b7fb16455a6e
zh: d820978a3f652e92
/user-interaction/question-item:
en: 1ad4373e6fdfe4c7
zh: efb8d41ebe7224f8
+18 -1
View File
@@ -22,7 +22,7 @@ interface AskUserQuestionOption {
## Presentation intent
`AskUserQuestionIntent` optionally declares a known decision kind. It is tagged on `kind` so intents can be added; a UI that does not recognise a tag renders the generic option list. An intent changes presentation only — a UI honouring it answers with the same option labels a generic UI would send, so the caller reads the same answer fields either way. `approve` names the affirmative option instead of relying on option order. `ask()` rejects the two assertions no type can carry: an `approve` naming none of its own question's options, and an intent on a question with no `detail`.
`AskUserQuestionIntent` changes presentation while preserving option labels and the caller’s decision policy. `plan-review` names the approve option and requires plan detail. `approval` requires one blocking question with detail and distinct reject, approve and optional always-allow labels covering exactly the offered options. It rejects multi-select and timed waits. The CUA frontend renders its fixed approvals through the existing composer chain; ordinary questions and plan review keep their existing renderers.
```ts type-equiv
/**
@@ -43,6 +43,23 @@ type AskUserQuestionIntent = {
approve: string
/** Logged tool invocation whose arguments contain the reviewed plan. */
callId?: ToolCallId
} | {
/** A blocking permission decision with fixed actions and no free-text answer. */
kind: 'approval'
/** Option label granting the scope described by the caller. */
approve: string
/** Option label refusing the requested access. */
reject: string
/** Optional persistent grant offered only when the caller supports it. */
always?: string
/** Metadata for human recognition; the caller admits icon sources, which the UI may load as URLs. Never an authorization identity. */
subject?: { name: string; icon?: string }
/** Localized question and limited-grant label; fixed cards own reject/always wording. Option labels remain answer values. */
display?: {
question: { en: string; [locale: string]: string }
detail?: { en: string; [locale: string]: string }
approve?: { en: string; [locale: string]: string }
}
}
```
+18 -1
View File
@@ -22,7 +22,7 @@ interface AskUserQuestionOption {
## 呈现意图
`AskUserQuestionIntent` 可选地声明一种已知的决策类型。它以 `kind` 作为标记,以便后续加入更多意图;不认识某个标记的 UI 会渲染通用选项列表。意图只改变呈现——遵循它的 UI 回答的选项标签与通用 UI 相同,因此调用方读到的答案字段一致。`approve` 指明表示同意的选项,而不依赖选项顺序。`ask()` 拒绝两种类型无法表达的断言:`approve` 未命名该问题自己的任何选项,以及没有 `detail` 的问题声明了意图。
`AskUserQuestionIntent` 改变呈现方式,保留选项标签和调用方的决策规则。`plan-review` 指定批准选项,并要求提供计划正文。`approval` 要求只有一个阻塞式问题,带有说明以及互不相同的拒绝、允许和可选的始终允许标签,完整对应已提供的选项,不支持多选或计时等待。CUA 前端通过现有 composer 呈现自己的固定审批;普通问答和计划审阅继续使用原有呈现。
```ts type-equiv
/**
@@ -43,6 +43,23 @@ type AskUserQuestionIntent = {
approve: string
/** Logged tool invocation whose arguments contain the reviewed plan. */
callId?: ToolCallId
} | {
/** A blocking permission decision with fixed actions and no free-text answer. */
kind: 'approval'
/** Option label granting the scope described by the caller. */
approve: string
/** Option label refusing the requested access. */
reject: string
/** Optional persistent grant offered only when the caller supports it. */
always?: string
/** Metadata for human recognition; the caller admits icon sources, which the UI may load as URLs. Never an authorization identity. */
subject?: { name: string; icon?: string }
/** Localized question and limited-grant label; fixed cards own reject/always wording. Option labels remain answer values. */
display?: {
question: { en: string; [locale: string]: string }
detail?: { en: string; [locale: string]: string }
approve?: { en: string; [locale: string]: string }
}
}
```
@@ -0,0 +1,16 @@
# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-rc.2/persistent-terminal-controls/guide.md
/:
en: 2b63472f97a928a2
zh: 1db21d2ab8ee528a
/manage-persistent-terminals-through-profile-configuration:
en: 39659f2e595dbb93
zh: 45b58c9ac1d0b006
/manage-persistent-terminals-through-profile-configuration/change:
en: bdbdd9596d9f45ed
zh: e874ef3b122cea38
/manage-persistent-terminals-through-profile-configuration/migration:
en: 87bdea56366ec097
zh: ed6add607169b1ba
@@ -0,0 +1,18 @@
---
kind: upgrade-guide
description: "Persistent-terminal bundle controls leave the Plugins page; profile configuration still enables and disables the bundle."
---
# Manage persistent terminals through profile configuration
English | [中文](guide.zh.md)
## Change
Web and Desktop no longer show the persistent-terminal bundle in Plugins lists or detail pages, including for profiles that already enabled it. The package and existing activation remain intact. The minimal preset's own persistent shell is independent of this bundle.
## Migration
1. To keep an existing selection, no action is required. To change it, open `$DSH_HOME/profiles/<name>/package.json`, where the default home is `~/.dsh` and `<name>` is the running profile, such as `web` or `desktop`.
2. Remove `@deepseek-ai/dsh-experimental-terminal-bundle` from `dsh.profile.bundles` to disable it, or add it to enable it. Keep the other entries and dependencies intact.
3. Restart the same profile to apply the selection. For a CLI-managed profile, run `dsh --profile <name> --dump-config`: the `optional-persistent-terminals` group is present only when the bundle is selected. See the [profile reference](../../../../apps/cli/reference/README.md#profile-boot).
@@ -0,0 +1,18 @@
---
kind: upgrade-guide
description: "持久终端组合包开关移出插件页,仍可通过 profile 配置启用或关闭组合包。"
---
# 通过 profile 配置管理持久终端
[English](guide.md) | 中文
## 变更
Web 和 Desktop 的插件列表和详情页不再显示持久终端组合包,包括此前已启用它的 profile。包及已有启用状态保持不变。minimal 预设自带的持久 shell 独立于此组合包。
## 迁移
1. 保留已有选择无需操作。如需更改,打开 `$DSH_HOME/profiles/<name>/package.json`,home 默认为 `~/.dsh`,`<name>` 是运行中的 profile,例如 `web` 或 `desktop`。
2. 从 `dsh.profile.bundles` 中移除 `@deepseek-ai/dsh-experimental-terminal-bundle` 即可关闭,加入即可启用。保留其他条目和依赖。
3. 重启同一个 profile 后生效。对于 CLI 管理的 profile,运行 `dsh --profile <name> --dump-config`:只有选中此组合包时,配置才包含 `optional-persistent-terminals` 分组。详见 [profile 参考](../../../../apps/cli/reference/README.zh.md#profile-boot)。
@@ -3,8 +3,8 @@
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/user/develop/practice/dynamic-cordis.md
/configure-persistent-plugins-from-a-prompt:
en: 9503745724cbe962
zh: 985513234a4eda31
en: d50e336357663f75
zh: 4364e91403387e2a
/configure-persistent-plugins-from-a-prompt/connect-an-mcp-server:
en: f9fefda94ba8a005
zh: f1a9a977a0732fc0
+1 -1
View File
@@ -2,7 +2,7 @@
English | [中文](dynamic-cordis.zh.md)
Creator mode provides [Plugin Manager](../../../../packages/boot/plugin-manager/README.md) and read-only [runtime inspection](../../../../packages/extensions/tool-cordis/README.md). Plugin configuration belongs to the current profile, affects its sessions, and survives process restarts.
Standard and Creator modes provide [Plugin Manager](../../../../packages/boot/plugin-manager/README.md); Creator mode adds read-only [runtime inspection](../../../../packages/extensions/tool-cordis/README.md). Plugin configuration belongs to the current profile, affects its sessions, and survives process restarts.
## Connect an MCP server
@@ -2,7 +2,7 @@
[English](dynamic-cordis.md) | 中文
创造模式提供 [Plugin Manager](../../../../packages/boot/plugin-manager/README.zh.md) 和只读[运行时检查](../../../../packages/extensions/tool-cordis/README.zh.md)。插件配置属于当前 profile,影响其会话,并在进程重启后保留。
标准模式和创造模式提供 [Plugin Manager](../../../../packages/boot/plugin-manager/README.zh.md);创造模式还提供只读[运行时检查](../../../../packages/extensions/tool-cordis/README.zh.md)。插件配置属于当前 profile,影响其会话,并在进程重启后保留。
## 连接 MCP 服务器
Loaded 100 of 258 files, more files were not shown because too many files have changed in this diff. Show more