@epoch-agent/protocol 2.8.0 → 3.1.1

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/dist/index.d.ts CHANGED
@@ -130,13 +130,147 @@ declare function isPlanOutcome(value: string): value is PlanApprovalOutcome;
130
130
  /**
131
131
  * 权限契约。
132
132
  *
133
- * 5 级权限模型:[Hermes shell_hooks + Codex execpolicy]
133
+ * **两根轴**,档位只是打包名(2026-10-27,抄 codex + deepseek-harness):
134
+ *
135
+ * | 轴 | 取值 | 谁在用 |
136
+ * | ------ | ------------------------------------------------- | ------ |
137
+ * | 审批 | {@link ApprovalPolicy} = `ask` / `never` | 抄 dsh |
138
+ * | 沙箱 | {@link SandboxMode} = 三个词,一字不改地抄 codex | 见下 |
139
+ *
140
+ * 用户选的永远是**档位**(preset),不是某个 knob —— codex 的 `granular` 那四五个
141
+ * 布尔是给企业策略用的,普通用户拧不动。但**底层形状是两根轴**,所以
142
+ * 「不问,但沙箱仍然管着」这种组合将来要放开时不用重写。
143
+ *
144
+ * ## ⚠️ 2026-10-27:`bypass` 并进 `auto`,五档变四档
145
+ *
146
+ * 实测(真 `PermissionManager` 跑 15 项日常操作)合并前的弹窗数是
147
+ * **11 / 5 / 2 / 1**(default / acceptEdits / auto / bypass),而 `auto` 与
148
+ * `bypass` 只差两处:「判不了」那一格,以及规则表 `ask` 那一族。
149
+ * 两档都说不出「用户凭什么选它而不是另一个」,所以按用户 2026-10-27 的拍板合并。
150
+ *
151
+ * **合并的方向是取宽的**(`never`):老 `auto` 会问的那一类「判不了的」
152
+ * (`$(echo rm) -rf /tmp/x`)从此不问。这是合并的直接后果,也是用户明确要的 ——
153
+ * 它正是 `never` 这个语义本身。
154
+ *
155
+ * **老名字 `bypass` 留作别名**({@link LEGACY_LEVEL_ALIASES}),静默映射成 `auto`:
156
+ * 定时任务、`--permission bypass`、脚本里写着的全部照旧能跑,不提示也不报错。
134
157
  */
135
158
 
136
- type PermissionLevel = 'default' | 'acceptEdits' | 'plan' | 'auto' | 'bypass';
159
+ type PermissionLevel = 'default' | 'acceptEdits' | 'plan' | 'auto';
137
160
  /** 合法权限级别清单 —— 用于把配置文件里的自由字符串收窄成 PermissionLevel */
138
161
  declare const PERMISSION_LEVELS: readonly PermissionLevel[];
162
+ /**
163
+ * 老档位名 → 新档位名。**2026-10-27 合并 `auto` + `bypass` 时留下的兼容层。**
164
+ *
165
+ * ## 为什么是静默映射,不是提示也不是报错
166
+ *
167
+ * 用户原话(2026-10-27):「自动映射 不用提示」。三条判据:
168
+ *
169
+ * 1. **写着 `bypass` 的地方多半不是人**:定时任务(`schedule` 的 `permission` 字段)、
170
+ * CI 脚本里的 `--permission bypass`、团队提交进仓库的 `config.yaml`。
171
+ * 给它们弹一句提示,那个提示会出现在**没人读的地方**(无人值守的定时任务);
172
+ * 2. **报错更糟**:升级一次就让所有写着 `bypass` 的定时任务当场停摆,
173
+ * 而它们本来干的事(放开权限跑一遍)在新档位上完全一样;
174
+ * 3. **它不改变语义强度**:`bypass` 是「不问」,`auto` 现在也是「不问」。
175
+ * 会问的那一类「判不了的」是**合并本身**决定的,不是「读到老名字」这个动作决定的
176
+ * —— 换句话说,就算用户手工把配置改成 `auto`,行为也一模一样。
177
+ *
178
+ * ⚠️ **不许把它扩成一张「随便什么词都能落进来」的表**:只认合并前真实存在过的
179
+ * 那一个名字。多认一个词,`permission: bypas` 这种笔误就会静默变成 `auto` ——
180
+ * 那是一个 typo 把权限放到最宽。
181
+ */
182
+ declare const LEGACY_LEVEL_ALIASES: Readonly<Record<string, PermissionLevel>>;
139
183
  declare function isPermissionLevel(value: string): value is PermissionLevel;
184
+ /**
185
+ * **出厂默认档** —— 配置里没写这一格时,新会话从哪一档起。
186
+ *
187
+ * 2026-10-27 由用户拍板,从 `default`(逐条确认)改成 `acceptEdits`(请求批准)。
188
+ * 判据是**日常操作上的弹窗数**(真 `PermissionManager` 跑 15 项):两档是 11 / 5,
189
+ * 而差的那 6 个全部来自「写文件 / 联网 / 跑命令」这三类最常见的动作 ——
190
+ * 一个刚装好、什么都没配的人,第一步就撞在弹窗上。
191
+ *
192
+ * ## ⚠️ 它只管「用户没表态」,不管「判不出来」
193
+ *
194
+ * 这两个意思在代码里各有一批调用点,**别把它们并成一个**:
195
+ *
196
+ * | 语意 | 用谁 | 例子 |
197
+ * | --- | --- | --- |
198
+ * | 用户没表态(出厂默认) | 本常量 | `EpochConfigSchema` 的 `.default()`、认不出的值那一步的回落 |
199
+ * | 我们不知道(保守兜底) | 字面量 `'default'` | 权限层压根没起来时的 `?? 'default'`(`runtime/src/user-shell.ts`、`core/src/agent/prompt.ts`) |
200
+ *
201
+ * 第二族**不许跟着改**:那里没有「用户」可言,而 `acceptEdits` 比 `default` 宽
202
+ * (工作区内写文件、联网都不问)。跟着改的后果是「权限层挂掉」这件事
203
+ * 顺手把一个保守兜底换成了更宽的档 —— 那是一处降级的边界悄悄让开。
204
+ *
205
+ * ⚠️ 一个写着 `permission:` 的老配置不受这里影响:显式值永远赢(`loader` 的
206
+ * 合并顺序)。所以改这一格**不会**把已经写着 `auto` / `bypass` 的机器降下来。
207
+ */
208
+ declare const DEFAULT_PERMISSION_LEVEL: PermissionLevel;
209
+ /**
210
+ * 把外部来的自由字符串收窄成 `PermissionLevel`,**含老档位名的别名解析**。
211
+ *
212
+ * 「收窄 + 认别名」是**一件事**,所以只留这一个入口:调用方先自己
213
+ * `isPermissionLevel()` 再自己去查别名表的话,漏查的那一处表现是
214
+ * 「老配置在 A 路能读、在 B 路读不到」—— 而 B 路多半就是定时任务那条。
215
+ *
216
+ * 认不出来时返回 `undefined`(**不是**兜底成某一档):调用方各自决定
217
+ * 是报错、是忽略、还是落回默认值,那是它们的判断,不是这一个函数的。
218
+ */
219
+ declare function resolvePermissionLevel(value: string): PermissionLevel | undefined;
220
+ /**
221
+ * 审批轴 —— **两个词,一字不改地抄 deepseek-harness**
222
+ * (`APPROVAL_POLICIES = ['ask', 'never']`)。
223
+ *
224
+ * 没抄 codex 那四个(`untrusted` / `on-request` / `granular` / `never`):
225
+ * `untrusted` 是「这个项目不可信」的策略档(我们有自己的信任闸门,那是另一根轴),
226
+ * `on-request` 是**让模型决定何时问**(判据不在静态表里,和本仓库
227
+ * 「命令弹不弹窗不经过 AI」那条红线直接冲突),`granular` 是五六个布尔的企业档。
228
+ * dsh 那两个词够用,而且它已经是「两根轴」的形状。
229
+ *
230
+ * ⚠️ **这一根轴今天是档位的函数,不是独立的配置项**
231
+ * ({@link approvalPolicyForLevel})。用户选档位,档位推轴 —— codex / dsh 都允许
232
+ * 单拧 knob,我们暂时不放开,判据写在 `infra/src/sandbox/policy.ts` 的文件头。
233
+ * 但**形状按两根轴写**:将来放开时改的是「谁能写这个 knob」,不是判定逻辑。
234
+ */
235
+ type ApprovalPolicy = 'ask' | 'never';
236
+ /** 合法审批策略清单。用途同 {@link PERMISSION_LEVELS} */
237
+ declare const APPROVAL_POLICIES: readonly ApprovalPolicy[];
238
+ /**
239
+ * 档位 → 审批轴。**这是「两根轴」在今天的唯一投影点。**
240
+ *
241
+ * | 档位 | 审批 | 为什么 |
242
+ * | ------------- | ---- | ------ |
243
+ * | `plan` | ask | 它仍然会问一句:工作区外的 `file_read`(判据在 `by-level.ts` 的 `checkPlan`)。「只读」限制的是**写**,不是**问** |
244
+ * | `default` | ask | 逐条确认 |
245
+ * | `acceptEdits` | ask | 请求批准(问的东西少了,但还在问) |
246
+ * | `auto` | never | 完全访问:**连「判不了」的都不问** |
247
+ *
248
+ * ⚠️ **`plan` 不是 `never`**:它有一格真的要问(工作区外的读),把这一格
249
+ * 说成 `never` 会让「plan 档下工作区外读文件」那个弹窗变成一句无法解释的例外。
250
+ *
251
+ * ⚠️ **别在别处再写一份这个映射**(比如在 `by-level.ts` 或 UI 里各判一次
252
+ * `level === 'auto'`):两张表分叉的表现是「屏幕说这一档不问,判定却在问」,
253
+ * 而两边各自都自洽。
254
+ */
255
+ declare function approvalPolicyForLevel(level: PermissionLevel): ApprovalPolicy;
256
+ /**
257
+ * 沙箱模式 —— 三个名字一字不改地拄 Codex(`sandbox_mode`)。
258
+ *
259
+ * ## 为什么 protocol 里要再写一份
260
+ *
261
+ * 真源住在 infra 的 `sandbox/policy.ts`(因为它算边界、且 `plugin-terminal`
262
+ * 按分层只依赖 protocol + infra,够不着 core)。而这一格要挂在
263
+ * {@link ToolContext.sandboxEscalation} 上而两份**必须逐字相等** —— 分叉的表现是
264
+ * 「引擎接受了一个 `plugin-terminal` 不认识的词」,而那会静默落回当前档,
265
+ * 也就是**用户批了一次升权、实际什么都没变**。
266
+ *
267
+ * 相等不靠「两边都这么写的」,靠一条用例锁着(core 同时够得着两边):
268
+ * `packages/core/__tests__/sandbox-mode-parity.test.ts`。
269
+ *
270
+ * 为什么不让 protocol 从 infra 拿:protocol 是最底层,infra 依赖 protocol 的方向
271
+ * 反过来就先倒了(`check:layers` 会红)。
272
+ */
273
+ type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';
140
274
  /**
141
275
  * 操作类别。
142
276
  * `code_exec` 单列一类:它跑在 OS 沙箱里(无网、写不出沙箱、读不到 $HOME),
@@ -338,6 +472,25 @@ interface PermissionManager {
338
472
  * 不给等于「只有主工作目录一个根」,也就是方案 29 之前的行为。
339
473
  */
340
474
  getExtraRoots?(): readonly string[];
475
+ /**
476
+ * 这一次会话是不是**无人值守**(CLI 的 `--print` / 评测 / 任何 `interactive: false`
477
+ * 的宿主)。2026-10-27 加。
478
+ *
479
+ * ## 为什么引擎这一层要问它
480
+ *
481
+ * 普通的权限审批不需要问:那一档在 `check()` 里就被 headless 预授权那一层
482
+ * 落成 `requireApproval: false` 了(判据在 `manager.ts` 第 3 层)。
483
+ * 但**沙箱升权那条路绕过了 `check()`**(它是审批之后的第二个问句,
484
+ * 见 `ToolExecutor.resolveEscalation`),于是它自己得判一次 —— 判漏的形态
485
+ * 不是拒绝,是**永久挂在 await 上**:宿主那座桥在无人值守下照样存在
486
+ * (请求进了会话队列,而队列那头没有人)。
487
+ *
488
+ * ⚠️ **别用它顶替 `requireApproval` 的判定**:两者问的不是一件事,
489
+ * 一个是「这一档要不要弹框」,一个是「此刻有没有人能答」。
490
+ *
491
+ * 可选:嵌入宿主不给时按「要问」(`false`)算 —— 那是这一格之前的全部行为。
492
+ */
493
+ isNonInteractive?(): boolean;
341
494
  }
342
495
 
343
496
  /**
@@ -457,6 +610,24 @@ interface ToolContext {
457
610
  * 而那种失败用户报得出来。
458
611
  */
459
612
  sandboxTerminal?: boolean;
613
+ /**
614
+ * **模型请求、用户批准的那一个升权目标**(方案 65 §2.1)。
615
+ *
616
+ * 引擎在 `ToolExecutor.resolveEscalation()` 里校验并审批之后才填它,所以工具侧
617
+ * 拿到的是一份**已经获批**的结论,不该再判一次。消费者只有一个:
618
+ * `plugin-terminal` 的 `sandboxPolicyFor()` —— 它拿它覆盖
619
+ * `sandboxModeForLevel(ctx.permissionLevel)` 推出来的那一档。
620
+ *
621
+ * ## 为什么不给 = 用档位推出来的那一档
622
+ *
623
+ * 缺省朝「严」是刻意的:宿主漏填这一格的表现是「升权没生效」(用户批了一次、
624
+ * 命令还是被挡),报得出来;反方向漏填(默认给个宽的值)是静默失去边界。
625
+ * 同一句话的形状在 {@link sandboxTerminal} 上已经有过一次。
626
+ *
627
+ * ⚠️ **它只对这一次调用生效。** 后台任务 / 持久 shell 会话各自的边界在**创建**
628
+ * 那一刻定下(`startTask` / `openShell`),之后那个值住在会话里,和这一格无关。
629
+ */
630
+ sandboxEscalation?: SandboxMode;
460
631
  /** 取消信号(AbortController.signal) */
