@qilin-agent/commands 0.0.0-stage → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kkutysllb
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,76 @@
1
+ # Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
2
+ # section, a hash of its English and Chinese blocks outside code blocks and generated regions.
3
+ # After editing either side, bring the other along and re-record with:
4
+ # pnpm run verify-translation-pairing --write packages/interaction/commands/README.md
5
+ /:
6
+ en: d331b9706513154d
7
+ zh: 20e08461c498d058
8
+ /qilin-agent-commands:
9
+ en: a63d13c28e2e727b
10
+ zh: d4f574616d744448
11
+ /qilin-agent-commands/summary:
12
+ en: 99c235f3b2ddbeba
13
+ zh: 1c057688521c5013
14
+ /qilin-agent-commands/table-of-contents:
15
+ en: d152484eb41ac6b4
16
+ zh: 09388d293f9be9cb
17
+ /qilin-agent-commands/use-this-package:
18
+ en: 6eee80c31dad122b
19
+ zh: 8f261f844a22ddad
20
+ /qilin-agent-commands/use-this-package/registering-a-command:
21
+ en: 81cefbf12580c26a
22
+ zh: 01c49d94aca89a07
23
+ /qilin-agent-commands/use-this-package/command-syntax:
24
+ en: f9160436da4939e7
25
+ zh: 90af200afaf3bb4c
26
+ /qilin-agent-commands/use-this-package/agent-scoped-commands:
27
+ en: b2e46875757e31c8
28
+ zh: 6f97db278fcbc58a
29
+ /qilin-agent-commands/use-this-package/attachments:
30
+ en: 5239ef9c245c3a6b
31
+ zh: 34e2f89e4e7f5554
32
+ /qilin-agent-commands/use-this-package/dispatching-from-an-adapter:
33
+ en: a5c6aecf74468137
34
+ zh: 5548d846d600d29a
35
+ /qilin-agent-commands/use-this-package/cancellation:
36
+ en: ee26e9855ce39626
37
+ zh: 7c092436d03b84a9
38
+ /qilin-agent-commands/understand-the-implementation:
39
+ en: 063b49f26f48d628
40
+ zh: 2ec899aa6f01359f
41
+ /qilin-agent-commands/understand-the-implementation/source-map:
42
+ en: 1617729234228bb0
43
+ zh: 3bee55cd286212e3
44
+ /qilin-agent-commands/understand-the-implementation/lifecycle-events:
45
+ en: c9fcc06089f8035d
46
+ zh: 74072476994a2093
47
+ /qilin-agent-commands/understand-the-implementation/scoping:
48
+ en: d2d9d05bb5efbec4
49
+ zh: 85ab0abcf728c56d
50
+ /qilin-agent-commands/understand-the-implementation/attachment-admission:
51
+ en: ee0efa5308dcf1e3
52
+ zh: da5a1d938301426c
53
+ /qilin-agent-commands/further-exploration:
54
+ en: 2ca86ec1b21240d0
55
+ zh: 2e44e52223d0994c
56
+ /qilin-agent-commands/model-experience:
57
+ en: 215e7ba838619b7b
58
+ zh: a311da3843709f90
59
+ /qilin-agent-commands/model-experience/direct-human-commands:
60
+ en: 47824d39a7117a5c
61
+ zh: 05fefe83ee7f8ad6
62
+ /qilin-agent-commands/model-experience/direct-human-commands/what-the-model-sees:
63
+ en: 46ea08932476bd6d
64
+ zh: 67160ce182dc3492
65
+ /qilin-agent-commands/model-experience/direct-human-commands/token-effect:
66
+ en: d212d42f4315c80c
67
+ zh: 433dd07e1a167f12
68
+ /qilin-agent-commands/model-experience/direct-human-commands/kv-cache-effect:
69
+ en: a0683fff79d40075
70
+ zh: 3d14d36c8a640031
71
+ /qilin-agent-commands/known-limitations-and-deferred-work:
72
+ en: 7e930763024d2644
73
+ zh: 351bbea360cab6d3
74
+ /qilin-agent-commands/known-limitations-and-deferred-work/dev-note:
75
+ en: e67f633dc6fe7773
76
+ zh: 3bb0c20c93f16f98
package/README.md CHANGED
@@ -1,3 +1,149 @@
1
- # Temporary Holding Version
1
+ ---
2
+ description: "Human slash-command registry for interactive UIs: plugin-owned commands that run directly against an agent without creating a model message, for users and maintainers composing or extending command surfaces."
3
+ kind: "package-reference"
4
+ ---
2
5
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
6
+ # @qilin-agent/commands
7
+
8
+ English | [中文](README.zh.md)
9
+
10
+ ## Summary
11
+
12
+ `qilin-commands` lets users run `/command [input]` actions in interactive Harness UIs without turning the command or its result into a model message. Commands can advertise input hints, accept attachments, and target one agent while preserving a global command with the same name for other agents. Every admitted run is recorded in the receiving agent's session log, while the UI renders the settled result outside model history. Use it for direct human controls in the `qilin` CLI or Web client; UI-less demos and ACP automation do not provide this command surface.
13
+
14
+ ## Table of Contents
15
+
16
+ - [Use this package](#use-this-package)
17
+ - [Understand the implementation](#understand-the-implementation)
18
+ - [Further Exploration](#further-exploration)
19
+ - [Model Experience](#model-experience)
20
+ - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
21
+ - [Dev Note](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## Use this package
27
+
28
+ Compose this service when an interactive UI should let users drive agent-side behavior with slash commands instead of model prompts. UI-less demo spines and ACP automation provide no command adapter and do not need it.
29
+
30
+ ### Registering a command
31
+
32
+ A plugin registers a command with `ctx.commands.register()`: a lowercase name, a discovery description, an optional `input` hint, and a handler. An optional branded `definitionId` gives the definition a stable, plugin-namespaced identity for adapters; it is independent of display copy and execution `commandId`. The effective descriptor carries only the selected definition's identity, so a scoped override never inherits the shadowed registration's identity.
33
+
34
+ ```text
35
+ ctx.commands.register({
36
+ name: 'plan',
37
+ description: 'Enter plan mode',
38
+ input: { hint: '<message>' },
39
+ handler: ({ agent, rawInput }) => {
40
+ // Runs directly against the agent; no model message is created.
41
+ return { kind: 'success', text: 'plan mode selected' }
42
+ },
43
+ })
44
+ ```
45
+
46
+ The handler returns `success` or `error` plus optional UI text that the adapter renders. `recordInput` defaults to true; a command whose own authoritative domain event already carries the payload sets it to false so the session log does not duplicate the input. Registering the same name twice in one scope throws.
47
+
48
+ ### Command syntax
49
+
50
+ A command line starts with a slash at byte zero, a lowercase name containing letters, digits, `_` or `-`, and then either end-of-input or whitespace. Everything after the name — including separator whitespace — is the command's `rawInput`, and the command owns its own grammar for it. Lines that are not syntactically a command, or that name an unknown command, are rejected by the adapter instead of becoming a model prompt.
51
+
52
+ ### Agent-scoped commands
53
+
54
+ A plain registration is global. A command-producing plugin mounted beneath an agent's own context declares its `commands` injection and registers an exact agent-scoped command, which shadows the global definition of the same name for that agent only.
55
+
56
+ ### Attachments
57
+
58
+ A command may declare `input.attachments` to accept composer images and generic files. The executor enforces the declaration: attachments sent to a non-declaring command, an absent attachment store, an unknown Session-scoped file-upload receipt, or an over-limit image batch each settle as an error before the handler runs. Images cross the command wire as base64 input; generic files cite receipts from their completed background uploads, so command submission never reads their bytes again. Admitted `ImageBlock`s and `FileBlock`s reach the handler as one frozen `invocation.attachments` array in the user's selection order, and the handler owns their model-visible use.
59
+
60
+ ### Dispatching from an adapter
61
+
62
+ An interactive adapter calls `execute(agent, line, attachments, signal)` with the exact receiving agent, the full command line, and the submission's ordered attachments. It returns the settled `CommandExecution` — the normalized result plus its lifecycle `commandId` — or `undefined` for invalid syntax or an unknown name. `list(agent)` and `find(agent, name)` serve discovery after agent-scoped shadowing.
63
+
64
+ ### Cancellation
65
+
66
+ The caller's abort signal stops the registry from awaiting a handler; a handler that ignores the signal may continue its own external side effects after the caller stops waiting. A cancelled or thrown handler settles as a `command/done` error in the log.
67
+
68
+ -----
69
+
70
+ <a id="understand-the-implementation"></a>
71
+ ## Understand the implementation
72
+
73
+ <details>
74
+ <summary>Implementation internals — click to expand</summary>
75
+
76
+ The observable behavior is covered in [Use this package](#use-this-package); this section explains how the registry is built and where its contracts live.
77
+
78
+ ### Source map
79
+
80
+ | File | Role |
81
+ |---|---|
82
+ | [`src/index.ts`](src/index.ts) | `CommandRuntime` service: registration, scoping, dispatch, lifecycle events |
83
+ | [`src/types.ts`](src/types.ts) | Command definition, descriptor, execution, and result types |
84
+ | [`src/brand.ts`](src/brand.ts) | Stable command-definition identities and per-execution lifecycle ids |
85
+
86
+ ### Lifecycle events
87
+
88
+ `execute()` mints a `commandId`, appends `command/run` before the handler runs, and appends `command/done` at settlement with the outcome kind and verbatim text; the exact payload fields live in [`src/index.ts`](src/index.ts). A successful result may name an earlier non-command authoritative domain event through `sourceEventSeq`; a thrown or aborted handler settles as `kind: 'error'`. Both events are direct standalone log-only appends: no turn wraps them, and persistence drains them at ordinary checkpoints and teardown. Admission misses (invalid syntax or unknown name) log nothing.
89
+
90
+ ### Scoping
91
+
92
+ Registrations live in global and agent-scoped layers merged per agent via `ScopedLayers`. The child-injection shape — a command-producing plugin mounted beneath `agent.ctx` declares its own `commands` injection — preserves agent scope without making the core agent loop depend on a UI service. Duplicate names within one layer fail during registration, and registration or removal notifies every `commands/change` observer so live adapters can refresh discovery; observer failures are logged and cannot veto the mutation or starve later observers.
93
+
94
+ ### Attachment admission
95
+
96
+ Attachment enforcement happens in the executor: images are committed through `admitEncodedImages`, files are resolved through the single Session-aware receipt provider, and the executor restores their original mixed order before calling the handler. Validation rejection starts no attachment writes. An image-storage failure can leave unreachable content-addressed objects for deferred collection, but publishes no model-visible message. Cancellation is honored before the handler runs. Command errors leave the dispatching composer's draft and attachment cards intact.
97
+
98
+ </details>
99
+
100
+ -----
101
+
102
+ <a id="further-exploration"></a>
103
+ ## Further Exploration
104
+
105
+ Read these pages when the package-level contract is not enough. They move from the shared command vocabulary to the design evidence and adjacent surfaces.
106
+
107
+ - [Commands subsystem reference](../../../docs/subsystems/commands.md) — registry semantics, input metadata, and the `ctx.commands` Cordis surface.
108
+ - [Command registration Agent Note](../../../.agents/notes/implemented/feature/2026-07-19-plugin-command-registration.md) — the boundary and dispatch contract behind this service.
109
+ - [Interaction group map](../README.md) — adjacent approval, permission, and question packages.
110
+ - [Plan mode package](../../plan/plan-mode/README.md) — a shipped command producer that drives model-visible work.
111
+
112
+ -----
113
+
114
+ <a id="model-experience"></a>
115
+ ## Model Experience
116
+
117
+ ### Direct human commands
118
+
119
+ #### What the model sees
120
+
121
+ The registry itself submits nothing. Known slash commands execute in the UI command plane, and their `CommandResult` text is not submitted as a user message. Unknown slash-command input is rejected by shipped adapters instead of becoming a model prompt. A command producer may explicitly use the receiving `Agent`; for example, [`qilin-plan-mode`](../../plan/plan-mode/README.md#model-and-human-interactions) submits the optional message and ordered attachments in `/plan [message]` after selecting plan mode. The executor only admits attachments into durable objects; the declaring producer decides whether and how they become model-visible message content.
122
+
123
+ #### Token effect
124
+
125
+ Command discovery, execution, and UI output add no model tokens. Explicit agent work scheduled by a command producer has the same token effect as the corresponding agent input.
126
+
127
+ #### KV Cache effect
128
+
129
+ Registry metadata, command input, and direct output never enter a model request and do not affect its cache. A mutated domain owns any later cache effect.
130
+
131
+ ## Known Limitations and Deferred Work
132
+
133
+ <a id="known-limitations-and-deferred-work"></a>
134
+
135
+
136
+ These limits define what the registry does not offer. They are current package constraints, not a UI backlog.
137
+
138
+ - **Only unstructured text input** — forms, completion schemas, and typed arguments remain command-owned parsing concerns.
139
+ - **Cooperative side-effect cancellation** — dispatch stops awaiting on abort; handlers must honor the signal to stop work that has already escaped into external systems.
140
+
141
+ <a id="dev-note"></a>
142
+ ### Dev Note
143
+
144
+ <details>
145
+ <summary>Working context for maintainers — click to expand</summary>
146
+
147
+ None.
148
+
149
+ </details>
package/README.zh.md ADDED
@@ -0,0 +1,149 @@
1
+ ---
2
+ description: "交互式 UI 的面向用户斜杠命令注册表:插件拥有的命令直接针对 agent(智能体)执行,不产生模型消息;供组合或扩展命令面的用户与维护者阅读。"
3
+ kind: "package-reference"
4
+ ---
5
+
6
+ # @qilin-agent/commands
7
+
8
+ [English](README.md) | 中文
9
+
10
+ ## 概述
11
+
12
+ `qilin-commands` 让用户能在交互式 Harness UI 中运行 `/command [input]` 操作,且不会把命令或结果变成模型消息。命令可以展示输入提示、接受附件,并只针对一个 agent 生效,同时为其他 agent 保留同名的全局命令。每次通过准入的执行都会记录到接收 agent 的会话日志中,UI 则在模型历史之外渲染结算结果。它适合为 `qilin` CLI(命令行界面)或 Web 客户端提供直接面向用户的控制;无 UI 的演示与 ACP(Agent Client Protocol)自动化不提供此命令面。
13
+
14
+ ## 目录
15
+
16
+ - [使用本包](#use-this-package)
17
+ - [理解实现](#understand-the-implementation)
18
+ - [进一步探索](#further-exploration)
19
+ - [模型体验](#model-experience)
20
+ - [已知限制与延期工作](#known-limitations-and-deferred-work)
21
+ - [开发备注](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## 使用本包
27
+
28
+ 当交互式 UI 希望用户用斜杠命令而非模型提示词驱动 agent 侧行为时,组合此服务。无 UI 的演示主干和 ACP 自动化不提供命令适配器,也不需要它。
29
+
30
+ ### 注册命令
31
+
32
+ 插件通过 `ctx.commands.register()` 注册命令,提供小写名称、发现界面中的说明、可选的 `input` 提示和处理器。可选的品牌类型字段 `definitionId` 为适配器提供带插件命名空间的稳定定义标识,它独立于显示文案和每次执行的 `commandId`。有效描述符只携带被选中定义的标识,作用域覆盖不会继承被遮蔽注册项的标识。
33
+
34
+ ```text
35
+ ctx.commands.register({
36
+ name: 'plan',
37
+ description: 'Enter plan mode',
38
+ input: { hint: '<message>' },
39
+ handler: ({ agent, rawInput }) => {
40
+ // Runs directly against the agent; no model message is created.
41
+ return { kind: 'success', text: 'plan mode selected' }
42
+ },
43
+ })
44
+ ```
45
+
46
+ 处理器返回 `success` 或 `error`,并可附带由适配器渲染的 UI 文本。`recordInput` 默认为 true;若载荷由命令自己的权威领域事件持有,命令会将 `recordInput` 设为 false,避免会话日志重复记录该输入。同一作用域内重复注册同名命令会抛出异常。
47
+
48
+ ### 命令语法
49
+
50
+ 命令行的第 0 字节必须是斜杠,随后是小写名称(可含字母、数字、`_` 或 `-`),再之后是输入末尾或空白。名称之后的每个字节——包括分隔空白——都是该命令的 `rawInput`,命令自己拥有其专属语法。不符合命令语法、或名称未知的行会被适配器拒绝,而不是变成模型提示词。
51
+
52
+ ### 限定到 agent 的命令
53
+
54
+ 普通注册全局生效。挂载在 agent 自身上下文之下的命令生产插件会声明 `commands` 注入,并注册精确限定到该 agent 的命令;该定义只对这个 agent 遮蔽同名的全局定义。
55
+
56
+ ### 附件
57
+
58
+ 命令可以声明 `input.attachments` 以接受 composer 图片与通用文件。执行器负责强制执行声明:把附件发给未声明的命令、附件存储缺失、会话范围内的文件上传凭证未知或图片批量超出限制,都会在处理器运行前以错误结果结算。图片以 base64 输入通过命令 wire,通用文件则引用后台上传完成后得到的凭证,因此命令提交不会再次读取文件字节。通过准入的 `ImageBlock` 与 `FileBlock` 按用户选择顺序组成冻结的 `invocation.attachments` 数组,其模型可见用途由处理器负责。
59
+
60
+ ### 从适配器分派
61
+
62
+ 交互式适配器调用 `execute(agent, line, attachments, signal)`,传入确切的接收 agent、完整命令行与本次提交的有序附件。它返回已结算的 `CommandExecution`——规范化结果加生命周期配对 `commandId`——语法无效或名称未知时返回 `undefined`。`list(agent)` 与 `find(agent, name)` 在应用 agent 作用域遮蔽后用于命令发现。
63
+
64
+ ### 取消
65
+
66
+ 调用方的中止信号会让注册表停止等待处理器;无视信号的处理器可能在调用方停止等待后继续产生自身的外部副作用。被取消或抛异常的处理器在日志中以 `command/done` 错误结算。
67
+
68
+ -----
69
+
70
+ <a id="understand-the-implementation"></a>
71
+ ## 理解实现
72
+
73
+ <details>
74
+ <summary>实现细节——点击展开</summary>
75
+
76
+ 可观察行为已在[使用本包](#use-this-package)中说明;本节解释注册表的构建方式与其约定的归属。
77
+
78
+ ### 源码地图
79
+
80
+ | 文件 | 职责 |
81
+ |---|---|
82
+ | [`src/index.ts`](src/index.ts) | `CommandRuntime` 服务:注册、作用域、分派、生命周期事件 |
83
+ | [`src/types.ts`](src/types.ts) | 命令定义、描述符、执行与结果类型 |
84
+ | [`src/brand.ts`](src/brand.ts) | 稳定命令定义标识和每次执行的生命周期 id |
85
+
86
+ ### 生命周期事件
87
+
88
+ `execute()` 会生成一个 `commandId`,在处理器运行前追加 `command/run`,并在结算时追加携带结果类型与原样文本的 `command/done`;确切载荷字段见 [`src/index.ts`](src/index.ts)。成功结果可以通过 `sourceEventSeq` 指向更早的一条非命令权威领域事件;处理器抛出或被中止时以 `kind: 'error'` 结算。两个事件都作为仅用于日志的事件直接独立追加:没有轮次包裹它们,持久化机制会在常规检查点和销毁期间排空这些事件。未通过准入的输入(语法无效或名称未知)不记录任何事件。
89
+
90
+ ### 作用域
91
+
92
+ 注册表通过 `ScopedLayers` 维护全局层与按 agent 的作用域层,并按 agent 合并视图。子级注入形态——挂载在 `agent.ctx` 之下的命令生产插件声明自身的 `commands` 注入——保留了 agent 作用域,同时不会让核心 agent loop(智能体循环)依赖 UI 服务。同一层内的名称重复会在注册时失败;注册或移除命令时,系统会通知每个 `commands/change` 观察者,使运行中的适配器能够刷新发现结果。观察者失败会写入日志,既不能否决注册表变更,也不能阻止后续观察者运行。
93
+
94
+ ### 附件准入
95
+
96
+ 附件强制执行发生在执行器中:图片经 `admitEncodedImages` 提交,文件通过唯一的会话感知凭证提供方解析,执行器在调用处理器前恢复原始混合顺序。验证拒绝不会开始写入附件。图片存储失败可能留下等待清理且无法引用的内容寻址对象,但不会发布模型可见消息。取消会在处理器运行前生效。命令返回错误时,分发方 composer 的草稿与附件卡保持原位。
97
+
98
+ </details>
99
+
100
+ -----
101
+
102
+ <a id="further-exploration"></a>
103
+ ## 进一步探索
104
+
105
+ 当包级约定不够用时阅读以下页面。它们从共享命令词汇逐步进入设计证据与相邻表面。
106
+
107
+ - [命令子系统参考](../../../docs/subsystems/commands.zh.md)——注册表语义、输入元数据与 `ctx.commands` 的 Cordis 接口面。
108
+ - [命令注册 Agent Note](../../../.agents/notes/implemented/feature/2026-07-19-plugin-command-registration.zh.md)——此服务背后的边界与分发约定。
109
+ - [交互组映射](../README.zh.md)——相邻的审批、权限与问答包。
110
+ - [Plan mode 包](../../plan/plan-mode/README.zh.md)——一个驱动模型可见工作的已交付命令生产方。
111
+
112
+ -----
113
+
114
+ <a id="model-experience"></a>
115
+ ## 模型体验
116
+
117
+ ### 直接面向用户的命令
118
+
119
+ #### 模型看到的内容
120
+
121
+ 注册表自身不会提交任何内容。已知斜杠命令在 UI 命令平面执行,其 `CommandResult` 文本不会作为用户消息提交。已交付的适配器会拒绝未知斜杠命令输入,而不是将其变成模型提示词。命令生产方可以显式使用接收命令的 `Agent`;例如,[`qilin-plan-mode`](../../plan/plan-mode/README.zh.md#model-and-human-interactions)在选择 plan mode 后,会提交 `/plan [message]` 中的可选消息与有序附件。执行器只负责把附件准入为持久化对象,是否以及如何成为模型可见消息由声明接受的生产方决定。
122
+
123
+ #### Token 影响
124
+
125
+ 命令发现、执行和 UI 输出不会增加模型 token。命令生产方显式安排的 agent 工作与相应 agent 输入具有相同的 token 影响。
126
+
127
+ #### KV Cache 影响
128
+
129
+ 注册表元数据、命令输入和直接输出绝不会进入模型请求,也不会影响其缓存。发生变更的领域负责之后产生的所有缓存影响。
130
+
131
+ ## 已知限制与延期工作
132
+
133
+ <a id="known-limitations-and-deferred-work"></a>
134
+
135
+
136
+ 这些限制说明注册表不提供什么。它们是当前包约束,不是 UI 积压事项。
137
+
138
+ - **仅支持非结构化文本输入**:表单、补全 schema 和类型化参数仍由各命令自行解析。
139
+ - **副作用采用协作式取消**:中止后,分发会停止等待;处理器必须遵循信号,才能停止已经进入外部系统的工作。
140
+
141
+ <a id="dev-note"></a>
142
+ ### 开发备注
143
+
144
+ <details>
145
+ <summary>维护者的工作上下文——点击展开</summary>
146
+
147
+ 无。
148
+
149
+ </details>