@sema-agent/sdk 6.8.0 → 6.10.0
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/README.md +84 -22
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/errors.d.ts +22 -8
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +38 -19
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +181 -23
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/resources/assistant.d.ts +1 -1
- package/dist/resources/elicitations.d.ts +14 -4
- package/dist/resources/elicitations.d.ts.map +1 -1
- package/dist/resources/elicitations.js.map +1 -1
- package/dist/resources/questions.d.ts +34 -9
- package/dist/resources/questions.d.ts.map +1 -1
- package/dist/resources/questions.js.map +1 -1
- package/dist/resources/tool-approvals.d.ts +93 -18
- package/dist/resources/tool-approvals.d.ts.map +1 -1
- package/dist/resources/tool-approvals.js +12 -3
- package/dist/resources/tool-approvals.js.map +1 -1
- package/dist/resources/workflows.d.ts +1 -1
- package/dist/resources/workflows.js +1 -1
- package/dist/types.d.ts +141 -48
- package/dist/types.d.ts.map +1 -1
- package/openapi.yaml +491 -231
- package/package.json +1 -1
|
@@ -1,24 +1,57 @@
|
|
|
1
1
|
/** tool-approvals — [830]① live-stream TOOL-APPROVAL HITL (server 1.191+ `ToolApprovalCoordinator`, gated on
|
|
2
|
-
* `TOOL_APPROVAL_ENABLED`; server `src/tool-approval.ts
|
|
2
|
+
* `TOOL_APPROVAL_ENABLED`; server `src/tool-approval.ts`, `ToolApprovalCoordinator.respond`). The THIRD sibling of
|
|
3
3
|
* {@link import("./questions.js").QuestionsResource} / {@link import("./elicitations.js").ElicitationsResource}:
|
|
4
4
|
* elicitation = an inbound-MCP-server ask, question = the agent's own AskUserQuestion, THIS = the ENGINE's
|
|
5
5
|
* permission gate ("may I run this tool?") surfaced to a live human — the suspended↔overlay bridge's decide面.
|
|
6
6
|
*
|
|
7
|
+
* 🔴 SCOPE OF THIS HEADER: everything below describes the LEGACY `respond` leg only. Since 6.7.0 this module
|
|
8
|
+
* ALSO carries {@link ToolApprovalsResource.decideAsk} (design/172, POST /v1/tasks/:taskId/asks/:askId/decision),
|
|
9
|
+
* which is the opposite shape — a persistent-store CAS keyed on the DURABLE `askId`, accepted by ANY replica.
|
|
10
|
+
* Do not read the live-only/same-replica statements as module-wide.
|
|
11
|
+
*
|
|
7
12
|
* 🔴 LIVE-ONLY + SAME-REPLICA (the `steer()`-class of HITL, NOT the durable approvals/checkpoint class —
|
|
8
13
|
* that is {@link import("./approvals.js").ApprovalsResource}): the parked ask is an in-memory promise with a
|
|
9
14
|
* 5-min TTL (server DEFAULT_APPROVAL_TTL_MS), so a respond that lands after settle / after the TTL / on
|
|
10
|
-
* another replica finds nothing → 404.
|
|
11
|
-
*
|
|
15
|
+
* another replica finds nothing → 404.
|
|
16
|
+
*
|
|
17
|
+
* 🔴 WHAT AN UNANSWERED ASK DOES (corrected — the old "fail-closes to DENY, the run proceeds" is now only the
|
|
18
|
+
* MINORITY case). Since [879] G1 / core 1.295 the coordinator reports a THIRD value, `"unavailable"` ("no
|
|
19
|
+
* reachable human"), instead of translating it to `false`, and CORE picks the landing:
|
|
20
|
+
* · deployment WITH a checkpoint store ⇒ the run **durable-PARKS** — an operator can still decide later
|
|
21
|
+
* through {@link import("./approvals.js").ApprovalsResource}. It does NOT proceed on a synthetic deny.
|
|
22
|
+
* · deployment WITHOUT one ⇒ the historical fail-closed DENY, and the run proceeds.
|
|
23
|
+
* With the design/172 protocol on the wire (server ≥7.3.0; default ON from server 7.5.0, see
|
|
24
|
+
* {@link ApprovalRequestFrame}) the window expiry itself is re-adjudicated to `"unavailable"` by the server's
|
|
25
|
+
* `expireAsk` CAS ⇒ the park route, not a deny. Either way the run never hangs.
|
|
12
26
|
*
|
|
13
|
-
* 🔴
|
|
14
|
-
* live token stream exactly like `question`/`elicitation
|
|
15
|
-
* the SSE `event:` name (the payload echoes `type`), parse with
|
|
16
|
-
* {@link ToolApprovalsResource.respond}.
|
|
27
|
+
* 🔴 On the LIVE leg the `tool_approval` / `tool_approval_complete` FRAMES are out-of-band NAMED frames,
|
|
28
|
+
* interleaved on the live token stream exactly like `question`/`elicitation`. The RECOMMENDED route there is
|
|
29
|
+
* `tasks.streamRaw` + dispatch on the SSE `event:` name (the payload echoes `type`), parse with
|
|
30
|
+
* {@link ToolApprovalFrame}, then decide via {@link ToolApprovalsResource.respond}.
|
|
31
|
+
* ⚠️ "Named frame" does NOT mean "no arm": since #185a both are {@link import("../events.js").AgentEvent}
|
|
32
|
+
* arms, and `tasks.stream()` (which yields every non-heartbeat frame as an `AgentEvent`, without filtering by
|
|
33
|
+
* event name) hands them to you typed. Use `streamRaw` when you want name-based dispatch, `stream()` when
|
|
34
|
+
* payload-`type` dispatch is enough — both work; only the OLD claim "not an arm on the live leg" was wrong.
|
|
35
|
+
* ⚠️ On the BACKGROUND/durable leg this pair — and the new protocol's `approval_request` — IS appended to the
|
|
36
|
+
* events tail by the server's durable-append emit, so it DOES come back through `runs.events()` /
|
|
37
|
+
* `GET /v1/runs/:id/events`, and as of **#185a** all three ARE arms of the
|
|
38
|
+
* {@link import("../events.js").AgentEvent} union. **How to catch it there** (the naive answer does not work,
|
|
39
|
+
* so it is spelled out): `runs.events()` yields PARSED PAYLOADS and drops the SSE `event:` line, so you cannot
|
|
40
|
+
* dispatch by event name through it. The durable read boundary re-injects the frame name INTO the payload
|
|
41
|
+
* (`{ type, ...data }`, same normalized name as the `event:` line), so the discriminator is **`ev.type`** —
|
|
42
|
+
* and since the union now declares the arms, `switch (ev.type)` narrows straight to {@link ToolApprovalFrame} /
|
|
43
|
+
* {@link ApprovalRequestFrame} with NO widening cast. (Before #185a this was a recorded TYPE-SURFACE GAP and a
|
|
44
|
+
* durable consumer switching only on the declared arms silently dropped approval frames until they expired or
|
|
45
|
+
* parked; that hole is closed on the type surface — the RUNTIME condition is unchanged, the frames still only
|
|
46
|
+
* arrive where the corresponding gate is on.)
|
|
47
|
+
* (`approval_revoke` is the ONE exception to the replay: deliberately live-only, never appended, and therefore
|
|
48
|
+
* deliberately NOT an `AgentEvent` arm — the structural compensation is the reconnect preamble's full
|
|
49
|
+
* reconciliation baseline.)
|
|
17
50
|
*
|
|
18
51
|
* 🔴 UNTRUSTED for display: `message`/`args` are service secret-redacted (+ args size-bounded, >16 KiB →
|
|
19
52
|
* `argsOmitted:true`) but remain model/tool-authored — render only, never re-feed to a model. */
|
|
20
53
|
import type { Transport } from "../transport.js";
|
|
21
|
-
/** The human's decision (server `parseToolApprovalResponse
|
|
54
|
+
/** The human's decision (server `parseToolApprovalResponse` in `src/tool-approval.ts` — closed 3-word set;
|
|
22
55
|
* anything else is a 400. [2400] HITL-10: the function name was written `parseToolApprovalDecision`, which does
|
|
23
56
|
* not exist in the server — grepping for it finds nothing. `allow_session` = allow AND remember for this session's category (fs-write tools share ONE
|
|
24
57
|
* category: approving Write covers Edit/NotebookEdit; other tools are per-tool) — the CC "don't ask again this
|
|
@@ -28,14 +61,14 @@ export type ToolApprovalDecision = "allow" | "allow_session" | "deny";
|
|
|
28
61
|
* tool-approval.d.ts). `type` IS the SSE `event:` name AND is echoed in the payload. The shell renders the
|
|
29
62
|
* `tool_approval` frame as an allow/deny dialog and dismisses it on `tool_approval_complete`.
|
|
30
63
|
*
|
|
31
|
-
* ⚠️ 与 {@link ApprovalRequestFrame}(design/172 流内审批协议,
|
|
64
|
+
* ⚠️ 与 {@link ApprovalRequestFrame}(design/172 流内审批协议,server ≥7.3.0 已上线)的关系:server 侧开关打开时
|
|
32
65
|
* **同一只 ask 出两帧**,顺序钉死为「先本帧(逐字不变)、后 `approval_request`」,两帧同带 `approvalId`。
|
|
33
66
|
* ⇒ 只认本帧的存量壳行为与今天字节一致;新壳按 `approvalId` 去重、优先渲染新帧。开关关闭 ⇒ 只有本帧。 */
|
|
34
67
|
/** 同源锚对账面(2026-07-28,cli 接法核查条 5):`ToolApprovalFrame` 的**字段名清单**,给下游值拷贝
|
|
35
68
|
* (client-core 自持同名闭集 copy)做机器对账用——照 registry-core 值拷贝+同源锚先例。下游测试断言
|
|
36
69
|
* 自己的 copy 键集 ⊇/== 本清单,SDK 每次 additive 增键(如 1.307 的 `toolCallId`)对方当天红,
|
|
37
70
|
* 不再靠人肉追平。**新增帧字段必须同步进本清单**(有测试钉)。 */
|
|
38
|
-
export declare const TOOL_APPROVAL_FRAME_KEYS: readonly ["type", "approvalId", "toolCallId", "toolName", "sourceTaskId", "fromSubagent", "sourceAgentName", "message", "args", "argsOmitted", "outcome"];
|
|
71
|
+
export declare const TOOL_APPROVAL_FRAME_KEYS: readonly ["type", "approvalId", "toolCallId", "toolName", "sourceTaskId", "fromSubagent", "sourceAgentName", "message", "args", "argsOmitted", "governanceForced", "delegation", "outcome"];
|
|
39
72
|
export interface ToolApprovalFrame {
|
|
40
73
|
type: "tool_approval" | "tool_approval_complete";
|
|
41
74
|
/** The id to echo back to {@link ToolApprovalsResource.respond}. */
|
|
@@ -74,8 +107,36 @@ export interface ToolApprovalFrame {
|
|
|
74
107
|
args?: unknown;
|
|
75
108
|
/** "tool_approval" only: args exceeded the 16 KiB bound (or failed to serialize) → omitted, render a stub. */
|
|
76
109
|
argsOmitted?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* "tool_approval" only, ADDITIVE — 两段式在场性:**≤ server 7.4.0 恒缺席;≥ 7.5.0 起**在治理来源的 ask 上
|
|
112
|
+
* 带 `true`([2942]/[2943])。唯一权威 = 实测帧,不是 server 版本号字符串。
|
|
113
|
+
*
|
|
114
|
+
* 语义:`true` ⇔ 这只 ask 的门来自**运维治理层**(部署侧的 `AUTONOMY` / `commandPolicy` /
|
|
115
|
+
* `MANUAL_MODE_SHELL_GATE` / `SENSITIVE_WRITE_PATTERNS`),而不是模型默认门或本次请求的客户端表态。
|
|
116
|
+
* 用途:呈「治理强制」徽标,回答「我都开了 `bypassPermissions` 为什么还在问」—— 这类门**客户端表态
|
|
117
|
+
* 掀不掉**,壳应把它呈成不可绕过,而不是引导用户去改 `permissionMode`。
|
|
118
|
+
*
|
|
119
|
+
* 🔴 **缺席 ≠ `false`**(与 `risk` 两轴同族纪律):本键**只在为真时在场**。缺席的含义是「没有治理来源的
|
|
120
|
+
* 证据」,它既覆盖真正的非治理 ask(例:部署把某工具写进 `APPROVAL_REQUIRE` 名单),也覆盖 server 侧
|
|
121
|
+
* 判据够不着的形(例:治理层的 shell 门停在 `classify` 档时,一次 shell ask 出自分类器还是别的门无从
|
|
122
|
+
* 分辨 —— server 选择让键缺席而不是猜)。所以缺席**不得**渲染成「这门可以用表态绕开」。
|
|
123
|
+
*/
|
|
124
|
+
governanceForced?: true;
|
|
125
|
+
/** "tool_approval" only (server ≥ core 5.9.0 W1, [2535]): the ask's DELEGATION provenance chain —
|
|
126
|
+
* `{parentToolCallId, depth, agentName?}` (the innermost grandchild frame wins). Present on the same door as
|
|
127
|
+
* {@link fromSubagent} (child asks only). Read-only display enrichment (the approval card can show where the
|
|
128
|
+
* ask floated up from); `agentName` is UNTRUSTED-for-display like {@link sourceAgentName}. ADDITIVE. */
|
|
129
|
+
delegation?: {
|
|
130
|
+
parentToolCallId: string;
|
|
131
|
+
depth: number;
|
|
132
|
+
agentName?: string;
|
|
133
|
+
};
|
|
77
134
|
/** "tool_approval_complete" only: how it settled (dialog dismiss reason). `expired` = TTL / abort / emit
|
|
78
|
-
* failure
|
|
135
|
+
* failure. ⚠️ What the ENGINE got for an `expired` ask depends on whether the design/172 ask ledger is on
|
|
136
|
+
* this deployment: with it (server ≥7.3.0 under `STREAM_APPROVAL_ENABLED`) the server's `expireAsk` CAS
|
|
137
|
+
* re-adjudicates the outcome to `"unavailable"` ⇒ the run **PARKS**; without it the historical
|
|
138
|
+
* `settle(false,"expired")` fail-closed DENY stands. The frame itself is cosmetic either way — never derive
|
|
139
|
+
* the run's fate from it; read the run row / checkpoint face. */
|
|
79
140
|
outcome?: "allowed" | "denied" | "expired";
|
|
80
141
|
[k: string]: unknown;
|
|
81
142
|
}
|
|
@@ -131,6 +192,11 @@ export interface ApprovalCard {
|
|
|
131
192
|
toolCallId?: string;
|
|
132
193
|
/** 风险两轴 + 安全类标记(见 {@link ApprovalRiskAxes} 的三态说明)。 */
|
|
133
194
|
risk: ApprovalRiskAxes;
|
|
195
|
+
/** ADDITIVE,两段式在场性(**≤ server 7.4.0 恒缺席;≥ 7.5.0 起**在治理来源的 ask 上带 `true`):
|
|
196
|
+
* `true` ⇔ 这只 ask 的门来自运维治理层,客户端表态掀不掉。语义、**「缺席 ≠ false」** 的硬条款与
|
|
197
|
+
* 判据边界逐字见 {@link ToolApprovalFrame.governanceForced}。放在卡的顶层而不是 {@link risk} 里:
|
|
198
|
+
* `risk` 讲引擎对这次操作的风险判定,本键讲**门是谁下的**,两件事。 */
|
|
199
|
+
governanceForced?: true;
|
|
134
200
|
/** 在场 ⇔ 本 ask 来自**委派子代**(显式判别位,worker 不可伪造)。恒 `true` 或缺席。 */
|
|
135
201
|
fromSubagent?: true;
|
|
136
202
|
/** 子代的 core session id —— 行 join 值 + 对早于 `fromSubagent` 的 server 的回落判别位。 */
|
|
@@ -145,9 +211,12 @@ export interface ApprovalCard {
|
|
|
145
211
|
* **新增帧字段必须同步进本清单**(有测试钉)。 */
|
|
146
212
|
export declare const APPROVAL_REQUEST_FRAME_KEYS: readonly ["type", "schemaVersion", "askId", "taskId", "kind", "card", "expiresInMs", "expiresAtMs", "serverNowMs", "approvalId"];
|
|
147
213
|
/** {@link ApprovalCard} 的字段名清单(同上,卡是嵌套结构,单独一份)。 */
|
|
148
|
-
export declare const APPROVAL_CARD_KEYS: readonly ["toolName", "message", "args", "argsOmitted", "toolCallId", "risk", "fromSubagent", "sourceTaskId", "sourceAgentName", "delegation"];
|
|
149
|
-
/** 流内审批呈卡帧(SSE,`type` 即事件名;design/172 §3.1 + 车3 §4.1)
|
|
150
|
-
*
|
|
214
|
+
export declare const APPROVAL_CARD_KEYS: readonly ["toolName", "message", "args", "argsOmitted", "toolCallId", "risk", "governanceForced", "fromSubagent", "sourceTaskId", "sourceAgentName", "delegation"];
|
|
215
|
+
/** 流内审批呈卡帧(SSE,`type` 即事件名;design/172 §3.1 + 车3 §4.1)。**两腿两形**:live 腿上它与
|
|
216
|
+
* `tool_approval`/`question`/`elicitation` 同一条 out-of-band 通道、在 token 流上交织,**不是**
|
|
217
|
+
* `AgentEvent` 臂(按 SSE `event:` 名分派);durable 腿上 server 会 append 它,于是同一帧在
|
|
218
|
+
* `runs.events()` 的重放里出现,**并且是**
|
|
219
|
+
* {@link import("../events.js").AgentEvent} 的 `approval_request` 臂(#185a,载荷逐字即本类型)。
|
|
151
220
|
*
|
|
152
221
|
* ── 窗与重放(车3 §4.4/§5;design/172 §3.1)──────────────────────────────────────────────────────
|
|
153
222
|
* - `expiresAtMs` = server 时钟绝对 deadline,**一次铸定、永不重算**;`expiresInMs` =
|
|
@@ -304,8 +373,8 @@ export interface AskDecisionAck {
|
|
|
304
373
|
* **幂等回放的响应不承诺本字段字节等同**——它是本副本活体状态的函数,不落行。 */
|
|
305
374
|
updatedInputForwarded?: true;
|
|
306
375
|
}
|
|
307
|
-
/** The 200 ack from a successful respond (server `src/tool-approval.ts
|
|
308
|
-
* `decision` echoed). */
|
|
376
|
+
/** The 200 ack from a successful respond (server `src/tool-approval.ts`, the ack assembly inside
|
|
377
|
+
* `ToolApprovalCoordinator.respond` — exact shape, `decision` echoed). */
|
|
309
378
|
export interface ToolApprovalRespondAck {
|
|
310
379
|
approvalId: string;
|
|
311
380
|
delivery: "applied";
|
|
@@ -325,7 +394,7 @@ export declare class ToolApprovalsResource {
|
|
|
325
394
|
/** POST /v1/tool-approvals/:id/respond — settle a parked LIVE tool-approval gate with the human's decision.
|
|
326
395
|
* The engine's suspended tool call resumes (allow) or is refused (deny) on the still-open task connection.
|
|
327
396
|
*
|
|
328
|
-
* 🔴 OWNER-GATED with a 404 (NO existence oracle, server `src/tool-approval.ts
|
|
397
|
+
* 🔴 OWNER-GATED with a 404 (NO existence oracle, server `src/tool-approval.ts` — errorCode
|
|
329
398
|
* `tool_approval.not_pending`): a non-owner AND an
|
|
330
399
|
* unknown/settled/expired/wrong-replica id both get the same 404 — never branch existence off the status.
|
|
331
400
|
* A malformed body (`decision` outside the 3-word set) is a 400 (existence-independent). A worker without
|
|
@@ -345,7 +414,13 @@ export declare class ToolApprovalsResource {
|
|
|
345
414
|
/** POST /v1/tasks/:taskId/asks/:askId/decision — 结算一张**流内审批卡**(design/172 §3.2,车4)。
|
|
346
415
|
* `askId` 取自 {@link ApprovalRequestFrame.askId};`taskId` 取自同帧的 `taskId`(wire run id)。
|
|
347
416
|
*
|
|
348
|
-
* 🔴
|
|
417
|
+
* 🔴 **已发布** —— 端点随 server 7.3.0 上线,本 verb 随 SDK 6.7.0 发出。部署默认位**分两段读**:
|
|
418
|
+
* server **≤7.4.0 默认 OFF**(`STREAM_APPROVAL_ENABLED` 默认 false ⇒ 这些版本上绝大多数部署走
|
|
419
|
+
* 501,能用的只有 legacy 活卡腿 {@link ToolApprovalsResource.respond});server **≥7.5.0 默认 ON**
|
|
420
|
+
* (2026-08-07 上 npm;server CHANGELOG 以 BREAKING 披露,`STREAM_APPROVAL_ENABLED=false` 是干净还原键)。
|
|
421
|
+
* 两段都要读——第一段描述今天仍在跑的全部 7.3.x/7.4.x 装机。
|
|
422
|
+
* ⚠️ 别按版本号猜:唯一权威是实测能力位 `capabilities.streamApproval`(它是五合取的结果,
|
|
423
|
+
* 开关只是其中一项)。
|
|
349
424
|
* 未挂 ask 持久层 / 未开开关的 worker ⇒ 501 `feature.approval_ask_disabled`
|
|
350
425
|
* ({@link import("../errors.js").FeatureDisabledError});探能力面而不是 trial-by-501。
|
|
351
426
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-approvals.d.ts","sourceRoot":"","sources":["../../src/resources/tool-approvals.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tool-approvals.d.ts","sourceRoot":"","sources":["../../src/resources/tool-approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* tool-approval.d.ts). `type` IS the SSE `event:` name AND is echoed in the payload. The shell renders the
|
|
3
3
|
* `tool_approval` frame as an allow/deny dialog and dismisses it on `tool_approval_complete`.
|
|
4
4
|
*
|
|
5
|
-
* ⚠️ 与 {@link ApprovalRequestFrame}(design/172 流内审批协议,
|
|
5
|
+
* ⚠️ 与 {@link ApprovalRequestFrame}(design/172 流内审批协议,server ≥7.3.0 已上线)的关系:server 侧开关打开时
|
|
6
6
|
* **同一只 ask 出两帧**,顺序钉死为「先本帧(逐字不变)、后 `approval_request`」,两帧同带 `approvalId`。
|
|
7
7
|
* ⇒ 只认本帧的存量壳行为与今天字节一致;新壳按 `approvalId` 去重、优先渲染新帧。开关关闭 ⇒ 只有本帧。 */
|
|
8
8
|
/** 同源锚对账面(2026-07-28,cli 接法核查条 5):`ToolApprovalFrame` 的**字段名清单**,给下游值拷贝
|
|
@@ -20,6 +20,8 @@ export const TOOL_APPROVAL_FRAME_KEYS = [
|
|
|
20
20
|
"message",
|
|
21
21
|
"args",
|
|
22
22
|
"argsOmitted",
|
|
23
|
+
"governanceForced",
|
|
24
|
+
"delegation",
|
|
23
25
|
"outcome",
|
|
24
26
|
];
|
|
25
27
|
/** 同源锚对账面(照 {@link TOOL_APPROVAL_FRAME_KEYS} 先例):`ApprovalRequestFrame` 的**字段名清单**,
|
|
@@ -45,6 +47,7 @@ export const APPROVAL_CARD_KEYS = [
|
|
|
45
47
|
"argsOmitted",
|
|
46
48
|
"toolCallId",
|
|
47
49
|
"risk",
|
|
50
|
+
"governanceForced",
|
|
48
51
|
"fromSubagent",
|
|
49
52
|
"sourceTaskId",
|
|
50
53
|
"sourceAgentName",
|
|
@@ -127,7 +130,7 @@ export class ToolApprovalsResource {
|
|
|
127
130
|
/** POST /v1/tool-approvals/:id/respond — settle a parked LIVE tool-approval gate with the human's decision.
|
|
128
131
|
* The engine's suspended tool call resumes (allow) or is refused (deny) on the still-open task connection.
|
|
129
132
|
*
|
|
130
|
-
* 🔴 OWNER-GATED with a 404 (NO existence oracle, server `src/tool-approval.ts
|
|
133
|
+
* 🔴 OWNER-GATED with a 404 (NO existence oracle, server `src/tool-approval.ts` — errorCode
|
|
131
134
|
* `tool_approval.not_pending`): a non-owner AND an
|
|
132
135
|
* unknown/settled/expired/wrong-replica id both get the same 404 — never branch existence off the status.
|
|
133
136
|
* A malformed body (`decision` outside the 3-word set) is a 400 (existence-independent). A worker without
|
|
@@ -146,7 +149,13 @@ export class ToolApprovalsResource {
|
|
|
146
149
|
/** POST /v1/tasks/:taskId/asks/:askId/decision — 结算一张**流内审批卡**(design/172 §3.2,车4)。
|
|
147
150
|
* `askId` 取自 {@link ApprovalRequestFrame.askId};`taskId` 取自同帧的 `taskId`(wire run id)。
|
|
148
151
|
*
|
|
149
|
-
* 🔴
|
|
152
|
+
* 🔴 **已发布** —— 端点随 server 7.3.0 上线,本 verb 随 SDK 6.7.0 发出。部署默认位**分两段读**:
|
|
153
|
+
* server **≤7.4.0 默认 OFF**(`STREAM_APPROVAL_ENABLED` 默认 false ⇒ 这些版本上绝大多数部署走
|
|
154
|
+
* 501,能用的只有 legacy 活卡腿 {@link ToolApprovalsResource.respond});server **≥7.5.0 默认 ON**
|
|
155
|
+
* (2026-08-07 上 npm;server CHANGELOG 以 BREAKING 披露,`STREAM_APPROVAL_ENABLED=false` 是干净还原键)。
|
|
156
|
+
* 两段都要读——第一段描述今天仍在跑的全部 7.3.x/7.4.x 装机。
|
|
157
|
+
* ⚠️ 别按版本号猜:唯一权威是实测能力位 `capabilities.streamApproval`(它是五合取的结果,
|
|
158
|
+
* 开关只是其中一项)。
|
|
150
159
|
* 未挂 ask 持久层 / 未开开关的 worker ⇒ 501 `feature.approval_ask_disabled`
|
|
151
160
|
* ({@link import("../errors.js").FeatureDisabledError});探能力面而不是 trial-by-501。
|
|
152
161
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-approvals.js","sourceRoot":"","sources":["../../src/resources/tool-approvals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-approvals.js","sourceRoot":"","sources":["../../src/resources/tool-approvals.ts"],"names":[],"mappings":"AA6DA;;;;;;kEAMkE;AAClE;;;uCAGuC;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,SAAS;IACT,MAAM;IACN,aAAa;IACb,kBAAkB;IAClB,YAAY;IACZ,SAAS;CACD,CAAC;AAyJX;;+BAE+B;AAC/B,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,MAAM;IACN,eAAe;IACf,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;CACJ,CAAC;AAEX,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,UAAU;IACV,SAAS;IACT,MAAM;IACN,aAAa;IACb,YAAY;IACZ,MAAM;IACN,kBAAkB;IAClB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,YAAY;CACJ,CAAC;AAiDX,kDAAkD;AAClD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;AA4C3H,2FAA2F;AAC3F,0DAA0D;AAC1D,qFAAqF;AACrF,oEAAoE;AACpE,mDAAmD;AACnD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7D,MAAM,KAAK,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7D,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAA2B,EAAW,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7F,MAAM,OAAO,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC;AAEvE,SAAS,oBAAoB,CAAC,CAAU;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,OAAO,CAAC,CAAC,oBAAoB,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;AAChH,CAAC;AAED,SAAS,0BAA0B,CAAC,CAAU;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,gEAAgE;IAChE,OAAO,CACL,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;QACtB,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC;QAC1B,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QACvB,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC;QAC5B,KAAK,CAAC,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC;QAC/B,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAChD,CAAC;AACJ,CAAC;AAED;;;;;mDAKmD;AACnD,MAAM,UAAU,wBAAwB,CAAC,CAAU;IACjD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACpG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1F,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,CAAU;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACjF,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAkFD,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;;;;;;;;;;uGAUmG;IACnG,KAAK,CAAC,OAAO,CACX,EAAU,EACV,IAMC,EACD,IAA+B;QAE/B,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAyB;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,EAAE,CAAC,UAAU;YAC5D,IAAI;YACJ,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEAkC6D;IAC7D,KAAK,CAAC,SAAS,CACb,MAAc,EACd,KAAa,EACb,IAAqB,EACrB,IAA+B;QAE/B,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAiB;YACpC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,kBAAkB,CAAC,MAAM,CAAC,SAAS,kBAAkB,CAAC,KAAK,CAAC,WAAW;YAC1F,IAAI;YACJ,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -121,7 +121,7 @@ export declare class WorkflowsResource {
|
|
|
121
121
|
* 🔴 **501 的门是 `capabilities.workflowsList`,不是 `capabilities.workflows`**(4.3.0 更正,FW-5):
|
|
122
122
|
* 501 的真判据是 `!deps.workflowRunStore`(`routes/workflows.ts:197-200`),而
|
|
123
123
|
* `workflows: deps.workflowsCapable ?? Boolean(deps.workflowRunStore)` 与
|
|
124
|
-
* `workflowsList: Boolean(deps.workflowRunStore)` 是**两个不同的量**(`routes/capabilities.ts
|
|
124
|
+
* `workflowsList: Boolean(deps.workflowRunStore)` 是**两个不同的量**(`routes/capabilities.ts` 中这两位旁的注
|
|
125
125
|
* 逐字区分:`workflows` = ENGINE-CAN「引擎能不能自编排」,`workflowsList` = 能不能 durable 列 run)。
|
|
126
126
|
* 同一判据也管着 `list`/`get`/`journal`/`stream` 四条读面。查错了键的后果双向都有:
|
|
127
127
|
* `workflows:true, workflowsList:false` ⇒ 入口被点亮、每次点都吃 501;反过来则把一个能用的面藏起来。
|
|
@@ -78,7 +78,7 @@ export class WorkflowsResource {
|
|
|
78
78
|
* 🔴 **501 的门是 `capabilities.workflowsList`,不是 `capabilities.workflows`**(4.3.0 更正,FW-5):
|
|
79
79
|
* 501 的真判据是 `!deps.workflowRunStore`(`routes/workflows.ts:197-200`),而
|
|
80
80
|
* `workflows: deps.workflowsCapable ?? Boolean(deps.workflowRunStore)` 与
|
|
81
|
-
* `workflowsList: Boolean(deps.workflowRunStore)` 是**两个不同的量**(`routes/capabilities.ts
|
|
81
|
+
* `workflowsList: Boolean(deps.workflowRunStore)` 是**两个不同的量**(`routes/capabilities.ts` 中这两位旁的注
|
|
82
82
|
* 逐字区分:`workflows` = ENGINE-CAN「引擎能不能自编排」,`workflowsList` = 能不能 durable 列 run)。
|
|
83
83
|
* 同一判据也管着 `list`/`get`/`journal`/`stream` 四条读面。查错了键的后果双向都有:
|
|
84
84
|
* `workflows:true, workflowsList:false` ⇒ 入口被点亮、每次点都吃 501;反过来则把一个能用的面藏起来。
|