461
632
  signal?: {
462
633
  readonly aborted: boolean;
@@ -785,6 +956,16 @@ type Translate = (key: string, vars?: TranslateVars) => string;
785
956
  type FlatCatalog = Record<string, string>;
786
957
  /** 语言 → 拍平的 catalog。宿主注入 / 构建期注入的那份就是这个形状 */
787
958
  type Catalogs = Partial<Record<Lang, FlatCatalog>>;
959
+ /**
960
+ * 把 `{name}` 形式的占位符换成值。**没给的占位符原样留着**。
961
+ *
962
+ * 导出它是因为这条规则现在有第二个消费方:宿主自己写的一整句话
963
+ * (`EpochConfig.scheduleRemoveConfirm` 那种)**不走 catalog**,但它里面的
964
+ * `{name}` 要和 catalog 里那些文案里的 `{name}` 同一个意思。抄一份替换逻辑的
965
+ * 下场是两处对「没给的占位符怎么办」分叉 —— 而这正是 {@link makeTranslate}
966
+ * 那条 ⚠️ 点名不能出的错(换成空串会让一句话看起来完好无损、实际丢了关键信息)。
967
+ */
968
+ declare function fillPlaceholders(text: string, vars: TranslateVars): string;
788
969
  /**
789
970
  * 一句文案里用到的占位符(去重,按出现顺序)。
790
971
  *
@@ -1402,6 +1583,176 @@ interface ActiveAgentRole {
1402
1583
  source?: AgentRoleSource;
1403
1584
  }
1404
1585
 
1586
+ /**
1587
+ * 进程内 Agent 团队(阶段 1:父子单通道)。
1588
+ *
1589
+ * ## 这里只放**跨包**用得上的形状
1590
+ *
1591
+ * 判据照 `index.ts` 文件头那条:是否被两个以上的包共用。团队状态本身住在
1592
+ * `core/src/team/` 的实现里;这里只有 registry 的尸体形状、消息形状、和
1593
+ * 「谁能给谁发」那几条不变量 —— 因为 `core`(工具与 registry)和 `runtime`
1594
+ * (子 agent 接线、父会话的通知源)两边都要认同一套。
1595
+ *
1596
+ * ## 为什么**不**放 `SteerSource`
1597
+ *
1598
+ * 那个接口住在 `core/src/agent/types.ts`,是引擎的入参契约,只有 core 自己
1599
+ * 认识。团队这一层的收件箱只是**实现**它,把一个 core 的内部接口提到 protocol
1600
+ * 等于让 runtime 也依赖引擎的细节 —— 而 runtime 本来就依赖 core,多此一举。
1601
+ *
1602
+ * ## roster 不持久化
1603
+ *
1604
+ * 成员活在进程里:一个子 agent 是一次 `new AgentLoop(...).run()`,跑完就没了。
1605
+ * 所以这张表每个进程一套,进程退出即消失。**讨论板(阶段 3)不是这样** ——
1606
+ * 那个要跨进程,所以它走 SQLite。两者不要混,判据写在 `core/src/team/registry.ts`
1607
+ * 的文件头上。
1608
+ */
1609
+ /** Lead(派活的那个会话)在消息里的固定身份。成员名不许叫这个 */
1610
+ declare const LEAD_AGENT_ID = "lead";
1611
+ /**
1612
+ * 一个成员此刻是什么状态。
1613
+ *
1614
+ * - `running` —— 正在跑一次 `run()`。这时候给它发消息走 steer,**当轮生效**
1615
+ * - `idle` —— 跑完了但还留在表里,消息进收件箱,等下一次 `run()` 才被读到
1616
+ * - `finalized` —— 已经收工,收件箱里的东西不会被任何一轮读到
1617
+ * - `failed` —— 这一次跑挂了(超时 / 抛错 / 被终止)
1618
+ *
1619
+ * ⚠️ `idle` 今天仍然是**没有生产方**的一档:一次 `run()` 结束就标 `finalized`。
1620
+ * 留着它是因为「跑完了但还能接着跑」和「跑完了就这样了」在一张名册上确实是两个
1621
+ * 状态,而阶段 2 的 `followup_task` 落地之后两者**都能被唤醒** —— 区别只在
1622
+ * 前者是「它本来就没收工」、后者是「它收工了,但现在有人叫它」。
1623
+ * 要不要把 `idle` 真的用起来(比如「空转等待下一句话」那档)留给下一个需要它的人。
1624
+ */
1625
+ type AgentMemberStatus = 'running' | 'idle' | 'finalized' | 'failed';
1626
+ /** registry 里一个成员的对外形状。**不含收件箱内容** —— 那是实现细节 */
1627
+ interface AgentMemberInfo {
1628
+ /** 扁平成员名(阶段 1 = 子会话 id,阶段 2 可具名),寻址用它 */
1629
+ agentId: string;
1630
+ /** 这个成员跑在哪个子会话上(会话库里有它那一行,带 `parent_id`) */
1631
+ sessionId: string;
1632
+ /** 派它出来的那个会话 */
1633
+ parentSessionId: string;
1634
+ status: AgentMemberStatus;
1635
+ /** 角色名(`spawn_teammate` / `delegate_task` 的 `role`)。纯展示 */
1636
+ role?: string;
1637
+ /**
1638
+ * 它此刻在干什么,一行人话。给 `list_agents` 和 UI 看。
1639
+ *
1640
+ * 来源是 `SubAgentRunner.onProgress` 那条通道(`session-factory.ts:1517`)。
1641
+ * 没有就是没有 —— 别拿这句当断言。
1642
+ */
1643
+ activity?: string;
1644
+ /** 派出去的时刻(毫秒时间戳) */
1645
+ startedAt: number;
1646
+ /** 收工的时刻。`running` 时没有 */
1647
+ finishedAt?: number;
1648
+ }
1649
+ /**
1650
+ * 一条 agent 之间的消息。
1651
+ *
1652
+ * ## 它不是 `EpochMessage`
1653
+ *
1654
+ * 这条只是**投递凭据**:谁在什么时候给谁说了什么。真正进模型上下文的是
1655
+ * 投递之后折出来的那一句(收件箱那一侧拼 `[来自 X 的消息]` 前缀)。
1656
+ * 把两者混成一个类型的话,「消息送没送到」和「模型看没看到」就分不开了 ——
1657
+ * 而阶段 2 的 `wait_agent` 要的恰恰是前一半。
1658
+ */
1659
+ interface AgentMessage {
1660
+ /** 消息 id。投递失败重试时用它去重(阶段 2) */
1661
+ id: string;
1662
+ /** 发送方:`LEAD_AGENT_ID` 或某个成员的 `agentId` */
1663
+ from: string;
1664
+ /** 接收方:同上 */
1665
+ to: string;
1666
+ text: string;
1667
+ /** 发出时刻(毫秒时间戳) */
1668
+ sentAt: number;
1669
+ }
1670
+ /**
1671
+ * 一条消息进模型上下文时的措辞。
1672
+ *
1673
+ * ⚠️ **两个消费方必须逐字相同**(子 agent 的收件箱注水、父会话的
1674
+ * `TaskNoticeTracker` note):一处写「来自 X 的消息」另一处写「X 说」,
1675
+ * 模型会把它们当成两种不同的来路。真源就是这一个函数。
1676
+ *
1677
+ * 前缀不是装饰:这条消息在模型眼里是 **user 角色**(`steer` 那一帧就是
1678
+ * user),不表明来路的话模型会以为用户在直接跟它说话 —— 而它接下来说的
1679
+ * 每一句都会顺着这个误判走。
1680
+ */
1681
+ declare function agentMessageLine(msg: Pick<AgentMessage, 'from' | 'text'>): string;
1682
+ /** 一条给模型看的 note 标题(父会话那一侧,`TaskNoticeTracker` 拼) */
1683
+ declare const AGENT_MESSAGE_NOTE_TITLE = "Agent \u6D88\u606F";
1684
+ /**
1685
+ * 团队共享任务的状态(阶段 2)。
1686
+ *
1687
+ * `blocked` 是**人/模型说的**,不是引擎推的:我们不去猜「它为什么停住」。
1688
+ * 判据同 `registry.ts` 上 `idle` / `finalized` 那一段 —— 多留一档比将来改协议便宜。
1689
+ */
1690
+ type TeamTaskStatus = 'pending' | 'in_progress' | 'done' | 'blocked';
1691
+ /**
1692
+ * 板子上的一条任务。
1693
+ *
1694
+ * `revision` 是 compare-and-set 的那把尺:调用方拿它去 `update`,对不上就整笔
1695
+ * 拒绝。判据全文在 `core/src/team/tasks.ts` 文件头 —— 它拦的是「两个成员同时
1696
+ * 认领同一件事,后写的静默盖掉前一个」。
1697
+ */
1698
+ interface TeamTask {
1699
+ id: string;
1700
+ title: string;
1701
+ description?: string;
1702
+ status: TeamTaskStatus;
1703
+ /** 谁在干 / 谁建的。空 = 没主 */
1704
+ owner?: string;
1705
+ /** 依赖哪些任务的 id。**只有 id**,不是嵌套对象 —— 免得读一条要递归整张图 */
1706
+ dependsOn: string[];
1707
+ /** 每次写入 +1。`update` 的 `expectedRevision` 对的就是它 */
1708
+ revision: number;
1709
+ createdAt: number;
1710
+ updatedAt: number;
1711
+ }
1712
+ /**
1713
+ * 一次更新能改的字段。
1714
+ *
1715
+ * `undefined` = 「不要动这一格」。**刻意不支持把字段清空**(比如把 `owner` 置空):
1716
+ * 那需要一个显式的哨兵值,而今天没有消费方 —— 判据同 `RunInput` 上那些可选项。
1717
+ */
1718
+ interface TeamTaskPatch {
1719
+ title?: string;
1720
+ description?: string;
1721
+ status?: TeamTaskStatus;
1722
+ owner?: string;
1723
+ }
1724
+ /** 一个频道。`name` 是稳定的寻址键,`id` 只给内部用 */
1725
+ interface BoardChannel {
1726
+ id: string;
1727
+ name: string;
1728
+ description?: string;
1729
+ createdBy: string;
1730
+ createdAt: number;
1731
+ }
1732
+ /** 一个线程 = 一条 root post 加它下面所有回复 */
1733
+ interface BoardThread {
1734
+ id: string;
1735
+ channel: string;
1736
+ /** 取 root post 的第一行,截到 80 字 */
1737
+ title: string;
1738
+ createdBy: string;
1739
+ createdAt: number;
1740
+ /** 最后一条帖子的时间。列表按它倒序 */
1741
+ lastPostAt: number;
1742
+ postCount: number;
1743
+ }
1744
+ /** 一条帖子 */
1745
+ interface BoardPost {
1746
+ /** 全板单调递增。订阅游标(`last_seen_seq`)对的就是它 —— 不是时间戳:
1747
+ * 同一毫秒内的两条会分不开,而那正是「漏看一条」的经典来源 */
1748
+ seq: number;
1749
+ id: string;
1750
+ threadId: string;
1751
+ author: string;
1752
+ text: string;
1753
+ createdAt: number;
1754
+ }
1755
+
1405
1756
  /**
1406
1757
  * 宿主自定义的那几张开场卡片(2026-09-04)—— 画在新会话空屏那句招呼底下。
1407
1758
  *
@@ -1948,8 +2299,8 @@ declare function entryDisplayName(entry: Pick<ModelEntry, 'name' | 'model'>): st
1948
2299
  * | | 单位 | 谁定的 | 换不换 |
1949
2300
  * | --- | --- | --- | --- |
1950
2301
  * | 单价表、`micro-USD` 累加、闸门比较 | **美元** | 上游 provider 的挂牌价 | **不换** |
1951
- * | `costUsd` / `maxCostUsd` / `maxBudgetUsd` / DB 里那几列 | **美元** | 契约 | **不换** |
1952
- * | 用户**输进来**的那几格(设置页、`--max-budget-usd`、定时任务表单) | **美元** | 标签上逐字写着「(美元)」 | **不换** |
2302
+ * | `costUsd` / `maxCostUsd` / DB 里那几列 | **美元** | 契约 | **不换** |
2303
+ * | 用户**输进来**的那几格(设置页、`--max-budget-usd`) | **美元** | 标签上逐字写着「(美元)」 | **不换** |
1953
2304
  * | 屏幕上印出来的每一串金额 | `display.currency` | 用户 | **这里换** |
1954
2305
  *
1955
2306
  * 换句话说,币种在这个仓里**只是一层皮**:它进不了任何一句算术,也进不了任何一个
@@ -1958,7 +2309,7 @@ declare function entryDisplayName(entry: Pick<ModelEntry, 'name' | 'model'>): st
1958
2309
  * 1. **上游单价本来就是美元计价的**(`core/src/provider/model-metadata.ts` 那张静态表、
1959
2310
  * 以及 OpenRouter 抓回来的那份,都是 USD / MTok)。让内部换成别的币种,等于在
1960
2311
  * 每一笔账上多乘一次汇率再除回来 —— 多两次浮点,换不到任何东西;
1961
- * 2. **落盘和网线上的字段名带着 `Usd` 后缀**(`costUsd`、`max_budget_usd`、
2312
+ * 2. **落盘和网线上的字段名带着 `Usd` 后缀**(`costUsd`、`maxCostUsd`、
1962
2313
  * `microUsd`)。让它们装别的币种,字段名当场变成假话,而**没有任何一处会红**;
1963
2314
  * 3. **汇率是会变的,账是不该变的。** 用户今天把 `rate` 从 7.1 改成 7.3,
1964
2315
  * 上个月那几段会话的**历史账**不该跟着动。只在展示时乘一次,这件事自动成立 ——
@@ -2779,6 +3130,23 @@ interface EpochConfig {
2779
3130
  /** 缺省 = `true`(沙箱照常包)。见上面那段「判它必须显式跟 `false` 比」 */
2780
3131
  terminal?: boolean;
2781
3132
  };
3133
+ /**
3134
+ * `delegate_task` 派出去的子任务(2026-10-27)。
3135
+ *
3136
+ * ⚠️ **这一格是 2026-10-27 补上的,而它揭露的那件事值得记一笔**:
3137
+ * 在这之前子任务的时间上限是 `DelegateManager` 构造函数里写死的 `300_000`,
3138
+ * 装配层从 `createDelegateTool(runner, undefined, ...)` 传 `undefined` ——
3139
+ * 于是「5 分钟硬切」这件事用户那边一个字都改不动,而「调研整个仓库」这类活
3140
+ * 十几分钟就过去了。撞上去的表现是汇总里一句 `[超时]`,半截结论不保留。
3141
+ */
3142
+ delegate?: {
3143
+ /**
3144
+ * 一个子任务最多跑多久(秒)。**缺省 900(15 分钟);`0` = 不限时。**
3145
+ *
3146
+ * 卡的是单个子任务,不是整批 —— 三个子任务并发跑,整批最长还是这个数。
3147
+ */
3148
+ taskTimeoutSec?: number;
3149
+ };
2782
3150
  /**
2783
3151
  * 按需发现工具(2026-08-26)。
2784
3152
  *
@@ -2883,6 +3251,42 @@ interface EpochConfig {
2883
3251
  */
2884
3252
  threshold?: number;
2885
3253
  };
3254
+ /**
3255
+ * 单次请求的**体积**上限(2026-10-28)。和 {@link compression} 那一段是两个
3256
+ * 量纲、两条线,别混。
3257
+ *
3258
+ * ## 为什么需要它:token 那条线看不见字节
3259
+ *
3260
+ * | 量纲 | 谁在判 | 一张 2 MB 的截图记多少 |
3261
+ * | --- | --- | --- |
3262
+ * | token | `compression.threshold` / `OVERSIZE_RATIO` | 约一千出头(按宽高估) |
3263
+ * | **字节** | **这一段** | 2.7 MB(base64 是原文的 4/3) |
3264
+ *
3265
+ * 而 chat completions 无状态、每轮重发整段历史 —— 于是「几张截图」在 token
3266
+ * 账上还空着九成,请求体已经撞穿上游网关那条上限了。表现是
3267
+ * `PROVIDER_BODY_TOO_LARGE`(1051)或者上游原话「请求体过大」,而两条 token
3268
+ * 线一个都不会动。
3269
+ *
3270
+ * ## 缺省行为:**有一个保守的缺省值,不是「不管」**
3271
+ *
3272
+ * 这一点和 {@link artifacts} / {@link compression} 那一类「不配就按内置默认」
3273
+ * 是同一个形状。不给这一段时用 core 的
3274
+ * `DEFAULT_MAX_REQUEST_IMAGE_BYTES`,那个数**没有权威出处**(判据写在
3275
+ * `provider/body-limit-cache.ts` 的文件头),它靠「撞一次学一次」自我修正。
3276
+ */
3277
+ limits?: {
3278
+ /**
3279
+ * 单次请求里**所有图片 base64 的合计**上限(字节)。
3280
+ *
3281
+ * ⚠️ 只管图片,不管文本:文本太大时 token 那条线会先抓住(判据在
3282
+ * `context/request-bytes.ts` 的文件头)。所以这个数不必等于请求体总上限,
3283
+ * 它只是「图片这一部分允许占多少」。
3284
+ *
3285
+ * 缺省 = core 的 `DEFAULT_MAX_REQUEST_IMAGE_BYTES`(8 MiB,猜的)。
3286
+ * 撞上一次之后,学到的值会在它更小时顶替它(`effectiveImageBudget`)。
3287
+ */
3288
+ maxRequestImageBytes?: number;
3289
+ };
2886
3290
  /**
2887
3291
  * 长期记忆的三个配额(`MEMORY.md` / `USER.md`,core 的 `memory/manager.ts`)。
2888
3292
  *
@@ -3497,7 +3901,60 @@ interface EpochConfig {
3497
3901
  /** 单个任务的录像总量上限(MB),缺省 64。先撞哪条算哪条 */
3498
3902
  maxRecordingMb?: number;
3499
3903
  };
3904
+ /**
3905
+ * 删一条定时任务时那句确认,宿主可以整句换掉(2026-10-28)。
3906
+ * **缺省 = 我们那句**(`web.ui.auto.remove_confirm`,跟着界面语言翻)。
3907
+ *
3908
+ * 它是「宿主装配期按下的事实」那条路上的一格(`brand` → `sidebarMenu` → `blankCards`
3909
+ * 或 `blankGreeting` → `user` → 这一个):只读、`GET /api/config` 原样下发、
3910
+ * 没配就不带这个键、界面上没有写端点。**别把它当「第 N 个」去数** ——
3911
+ * 那条路上的编号在这份仓库里已经数岔过一次(`userMenuHost` 和 `settingsHidden`
3912
+ * 各被叫作「第六个键」),关系说清楚比序数可靠。
3913
+ *
3914
+ * ## 收 `HostText` 而不是 `string`:理由逐字同 {@link blankGreeting}
3915
+ *
3916
+ * 这句话**今天就在我们的 catalog 里**(中文 / 英文各一份)。照 `brand` 那样收纯
3917
+ * 字符串的话,宿主一配,把界面切成英文的人看到的就是一句中文 —— 而这个框又是
3918
+ * 不可逆动作之前唯一的一道门,看不懂等于没有。
3919
+ *
3920
+ * ## ⚠️ 整句都归宿主,包括「记录和录像找不回来」那半句
3921
+ *
3922
+ * 这是 2026-10-28 用户拍的那一档,代价如实记着:**宿主漏写那半句,屏幕上就没有
3923
+ * 任何地方说这件事**。我们不拦,也不偷偷补一句在后面 —— 一句话被我们补了半句之后,
3924
+ * 宿主改它自己那句话时会发现屏幕上多出来的字不是他写的。
3925
+ *
3926
+ * 默认那一档(不配这个键)因此逐字节等于这一笔之前:屏幕上还是那一整句,
3927
+ * 含「运行记录和录像会一起删掉,找不回来。系统里那条定时也会一起撤掉。」
3928
+ * 宿主真想保留这个警告,把他要改的那半句之外原样抄过去就行 —— `docs/EMBEDDING.md`
3929
+ * 那一段给的样例就是这么写的。
3930
+ *
3931
+ * ## `{name}` 是**唯一**认得的占位符,而且不强制
3932
+ *
3933
+ * 我们那句里 `{name}` 是任务名(`t('…', { name: def.name })` 渲一遍),删掉它
3934
+ * 也让得过去(「确定删除这条任务?」是句说得通的话)。写别的 `{foo}` 不会被替换,
3935
+ * 原样留在屏幕上 —— 判据同 `makeTranslate` 那条「没给的占位符原样留着」:
3936
+ * 换成空串会让一句话看起来完好无损、实际丢了关键信息。
3937
+ *
3938
+ * ⚠️ core 的 schema 会为「一个占位符都没有」的情况产一条 warn 诊断吗?**不会**,
3939
+ * 而且那是刻意的:这一句换掉之后仍然说得通,属于正当配置。诊断只管一种事 ——
3940
+ * 写了 `{name}` 之外的占位符(那多半是想写 `{{name}}` 转义或者抄错了别的键),
3941
+ * 见 `scheduleRemoveConfirmIssues`。
3942
+ *
3943
+ * ⚠️ **空串 / 空表是配错了**(不要自定义就别写这个键),判据同 {@link blankGreeting}:
3944
+ * 一条带字段路径的 warn 诊断然后整份配置退默认值 —— 而这一格退默认的后果很轻,
3945
+ * 屏幕上还是我们那一整句。
3946
+ */
3947
+ scheduleRemoveConfirm?: HostText;
3500
3948
  }
3949
+ /**
3950
+ * 那一句删除确认里**唯一**被替换的占位符(2026-10-28)。
3951
+ *
3952
+ * 值的来源是「这个界面上那条任务叫什么」—— 也就是我们那句 catalog 文案里的
3953
+ * `{name}`。写在 protocol 而不是各写一份:core 的 schema 用它判「宿主写了别的占位符」
3954
+ * (`scheduleRemoveConfirmIssues`),web 用它填值。两处各写一个字面量的话,
3955
+ * 改了一处之后那条诊断会在一个完全正常的新配置上报红。
3956
+ */
3957
+ declare const SCHEDULE_CONFIRM_PLACEHOLDER = "name";
3501
3958
  /**
3502
3959
  * 支持的搜索后端。**三档「不用再办一个账号」的**:
3503
3960
  *
@@ -4242,6 +4699,43 @@ interface EpochToolResult {
4242
4699
  */
4243
4700
  artifacts?: ToolArtifact[];
4244
4701
  }
4702
+ /**
4703
+ * 一次工具调用对某个文件造成的改动(补丁预览)—— **落盘形状**(2026-10-30)。
4704
+ *
4705
+ * 字段就是 `AgentEvent` 里那个 `{ type: 'diff' }` 去掉 `type`:那一帧是直播用的,
4706
+ * 这一份是落库用的,两者讲的是同一件事。
4707
+ *
4708
+ * ## 为什么现在要存它
4709
+ *
4710
+ * 2026-08-18 那次定下的口径是「宿主拿 tool-call 的入参和 tool-result 的输出
4711
+ * 重建,不必在 DB 里再存一份内容快照」。那条口径在 web 上没兑现得了
4712
+ * ——`file_write` 的入参里只有新内容,旧内容不在任何地方,硬画出来是
4713
+ * 「整文件纯新增」,看着像真的但是错的(判据在 `web/src/state/replay.ts` 文件头)。
4714
+ * 于是回放干脆不画,而屏幕上就少了一张卡:切到别的会话再切回来、刷新、
4715
+ * 重启之后,**补丁预览永久消失**(2026-10-30 实测,见 `session-switch.test.tsx`
4716
+ * 那条回归用例)。
4717
+ *
4718
+ * 存下来是唯一能让「直播看到的」和「刷新之后看到的」相同的做法。
4719
+ *
4720
+ * ⚠️ **它属于某一步**,和 `reasoning` 同一个位置:一条 assistant 行就是一步,
4721
+ * 而那一步里可能改了三个文件(三次 diff 帧)。
4722
+ */
4723
+ interface EpochDiffSnapshot {
4724
+ /** 工作区内的相对路径(`/` 分隔),或工作区外的绝对路径 */
4725
+ filePath: string;
4726
+ /** 改动前的内容。**缺** = 这个文件是新建的 */
4727
+ oldContent?: string;
4728
+ /** 改动后的内容。**缺** = 被删了 */
4729
+ newContent?: string;
4730
+ /**
4731
+ * 内容太大、**没存**(只留了路径)。
4732
+ *
4733
+ * 一份 2MB 的日志整份进库会把会话库撑爆,而那种文件本来也不是给人看补丁的。
4734
+ * 回放遇到它画一张「内容过大,未保存」的降级卡 —— **不是空白**:屏幕上凭空
4735
+ * 少一张卡比一张说清楚原因的卡难查得多。
4736
+ */
4737
+ omitted?: 'too-large';
4738
+ }
4245
4739
  /** 文本部件 */
4246
4740
  interface EpochTextPart {
4247
4741
  type: 'text';
@@ -4463,6 +4957,37 @@ declare function filePartSummary(part: EpochFilePart): string;
4463
4957
  * 逐字冻住,理由同 {@link OMIT_LABEL}(进模型 prompt、进 eval 指纹、不进 catalog)。
4464
4958
  */
4465
4959
  declare function imagePartOmittedSummary(part: EpochImagePart): string;
4960
+ /**
4961
+ * 历史里的图因为**请求体太大**被下放之后,留在原位的那一行(2026-10-28)。
4962
+ *
4963
+ * ## 为什么不能复用 {@link imagePartOmittedSummary}
4964
+ *
4965
+ * 那一句的结论是「当前模型不支持图片输入」——**这个场景下它是假话**:模型是
4966
+ * 支持图的,超的是网关那条字节线,而换个模型、换条消息都一样大。更贵的后果是
4967
+ * 它会诱发一个错误的下一步:模型读到「不支持」,会建议用户「重发一次」或者
4968
+ * 「换张图」,而重发多少次、换多小的图都不改变历史里那坨 base64 的体积。
4969
+ *
4970
+ * ## 为什么必须带一个下一步
4971
+ *
4972
+ * 判据同 {@link OMIT_LABEL} 那张表:`denied` 那一档**管用**(原图在 artifact
4973
+ * 目录里躺着,`file_read` 拿得到),所以要指过去;`binary` 那一档不管用,
4974
+ * 所以明说「别回头让用户贴」。这一档属于前者 —— 下放的是**引用**,不是文件,
4975
+ * 文件还在 `<homeDir>/artifacts/<sid>/` 下(判据在 infra 的 `writeArtifact`)。
4976
+ *
4977
+ * ## 逐字冻住
4978
+ *
4979
+ * 理由逐字同 {@link OMIT_LABEL}:它进模型 prompt、进 eval 指纹、**不进 catalog**
4980
+ * (跟着界面语言变的后果见 §33.2)。
4981
+ */
4982
+ declare const OFFLOADED_IMAGE_NOTE = "[\u56FE\u7247\u5DF2\u4E0B\u653E\uFF1A\u539F\u56FE\u4ECD\u5728 artifact \u76EE\u5F55\u91CC\uFF0C\u9700\u8981\u5C31\u8C03 file_read \u6309\u8DEF\u5F84\u53D6\uFF1B\u522B\u8BA9\u7528\u6237\u91CD\u53D1\uFF0C\u91CD\u53D1\u4E5F\u4E0D\u6539\u53D8\u4F53\u79EF]";
4983
+ /**
4984
+ * 把一张图片部件换成上面那句占位。**内容一个字节都不留** —— 这是「下放」的
4985
+ * 全部含义:原图在 artifact 目录里,引用它的是路径,不是 base64。
4986
+ *
4987
+ * `mediaType` 只在有值时才带进占位文案,判据同 {@link imagePartOmittedSummary}
4988
+ * 那半句:不知道就写「未知类型」,别编一个 `image/png`。
4989
+ */
4990
+ declare function offloadedImagePart(): EpochTextPart;
4466
4991
  /**
4467
4992
  * 引用的会话在纯文本投影里长什么样。**不吐那段会话的正文** —— 同 `filePartSummary`。
4468
4993
  *
@@ -4650,9 +5175,19 @@ interface EpochMessage {
4650
5175
  /**
4651
5176
  * 这一步模型的思考原文(推理模型的 `reasoning-delta` 累加)。2026-08-18。
4652
5177
  *
4653
- * **只给人看,不回灌模型**:`sdk-adapter.ts` 一个字都不读它。加它是因为
4654
- * 刷新页面之前屏幕上有「深度思考」那一段,刷新之后整段消失 —— 而那不是
4655
- * 「这一轮没想」,是我们没记。
5178
+ * ## 它现在是**两个**用途,而 2026-10-28 之前只有第一个
5179
+ *
5180
+ * 1. **给人看**:刷新页面之前屏幕上有「深度思考」那一段,刷新之后整段消失 ——
5181
+ * 而那不是「这一轮没想」,是我们没记。
5182
+ * 2. **回灌模型**(2026-10-28 起):DeepSeek 思考模式 + `tools` 时,官方文档
5183
+ * 要求「all previous turns 的 `reasoning_content` 都要原样回传」,漏一发就
5184
+ * `400 The reasoning_content in the thinking mode must be passed back to the API.`
5185
+ * 所以 `loop.ts` 往 `messages` 里 push assistant 时带上它、`sdk-adapter`
5186
+ * 把它翻成 SDK 的 `reasoning` 部件。
5187
+ *
5188
+ * ⚠️ **翻不翻是 provider 的事**,判据在 registry 的 `CARRIES_REASONING_BACK` 上 ——
5189
+ * 别家(google / anthropic / openai…)收到这个部件只会各自改写或报 unsupported
5190
+ * (它们需要的 providerOptions 我们存不下来),所以那几家**一个字都不发**。
4656
5191
  *
4657
5192
  * ⚠️ **它属于某一步,不属于整轮。** 一轮里模型可以想一次、调个工具、再想一次,
4658
5193
  * 每次的思考挂在**它自己那条 assistant 行**上,位置就是它真实的时序位置。
@@ -4664,6 +5199,17 @@ interface EpochMessage {
4664
5199
  * 写过,所以这一档不需要迁移。
4665
5200
  */
4666
5201
  reasoning?: string;
5202
+ /**
5203
+ * 这一步里工具改过的文件(补丁预览,2026-10-30)。
5204
+ *
5205
+ * 和 `reasoning` 同一个位置 —— 都是「某一步的产物」,不是整轮的。
5206
+ * 顺序就是它们发生的顺序;同一步里同一个文件被改两次就有两条。
5207
+ *
5208
+ * ⚠️ **老库里的行没有这一格**(这一列是后加的)。回放见到 `undefined`
5209
+ * 就当这一步没补丁卡,**不许**拿工具入参去凑一个出来(判据在
5210
+ * `EpochDiffSnapshot` 的文件头)。
5211
+ */
5212
+ diffs?: EpochDiffSnapshot[];
4667
5213
  }
4668
5214
 
4669
5215
  /**
@@ -5360,6 +5906,20 @@ type NoticeCode =
5360
5906
  * 第二层意思:那一轮正是这条技能**真的进了 system prompt** 的那一轮。
5361
5907
  */
5362
5908
  'skill-learned'
5909
+ /**
5910
+ * 另一个 agent 发来的话**这次真的进了这一轮的上下文**(2026-11-02)。
5911
+ *
5912
+ * 正文是 `[系统] Agent 消息` + 若干行 `[来自 <谁> 的消息] …`,和
5913
+ * `TaskNoticeTracker` 塞进 `messages` 的那段**逐字相同**。两个消费方:
5914
+ *
5915
+ * - 界面:`notice → info`,两个宿主都画得出来(判据在 view 的 `reducer.ts`);
5916
+ * - 落盘:`AgentSession` 见到这个 code 就往库里补一条 `[系统]` user 行 ——
5917
+ * 在这之前「谁跟我说了什么」只在模型的脑子里,屏幕上和库里都没有。
5918
+ *
5919
+ * ⚠️ **只报成员消息那一半**,后台任务状态同一轮也会进上下文,但它每轮都可能
5920
+ * 变、落进库是噪音(判据在 `TaskNoticeTracker.noticeDetailed`)。
5921
+ */
5922
+ | 'agent-message'
5363
5923
  /**
5364
5924
  * provider **把用户发的图片丢了**,而请求已经发出去、已经计费(2026-09-01)。
5365
5925
  *
@@ -5504,6 +6064,32 @@ type NoticeCode =
5504
6064
  * run 的每一轮都要重新摘一次,逐轮报的话一次多工具调用的对话会刷出十几行。
5505
6065
  */
5506
6066
  | 'history-images-stripped'
6067
+ /**
6068
+ * **历史里那几张图因为请求体太大被下放了**,会话还能继续(2026-10-28)。
6069
+ *
6070
+ * ## 为什么和上面 `history-images-stripped` 不是同一件事
6071
+ *
6072
+ * 两件事触发的原因不同、换一个模型能不能好也不同 —— 判据就是那张分工表:
6073
+ *
6074
+ * | | 为什么摘 | 换个模型会好吗 | 用户能改什么 |
6075
+ * | --- | --- | --- | --- |
6076
+ * | `history-images-stripped` | 这个模型**不认图**(能力) | **会** | 换个认图的模型 |
6077
+ * | 这一条 | 请求体**超了网关的字节线**(体积) | **不会**(一样大) | 删掉旧消息 / 压一次 |
6078
+ *
6079
+ * 合成一条的话,说给用户的那句话会指错方向:用户按「模型不认图」去换模型,
6080
+ * 换完还是发不出去。
6081
+ *
6082
+ * ## 没有这一帧的话,这件事同样静默
6083
+ *
6084
+ * 下放是**有损**的:模型此后看不见那几张像素,而屏幕上那段对话还在。它接下来
6085
+ * 那句「你那张截图里……」会答得对不上,而没有任何线索说过发生了什么。这一点
6086
+ * 逐字同 `context-compacted` 的理由。
6087
+ *
6088
+ * ⚠️ **一次 run 只发一帧**,判据同 `images-dropped`:下放之后同一段历史在每一轮
6089
+ * 都会再被数一遍、很可能再被下放几张,逐轮报的话一次多工具调用的对话会刷出
6090
+ * 十几行同样的话。
6091
+ */
6092
+ | 'images-offloaded'
5507
6093
  /**
5508
6094
  * 用户**自己按了停**,而那一刻在飞的是一次 provider 请求(2026-09-17)。
5509
6095
  *
@@ -5731,7 +6317,22 @@ interface EpochPlugin {
5731
6317
  * HookManager 却是宽的那份。这里合并成唯一一份。
5732
6318
  */
5733
6319
 
5734
- type HookType = 'session:start' | 'session:end' | 'turn:before' | 'turn:after' | 'tool:before' | 'tool:after' | 'stop' | 'compress:after' | 'transform:tool:output' | 'transform:response' | 'transform:user:input' | 'verify:stop';
6320
+ type HookType = 'session:start' | 'session:end'
6321
+ /**
6322
+ * `delegate_task` 派出去的子任务开始 / 结束(2026-10-27)。
6323
+ *
6324
+ * ## 为什么值得两个新事件
6325
+ *
6326
+ * 子 agent 在此之前对 hook 是**完全隐形**的:它跑一整轮、调几十次工具、
6327
+ * 花掉真金白银,而 `session:start` / `stop` 只覆盖主会话。想「每次子任务开始
6328
+ * 时记一笔」「子任务结束时发通知」的插件无处可挂。
6329
+ *
6330
+ * ## `sessionId` 是**子会话**那个
6331
+ *
6332
+ * 和 `session:start` 一致(那个也是当前会话),而父会话 id 在
6333
+ * `event.data.parentSessionId` 里 —— 需要区分两者的插件看那一格。
6334
+ */
6335
+ | 'subagent:start' | 'subagent:stop' | 'turn:before' | 'turn:after' | 'tool:before' | 'tool:after' | 'stop' | 'compress:after' | 'transform:tool:output' | 'transform:response' | 'transform:user:input' | 'verify:stop';
5735
6336
  interface HookEvent {
5736
6337
  type: HookType;
5737
6338
  sessionId: string;
@@ -5923,13 +6524,73 @@ declare const SCHEDULE_MAX_TIMES_PER_DAY = 24;
5923
6524
  */
5924
6525
  declare const SCHEDULE_INTERVAL_MIN_MINUTES = 5;
5925
6526
  declare const SCHEDULE_INTERVAL_MAX_MINUTES: number;
6527
+ /**
6528
+ * 一条**新建**定时任务落在哪一档权限 —— 三条创建路径共用的唯一真源。
6529
+ *
6530
+ * ## 为什么必须是 `auto`(最高档)
6531
+ *
6532
+ * 2026-10-27 用户拍板:「定时任务默认给最高权限」。判据是**定时任务没人可问**:
6533
+ * 它在半夜自己跑,撞到要确认的操作时引擎那条路的结局不是「等一等」而是
6534
+ * **直接拒 + 记一条欠条**(`core/src/permission/manager.ts` 的
6535
+ * `non_interactive_denied`)。于是低档在这里的身价和对话里完全不同:
6536
+ * 对话里选「逐条确认」只是多点几次鼠标,定时任务里选它等于**这个任务到点必然失败**,
6537
+ * 而反馈回路按天算 —— 用户第二天早上才知道。
6538
+ *
6539
+ * 这条结论不是新拍的:web 表单 2026-09-18 就已经把新建默认改成了 `bypass`
6540
+ * (合并后的 `auto`),理由和上面一字不差。真正改的是**另外两条路没跟上**,
6541
+ * 于是同一天建的任务,「在表单里建」和「用 CLI 建」落的是两个档 ——
6542
+ * 而这件事没有任何地方会报错。
6543
+ *
6544
+ * ## ⚠️ 它只管「新建时不说话」,不管「改一条已有任务」
6545
+ *
6546
+ * | 场景 | 用谁 |
6547
+ * | --- | --- |
6548
+ * | 新建(CLI `add` / 表单 blank / `schedule_draft` 的 create) | 本常量 |
6549
+ * | 改一条已有任务时某一格没提 | **那条任务现在的值**,不落回这里 |
6550
+ *
6551
+ * 把第二行也指过来是错的:一份只改了触发器的提案会把权限档从用户设的那一档
6552
+ * 悄悄搬到最宽的一档(`core/src/schedule/draft.ts` 的 `persist` 与
6553
+ * `validateDraft` 都是 `draft.permission ?? current?.permission ?? …`,
6554
+ * 那个 `?? …` 兜的是「current 也没有」这种不该发生的形状)。
6555
+ *
6556
+ * ## 🔴 它带一条硬约束:`auto` 档新建时必须「我明白」
6557
+ *
6558
+ * 判据在 `core/src/schedule/validate.ts` 的 `bypassIssues`:不问人这一档
6559
+ * 存下来之前要过三道网(工作目录不许宽得等于没绑 / 超时必须为正 /
6560
+ * 二次确认)。**默认值改成这一档之后,三条创建路径都替用户把那个确认勾上**
6561
+ * (用户 2026-10-27 明确选的口径:「默认替用户勾上,和 web 表单今天一样」)——
6562
+ * 表单那条路 2026-09-18 就是这么做的(`web/src/automation/form-state.ts` 的
6563
+ * `ackFor()`),CLI 与 `schedule_draft` 现在跟上。
6564
+ *
6565
+ * ⚠️ **「替它勾上」不等于撤掉那道网**:勾是**显式的、看得见的、取消得掉**的
6566
+ * —— 表单里那一勾照旧画在屏幕上,取消了就存不下;另两条路没有勾选框可取消,
6567
+ * 所以它们的确认就是**用户在建这条任务时说的那句话本身**。剩下两道网
6568
+ * (工作目录、超时)三条路一条都没放过。
6569
+ *
6570
+ * ⚠️ **中间那道「尺子必须为正」2026-10-29 缩成了只剩超时**:定时任务那格预算
6571
+ * (`maxBudgetUsd`)整个撤掉了,于是这一档下唯一拦得住「跑飞」的是 `timeoutMs`。
6572
+ * 判据全文在 `validate.ts` 的 `bypassIssues()` 第 2 条上。
6573
+ */
6574
+ declare const SCHEDULE_DEFAULT_PERMISSION: PermissionLevel;
5926
6575
  /**
5927
6576
  * 一次运行的结局。
5928
6577
  *
5929
6578
  * 后三个是「没跑」而不是「跑失败了」,它们必须和 `failed` 分开 ——
5930
6579
  * 界面上把「上一次因为上一次还在跑所以跳过了」显示成红叉,用户会去查一个不存在的故障。
5931
6580
  */
5932
- type ScheduleRunStatus = 'ok' | 'failed' | 'denied' | 'timeout' | 'budget' | 'skipped-overlap' | 'skipped-window' | 'missed';
6581
+ type ScheduleRunStatus = 'ok' | 'failed' | 'denied' | 'timeout'
6582
+ /**
6583
+ * 触顶。
6584
+ *
6585
+ * ⚠️ **2026-10-29 起这个名字有点窄了,但一个字节都别改**:定时任务自己那格
6586
+ * 预算(`maxBudgetUsd`)那天撤掉了,而这个值仍然有两个产出点 ——
6587
+ * `max-turns`(轮次闸门)和跨会话预算 `budget.maxCostUsd` 触顶
6588
+ * (判据在 runtime 执行器的 `FINISH_STATUS` 上)。
6589
+ *
6590
+ * 🔴 **库里老运行记录里躺着这个值**:从联合类型里删掉它,那些行会在读路径上
6591
+ * 变成一个类型上说不出口的状态。改名/删除要配一条数据迁移,不是一次干净的改动。
6592
+ */
6593
+ | 'budget' | 'skipped-overlap' | 'skipped-window' | 'missed';
5933
6594
  /** 合法结局全集。存进库之前用它收窄,别让一个拼错的状态混进 `last_status` */
5934
6595
  declare const SCHEDULE_RUN_STATUSES: readonly ScheduleRunStatus[];
5935
6596
  /**
@@ -6033,16 +6694,21 @@ interface ScheduleDefinition {
6033
6694
  allowTools: readonly string[];
6034
6695
  allowOperations: readonly OperationType[];
6035
6696
  allowRules: readonly string[];
6036
- /** 无人看着的一轮不该比有人看着的更长(交互缺省是 50) */
6037
- maxTurns: number;
6038
6697
  /**
6039
- * **必填,没有默认值。** 这是整个方案唯一一处刻意增加摩擦的地方:
6040
- * 一个假默认会让「一觉醒来 40 美元」变成我们的错。
6698
+ * 轮次上限。**`0` = 不限**(`UNLIMITED_TURNS`),缺省就是这一档。
6699
+ *
6700
+ * ⚠️ **2026-10-29 起定时任务只剩两把尺子**(轮次 / 超时):
6701
+ * 那一天撤掉了 `maxBudgetUsd`(「这一次最多花多少」),判据在
6702
+ * `core/src/schedule/validate.ts` 的 `bypassIssues()` 上。
6703
+ * 于是**无人值守那一路唯一兜得住「跑飞」的是下面那个 `timeoutMs`** ——
6704
+ * 因为这一格的缺省是 0(不限)。要一道轮次闸门的人在新建任务时自己填一个数。
6041
6705
  */
6042
- maxBudgetUsd: number;
6706
+ maxTurns: number;
6043
6707
  /**
6044
- * 墙钟超时。前两把尺子拦不住「一条 `terminal` 命令挂住了」——
6045
- * 那种情况轮次和花费都不增长,这把尺子是唯一能拦它的。
6708
+ * 墙钟超时。**无人值守路上唯一兜得住「跑飞」的那把尺子**(2026-10-29 起)。
6709
+ *
6710
+ * 它要拦两种前一把拦不住的东西:一条 `terminal` 命令挂住了(那种情况下轮次
6711
+ * 不增长),以及一个每轮都很便宜、但一轮接一轮跑下去的循环。
6046
6712
  */
6047
6713
  timeoutMs: number;
6048
6714
  /**
@@ -6275,11 +6941,10 @@ declare function collectPendingApprovals(defs: readonly ScheduleDefinition[], ru
6275
6941
  * - **没有 `id` / `createdAt` / `enabled`**:新建那条的 id 由库生成,提案里猜不出来;
6276
6942
  * `enabled` 在这条路上恒为「启用」(和表单上那个保存键同一档,`register: true`)。
6277
6943
  * 改已有那条时 id 是**入参**(模型得先 `action: 'list'` 看一眼),不是产出。
6278
- * - **`maxBudgetUsd` 是可选而不是必填**:不给时 core 用 `SCHEDULE_FORM_BUDGET_USD`
6279
- * (= 200,和新建表单预填的那一格是同一个常量)。用户定的口径是「按新建任务
6280
- * 那里的来」—— 缺省值因此只有一个真源,**别在这份文件里再抄一个数**
6281
- * (protocol 够不着 core,抄了就是第二份,而它漂走的表现是「不同入口预填的数
6282
- * 不一样」,没有检查抓得到)。
6944
+ * - **`maxBudgetUsd` 已经不存在了**(2026-10-29 撤的):定时任务只剩轮次和
6945
+ * 超时两把尺子,而这两格各有一条路给缺省(`SCHEDULE_DEFAULTS`)。
6946
+ * 预算当年是 optional 而不是必填,因为「不给就用表单那个值」;那条理由
6947
+ * 随着这一格的取消一起没了。
6283
6948
  *
6284
6949
  * ## 为什么住在 protocol
6285
6950
  *
@@ -6362,16 +7027,19 @@ interface ScheduleDraftCreate extends ScheduleDraftAllowlist {
6362
7027
  trigger: ScheduleTrigger;
6363
7028
  /** 工作目录。不给就是引擎那份缺省(`~/.epoch/automation/<id>/`) */
6364
7029
  workDir?: string;
6365
- permission: ScheduleDraftPermission;
6366
7030
  /**
6367
- * 每次最多花多少钱。**不给 = `SCHEDULE_FORM_BUDGET_USD`(200)**,
6368
- * 判据在这个文件头「两个刻意的形状缺口」那一段。
7031
+ * 权限档。**2026-10-27 起可选:不给就落 `SCHEDULE_DEFAULT_PERMISSION`(`auto`)。**
7032
+ *
7033
+ * 判据是「模型没必要把缺省念一遍」。
6369
7034
  *
6370
- * 模型可以给一个更小的数(「这活很轻」),也可以给一个更大的(「要扫大仓」)
6371
- * —— 今天没有硬上限,用户拍的是「不设天花板」。⚠️ 别在这一层夹紧:夹紧会让
6372
- * 模型以为自己给了 500、实际存的是 200,而卡片上印的会是它给的那个数。
7035
+ * ⚠️ 它以前是必填,而那一版的形状在默认档抬到 `auto` 之后变成了陷阱:
7036
+ * 模型不给这一格时整份草稿被拒(`permission 是空的`),而工具描述里写着
7037
+ * 「不给就是 auto」—— 两句话对着同一件事,一句说它可选、一句说必填。
7038
+ *
7039
+ * ⚠️ **`update` 那一支照旧「不给 = 这一格不动」**(那边是补丁语义):
7040
+ * 别把它一并改成落默认值,否则一份只改触发器的提案会把用户设的档搬走。
6373
7041
  */
6374
- maxBudgetUsd?: number;
7042
+ permission?: ScheduleDraftPermission;
6375
7043
  /**
6376
7044
  * 为什么建议这一条,一句话。**给人看的**,会印在卡片上。
6377
7045
  *
@@ -6410,8 +7078,6 @@ interface ScheduleDraftUpdate extends ScheduleDraftAllowlist {
6410
7078
  permission?: ScheduleDraftPermission;
6411
7079
  enabled?: boolean;
6412
7080
  maxTurns?: number;
6413
- /** 同 {@link ScheduleDraftCreate.maxBudgetUsd} */
6414
- maxBudgetUsd?: number;
6415
7081
  timeoutMs?: number;
6416
7082
  /** 同 {@link ScheduleDraftCreate.note},必填 */
6417
7083
  note: string;
@@ -8151,6 +8817,43 @@ interface ContextBreakdown {
8151
8817
  hints: string[];
8152
8818
  /** `hints` 的结构化版本,一一对应、同序。可选:老的生产方不发,判据在 {@link ContextNote} */
8153
8819
  notes?: ContextNote[];
8820
+ /**
8821
+ * 上一次请求的**缓存命中情况**(2026-10-26)。不给 = 这个宿主量不到
8822
+ * (没跑过任何一轮 / 老的生产方没发),不是「命中率为零」。
8823
+ *
8824
+ * ## 为什么它必须在这一屏上
8825
+ *
8826
+ * 「工具表每轮全量重发」在这三家 provider 上的**账单含义完全不同**:
8827
+ * OpenAI / DeepSeek / Gemini 自动按前缀缓存,重发不等于重复计费;
8828
+ * 而 Anthropic 不显式打 `cache_control` 就是**零命中**,一次都不省。
8829
+ *
8830
+ * 也就是说:同样一段代码,同样一条链路,在一家上「只是浪费带宽」,
8831
+ * 在另一家上「每一轮都按全价付」—— 而**界面上一模一样,什么都没说**。
8832
+ * 这一格存在的理由就是把这个差别变成可见的数字:没有它,
8833
+ * 「缓存到底有没有生效」既不能证明也不能证伪,那两处改动就只能靠信念。
8834
+ *
8835
+ * ⚠️ 口径是**最近一次请求**,不是全程累计(同 `promptTokens` 那条注释里
8836
+ * 「一估一真、一前一后」的记录)。累计值会随着高命中的历史越来越好看,
8837
+ * 从而掩盖「刚改的这一处根本没生效」。
8838
+ */
8839
+ cache?: ContextCacheStats;
8840
+ }
8841
+ /** 最近一次请求的缓存账目。三格都是 provider 报的真数,不是估算 */
8842
+ interface ContextCacheStats {
8843
+ /** 这次请求里**命中缓存**的 token 数 */
8844
+ hit: number;
8845
+ /** 这次请求**写进缓存**的 token 数(Anthropic 的 5 分钟 TTL 起算点) */
8846
+ write: number;
8847
+ /**
8848
+ * 这次请求的提示词总量(= 非缓存 + 命中 + 写入,同 `promptTokens()`)。
8849
+ * `hit / prompt` 就是命中率,放在生产侧算,免得两个界面各写一遍除法。
8850
+ */
8851
+ prompt: number;
8852
+ /**
8853
+ * 命中率,**0~100 的整数百分比**。`prompt` 为 0 时它也是 0 ——
8854
+ * 那种情况下 `hit` 必然也是 0,没有除法可做。
8855
+ */
8856
+ hitPercent: number;
8154
8857
  }
8155
8858
 
8156
8859
  /**
@@ -8865,6 +9568,22 @@ interface WireConfigResponse {
8865
9568
  * (见本文件 `diagnostics` 那一格)—— 那一格没得选,它是服务端生成的字符串。
8866
9569
  */
8867
9570
  blankGreeting?: BlankGreeting;
9571
+ /**
9572
+ * 删一条定时任务时那句确认,宿主可以整句换掉 —— **宿主没配就没有这个键**(2026-10-28)。
9573
+ *
9574
+ * 来源是 `EpochConfig.scheduleRemoveConfirm`;形状、默认档、以及「整句都归宿主」
9575
+ * 那笔代价,全文在 `config.ts` 那一格上。
9576
+ *
9577
+ * ⚠️ **原样转发,而且「按语言挑那一份」也不在这一层做** —— 判据逐字同上面
9578
+ * {@link blankGreeting}(那张三行对照表)。这一格只多一件事:**占位符替换也不在
9579
+ * 这儿做**。`{name}` 要等界面那一刻拿到任务名才填得进去,而这一层连「哪一条任务
9580
+ * 在删」都不知道(它不认识某一张卡)。服务端在这里填一遍只会填进空串,
9581
+ * 而那正是「一句话看起来完好无损、实际丢了关键信息」那一档。
9582
+ *
9583
+ * ⚠️ **这一格的默认档和上面 `blankGreeting` 一样是「我们那句」,不是「什么都不
9584
+ * 显示」** —— 不配这个键时屏幕上是我们那一整句,逐字节等于这一笔之前。
9585
+ */
9586
+ scheduleRemoveConfirm?: HostText;
8868
9587
  /**
8869
9588
  * 侧栏最下面那一行「用户」的名字和头像 —— **宿主没配就没有这个键**(2026-09-07)。
8870
9589
  *
@@ -9542,6 +10261,21 @@ interface WireSessionSummary {
9542
10261
  * 一段还没落盘的会话不可能被置顶过(置顶写的是 DB 里那一列)。
9543
10262
  */
9544
10263
  pinned: boolean;
10264
+ /**
10265
+ * 这是**子 agent 的会话**吗(2026-11-02)—— 真身 `sessions.source = 'delegate'`。
10266
+ *
10267
+ * 界面拿它决定两件事,两件都必须按它分:
10268
+ *
10269
+ * 1. **只读那句话怎么说**:子会话说不出工作区决定(那一列是 NULL),
10270
+ * 按普通那档的「接不回来」文案会说成「说不出它当初在哪儿干活」——
10271
+ * 对成员会话是假话(它跑在派它的那段会话的地盘上);
10272
+ * 2. 侧栏列不列那道闸在库里(`SessionDB.listSessions` 的 `includeDelegate`),
10273
+ * 这一格是给「按 id 打开一段」那条路用的。
10274
+ *
10275
+ * 恒有值(普通会话 `false`),不是可选字段:读侧每次都要判它,而一个
10276
+ * 「缺席 = 不知道」的第三档没人消费。
10277
+ */
10278
+ delegate: boolean;
9545
10279
  }
9546
10280
  /**
9547
10281
  * 上面那张接口的必填清单。**要数字段有几个,数这里,别在别处手抄**(抄过去的那份
@@ -10938,6 +11672,63 @@ type WireBindWorkspaceRequest =
10938
11672
  | {
10939
11673
  none: true;
10940
11674
  };
11675
+ /**
11676
+ * `GET /api/sessions/:id/branch` 的响应(2026-10-28)。
11677
+ *
11678
+ * ## 为什么非得是**单独一条端点**(这一条是它存在或不存在的全部判据)
11679
+ *
11680
+ * 分支名这条信息 `GET /api/sessions/:id/diff` 本来就发({@link WireWorkspaceDiffResponse.branch}),
11681
+ * 而那条端点的 JSDoc 里明写着「单独开一条件量端点等于多打一次往返、两屏答案可能
11682
+ * 来自不同一刻」——**那条理由今天仍然成立,它管的只是 diff 屏**:diff 屏上的分支
11683
+ * 和那份改动**必须来自同一刻**,否则一次 `git checkout` 夹在中间就能让「这一屏的
11684
+ * 改动」和「这一屏说的分支」对不上。
11685
+ *
11686
+ * 而托盘那一格要的是另一件事:**它得反复问**(用户或智能体随时可能切分支,我们
11687
+ * 收不到 `git checkout` 的通知,只能轮)。拿 diff 那条来轮是不成立的 —— 它每次
11688
+ * 要 `git diff --raw` 扫全仓、读文件内容、算 blob 大小(`server/src/workspace/diff.ts`
11689
+ * 那套,`MAX_INLINE_BYTES` 那些预算就是为它定的),一个几千文件的仓库每次几百毫秒,
11690
+ * 每 10 秒跑一遍纯粹是白烧 CPU 换一个分支名。
11691
+ *
11692
+ * 所以这一条只做 `repoRoot()` + `currentBranch()` 两条 `rev-parse`:**纯引用解析,
11693
+ * 不碰工作树**(判据在 `server/src/workspace/git.ts` 的 `currentBranch` 上)。
11694
+ *
11695
+ * ## 两个字段都缺席是一个**正常答案**,不是失败
11696
+ *
11697
+ * ```
11698
+ * {} 不是 git 仓库 / 没装 git / 刚 init / detached HEAD / 没绑工作区
11699
+ * {branch:'main'} 在某个分支上,但它没配上游
11700
+ * {branch:'main', upstream:'origin/main'}
11701
+ * ```
11702
+ *
11703
+ * ⚠️ **缺席就是缺席,不拿 `''` 或 `'HEAD'` 顶上** —— 判据逐字沿用
11704
+ * {@link WireWorkspaceDiffResponse.branch} 那一条(「编一个值顶上去就是谎」)。
11705
+ * 界面那一格唯一的画法判据就是「有没有这个字段」:有就画,没有就**整格不画**。
11706
+ *
11707
+ * ⚠️ 第一档里那**五**种现场在网线上是同一个 `{}`,因为它们对界面说的是同一句话
11708
+ * (「这条信息这一发没有」),而屏幕上的下一步也相同(不画那一格)。这**不违反**
11709
+ * 「两个码 ⇔ 用户下一步动作不同」那条拆码判据 —— 那是给**错误体**定的,而这一条
11710
+ * 五档都是 200。真答不上的只有一档:**会话整个不认识**,那是 404 `unknown-session`,
11711
+ * 和别的端点一致。
11712
+ */
11713
+ interface WireSessionBranchResponse {
11714
+ /**
11715
+ * 当前分支名(`main`)。**缺席 = 此刻没有分支可显示**(五档见类型头那三个例子)。
11716
+ *
11717
+ * detached HEAD 那一档必须落在这里:`git rev-parse --abbrev-ref HEAD` 对它的
11718
+ * 回话就是字面量 `HEAD`,照原样发出去屏幕上会写「分支 HEAD」,而用户此刻
11719
+ * 根本不在任何分支上(判据在 `git.ts` 的 `currentBranch` 上)。
11720
+ */
11721
+ branch?: string;
11722
+ /**
11723
+ * 当前分支的上游(`origin/main`)。没有配上游 / `branch` 缺席时一起缺席。
11724
+ *
11725
+ * ⚠️ 只给**配置里写着的那一个**(`@{upstream}`),不自己猜 `origin/<同名>` ——
11726
+ * 猜出来的那个在「本地分支还没推过」时是一条不存在的引用。
11727
+ */
11728
+ upstream?: string;
11729
+ }
11730
+ /** 两个字段都是可选的(`{}` 是合法答案),所以这份清单是空的 —— 同 `WireBindWorkspaceRequest` */
11731
+ declare const WIRE_SESSION_BRANCH_RESPONSE_FIELDS: WireFields<WireSessionBranchResponse>;
10941
11732
  /**
10942
11733
  * 统一的错误体。前端只认 `code` 做分支,`message` 是给人看的。
10943
11734
  *
@@ -11694,6 +12485,13 @@ interface WireCompactResponse {
11694
12485
  reason?: string;
11695
12486
  }
11696
12487
  declare const WIRE_COMPACT_FIELDS: WireFields<WireCompactResponse>;
12488
+ /** `GET /api/team` —— 名册 + 共享任务板 */
12489
+ interface WireTeamResponse {
12490
+ /** 按派出去的先后。空数组是最常见的正常形态 */
12491
+ agents: readonly AgentMemberInfo[];
12492
+ tasks: readonly TeamTask[];
12493
+ }
12494
+ declare const WIRE_TEAM_FIELDS: WireFields<WireTeamResponse>;
11697
12495
 
11698
12496
  /**
11699
12497
  * 一个角色在网线上的样子。
@@ -14917,7 +15715,7 @@ interface WireManagedLock {
14917
15715
  path: string;
14918
15716
  /** 其余各层的三张表整份作废了(`allowManagedPermissionRulesOnly`) */
14919
15717
  rulesOnly: boolean;
14920
- /** 「跳过全部检查」那一档被禁了(`disableBypassPermissionsMode`) */
15718
+ /** 「完全访问」那一档被禁了(`disableBypassPermissionsMode`) */
14921
15719
  bypassDisabled: boolean;
14922
15720
  }
14923
15721
  declare const WIRE_MANAGED_LOCK_FIELDS: WireFields<WireManagedLock>;
@@ -17463,10 +18261,14 @@ declare const WIRE_FILE_OPEN_RESPONSE_FIELDS: WireFields<WireFileOpenResponse>;
17463
18261
  /**
17464
18262
  * 一条校验不通过的原因码。**真源在 core,这是网线上那一份**,见文件头。
17465
18263
  *
17466
- * 二十一条分四组读:四条讲「必填项空着」、三条讲三把尺子、八条讲触发器与生效区间、
17467
- * 一条讲规则语法、四条讲「定时任务 + 跳过全部检查」那个组合。
18264
+ * 二十条分四组读:四条讲「必填项空着」、两条讲两把尺子、八条讲触发器与生效区间、
18265
+ * 一条讲规则语法、四条讲「定时任务 + 完全访问」那个组合。
18266
+ *
18267
+ * ⚠️ **2026-10-29 去掉了 `'budget-missing'`**:定时任务那格预算整个撤了,
18268
+ * 这个码不再有产出点。从两份联合类型里一起删而不是留着 —— 留一个永不产出的码
18269
+ * 要求两侧各写一句它永远不会用上的文案,而那些文案本身就是「这功能还在」的谣言。
17468
18270
  */
17469
- type WireScheduleIssueCode = 'name-empty' | 'prompt-empty' | 'permission-unknown' | 'work-dir-missing' | 'budget-missing' | 'max-turns-invalid' | 'timeout-invalid' | 'trigger-time-invalid' | 'trigger-times-too-many' | 'trigger-weekdays-empty' | 'trigger-days-invalid' | 'trigger-interval-invalid' | 'trigger-once-date-invalid' | 'trigger-once-past' | 'date-range-invalid' | 'date-range-on-once' | 'rule-invalid' | 'bypass-needs-workdir' | 'bypass-workdir-too-broad' | 'bypass-needs-limits' | 'bypass-not-confirmed';
18271
+ type WireScheduleIssueCode = 'name-empty' | 'prompt-empty' | 'permission-unknown' | 'work-dir-missing' | 'max-turns-invalid' | 'timeout-invalid' | 'trigger-time-invalid' | 'trigger-times-too-many' | 'trigger-weekdays-empty' | 'trigger-days-invalid' | 'trigger-interval-invalid' | 'trigger-once-date-invalid' | 'trigger-once-past' | 'date-range-invalid' | 'date-range-on-once' | 'rule-invalid' | 'bypass-needs-workdir' | 'bypass-workdir-too-broad' | 'bypass-needs-limits' | 'bypass-not-confirmed';
17470
18272
  /**
17471
18273
  * 全集。**顺序也钉着** —— 那条「逐项相等」的用例比的是数组,不是集合,
17472
18274
  * 因为顺序对不上通常意味着有人在一边插了一条而另一边追加在末尾。
@@ -17498,42 +18300,15 @@ declare const WIRE_SCHEDULE_CAPABILITY_FIELDS: WireFields<WireScheduleCapability
17498
18300
  * 服务端原样转发。**不让表单自己写死一份**:那两份缺省一改,界面上预填的就是
17499
18301
  * 一个和引擎不一样的值,而它编译得过、跑得通、只是和 CLI 建出来的任务不一致。
17500
18302
  *
17501
- * ## ⚠️ 这一份是「表单该预填什么」,**不是**「没给值时引擎用什么」
17502
- *
17503
- * 两者今天只在 {@link WireScheduleDefaults.maxBudgetUsd} 这一格上分开,而那一格
17504
- * 正是这条分界存在的理由:
17505
- *
17506
- * | 这一份(`WireScheduleDefaults`) | core 的 `SCHEDULE_DEFAULTS` |
17507
- * | --- | --- |
17508
- * | 新建表单打开时那几个格子里**印着**什么 | 调 API / CLI **没给**这一格时引擎兜底用什么 |
17509
- * | 预算在这儿有值(200) | 预算**不在那儿** —— 没给就是 400 |
17510
- *
17511
- * 也就是说:表单上预算那一格是预填的,而**网线那一侧照旧必填**。
17512
- *
17513
- * ## ⚠️ `maxBudgetUsd` 2026-09-18 加进来了,而它撤掉的是方案 45 §3.5
17514
- *
17515
- * 这里原来写着「这个形状里连一个可选的 `maxBudgetUsd?` 都不留 —— 留了下一个人
17516
- * 就会顺手给个 0.50」。那条决定(`--budget` 必填、**没有默认值**,全方案唯一一处
17517
- * 刻意增加的摩擦)**用户撤掉了一半**:表单上它现在预填 200。
17518
- *
17519
- * 留下的那一半是承重的,别跟着一起撤:
17520
- *
17521
- * 1. 表单上**清空了就存不下**(那两个保存按钮 `disabled`);
17522
- * 2. **网线上照旧必填** —— 服务端 `schedule_budget_required` 是 400,CLI 的
17523
- * `--budget` 照旧必给。这一道拦的是别的客户端,而不是坐在表单前的那个人。
18303
+ * ⚠️ **2026-10-29:预算那一格(`maxBudgetUsd`)从这里撤掉了** —— 它当年是
18304
+ * 「表单该预填、而引擎没兜底」那条分界唯一的存在理由,定时任务那格预算整个
18305
+ * 取消之后,这一份和 core 的 `SCHEDULE_DEFAULTS` 也就不再有任何差别。
17524
18306
  */
17525
18307
  interface WireScheduleDefaults {
17526
18308
  /** 无人看着的一轮不该比有人看着的更长(交互缺省是 50) */
17527
18309
  maxTurns: number;
17528
18310
  /** 墙钟超时。唯一能拦住「一条命令挂住了」的那把尺子 */
17529
18311
  timeoutMs: number;
17530
- /**
17531
- * 表单里预算那一格印什么(2026-09-18)。
17532
- *
17533
- * ⚠️ **只是预填**,不是引擎兜底 —— 判据全文在上面那张表上。这一格在
17534
- * core 的 `SCHEDULE_DEFAULTS` 里**没有对应物**,那是刻意的。
17535
- */
17536
- maxBudgetUsd: number;
17537
18312
  allowTools: readonly string[];
17538
18313
  allowOperations: readonly OperationType[];
17539
18314
  allowRules: readonly string[];
@@ -17565,7 +18340,7 @@ interface WireScheduleRow {
17565
18340
  * 这一档权限档下,那份无人值守清单**有没有意义**。
17566
18341
  *
17567
18342
  * `false` 有两种成因,理由正好相反:「只读」档天然零授权面(没有要授权的东西),
17568
- * 「跳过全部检查」已经全放开了(清单管不着任何事)。界面据此把整块灰掉 ——
18343
+ * 「完全访问」已经全放开了(清单管不着任何事)。界面据此把整块灰掉 ——
17569
18344
  * 判据是方案 45 §3.4 末尾那句:留着一份看起来在生效的清单,
17570
18345
  * 会让人以为自己还有一道边界。
17571
18346
  *
@@ -17610,19 +18385,17 @@ declare const WIRE_SCHEDULE_RUNS_FIELDS: WireFields<WireScheduleRunsResponse>;
17610
18385
  /**
17611
18386
  * `POST /api/schedules` 的请求体。
17612
18387
  *
17613
- * 五个必填字段就是「一条任务最少要说清什么」:叫什么、到点了做什么、
17614
- * 多久一次、要不要人确认、**这一次最多花多少钱**。
18388
+ * 四个必填字段就是「一条任务最少要说清什么」:叫什么、到点了做什么、
18389
+ * 多久一次、要不要人确认。
17615
18390
  *
17616
- * ⚠️ `maxBudgetUsd` **必填而且没有缺省**(§3.5 / §十二 第 2 条)。它不在
17617
- * {@link WireScheduleDefaults} 里,也不该在这里写成可选 —— 可选加一个服务端
17618
- * 兜底的默认值,就是那个「一觉醒来 40 美元」的假默认本身。
18391
+ * ⚠️ **2026-10-29 去掉了 `maxBudgetUsd`**(当年是第五个必填)—— 定时任务那格
18392
+ * 预算整个取消了,这一路不再要求、也不再接受它。
17619
18393
  */
17620
18394
  interface WireScheduleCreateRequest {
17621
18395
  name: string;
17622
18396
  prompt: string;
17623
18397
  permission: PermissionLevel;
17624
18398
  trigger: ScheduleTrigger;
17625
- maxBudgetUsd: number;
17626
18399
  /**
17627
18400
  * 工作区。**可选,但不给不等于「继承服务进程的 cwd」** ——
17628
18401
  * 不给就落在 `~/.epoch/automation/<id>/`(判据在 `ScheduleDefinition.workDir` 上:
@@ -17683,7 +18456,6 @@ interface WireScheduleUpdateRequest {
17683
18456
  prompt?: string;
17684
18457
  permission?: PermissionLevel;
17685
18458
  trigger?: ScheduleTrigger;
17686
- maxBudgetUsd?: number;
17687
18459
  workDir?: string | null;
17688
18460
  model?: string | null;
17689
18461
  /** 换身份 / 清掉(`null` = 回到默认 agent)。见 {@link WireScheduleCreateRequest.role} */
@@ -18685,4 +19457,4 @@ declare const SECRET_SERVICE = "epoch-agent";
18685
19457
  */
18686
19458
  declare const MCP_DATA_KEY_NAME = "mcp-auth-data-key";
18687
19459
 
18688
- export { ACTION_CONTEXTS, AGENT_ROLE_NAME_PATTERN, API_KEY_ENV_VARS, APPEARANCE_ACCENTS, APPEARANCE_BACKGROUND_FITS, APPEARANCE_BACKGROUND_KINDS, APPEARANCE_BACKGROUND_ON_PARAM, APPEARANCE_CODE_FONTS, APPEARANCE_CODE_FONT_SIZE, APPEARANCE_CONTRAST, APPEARANCE_DEFAULT_CODE_FONT_SIZE, APPEARANCE_DEFAULT_FONT_SIZE, APPEARANCE_DIFF_TREE_WIDTH, APPEARANCE_FIRST_SCREEN_FIELDS, APPEARANCE_FIRST_SCREEN_FIELD_ORDER, APPEARANCE_FONT_SIZE, APPEARANCE_LANGS, APPEARANCE_MOTION, APPEARANCE_ROOT_ATTRIBUTES, APPEARANCE_SIDEBAR_WIDTH, APPEARANCE_THEMES, APPEARANCE_THEME_NAME_MAX, APPEARANCE_TRANSLUCENT, APPEARANCE_UI_FONTS, APPROVAL_OUTCOMES, type ActiveAgentRole, type AgentEvent, type AgentEventOf, type AgentEventType, type AgentRole, type AgentRoleScope, type AgentRoleSource, type AppearanceAccent, type AppearanceAccentValue, type AppearanceBackground, type AppearanceBackgroundFit, type AppearanceBackgroundKind, type AppearanceCodeFont, type AppearanceEffectiveTheme, type AppearanceFirstScreenField, type AppearanceFirstScreenKind, type AppearanceLang, type AppearanceModePatch, type AppearanceMotion, type AppearanceTheme, type AppearanceUiFont, type AppearanceVisualSource, type ApprovalAnswer, type ApprovalOutcome, type ApprovalReply, type ApprovalRequest, type ApprovalScope, type ArtifactKind, type AttributeValue, type Attributes, BRAND_WHEN_SIDEBAR_COLLAPSED, type BackgroundTaskInfo, type BackgroundTaskKind, type BackgroundTaskStatus, type BlankCard, type BlankGreeting, type BoundKey, type BrandWhenSidebarCollapsed, type BudgetBreach, COMMAND_NAME_PATTERN, COMPLIANCE_ACTIONS, COMPLIANCE_CATEGORIES, CURRENCIES, type Catalogs, type ComplianceAction, type ComplianceCategory, type ContextBreakdown, type ContextNote, type ContextSegment, type ContextSegmentKind, type Currency, type CurrencyDisplay, type CustomCommandDef, type CustomCommandSource, DEFAULT_AGENT_ROLE, DEFAULT_LANG, type DecidedTrustLevel, type Diagnostic, DiagnosticSink, type DiagnosticStatus, ENTRY_REF_PREFIX, ENTRY_SECRET_PREFIX, type EpochConfig, type EpochContentPart, type EpochFilePart, type EpochHook, type EpochImagePart, type EpochMessage, type EpochMessageRole, type EpochPlugin, type EpochSessionPart, type EpochSkill, type EpochTextPart, type EpochTool, type EpochToolCall, type EpochToolResult, type EpochTurnFacts, type EpochUserCommand, type EpochUserContent, type ExpandedCommand, FOLLOW_SYSTEM, type FileOmitReason, type FinishReason, type FixableApproval, type FlatCatalog, type FormatMoneyOptions, GEN_AI, HEADLESS_INPUT_EVENT_TYPES, HEADLESS_INPUT_FORMATS, HEADLESS_OUTPUT_FORMATS, HEADLESS_PROTOCOL_VERSION, type HeadlessEnvelope, type HeadlessEvent, type HeadlessInit, type HeadlessInputEvent, type HeadlessInputEventType, type HeadlessInputFormat, type HeadlessLifecycleEvent, type HeadlessOutputFormat, type HeadlessResult, type HeadlessResultReason, type HookContext, type HookEvent, type HookHandler, type HookManager, type HookRegistration, type HookType, type HostText, type HostUser, type Hsv, type JsonSchema, KEY_ACTIONS, type KeyAction, type KeyChord, type KeyContext, type KeySequence, type KeybindingReport, type KeybindingSource, type KeybindingTable, LANGS, LINK_CLICKED_MESSAGE_TYPE, type Lang, type LinkClickedMessage, type LocalizedDetail, type LogFn, MAX_ATTACH_BYTES, MAX_ATTACH_FILES, MAX_ATTACH_TOTAL_BYTES, MAX_HEADER_CHARS, MAX_LINK_URL, MAX_OPTIONS, MAX_QUESTIONS, MAX_SESSION_ATTACH_BYTES, MAX_SESSION_REFS, MCP_DATA_KEY_NAME, METRIC, MIN_OPTIONS, MODEL_ENTRY_PROTOCOLS, type MentionSet, type ModelEntry, type ModelEntryCapabilities, type ModelEntryProtocol, type ModelRef, type ModelSelection, type ModelSelectionOrigin, type MoneyDigits, NOOP_TELEMETRY, type NoticeCode, OPENABLE_LINK_SCHEMES, OPEN_SETTINGS_MESSAGE_TYPE, OPERATION_TYPES, OVERSIZE_RATIO, type OpenSettingsMessage, type Operation, type OperationType, PERMISSION_LEVELS, PLAN_OUTCOMES, PLUGIN_CATEGORY_DISPLAY_SEP, PLUGIN_MENU_MESSAGE_TYPE, PLUGIN_PREVIEW_STREAM_MIME, PLUGIN_UPLOAD_MULTI_SEP, PROVIDER_INFOS, PROVIDER_TYPES, type PermissionDecision, type PermissionLevel, type PermissionManager, type PermissionRuleLists, type PlanApprovalOutcome, type PlanProposal, type PluginContext, type PluginMenuMessage, type ProviderInfo, type ProviderType, type QuestionAnswer, type QuestionItem, type QuestionOption, type QuestionPage, type QuestionRequest, REASONING_EFFORTS, REASONING_OFF, RESERVED_CHORDS, RESERVED_COMMAND_NAMES, type ReasoningChoice, type ReasoningEffort, type ReasoningState, type RejectReason, type RejectedKey, type ResolvedAppearanceVisual, type RuleValue, SCHEDULE_DRAFT_SAVED_MARK, SCHEDULE_DRAFT_TOOL, SCHEDULE_INTERVAL_MAX_MINUTES, SCHEDULE_INTERVAL_MIN_MINUTES, SCHEDULE_MAX_TIMES_PER_DAY, SCHEDULE_RUN_STATUSES, SEARCH_API_KEY_ENV, SEARCH_PROVIDER_TYPES, SECRET_SERVICE, SEQUENCE_CONTEXTS, SESSION_MENTION_PREFIX, SESSION_REFERENCE_ERROR_CODES, SETTINGS_PANE_IDS, SHELL_KINDS, SIDEBAR_MENU_MESSAGE_TYPE, SIMULTANEOUS_CONTEXTS, SYSTEM_NOTE_PREFIX, type ScheduleAllowlist, type ScheduleBackendKind, type ScheduleCronTrigger, type ScheduleCycle, type ScheduleDefinition, type ScheduleDraft, type ScheduleDraftAllowlist, type ScheduleDraftCreate, type ScheduleDraftPermission, type ScheduleDraftUpdate, type SchedulePendingApproval, type SchedulePendingItem, type ScheduleRun, type ScheduleRunStatus, type ScheduleRunnerSpec, type ScheduleTrigger, type ScheduleTriggerKind, type ScheduleWeekday, type ScheduleWideningKind, type SearchProviderType, type SecretBackendId, type SecretStore, type SelectionContext, type SelectionRejection, type SelectionWarning, type SessionAttachKind, type SessionAttachResult, type SessionOmitReason, type SessionSurfaceMessage, type SessionSurfaceView, type SetSelectionResult, type SettingsPaneId, type SettingsPaneItem, type ShellKind, type SidebarMenuItem, type SidebarMenuMessage, type SidebarNavItem, type SpanLike, type SubToolCall, type SubToolCallResult, type Telemetry, type TokenUsage, type ToolAnnotations, type ToolArtifact, type ToolArtifactInput, type ToolContext, type ToolDefinition, ToolExposure, type ToolProvider, type ToolResult, type Translate, type TranslateVars, type TrustExecGrant, type TrustGrant, type TrustLevel, type TrustManager, type TrustRecord, type TrustScope, type TrustTier, UNLIMITED_TURNS, USER_MENU_MESSAGE_TYPE, type UserMenuMessage, type VerifyResult, WIRE_ABORT_FIELDS, WIRE_ABOUT_FIELDS, WIRE_AGENT_ROLE_FIELDS, WIRE_APPEARANCE_RESPONSE_FIELDS, WIRE_APPROVAL_CACHE_REVOKE_REQUEST_FIELDS, WIRE_APPROVAL_CACHE_REVOKE_RESPONSE_FIELDS, WIRE_APPROVAL_LIST_FIELDS, WIRE_APPROVAL_ROW_FIELDS, WIRE_ARTIFACTS_FIELDS, WIRE_ATTACHMENT_FOLDER_FIELDS, WIRE_ATTACHMENT_UPLOAD_FIELDS, WIRE_AUDIT_LOG_FIELDS, WIRE_AUDIT_ROW_FIELDS, WIRE_AUTH_COOKIE, WIRE_AUTH_COOKIE_ATTRS, WIRE_AUTH_TOKEN_PARAM, WIRE_BACKGROUND_TASK_FIELDS, WIRE_BLOCKED_GOALS_FIELDS, WIRE_BLOCKED_GOAL_FIELDS, WIRE_BLOCKED_LEVEL_FIELDS, WIRE_BUILTIN_CONNECTOR_FIELDS, WIRE_CACHED_APPROVAL_FIELDS, WIRE_CAPABILITIES_FIELDS, WIRE_CAPABILITY_PROJECT_FIELDS, WIRE_CHECKPOINT_LIST_FIELDS, WIRE_CHECKPOINT_SUMMARY_FIELDS, WIRE_COMMANDS_FIELDS, WIRE_COMMAND_EXPANSION_FIELDS, WIRE_COMPACT_FIELDS, WIRE_COMPRESSION_LINE_FIELDS, WIRE_CONFIG_FIELDS, WIRE_CONTEXT_FIELDS, WIRE_CREATE_SESSION_FIELDS, WIRE_CREATE_WORKSPACE_FIELDS, WIRE_CREATE_WORKSPACE_RESPONSE_FIELDS, WIRE_CUSTOM_COMMAND_FIELDS, WIRE_DELETE_SESSION_FIELDS, WIRE_DIFF_FILE_FIELDS, WIRE_DIFF_FILE_RESPONSE_FIELDS, WIRE_ERROR_FIELDS, WIRE_FILE_CANDIDATES_FIELDS, WIRE_FILE_CANDIDATE_FIELDS, WIRE_FILE_CHANGE_FIELDS, WIRE_FILE_OPEN_RESPONSE_FIELDS, WIRE_FILE_REFERENCE_FIELDS, WIRE_FILE_STAT_MAX, WIRE_FILE_STAT_OK_FIELDS, WIRE_FILE_STAT_REFUSED_FIELDS, WIRE_FILE_STAT_RESPONSE_FIELDS, WIRE_FILE_TEXT_RESPONSE_FIELDS, WIRE_FORGET_WORKSPACE_FIELDS, WIRE_FORGET_WORKSPACE_RESPONSE_FIELDS, WIRE_GOAL_ACTIONS, WIRE_GOAL_BLOCK_FIELDS, WIRE_GOAL_CLEAR_FIELDS, WIRE_GOAL_CREATE_FIELDS, WIRE_GOAL_FIELDS, WIRE_GOAL_LIMITS_FIELDS, WIRE_GOAL_PHASES, WIRE_GOAL_REFUSALS, WIRE_GOAL_RESPONSE_FIELDS, WIRE_GOAL_WRITE_FIELDS, WIRE_HEALTH_FIELDS, WIRE_IMAGE_REFERENCE_FIELDS, WIRE_KNOWN_WORKSPACE_FIELDS, WIRE_LANG_PARAM, WIRE_LAST_SESSION_FIELDS, WIRE_LAST_SESSION_RESPONSE_FIELDS, WIRE_MANAGED_LOCK_FIELDS, WIRE_MCP_ADD_FIELDS, WIRE_MCP_ADD_RESPONSE_FIELDS, WIRE_MCP_APPLY_ENTRY_FIELDS, WIRE_MCP_APPLY_RESPONSE_FIELDS, WIRE_MCP_CONFIG_APPLY_FIELDS, WIRE_MCP_CONFIG_FIELDS, WIRE_MCP_CONFIG_ISSUE_FIELDS, WIRE_MCP_CONFIG_SAVE_FIELDS, WIRE_MCP_CONFIG_SAVE_RESPONSE_FIELDS, WIRE_MCP_CONNECTOR_FIELDS, WIRE_MCP_RECONNECT_FIELDS, WIRE_MESSAGE_LIST_FIELDS, WIRE_MODEL_ENTRIES_FIELDS, WIRE_MODEL_ENTRY_MODELS_FIELDS, WIRE_MODEL_ENTRY_SAVE_FIELDS, WIRE_MODEL_ENTRY_TEST_FIELDS, WIRE_MODEL_FIELDS, WIRE_MODEL_SELECTION_FIELDS, WIRE_MODEL_SET_FIELDS, WIRE_PATCH_SESSION_FIELDS, WIRE_PATCH_SESSION_RESPONSE_FIELDS, WIRE_PERMISSION_RULE_FIELDS, WIRE_PERMISSION_SET_REQUEST_FIELDS, WIRE_PERMISSION_SET_RESPONSE_FIELDS, WIRE_PERMISSION_SHADOW_FIELDS, WIRE_PERMISSION_STATE_FIELDS, WIRE_PERMISSION_STATUS_FIELDS, WIRE_PLAN_ACTIONS, WIRE_PLAN_FIELDS, WIRE_PLAN_MODE_REQUEST_FIELDS, WIRE_PLAN_MODE_RESPONSE_FIELDS, WIRE_PLAN_MODE_STATE_FIELDS, WIRE_PLUGINS_FIELDS, WIRE_PLUGIN_ACTION_FIELDS, WIRE_PLUGIN_ARCHIVE_SUFFIXES, WIRE_PLUGIN_INSTALL_FIELDS, WIRE_PLUGIN_LOCAL_FIELDS, WIRE_PLUGIN_LOCAL_INSTALL_FIELDS, WIRE_PLUGIN_MARKETPLACE_FIELDS, WIRE_PLUGIN_MARKETPLACE_RESPONSE_FIELDS, WIRE_PLUGIN_NAME_FIELDS, WIRE_PLUGIN_PREVIEW_FIELDS, WIRE_PLUGIN_PREVIEW_RESPONSE_FIELDS, WIRE_PLUGIN_REFRESH_RESPONSE_FIELDS, WIRE_PLUGIN_STAGE_FIELDS, WIRE_PLUGIN_STAGE_RESPONSE_FIELDS, WIRE_PLUGIN_TOGGLE_FIELDS, WIRE_PLUGIN_UPDATE_FIELDS, WIRE_PLUGIN_UPLOAD_CONFIRM_FIELDS, WIRE_PLUGIN_UPLOAD_FIELDS, WIRE_PLUGIN_UPLOAD_FORM_FIELDS, WIRE_PLUGIN_UPLOAD_PREVIEW_RESPONSE_FIELDS, WIRE_PLUGIN_UPLOAD_RESPONSE_FIELDS, WIRE_PLUGIN_VIEW_FIELDS, WIRE_PLUGIN_VIEW_RESPONSE_FIELDS, WIRE_POLICY_DIR_FIELDS, WIRE_POLICY_STATUS_FIELDS, WIRE_PROJECT_INVENTORY_FIELDS, WIRE_PROVIDER_GROUPS, WIRE_QUESTION_LIST_FIELDS, WIRE_QUESTION_ROW_FIELDS, WIRE_RESPOND_APPROVAL_FIELDS, WIRE_RESPOND_APPROVAL_RESPONSE_FIELDS, WIRE_RESPOND_QUESTION_FIELDS, WIRE_RESPOND_QUESTION_RESPONSE_FIELDS, WIRE_REVIVE_FIELDS, WIRE_REWIND_FILE_PLAN_FIELDS, WIRE_REWIND_OUTCOME_FIELDS, WIRE_REWIND_PREVIEW_FIELDS, WIRE_REWIND_REQUEST_FIELDS, WIRE_REWIND_RESPONSE_FIELDS, WIRE_REWIND_SCOPES, WIRE_ROLES_FIELDS, WIRE_ROLE_ADD_FIELDS, WIRE_ROLE_ADD_RESPONSE_FIELDS, WIRE_ROLE_REMOVE_FIELDS, WIRE_RUNNING_SCHEDULE_FIELDS, WIRE_SANDBOX_STATUS_FIELDS, WIRE_SCHEDULE_CAPABILITY_FIELDS, WIRE_SCHEDULE_CREATE_FIELDS, WIRE_SCHEDULE_DEFAULTS_FIELDS, WIRE_SCHEDULE_DELETE_FIELDS, WIRE_SCHEDULE_FIELDS, WIRE_SCHEDULE_FIX_FIELDS, WIRE_SCHEDULE_FIX_REQUEST_FIELDS, WIRE_SCHEDULE_ISSUE_CODES, WIRE_SCHEDULE_LIST_FIELDS, WIRE_SCHEDULE_PENDING_FIELDS, WIRE_SCHEDULE_RECORDING_FIELDS, WIRE_SCHEDULE_ROW_FIELDS, WIRE_SCHEDULE_RUNNING_FIELDS, WIRE_SCHEDULE_RUNS_FIELDS, WIRE_SCHEDULE_RUN_FIELDS, WIRE_SCHEDULE_SAVE_FIELDS, WIRE_SECURITY_FIELDS, WIRE_SECURITY_WORKSPACE_FIELDS, WIRE_SEND_MESSAGE_FIELDS, WIRE_SEND_MESSAGE_RESPONSE_FIELDS, WIRE_SESSION_CANDIDATES_FIELDS, WIRE_SESSION_CANDIDATE_FIELDS, WIRE_SESSION_FINISH_FIELDS, WIRE_SESSION_LIST_FIELDS, WIRE_SESSION_REFERENCE_FIELDS, WIRE_SESSION_RESPONSE_FIELDS, WIRE_SESSION_SUMMARY_FIELDS, WIRE_SESSION_WORKSPACE_FIELDS, WIRE_SESSION_WORKSPACE_RESPONSE_FIELDS, WIRE_SETTINGS_FIELDS, WIRE_SETTINGS_WRITE_FIELDS, WIRE_SETTINGS_WRITE_REQUEST_FIELDS, WIRE_SETTING_PENDING_FIELDS, WIRE_SETTING_ROW_FIELDS, WIRE_SETTING_STEP_FIELDS, WIRE_SETTING_WRITE_FIELDS, WIRE_SETTING_WRITE_LAYERS, WIRE_SKILL_BODY_FIELDS, WIRE_SKILL_DROP_SUFFIXES, WIRE_SKILL_FIELDS, WIRE_SKILL_IMPORT_FIELDS, WIRE_SKILL_IMPORT_PREVIEW_FIELDS, WIRE_SKILL_REMOVE_FIELDS, WIRE_SKILL_STAGE_FIELDS, WIRE_TASKS_FIELDS, WIRE_TOOLS_FIELDS, WIRE_TOOL_GATE_FIELDS, WIRE_TOOL_ROW_FIELDS, WIRE_TRUST_REQUEST_FIELDS, WIRE_TRUST_REQUEST_RESPONSE_FIELDS, WIRE_WITHDRAW_MESSAGE_FIELDS, WIRE_WORKSPACE_DIFF_FIELDS, WIRE_WORKSPACE_DIRS_FIELDS, WIRE_WORKSPACE_DIR_ENTRY_FIELDS, WIRE_WORKSPACE_REF_FIELDS, type WireAbortResponse, type WireAbout, type WireAgentEnvelope, type WireAgentEvent, type WireAgentRoleSummary, type WireAppearanceRequest, type WireAppearanceResponse, type WireApprovalCacheRevokeRequest, type WireApprovalCacheRevokeResponse, type WireApprovalListResponse, type WireApprovalRequest, type WireArtifactsResponse, type WireAttachmentFolderResponse, type WireAttachmentUploadResponse, type WireAuditCode, type WireAuditLog, type WireAuditOutcome, type WireAuditRow, type WireAuthDenyReason, type WireAuthDenyStatus, type WireAuthGuard, type WireAuthRequestView, type WireAuthVerdict, type WireBackgroundTask, type WireBindWorkspaceRequest, type WireBlockedGoal, type WireBlockedGoalsResponse, type WireBlockedLevel, type WireBuiltinConnector, type WireCachedApproval, type WireCachedDecision, type WireCapabilitiesResponse, type WireCapabilityProject, type WireCheckpointListResponse, type WireCheckpointSummary, type WireCommandExpansion, type WireCommandsResponse, type WireCompactRequest, type WireCompactResponse, type WireCompressionLine, type WireConfigResponse, type WireContextResponse, type WireCreateSessionRequest, type WireCreateSessionResponse, type WireCreateWorkspaceRequest, type WireCreateWorkspaceResponse, type WireCustomCommand, type WireDeleteSessionResponse, type WireDiffFile, type WireDiffFileResponse, type WireDiffNote, type WireDiffOmitReason, type WireDiffSource, type WireDiffStatus, type WireEffectiveModel, type WireEffectiveSlots, type WireEntryProbeCode, type WireEntryProvider, type WireEnvelope, type WireErrorResponse, type WireEvent, type WireFields, type WireFileCandidate, type WireFileCandidatesResponse, type WireFileChange, type WireFileKind, type WireFileOpenRefusal, type WireFileOpenResponse, type WireFileReference, type WireFileRefusal, type WireFileStat, type WireFileStatOk, type WireFileStatRefused, type WireFileStatResponse, type WireFileTextResponse, type WireFixture, type WireFixtureCase, type WireForgetWorkspaceRequest, type WireForgetWorkspaceResponse, type WireGoal, type WireGoalBlock, type WireGoalClearResponse, type WireGoalCreateRequest, type WireGoalLimits, type WireGoalPhase, type WireGoalRefusal, type WireGoalResponse, type WireGoalUpdateRequest, type WireGoalWriteResponse, type WireHealthResponse, type WireHostBadgeRequest, type WireHostBadges, type WireHostCompose, type WireHostComposeRequest, type WireHostComposeResponse, type WireHostComposeStateResponse, type WireHostComposeTakeResponse, type WireHubEnvelope, type WireHubEvent, type WireImageReference, type WireKnownWorkspace, type WireKnownWorkspaceRef, type WireLastSessionRequest, type WireLastSessionResponse, type WireManagedLock, type WireMcpAddRequest, type WireMcpAddResponse, type WireMcpApplyAction, type WireMcpApplyEntry, type WireMcpApplyResponse, type WireMcpConfigApplyRequest, type WireMcpConfigIssue, type WireMcpConfigResponse, type WireMcpConfigSaveRequest, type WireMcpConfigSaveResponse, type WireMcpConnector, type WireMcpReconnectResponse, type WireMessageListResponse, type WireModelCaveat, type WireModelEffortRequest, type WireModelEffortResponse, type WireModelEntriesResponse, type WireModelEntry, type WireModelEntryModelsResponse, type WireModelEntryProbeRequest, type WireModelEntryRefRequest, type WireModelEntryRefs, type WireModelEntrySaveRequest, type WireModelEntrySaveResponse, type WireModelEntryTestResponse, type WireModelRejection, type WireModelResponse, type WireModelSelection, type WireModelSetRequest, type WireModelSetResponse, type WirePatchSessionRequest, type WirePatchSessionResponse, type WirePermissionRememberFailure, type WirePermissionRuleRow, type WirePermissionSetRequest, type WirePermissionSetResponse, type WirePermissionShadow, type WirePermissionState, type WirePermissionStatus, type WirePickDirectoryResponse, type WirePlanAction, type WirePlanModeRequest, type WirePlanModeResponse, type WirePlanModeState, type WirePlanResponse, type WirePluginActionResponse, type WirePluginCategory, type WirePluginCounts, type WirePluginDependency, type WirePluginDependencyInventory, type WirePluginDependencyStatus, type WirePluginDoc, type WirePluginDocs, type WirePluginEntry, type WirePluginHit, type WirePluginHookTally, type WirePluginInstallRequest, type WirePluginLocalInstallRequest, type WirePluginLocalRequest, type WirePluginMarketplace, type WirePluginMarketplaceRequest, type WirePluginMarketplaceResponse, type WirePluginMenuItem, type WirePluginNameRequest, type WirePluginPanel, type WirePluginPreview, type WirePluginPreviewRequest, type WirePluginPreviewResponse, type WirePluginPreviewStreamLine, type WirePluginProgressStep, type WirePluginRefreshResponse, type WirePluginRefuseReason, type WirePluginSourceType, type WirePluginStageRequest, type WirePluginStageResponse, type WirePluginStatus, type WirePluginToggleRequest, type WirePluginUpdateRequest, type WirePluginUploadChoice, type WirePluginUploadConfirmRequest, type WirePluginUploadField, type WirePluginUploadFieldName, type WirePluginUploadFields, type WirePluginUploadFile, type WirePluginUploadForm, type WirePluginUploadPlan, type WirePluginUploadPreviewResponse, type WirePluginUploadRequest, type WirePluginUploadResponse, type WirePluginVersionUnmet, type WirePluginViewRequest, type WirePluginViewResponse, type WirePluginVisibility, type WirePluginsResponse, type WirePolicyDir, type WirePolicyStatus, type WireProjectInventory, type WireProviderGroup, type WireQuestionListResponse, type WireQuestionRequest, type WireReplayMessage, type WireResetReason, type WireRespondApprovalRequest, type WireRespondApprovalResponse, type WireRespondQuestionRequest, type WireRespondQuestionResponse, type WireReviveResponse, type WireRewindAction, type WireRewindDrift, type WireRewindFilePlan, type WireRewindOutcome, type WireRewindPreview, type WireRewindRequest, type WireRewindResponse, type WireRewindScope, type WireRoleAddRequest, type WireRoleAddResponse, type WireRoleRemoveFailure, type WireRoleRemoveResponse, type WireRolesResponse, type WireRunningSchedule, type WireSandboxReason, type WireSandboxStatus, type WireScheduleCapability, type WireScheduleCreateRequest, type WireScheduleDefaults, type WireScheduleDeleteResponse, type WireScheduleFixRequest, type WireScheduleFixResponse, type WireScheduleIssue, type WireScheduleIssueCode, type WireScheduleListResponse, type WireSchedulePendingResponse, type WireScheduleRecordingResponse, type WireScheduleRegisterRefusal, type WireScheduleRegisterWarning, type WireScheduleRegistration, type WireScheduleResponse, type WireScheduleRow, type WireScheduleRunResponse, type WireScheduleRunningResponse, type WireScheduleRunsResponse, type WireScheduleSaveResponse, type WireScheduleUpdateRequest, type WireSecurityResponse, type WireSecurityWorkspace, type WireSendMessageRequest, type WireSendMessageResponse, type WireSessionCandidate, type WireSessionCandidatesResponse, type WireSessionFinish, type WireSessionListResponse, type WireSessionReference, type WireSessionResponse, type WireSessionSummary, type WireSessionWorkspace, type WireSessionWorkspaceResponse, type WireSettingApply, type WireSettingFutile, type WireSettingLayer, type WireSettingPending, type WireSettingRow, type WireSettingStep, type WireSettingValue, type WireSettingValueKind, type WireSettingWrite, type WireSettingWriteLayer, type WireSettingsResponse, type WireSettingsWriteRequest, type WireSettingsWriteResponse, type WireSkillBodyResponse, type WireSkillImportConflict, type WireSkillImportEntry, type WireSkillImportFailure, type WireSkillImportForm, type WireSkillImportIssue, type WireSkillImportPreviewResponse, type WireSkillImportResponse, type WireSkillRemoveFailure, type WireSkillRemoveResponse, type WireSkillStageFailure, type WireSkillStageResponse, type WireSkillSummary, type WireSummaryWorkspace, type WireTaggedEvent, type WireTasksResponse, type WireToolGate, type WireToolGateAxis, type WireToolRow, type WireToolSummary, type WireToolVerdict, type WireToolsResponse, type WireTrustRequestRequest, type WireTrustRequestResponse, type WireTurnState, type WireWithdrawMessageResponse, type WireWorkspaceBinding, type WireWorkspaceDiffResponse, type WireWorkspaceDirEntry, type WireWorkspaceDirsResponse, type WireWorkspaceRef, accentScale, apiKeyEnvVar, appearanceInlineVars, appearanceRootAttributes, appearanceVisualCss, assertNeverPart, assistantTurnText, attachSessionSurface, chordId, collectPendingApprovals, compressionThresholdTokens, conformsToWire, contentToText, cronTimes, diagnosticToLine, encodeAppearanceFirstScreenValue, entryDisplayName, entryRef, entrySecretName, extractAllMentions, extractMentions, extractSessionMentions, filePartSummary, flattenCatalog, formatAppearanceTranslucent, formatMoney, getProviderInfo, hasFailure, hexToHsv, hsvToHex, imagePartOmittedSummary, isAppearanceAccent, isAppearanceAccentValue, isAppearanceBackground, isAppearanceBackgroundFit, isAppearanceBackgroundKind, isAppearanceCodeFont, isAppearanceCodeFontSize, isAppearanceContrast, isAppearanceDiffTreeWidth, isAppearanceFontSize, isAppearanceLang, isAppearanceModePatch, isAppearanceMotion, isAppearanceSidebarWidth, isAppearanceTheme, isAppearanceThemeName, isAppearanceTranslucent, isAppearanceUiFont, isApprovalOutcome, isContextNearlyFull, isCurrency, isEntrySecretName, isHeadlessInputFormat, isHeadlessLifecycleEvent, isHeadlessOutputFormat, isHexColor, isKeyAction, isLang, isMentionableFilePath, isModelEntryId, isOpenableLink, isOperationType, isPermissionLevel, isPlanOutcome, isPromptOversize, isProviderType, isQuestionAnswerMap, isReasoningEffort, isSearchProviderType, isSettingsPaneId, isValidAgentRoleName, isValidCommandName, isWireGoalPhase, isWireHubEvent, isWirePlanAction, isWirePluginArchiveName, isWireRewindScope, isWireSettingWriteLayer, isWireSkillDropName, joinUploadMulti, makeTranslate, mcpConnectorState, normalizeAppearanceTranslucent, normalizeApproval, packSessionSurface, parseAppearanceTranslucentText, parseChord, parseModelRef, parseSequence, perAction, placeholdersOf, promptTokens, relativeLuminance, resolveAppearanceVisual, resolveHostText, sequenceId, sessionPartSummary, snapAppearanceContrast, splitUploadMulti, stripSystemNote, systemNote, tableOf, totalUsageTokens, translatorFor, truncateToBudget, turnDigest, unfixedRules, utf8ByteLength, wireFields };
19460
+ export { ACTION_CONTEXTS, AGENT_MESSAGE_NOTE_TITLE, AGENT_ROLE_NAME_PATTERN, API_KEY_ENV_VARS, APPEARANCE_ACCENTS, APPEARANCE_BACKGROUND_FITS, APPEARANCE_BACKGROUND_KINDS, APPEARANCE_BACKGROUND_ON_PARAM, APPEARANCE_CODE_FONTS, APPEARANCE_CODE_FONT_SIZE, APPEARANCE_CONTRAST, APPEARANCE_DEFAULT_CODE_FONT_SIZE, APPEARANCE_DEFAULT_FONT_SIZE, APPEARANCE_DIFF_TREE_WIDTH, APPEARANCE_FIRST_SCREEN_FIELDS, APPEARANCE_FIRST_SCREEN_FIELD_ORDER, APPEARANCE_FONT_SIZE, APPEARANCE_LANGS, APPEARANCE_MOTION, APPEARANCE_ROOT_ATTRIBUTES, APPEARANCE_SIDEBAR_WIDTH, APPEARANCE_THEMES, APPEARANCE_THEME_NAME_MAX, APPEARANCE_TRANSLUCENT, APPEARANCE_UI_FONTS, APPROVAL_OUTCOMES, APPROVAL_POLICIES, type ActiveAgentRole, type AgentEvent, type AgentEventOf, type AgentEventType, type AgentMemberInfo, type AgentMemberStatus, type AgentMessage, type AgentRole, type AgentRoleScope, type AgentRoleSource, type AppearanceAccent, type AppearanceAccentValue, type AppearanceBackground, type AppearanceBackgroundFit, type AppearanceBackgroundKind, type AppearanceCodeFont, type AppearanceEffectiveTheme, type AppearanceFirstScreenField, type AppearanceFirstScreenKind, type AppearanceLang, type AppearanceModePatch, type AppearanceMotion, type AppearanceTheme, type AppearanceUiFont, type AppearanceVisualSource, type ApprovalAnswer, type ApprovalOutcome, type ApprovalPolicy, type ApprovalReply, type ApprovalRequest, type ApprovalScope, type ArtifactKind, type AttributeValue, type Attributes, BRAND_WHEN_SIDEBAR_COLLAPSED, type BackgroundTaskInfo, type BackgroundTaskKind, type BackgroundTaskStatus, type BlankCard, type BlankGreeting, type BoardChannel, type BoardPost, type BoardThread, type BoundKey, type BrandWhenSidebarCollapsed, type BudgetBreach, COMMAND_NAME_PATTERN, COMPLIANCE_ACTIONS, COMPLIANCE_CATEGORIES, CURRENCIES, type Catalogs, type ComplianceAction, type ComplianceCategory, type ContextBreakdown, type ContextCacheStats, type ContextNote, type ContextSegment, type ContextSegmentKind, type Currency, type CurrencyDisplay, type CustomCommandDef, type CustomCommandSource, DEFAULT_AGENT_ROLE, DEFAULT_LANG, DEFAULT_PERMISSION_LEVEL, type DecidedTrustLevel, type Diagnostic, DiagnosticSink, type DiagnosticStatus, ENTRY_REF_PREFIX, ENTRY_SECRET_PREFIX, type EpochConfig, type EpochContentPart, type EpochDiffSnapshot, type EpochFilePart, type EpochHook, type EpochImagePart, type EpochMessage, type EpochMessageRole, type EpochPlugin, type EpochSessionPart, type EpochSkill, type EpochTextPart, type EpochTool, type EpochToolCall, type EpochToolResult, type EpochTurnFacts, type EpochUserCommand, type EpochUserContent, type ExpandedCommand, FOLLOW_SYSTEM, type FileOmitReason, type FinishReason, type FixableApproval, type FlatCatalog, type FormatMoneyOptions, GEN_AI, HEADLESS_INPUT_EVENT_TYPES, HEADLESS_INPUT_FORMATS, HEADLESS_OUTPUT_FORMATS, HEADLESS_PROTOCOL_VERSION, type HeadlessEnvelope, type HeadlessEvent, type HeadlessInit, type HeadlessInputEvent, type HeadlessInputEventType, type HeadlessInputFormat, type HeadlessLifecycleEvent, type HeadlessOutputFormat, type HeadlessResult, type HeadlessResultReason, type HookContext, type HookEvent, type HookHandler, type HookManager, type HookRegistration, type HookType, type HostText, type HostUser, type Hsv, type JsonSchema, KEY_ACTIONS, type KeyAction, type KeyChord, type KeyContext, type KeySequence, type KeybindingReport, type KeybindingSource, type KeybindingTable, LANGS, LEAD_AGENT_ID, LEGACY_LEVEL_ALIASES, LINK_CLICKED_MESSAGE_TYPE, type Lang, type LinkClickedMessage, type LocalizedDetail, type LogFn, MAX_ATTACH_BYTES, MAX_ATTACH_FILES, MAX_ATTACH_TOTAL_BYTES, MAX_HEADER_CHARS, MAX_LINK_URL, MAX_OPTIONS, MAX_QUESTIONS, MAX_SESSION_ATTACH_BYTES, MAX_SESSION_REFS, MCP_DATA_KEY_NAME, METRIC, MIN_OPTIONS, MODEL_ENTRY_PROTOCOLS, type MentionSet, type ModelEntry, type ModelEntryCapabilities, type ModelEntryProtocol, type ModelRef, type ModelSelection, type ModelSelectionOrigin, type MoneyDigits, NOOP_TELEMETRY, type NoticeCode, OFFLOADED_IMAGE_NOTE, OPENABLE_LINK_SCHEMES, OPEN_SETTINGS_MESSAGE_TYPE, OPERATION_TYPES, OVERSIZE_RATIO, type OpenSettingsMessage, type Operation, type OperationType, PERMISSION_LEVELS, PLAN_OUTCOMES, PLUGIN_CATEGORY_DISPLAY_SEP, PLUGIN_MENU_MESSAGE_TYPE, PLUGIN_PREVIEW_STREAM_MIME, PLUGIN_UPLOAD_MULTI_SEP, PROVIDER_INFOS, PROVIDER_TYPES, type PermissionDecision, type PermissionLevel, type PermissionManager, type PermissionRuleLists, type PlanApprovalOutcome, type PlanProposal, type PluginContext, type PluginMenuMessage, type ProviderInfo, type ProviderType, type QuestionAnswer, type QuestionItem, type QuestionOption, type QuestionPage, type QuestionRequest, REASONING_EFFORTS, REASONING_OFF, RESERVED_CHORDS, RESERVED_COMMAND_NAMES, type ReasoningChoice, type ReasoningEffort, type ReasoningState, type RejectReason, type RejectedKey, type ResolvedAppearanceVisual, type RuleValue, SCHEDULE_CONFIRM_PLACEHOLDER, SCHEDULE_DEFAULT_PERMISSION, SCHEDULE_DRAFT_SAVED_MARK, SCHEDULE_DRAFT_TOOL, SCHEDULE_INTERVAL_MAX_MINUTES, SCHEDULE_INTERVAL_MIN_MINUTES, SCHEDULE_MAX_TIMES_PER_DAY, SCHEDULE_RUN_STATUSES, SEARCH_API_KEY_ENV, SEARCH_PROVIDER_TYPES, SECRET_SERVICE, SEQUENCE_CONTEXTS, SESSION_MENTION_PREFIX, SESSION_REFERENCE_ERROR_CODES, SETTINGS_PANE_IDS, SHELL_KINDS, SIDEBAR_MENU_MESSAGE_TYPE, SIMULTANEOUS_CONTEXTS, SYSTEM_NOTE_PREFIX, type SandboxMode, type ScheduleAllowlist, type ScheduleBackendKind, type ScheduleCronTrigger, type ScheduleCycle, type ScheduleDefinition, type ScheduleDraft, type ScheduleDraftAllowlist, type ScheduleDraftCreate, type ScheduleDraftPermission, type ScheduleDraftUpdate, type SchedulePendingApproval, type SchedulePendingItem, type ScheduleRun, type ScheduleRunStatus, type ScheduleRunnerSpec, type ScheduleTrigger, type ScheduleTriggerKind, type ScheduleWeekday, type ScheduleWideningKind, type SearchProviderType, type SecretBackendId, type SecretStore, type SelectionContext, type SelectionRejection, type SelectionWarning, type SessionAttachKind, type SessionAttachResult, type SessionOmitReason, type SessionSurfaceMessage, type SessionSurfaceView, type SetSelectionResult, type SettingsPaneId, type SettingsPaneItem, type ShellKind, type SidebarMenuItem, type SidebarMenuMessage, type SidebarNavItem, type SpanLike, type SubToolCall, type SubToolCallResult, type TeamTask, type TeamTaskPatch, type TeamTaskStatus, type Telemetry, type TokenUsage, type ToolAnnotations, type ToolArtifact, type ToolArtifactInput, type ToolContext, type ToolDefinition, ToolExposure, type ToolProvider, type ToolResult, type Translate, type TranslateVars, type TrustExecGrant, type TrustGrant, type TrustLevel, type TrustManager, type TrustRecord, type TrustScope, type TrustTier, UNLIMITED_TURNS, USER_MENU_MESSAGE_TYPE, type UserMenuMessage, type VerifyResult, WIRE_ABORT_FIELDS, WIRE_ABOUT_FIELDS, WIRE_AGENT_ROLE_FIELDS, WIRE_APPEARANCE_RESPONSE_FIELDS, WIRE_APPROVAL_CACHE_REVOKE_REQUEST_FIELDS, WIRE_APPROVAL_CACHE_REVOKE_RESPONSE_FIELDS, WIRE_APPROVAL_LIST_FIELDS, WIRE_APPROVAL_ROW_FIELDS, WIRE_ARTIFACTS_FIELDS, WIRE_ATTACHMENT_FOLDER_FIELDS, WIRE_ATTACHMENT_UPLOAD_FIELDS, WIRE_AUDIT_LOG_FIELDS, WIRE_AUDIT_ROW_FIELDS, WIRE_AUTH_COOKIE, WIRE_AUTH_COOKIE_ATTRS, WIRE_AUTH_TOKEN_PARAM, WIRE_BACKGROUND_TASK_FIELDS, WIRE_BLOCKED_GOALS_FIELDS, WIRE_BLOCKED_GOAL_FIELDS, WIRE_BLOCKED_LEVEL_FIELDS, WIRE_BUILTIN_CONNECTOR_FIELDS, WIRE_CACHED_APPROVAL_FIELDS, WIRE_CAPABILITIES_FIELDS, WIRE_CAPABILITY_PROJECT_FIELDS, WIRE_CHECKPOINT_LIST_FIELDS, WIRE_CHECKPOINT_SUMMARY_FIELDS, WIRE_COMMANDS_FIELDS, WIRE_COMMAND_EXPANSION_FIELDS, WIRE_COMPACT_FIELDS, WIRE_COMPRESSION_LINE_FIELDS, WIRE_CONFIG_FIELDS, WIRE_CONTEXT_FIELDS, WIRE_CREATE_SESSION_FIELDS, WIRE_CREATE_WORKSPACE_FIELDS, WIRE_CREATE_WORKSPACE_RESPONSE_FIELDS, WIRE_CUSTOM_COMMAND_FIELDS, WIRE_DELETE_SESSION_FIELDS, WIRE_DIFF_FILE_FIELDS, WIRE_DIFF_FILE_RESPONSE_FIELDS, WIRE_ERROR_FIELDS, WIRE_FILE_CANDIDATES_FIELDS, WIRE_FILE_CANDIDATE_FIELDS, WIRE_FILE_CHANGE_FIELDS, WIRE_FILE_OPEN_RESPONSE_FIELDS, WIRE_FILE_REFERENCE_FIELDS, WIRE_FILE_STAT_MAX, WIRE_FILE_STAT_OK_FIELDS, WIRE_FILE_STAT_REFUSED_FIELDS, WIRE_FILE_STAT_RESPONSE_FIELDS, WIRE_FILE_TEXT_RESPONSE_FIELDS, WIRE_FORGET_WORKSPACE_FIELDS, WIRE_FORGET_WORKSPACE_RESPONSE_FIELDS, WIRE_GOAL_ACTIONS, WIRE_GOAL_BLOCK_FIELDS, WIRE_GOAL_CLEAR_FIELDS, WIRE_GOAL_CREATE_FIELDS, WIRE_GOAL_FIELDS, WIRE_GOAL_LIMITS_FIELDS, WIRE_GOAL_PHASES, WIRE_GOAL_REFUSALS, WIRE_GOAL_RESPONSE_FIELDS, WIRE_GOAL_WRITE_FIELDS, WIRE_HEALTH_FIELDS, WIRE_IMAGE_REFERENCE_FIELDS, WIRE_KNOWN_WORKSPACE_FIELDS, WIRE_LANG_PARAM, WIRE_LAST_SESSION_FIELDS, WIRE_LAST_SESSION_RESPONSE_FIELDS, WIRE_MANAGED_LOCK_FIELDS, WIRE_MCP_ADD_FIELDS, WIRE_MCP_ADD_RESPONSE_FIELDS, WIRE_MCP_APPLY_ENTRY_FIELDS, WIRE_MCP_APPLY_RESPONSE_FIELDS, WIRE_MCP_CONFIG_APPLY_FIELDS, WIRE_MCP_CONFIG_FIELDS, WIRE_MCP_CONFIG_ISSUE_FIELDS, WIRE_MCP_CONFIG_SAVE_FIELDS, WIRE_MCP_CONFIG_SAVE_RESPONSE_FIELDS, WIRE_MCP_CONNECTOR_FIELDS, WIRE_MCP_RECONNECT_FIELDS, WIRE_MESSAGE_LIST_FIELDS, WIRE_MODEL_ENTRIES_FIELDS, WIRE_MODEL_ENTRY_MODELS_FIELDS, WIRE_MODEL_ENTRY_SAVE_FIELDS, WIRE_MODEL_ENTRY_TEST_FIELDS, WIRE_MODEL_FIELDS, WIRE_MODEL_SELECTION_FIELDS, WIRE_MODEL_SET_FIELDS, WIRE_PATCH_SESSION_FIELDS, WIRE_PATCH_SESSION_RESPONSE_FIELDS, WIRE_PERMISSION_RULE_FIELDS, WIRE_PERMISSION_SET_REQUEST_FIELDS, WIRE_PERMISSION_SET_RESPONSE_FIELDS, WIRE_PERMISSION_SHADOW_FIELDS, WIRE_PERMISSION_STATE_FIELDS, WIRE_PERMISSION_STATUS_FIELDS, WIRE_PLAN_ACTIONS, WIRE_PLAN_FIELDS, WIRE_PLAN_MODE_REQUEST_FIELDS, WIRE_PLAN_MODE_RESPONSE_FIELDS, WIRE_PLAN_MODE_STATE_FIELDS, WIRE_PLUGINS_FIELDS, WIRE_PLUGIN_ACTION_FIELDS, WIRE_PLUGIN_ARCHIVE_SUFFIXES, WIRE_PLUGIN_INSTALL_FIELDS, WIRE_PLUGIN_LOCAL_FIELDS, WIRE_PLUGIN_LOCAL_INSTALL_FIELDS, WIRE_PLUGIN_MARKETPLACE_FIELDS, WIRE_PLUGIN_MARKETPLACE_RESPONSE_FIELDS, WIRE_PLUGIN_NAME_FIELDS, WIRE_PLUGIN_PREVIEW_FIELDS, WIRE_PLUGIN_PREVIEW_RESPONSE_FIELDS, WIRE_PLUGIN_REFRESH_RESPONSE_FIELDS, WIRE_PLUGIN_STAGE_FIELDS, WIRE_PLUGIN_STAGE_RESPONSE_FIELDS, WIRE_PLUGIN_TOGGLE_FIELDS, WIRE_PLUGIN_UPDATE_FIELDS, WIRE_PLUGIN_UPLOAD_CONFIRM_FIELDS, WIRE_PLUGIN_UPLOAD_FIELDS, WIRE_PLUGIN_UPLOAD_FORM_FIELDS, WIRE_PLUGIN_UPLOAD_PREVIEW_RESPONSE_FIELDS, WIRE_PLUGIN_UPLOAD_RESPONSE_FIELDS, WIRE_PLUGIN_VIEW_FIELDS, WIRE_PLUGIN_VIEW_RESPONSE_FIELDS, WIRE_POLICY_DIR_FIELDS, WIRE_POLICY_STATUS_FIELDS, WIRE_PROJECT_INVENTORY_FIELDS, WIRE_PROVIDER_GROUPS, WIRE_QUESTION_LIST_FIELDS, WIRE_QUESTION_ROW_FIELDS, WIRE_RESPOND_APPROVAL_FIELDS, WIRE_RESPOND_APPROVAL_RESPONSE_FIELDS, WIRE_RESPOND_QUESTION_FIELDS, WIRE_RESPOND_QUESTION_RESPONSE_FIELDS, WIRE_REVIVE_FIELDS, WIRE_REWIND_FILE_PLAN_FIELDS, WIRE_REWIND_OUTCOME_FIELDS, WIRE_REWIND_PREVIEW_FIELDS, WIRE_REWIND_REQUEST_FIELDS, WIRE_REWIND_RESPONSE_FIELDS, WIRE_REWIND_SCOPES, WIRE_ROLES_FIELDS, WIRE_ROLE_ADD_FIELDS, WIRE_ROLE_ADD_RESPONSE_FIELDS, WIRE_ROLE_REMOVE_FIELDS, WIRE_RUNNING_SCHEDULE_FIELDS, WIRE_SANDBOX_STATUS_FIELDS, WIRE_SCHEDULE_CAPABILITY_FIELDS, WIRE_SCHEDULE_CREATE_FIELDS, WIRE_SCHEDULE_DEFAULTS_FIELDS, WIRE_SCHEDULE_DELETE_FIELDS, WIRE_SCHEDULE_FIELDS, WIRE_SCHEDULE_FIX_FIELDS, WIRE_SCHEDULE_FIX_REQUEST_FIELDS, WIRE_SCHEDULE_ISSUE_CODES, WIRE_SCHEDULE_LIST_FIELDS, WIRE_SCHEDULE_PENDING_FIELDS, WIRE_SCHEDULE_RECORDING_FIELDS, WIRE_SCHEDULE_ROW_FIELDS, WIRE_SCHEDULE_RUNNING_FIELDS, WIRE_SCHEDULE_RUNS_FIELDS, WIRE_SCHEDULE_RUN_FIELDS, WIRE_SCHEDULE_SAVE_FIELDS, WIRE_SECURITY_FIELDS, WIRE_SECURITY_WORKSPACE_FIELDS, WIRE_SEND_MESSAGE_FIELDS, WIRE_SEND_MESSAGE_RESPONSE_FIELDS, WIRE_SESSION_BRANCH_RESPONSE_FIELDS, WIRE_SESSION_CANDIDATES_FIELDS, WIRE_SESSION_CANDIDATE_FIELDS, WIRE_SESSION_FINISH_FIELDS, WIRE_SESSION_LIST_FIELDS, WIRE_SESSION_REFERENCE_FIELDS, WIRE_SESSION_RESPONSE_FIELDS, WIRE_SESSION_SUMMARY_FIELDS, WIRE_SESSION_WORKSPACE_FIELDS, WIRE_SESSION_WORKSPACE_RESPONSE_FIELDS, WIRE_SETTINGS_FIELDS, WIRE_SETTINGS_WRITE_FIELDS, WIRE_SETTINGS_WRITE_REQUEST_FIELDS, WIRE_SETTING_PENDING_FIELDS, WIRE_SETTING_ROW_FIELDS, WIRE_SETTING_STEP_FIELDS, WIRE_SETTING_WRITE_FIELDS, WIRE_SETTING_WRITE_LAYERS, WIRE_SKILL_BODY_FIELDS, WIRE_SKILL_DROP_SUFFIXES, WIRE_SKILL_FIELDS, WIRE_SKILL_IMPORT_FIELDS, WIRE_SKILL_IMPORT_PREVIEW_FIELDS, WIRE_SKILL_REMOVE_FIELDS, WIRE_SKILL_STAGE_FIELDS, WIRE_TASKS_FIELDS, WIRE_TEAM_FIELDS, WIRE_TOOLS_FIELDS, WIRE_TOOL_GATE_FIELDS, WIRE_TOOL_ROW_FIELDS, WIRE_TRUST_REQUEST_FIELDS, WIRE_TRUST_REQUEST_RESPONSE_FIELDS, WIRE_WITHDRAW_MESSAGE_FIELDS, WIRE_WORKSPACE_DIFF_FIELDS, WIRE_WORKSPACE_DIRS_FIELDS, WIRE_WORKSPACE_DIR_ENTRY_FIELDS, WIRE_WORKSPACE_REF_FIELDS, type WireAbortResponse, type WireAbout, type WireAgentEnvelope, type WireAgentEvent, type WireAgentRoleSummary, type WireAppearanceRequest, type WireAppearanceResponse, type WireApprovalCacheRevokeRequest, type WireApprovalCacheRevokeResponse, type WireApprovalListResponse, type WireApprovalRequest, type WireArtifactsResponse, type WireAttachmentFolderResponse, type WireAttachmentUploadResponse, type WireAuditCode, type WireAuditLog, type WireAuditOutcome, type WireAuditRow, type WireAuthDenyReason, type WireAuthDenyStatus, type WireAuthGuard, type WireAuthRequestView, type WireAuthVerdict, type WireBackgroundTask, type WireBindWorkspaceRequest, type WireBlockedGoal, type WireBlockedGoalsResponse, type WireBlockedLevel, type WireBuiltinConnector, type WireCachedApproval, type WireCachedDecision, type WireCapabilitiesResponse, type WireCapabilityProject, type WireCheckpointListResponse, type WireCheckpointSummary, type WireCommandExpansion, type WireCommandsResponse, type WireCompactRequest, type WireCompactResponse, type WireCompressionLine, type WireConfigResponse, type WireContextResponse, type WireCreateSessionRequest, type WireCreateSessionResponse, type WireCreateWorkspaceRequest, type WireCreateWorkspaceResponse, type WireCustomCommand, type WireDeleteSessionResponse, type WireDiffFile, type WireDiffFileResponse, type WireDiffNote, type WireDiffOmitReason, type WireDiffSource, type WireDiffStatus, type WireEffectiveModel, type WireEffectiveSlots, type WireEntryProbeCode, type WireEntryProvider, type WireEnvelope, type WireErrorResponse, type WireEvent, type WireFields, type WireFileCandidate, type WireFileCandidatesResponse, type WireFileChange, type WireFileKind, type WireFileOpenRefusal, type WireFileOpenResponse, type WireFileReference, type WireFileRefusal, type WireFileStat, type WireFileStatOk, type WireFileStatRefused, type WireFileStatResponse, type WireFileTextResponse, type WireFixture, type WireFixtureCase, type WireForgetWorkspaceRequest, type WireForgetWorkspaceResponse, type WireGoal, type WireGoalBlock, type WireGoalClearResponse, type WireGoalCreateRequest, type WireGoalLimits, type WireGoalPhase, type WireGoalRefusal, type WireGoalResponse, type WireGoalUpdateRequest, type WireGoalWriteResponse, type WireHealthResponse, type WireHostBadgeRequest, type WireHostBadges, type WireHostCompose, type WireHostComposeRequest, type WireHostComposeResponse, type WireHostComposeStateResponse, type WireHostComposeTakeResponse, type WireHubEnvelope, type WireHubEvent, type WireImageReference, type WireKnownWorkspace, type WireKnownWorkspaceRef, type WireLastSessionRequest, type WireLastSessionResponse, type WireManagedLock, type WireMcpAddRequest, type WireMcpAddResponse, type WireMcpApplyAction, type WireMcpApplyEntry, type WireMcpApplyResponse, type WireMcpConfigApplyRequest, type WireMcpConfigIssue, type WireMcpConfigResponse, type WireMcpConfigSaveRequest, type WireMcpConfigSaveResponse, type WireMcpConnector, type WireMcpReconnectResponse, type WireMessageListResponse, type WireModelCaveat, type WireModelEffortRequest, type WireModelEffortResponse, type WireModelEntriesResponse, type WireModelEntry, type WireModelEntryModelsResponse, type WireModelEntryProbeRequest, type WireModelEntryRefRequest, type WireModelEntryRefs, type WireModelEntrySaveRequest, type WireModelEntrySaveResponse, type WireModelEntryTestResponse, type WireModelRejection, type WireModelResponse, type WireModelSelection, type WireModelSetRequest, type WireModelSetResponse, type WirePatchSessionRequest, type WirePatchSessionResponse, type WirePermissionRememberFailure, type WirePermissionRuleRow, type WirePermissionSetRequest, type WirePermissionSetResponse, type WirePermissionShadow, type WirePermissionState, type WirePermissionStatus, type WirePickDirectoryResponse, type WirePlanAction, type WirePlanModeRequest, type WirePlanModeResponse, type WirePlanModeState, type WirePlanResponse, type WirePluginActionResponse, type WirePluginCategory, type WirePluginCounts, type WirePluginDependency, type WirePluginDependencyInventory, type WirePluginDependencyStatus, type WirePluginDoc, type WirePluginDocs, type WirePluginEntry, type WirePluginHit, type WirePluginHookTally, type WirePluginInstallRequest, type WirePluginLocalInstallRequest, type WirePluginLocalRequest, type WirePluginMarketplace, type WirePluginMarketplaceRequest, type WirePluginMarketplaceResponse, type WirePluginMenuItem, type WirePluginNameRequest, type WirePluginPanel, type WirePluginPreview, type WirePluginPreviewRequest, type WirePluginPreviewResponse, type WirePluginPreviewStreamLine, type WirePluginProgressStep, type WirePluginRefreshResponse, type WirePluginRefuseReason, type WirePluginSourceType, type WirePluginStageRequest, type WirePluginStageResponse, type WirePluginStatus, type WirePluginToggleRequest, type WirePluginUpdateRequest, type WirePluginUploadChoice, type WirePluginUploadConfirmRequest, type WirePluginUploadField, type WirePluginUploadFieldName, type WirePluginUploadFields, type WirePluginUploadFile, type WirePluginUploadForm, type WirePluginUploadPlan, type WirePluginUploadPreviewResponse, type WirePluginUploadRequest, type WirePluginUploadResponse, type WirePluginVersionUnmet, type WirePluginViewRequest, type WirePluginViewResponse, type WirePluginVisibility, type WirePluginsResponse, type WirePolicyDir, type WirePolicyStatus, type WireProjectInventory, type WireProviderGroup, type WireQuestionListResponse, type WireQuestionRequest, type WireReplayMessage, type WireResetReason, type WireRespondApprovalRequest, type WireRespondApprovalResponse, type WireRespondQuestionRequest, type WireRespondQuestionResponse, type WireReviveResponse, type WireRewindAction, type WireRewindDrift, type WireRewindFilePlan, type WireRewindOutcome, type WireRewindPreview, type WireRewindRequest, type WireRewindResponse, type WireRewindScope, type WireRoleAddRequest, type WireRoleAddResponse, type WireRoleRemoveFailure, type WireRoleRemoveResponse, type WireRolesResponse, type WireRunningSchedule, type WireSandboxReason, type WireSandboxStatus, type WireScheduleCapability, type WireScheduleCreateRequest, type WireScheduleDefaults, type WireScheduleDeleteResponse, type WireScheduleFixRequest, type WireScheduleFixResponse, type WireScheduleIssue, type WireScheduleIssueCode, type WireScheduleListResponse, type WireSchedulePendingResponse, type WireScheduleRecordingResponse, type WireScheduleRegisterRefusal, type WireScheduleRegisterWarning, type WireScheduleRegistration, type WireScheduleResponse, type WireScheduleRow, type WireScheduleRunResponse, type WireScheduleRunningResponse, type WireScheduleRunsResponse, type WireScheduleSaveResponse, type WireScheduleUpdateRequest, type WireSecurityResponse, type WireSecurityWorkspace, type WireSendMessageRequest, type WireSendMessageResponse, type WireSessionBranchResponse, type WireSessionCandidate, type WireSessionCandidatesResponse, type WireSessionFinish, type WireSessionListResponse, type WireSessionReference, type WireSessionResponse, type WireSessionSummary, type WireSessionWorkspace, type WireSessionWorkspaceResponse, type WireSettingApply, type WireSettingFutile, type WireSettingLayer, type WireSettingPending, type WireSettingRow, type WireSettingStep, type WireSettingValue, type WireSettingValueKind, type WireSettingWrite, type WireSettingWriteLayer, type WireSettingsResponse, type WireSettingsWriteRequest, type WireSettingsWriteResponse, type WireSkillBodyResponse, type WireSkillImportConflict, type WireSkillImportEntry, type WireSkillImportFailure, type WireSkillImportForm, type WireSkillImportIssue, type WireSkillImportPreviewResponse, type WireSkillImportResponse, type WireSkillRemoveFailure, type WireSkillRemoveResponse, type WireSkillStageFailure, type WireSkillStageResponse, type WireSkillSummary, type WireSummaryWorkspace, type WireTaggedEvent, type WireTasksResponse, type WireTeamResponse, type WireToolGate, type WireToolGateAxis, type WireToolRow, type WireToolSummary, type WireToolVerdict, type WireToolsResponse, type WireTrustRequestRequest, type WireTrustRequestResponse, type WireTurnState, type WireWithdrawMessageResponse, type WireWorkspaceBinding, type WireWorkspaceDiffResponse, type WireWorkspaceDirEntry, type WireWorkspaceDirsResponse, type WireWorkspaceRef, accentScale, agentMessageLine, apiKeyEnvVar, appearanceInlineVars, appearanceRootAttributes, appearanceVisualCss, approvalPolicyForLevel, assertNeverPart, assistantTurnText, attachSessionSurface, chordId, collectPendingApprovals, compressionThresholdTokens, conformsToWire, contentToText, cronTimes, diagnosticToLine, encodeAppearanceFirstScreenValue, entryDisplayName, entryRef, entrySecretName, extractAllMentions, extractMentions, extractSessionMentions, filePartSummary, fillPlaceholders, flattenCatalog, formatAppearanceTranslucent, formatMoney, getProviderInfo, hasFailure, hexToHsv, hsvToHex, imagePartOmittedSummary, isAppearanceAccent, isAppearanceAccentValue, isAppearanceBackground, isAppearanceBackgroundFit, isAppearanceBackgroundKind, isAppearanceCodeFont, isAppearanceCodeFontSize, isAppearanceContrast, isAppearanceDiffTreeWidth, isAppearanceFontSize, isAppearanceLang, isAppearanceModePatch, isAppearanceMotion, isAppearanceSidebarWidth, isAppearanceTheme, isAppearanceThemeName, isAppearanceTranslucent, isAppearanceUiFont, isApprovalOutcome, isContextNearlyFull, isCurrency, isEntrySecretName, isHeadlessInputFormat, isHeadlessLifecycleEvent, isHeadlessOutputFormat, isHexColor, isKeyAction, isLang, isMentionableFilePath, isModelEntryId, isOpenableLink, isOperationType, isPermissionLevel, isPlanOutcome, isPromptOversize, isProviderType, isQuestionAnswerMap, isReasoningEffort, isSearchProviderType, isSettingsPaneId, isValidAgentRoleName, isValidCommandName, isWireGoalPhase, isWireHubEvent, isWirePlanAction, isWirePluginArchiveName, isWireRewindScope, isWireSettingWriteLayer, isWireSkillDropName, joinUploadMulti, makeTranslate, mcpConnectorState, normalizeAppearanceTranslucent, normalizeApproval, offloadedImagePart, packSessionSurface, parseAppearanceTranslucentText, parseChord, parseModelRef, parseSequence, perAction, placeholdersOf, promptTokens, relativeLuminance, resolveAppearanceVisual, resolveHostText, resolvePermissionLevel, sequenceId, sessionPartSummary, snapAppearanceContrast, splitUploadMulti, stripSystemNote, systemNote, tableOf, totalUsageTokens, translatorFor, truncateToBudget, turnDigest, unfixedRules, utf8ByteLength, wireFields };