@sema-agent/sdk 24.0.0 → 26.0.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 +243 -6
- package/dist/client.d.ts +6 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -6
- package/dist/client.js.map +1 -1
- package/dist/device/index.d.ts +76 -12
- package/dist/device/index.d.ts.map +1 -1
- package/dist/device/index.js +90 -33
- package/dist/device/index.js.map +1 -1
- package/dist/errors.d.ts +162 -30
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +71 -35
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +53 -13
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +3 -2
- package/dist/events.js.map +1 -1
- package/dist/health.d.ts +25 -0
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js.map +1 -1
- package/dist/index.d.ts +44 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/model-route-env/index.d.ts +129 -0
- package/dist/model-route-env/index.d.ts.map +1 -0
- package/dist/model-route-env/index.js +131 -0
- package/dist/model-route-env/index.js.map +1 -0
- package/dist/resources/adoption.d.ts +8 -2
- package/dist/resources/adoption.d.ts.map +1 -1
- package/dist/resources/adoption.js.map +1 -1
- package/dist/resources/approvals.d.ts +38 -4
- package/dist/resources/approvals.d.ts.map +1 -1
- package/dist/resources/approvals.js +19 -4
- package/dist/resources/approvals.js.map +1 -1
- package/dist/resources/fleet.d.ts +73 -18
- package/dist/resources/fleet.d.ts.map +1 -1
- package/dist/resources/fleet.js.map +1 -1
- package/dist/resources/ops.d.ts +113 -0
- package/dist/resources/ops.d.ts.map +1 -1
- package/dist/resources/ops.js +10 -0
- package/dist/resources/ops.js.map +1 -1
- package/dist/resources/principal-inbox.d.ts +62 -0
- package/dist/resources/principal-inbox.d.ts.map +1 -0
- package/dist/resources/principal-inbox.js +51 -0
- package/dist/resources/principal-inbox.js.map +1 -0
- package/dist/resources/rules.d.ts +2 -5
- package/dist/resources/rules.d.ts.map +1 -1
- package/dist/resources/rules.js.map +1 -1
- package/dist/resources/session-sync.d.ts +27 -32
- package/dist/resources/session-sync.d.ts.map +1 -1
- package/dist/resources/session-sync.js +25 -39
- package/dist/resources/session-sync.js.map +1 -1
- package/dist/resources/tool-approvals.d.ts +251 -115
- package/dist/resources/tool-approvals.d.ts.map +1 -1
- package/dist/resources/tool-approvals.js +222 -69
- package/dist/resources/tool-approvals.js.map +1 -1
- package/dist/settings.d.ts +83 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +0 -24
- package/dist/settings.js.map +1 -1
- package/dist/sse.d.ts +5 -1
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +6 -2
- package/dist/sse.js.map +1 -1
- package/dist/sync.d.ts +5 -5
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +13 -55
- package/dist/sync.js.map +1 -1
- package/dist/transport.d.ts +2 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +3 -0
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +298 -123
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -3
- package/dist/types.js.map +1 -1
- package/openapi.yaml +1014 -572
- package/package.json +6 -2
- package/dist/resources/workspace.d.ts +0 -95
- package/dist/resources/workspace.d.ts.map +0 -1
- package/dist/resources/workspace.js +0 -60
- package/dist/resources/workspace.js.map +0 -1
|
@@ -67,9 +67,10 @@ export type ToolApprovalDecision = "allow" | "allow_session" | "deny";
|
|
|
67
67
|
* tool-approval.d.ts). `type` IS the SSE `event:` name AND is echoed in the payload. The shell renders the
|
|
68
68
|
* `tool_approval` frame as an allow/deny dialog and dismisses it on `tool_approval_complete`.
|
|
69
69
|
*
|
|
70
|
-
* ⚠️ 与 {@link ApprovalRequestFrame}(design/172 流内审批协议,server ≥7.3.0 已上线)
|
|
71
|
-
*
|
|
72
|
-
*
|
|
70
|
+
* ⚠️ 与 {@link ApprovalRequestFrame}(design/172 流内审批协议,server ≥7.3.0 已上线)的关系:**一条腿一个帧族**(server ≥7.133.0,`capabilities.approvalFrameFamilies`)——
|
|
71
|
+
* 呈卡协议上场的腿(`["approval_request"]`)上一只 ask 只走 `approval_request` 族,**本帧(`tool_approval` / `tool_approval_complete`)一帧都不发**(补偿:该 worker 设 `STREAM_APPROVAL_ENABLED=false` 回到旧族腿);
|
|
72
|
+
* 协议没上场的腿(`["tool_approval"]`)只发本族,wire 逐字不变。≤7.132.x 的呈卡腿上两族并发:同一只 ask 先本帧(逐字不变)、后 `approval_request`,两帧同带 `approvalId`
|
|
73
|
+
* ⇒ 新壳按 `approvalId` 去重、优先渲染新帧。 */
|
|
73
74
|
/**
|
|
74
75
|
* auto 模式分类器「没判出来」的成因闭集 —— 引擎 `AUTO_MODE_FALLBACK_CAUSES`(core 7.43.0)逐字同序:`error` / `timeout`(分类器跑不了)· `parse_error`(答了却没有判词)。
|
|
75
76
|
* server ≥7.118.0 上 {@link ToolApprovalFrame.classifierNoRuling} 与收件箱行同名位用它(server 用引擎谓词筛,集外不铸)。**闭集**:加词 = 引擎下一版 + 本常量与 spec enum 同批加。
|
|
@@ -96,26 +97,9 @@ export type ToolApprovalCardWord = (typeof TOOL_APPROVAL_CARD_WORDS)[number];
|
|
|
96
97
|
* (client-core 自持同名闭集 copy)做机器对账用——照 settings-schema(原 registry-core)值拷贝+同源锚先例。下游测试断言
|
|
97
98
|
* 自己的 copy 键集 ⊇/== 本清单,SDK 每次 additive 增键(如 1.307 的 `toolCallId`)对方当天红,
|
|
98
99
|
* 不再靠人肉追平。**新增帧字段必须同步进本清单**(有测试钉)。 */
|
|
99
|
-
export declare const TOOL_APPROVAL_FRAME_KEYS: readonly ["type", "approvalId", "toolCallId", "toolName", "sourceTaskId", "fromSubagent", "sourceAgentName", "message", "args", "argsOmitted", "governanceForced", "rememberRefused", "requiresRealApproval", "origin", "approvalCard", "inputHasBidi", "expiresAtMs", "expiresInMs", "serverNowMs", "
|
|
100
|
-
/** #154 车二(core 5.18.0 design/179):**引擎铸的**一条规则候选 —— 一格「不再询问」按下去会持久化的东西。
|
|
101
|
-
*
|
|
102
|
-
* 🔴 文本由 ENGINE 铸,不由壳拼:`rule` 是 server 从被裁决命令的原字节交给引擎算出来的规范文本,回决时
|
|
103
|
-
* 客户端只能把**其中一条原样报回去**({@link ToolApprovalsResource.respond} 的 `persistRule.rule`)。
|
|
104
|
-
* 报一条不在候选里的文本 ⇒ server 拒(`ruleRefusal: "rule_not_offered"`),不猜 —— 于是「点一次某条无害
|
|
105
|
-
* 命令换来一条别的规则」在这条路上结构性不可拼写。
|
|
106
|
-
*
|
|
107
|
-
* `match`:`exact` = 只放行这一条命令(`Bash(git status)`);`prefix` = 词界前缀放行(`Bash(git status:*)`)。
|
|
108
|
-
* `command` = 规则里的命令模式,给不想再解析一遍规则文本的壳直接渲染用。 */
|
|
109
|
-
export interface RuleSuggestion {
|
|
110
|
-
/** 兑付时要原样报回的规范规则文本(server `MAX_RULE_TEXT_CHARS` = 512 字符上限)。 */
|
|
111
|
-
rule: string;
|
|
112
|
-
/** 闭词表两值 —— 精确 / 词界前缀。未知值 ⇒ 这条候选不是本包描述的形,别渲成可兑的选项。 */
|
|
113
|
-
match: "exact" | "prefix";
|
|
114
|
-
/** 规则里的命令模式(渲染用;不必再解析 `rule`)。 */
|
|
115
|
-
command: string;
|
|
116
|
-
}
|
|
100
|
+
export declare const TOOL_APPROVAL_FRAME_KEYS: readonly ["type", "approvalId", "toolCallId", "toolName", "sourceTaskId", "fromSubagent", "sourceAgentName", "message", "args", "argsOmitted", "governanceForced", "rememberRefused", "requiresRealApproval", "origin", "approvalCard", "inputHasBidi", "expiresAtMs", "expiresInMs", "serverNowMs", "ruleOffers", "ruleOffersAbsence", "mandated", "mandate", "denialLimitFallback", "allowRuleShadowed", "probeCause", "probeReason", "ruleEvidence", "delegation", "parked", "outcome", "cause", "classifierUnavailable", "ruleStoreUnreadable", "readRootCandidate", "askClass", "classes", "boundGrantDigest", "boundGrants", "classifierNoRuling", "boundGrantAbsence"];
|
|
117
101
|
/**
|
|
118
|
-
* 一条规则的**匹配形**闭词表 ——
|
|
102
|
+
* 一条规则的**匹配形**闭词表 —— core `PERSISTED_RULE_MATCHES` 逐字九员同序(词表属主是 core:core 7.54.0 起是包根值,server ≥7.134.0 直接读它、不再自留转录;此前 server 转录并钉全等)。
|
|
119
103
|
* **一张表、两面同读**:卡上的规则候选 {@link RuleOffer}(server 的卡 schema 用同一只 enum 校验)与持久规则行
|
|
120
104
|
* {@link import("./rules.js").PersistedRule.match}(`GET /v1/rules`)。
|
|
121
105
|
*
|
|
@@ -320,7 +304,7 @@ export type AskOrigin = (typeof ASK_ORIGINS)[number] | (string & {});
|
|
|
320
304
|
*/
|
|
321
305
|
export declare const ASK_ORIGINS: readonly ["content_question", "plan_review", "ancestor_marked", "org_unavailable", "org_rule", "rule_store_unavailable", "hook", "ask_rule", "denial_limit_fallback", "shell_gate_tighten", "safety_tighten", "policy"];
|
|
322
306
|
/**
|
|
323
|
-
* **强制位站在哪一个词上**(server ≥7.102.0 / S-721 / core 7.32.0 #1092)—— core `PERSISTED_RULE_MANDATES`
|
|
307
|
+
* **强制位站在哪一个词上**(server ≥7.102.0 / S-721 / core 7.32.0 #1092)—— core `PERSISTED_RULE_MANDATES` 七词(core 7.54.0 起;此前六词)
|
|
324
308
|
* **逐词同序**转录(`dist/core/ask-origin.d.ts:349`;词义属主在 core,下面逐词照 core 7.32.1 `ask-origin.d.ts:336-347` 的定义转述,
|
|
325
309
|
* 不另作解释 —— 「这一问因**结构**而站着,常驻 allow 规则不许清掉它」的闭集):
|
|
326
310
|
* · `operator_always` —— 粗粒度 shell 教条(`shellGate` 的 always 档)对 shell 命令的**逐次确认**;
|
|
@@ -329,7 +313,10 @@ export declare const ASK_ORIGINS: readonly ["content_question", "plan_review", "
|
|
|
329
313
|
* · `probe_unanswered` —— 探针被咨询了但没答上:边界**未知**;
|
|
330
314
|
* · `write_protection` —— 写保护名表覆盖这次写的目标(写到被加载执行的配置上 = 给 agent 重新授权,问题是**目标**的属性);
|
|
331
315
|
* · `target_unresolved` —— 写目标的落点**读不出**(路上有一个链接查不了,或执行环境解不出目标):`probe_unanswered` 同一条教条的上一层
|
|
332
|
-
* (core 7.49.0 #955 / server ≥7.126.0 的拼法;7.122.0–7.125.x 是旧拼法,零别名 —— 老 server 发的旧词读作集外,见 README 22.0.0 迁移表)
|
|
316
|
+
* (core 7.49.0 #955 / server ≥7.126.0 的拼法;7.122.0–7.125.x 是旧拼法,零别名 —— 老 server 发的旧词读作集外,见 README 22.0.0 迁移表);
|
|
317
|
+
* · `cross_boundary_taint` —— (core 7.54.0 / server ≥7.134.0)这条 run 执行在部署信任边界之外的设备上、部署是多租形:一次落到组织侧的写 —— 或在一次离目标读之后、
|
|
318
|
+
* 发回设备的调用 —— 由部署的审批人逐次确认,常驻 allow 规则与任何自动车道都答不了它,配置给的放行(整座放行或策略代答)被拒。core 把它排在强制梯的**最前**
|
|
319
|
+
* (判序),数组里它在末位(数组序 = core 常量序,不是判序)。只在执行于目标设备的树上出现,宿主车道永不出现。
|
|
333
320
|
*
|
|
334
321
|
* 🔴 **闭集**(与 {@link AskOrigin} 刻意相反):四面 server 都经 core 成员筛 `isPersistedRuleMandate`(`approval-card.ts`
|
|
335
322
|
* `readClosedWordSeat`;inbox 行由 core `summarizeCheckpoint` 筛),集外词读作**缺席**、不上 wire ⇒ 真闭集。core 加词 ⇒
|
|
@@ -340,12 +327,12 @@ export declare const ASK_ORIGINS: readonly ["content_question", "plan_review", "
|
|
|
340
327
|
* 位读 `mandated`,别从词反推。
|
|
341
328
|
* echo-only:server 不按词分支,本包也不 —— 渲染按词给文案是消费端自己的事。
|
|
342
329
|
*/
|
|
343
|
-
export declare const PERSISTED_RULE_MANDATES: readonly ["operator_always", "tool_marks", "probe_mandate", "probe_unanswered", "write_protection", "target_unresolved"];
|
|
330
|
+
export declare const PERSISTED_RULE_MANDATES: readonly ["operator_always", "tool_marks", "probe_mandate", "probe_unanswered", "write_protection", "target_unresolved", "cross_boundary_taint"];
|
|
344
331
|
export type PersistedRuleMandate = (typeof PERSISTED_RULE_MANDATES)[number];
|
|
345
332
|
/**
|
|
346
333
|
* 一张审批卡上的**一个**「不再询问」选项(core design/375 §3.1 的判别联合;server ≥7.46.0 在
|
|
347
334
|
* `tool_approval` 帧 / `card_json` / durable park 行**三腿同形**发出,**BREAKING 换键**,前名
|
|
348
|
-
* `ruleSuggestions`、旧键同批退役无 alias)。
|
|
335
|
+
* `ruleSuggestions`、旧键同批退役无 alias;sdk 26.0.0 随底线 7.52.0 删了旧键的声明)。
|
|
349
336
|
*
|
|
350
337
|
* 🔴 **判形读 `kind`,不许按下标假设形**。**序即契约**:whole-string exact 的 `single` 在场时恒 index 0、
|
|
351
338
|
* `batch` 至多一条且恒末位;core 契约基数 ≤2,server 执法帽 4(容忍余量,消费端按 ≤4 布局)。
|
|
@@ -495,8 +482,8 @@ export type PersistRuleSelection =
|
|
|
495
482
|
* · `confirm-refused` / `redeem-refused` —— 同意协议的确认/兑付步被拒(记录状态不对、CAS 输、店拒写);
|
|
496
483
|
* · `rule_lane_unavailable` —— **四种成因共用一格**(亲读 `persistRuleAfterDecision` 的合取项):①本部署
|
|
497
484
|
* 没接规则店;②引擎对这条命令没铸出候选;③命令原字节读不出;④这只 ask 没有已验明的属主。②③是
|
|
498
|
-
* **这张卡**的局限,不是部署形态 ⇒ 🔴 **禁**据它判断「这台部署不供规则」(帧上 `
|
|
499
|
-
* 时同理,见 {@link ToolApprovalFrame.
|
|
485
|
+
* **这张卡**的局限,不是部署形态 ⇒ 🔴 **禁**据它判断「这台部署不供规则」(帧上 `ruleOffers` 缺席
|
|
486
|
+
* 时同理,见 {@link ToolApprovalFrame.ruleOffers});
|
|
500
487
|
* · `rule_input_edited` —— 回决同时带了 `updatedInput`(ctrl+g 编辑放行):生效的是编辑后那份,而候选是
|
|
501
488
|
* 引擎从**原始**命令铸的 ⇒ v1 拒绝这次持久化(否则「把危险命令改安全 + 勾上不再询问」会给原始那条
|
|
502
489
|
* 危险命令装上常驻放行规则);
|
|
@@ -541,9 +528,13 @@ export type RuleRefusalReason = "no-candidates" | "unknown-candidate" | "confirm
|
|
|
541
528
|
* 再加四个**不落问账行**的等待类词 —— `ttl_expired`(等待窗走完、没有人答)· `broadcast_lost`(两族帧都没送到任何连接,卡从未送达任何人)·
|
|
542
529
|
* `stream_disconnected`(承载这张卡的流断了,断连强转 park)· `undeliverable`(持久行不可用 / 身份不定 / 悬挂无行,卡没呈到任何投递面)。
|
|
543
530
|
* 另三个决断类词(`binding_changed` / `answer_invalid` / `outcome_cell_invalid`)只拒一次决议、不结束一张卡 ⇒ 不在这里(它们在 wire 上是决断口 409 的码,不是词)。
|
|
544
|
-
*
|
|
531
|
+
* 闭集:冻结的字面元组,成员型 {@link ApprovalSettleCause};{@link isApprovalCompleteFrameV1} 判 `cause` 成员读的就是这张表(型、常量、守卫一处定义)。
|
|
532
|
+
* 🔴 **词与序逐位 == server `SETTLE_CAUSE_WORDS` 的键序 == 随包 spec `ApprovalSettleCause` 枚举**(测试对着发布字节逐位核);这是 server 的另一张字面表 ——
|
|
533
|
+
* `ASK_ROW_ENDING_CAUSES`(十词,问账行序)与它是两张表、序不同,server 自己也是两张;「十词是这十四词的子集、余下四词是等待类词」由测试逐词核,不由类型保证。
|
|
545
534
|
*/
|
|
546
|
-
export
|
|
535
|
+
export declare const APPROVAL_SETTLE_CAUSES: readonly ["ttl_expired", "broadcast_lost", "stream_disconnected", "undeliverable", "run_cancelled", "run_exited", "batch_aborted", "batch_sibling_withdrawn", "batch_bound_elsewhere", "routing_failure_fail_closed", "crashed_before_park", "shutdown_before_park", "orphan_ttl_exceeded", "adhoc_leg_no_durable_domain"];
|
|
536
|
+
/** {@link APPROVAL_SETTLE_CAUSES} 的成员型(= 四个等待类词 ∪ {@link AskRowEndingCause} 十词)。 */
|
|
537
|
+
export type ApprovalSettleCause = (typeof APPROVAL_SETTLE_CAUSES)[number];
|
|
547
538
|
/**
|
|
548
539
|
* 晚答 `POST /v1/tool-approvals/:id/respond` 的 `404 tool_approval.not_pending` 体 `cause`(经 `err.extra.cause` 到达;本包对该码不开具名属性)。
|
|
549
540
|
* = 问账行成因十词({@link AskRowEndingCause};读同一列、同一个值)∪ 404 专属词 `unknown_or_other_replica`(本副本不认识这个 id —— 换端点或换副本重试才有意义)。
|
|
@@ -552,6 +543,15 @@ export type ApprovalSettleCause = "ttl_expired" | "broadcast_lost" | "stream_dis
|
|
|
552
543
|
* 今天只有 park 与取消撤卡两类终局留桥 ⇒ 答得出具体词;批内兄弟连坐与遗孤 TTL 收的行不留桥 ⇒ 那两形的迟到答仍是 `unknown_or_other_replica` —— 别把词表读成可达性承诺。
|
|
553
544
|
*/
|
|
554
545
|
export type ToolApprovalNotPendingCause = AskRowEndingCause | "unknown_or_other_replica";
|
|
546
|
+
/**
|
|
547
|
+
* 读根候选 {@link ToolApprovalFrame.readRootCandidate} 的 `covers` **词表**(引擎 `ReadRootGrantCandidate.covers`;server 的窄读铸点 `readReadRootCandidate` 对集外词整只丢)。
|
|
548
|
+
* 今天一词:`"exact"` —— `dir` 是命令点名的那一条路径本身,不是包含它的目录。闭集:冻结的字面元组,成员型 {@link ReadRootCover};
|
|
549
|
+
* 型、随包 spec 枚举、{@link isApprovalRequestFrameV1} 对 `covers` 的成员判读的都是这一张表(一处定义,守卫里没有内联词表)。
|
|
550
|
+
* 同源锚:测试对着 server 发布字节里铸点上的词(语法树读)与引擎 d.ts 里的字面量联合逐词核 —— 任一边加词 / 换词,这张表不跟就当场红。
|
|
551
|
+
*/
|
|
552
|
+
export declare const READ_ROOT_COVERS: readonly ["exact"];
|
|
553
|
+
/** {@link READ_ROOT_COVERS} 的成员型。 */
|
|
554
|
+
export type ReadRootCover = (typeof READ_ROOT_COVERS)[number];
|
|
555
555
|
export interface ToolApprovalFrame {
|
|
556
556
|
type: Extract<HitlFrameType, "tool_approval" | "tool_approval_complete">;
|
|
557
557
|
/** The id to echo back to {@link ToolApprovalsResource.respond}. */
|
|
@@ -689,48 +689,15 @@ export interface ToolApprovalFrame {
|
|
|
689
689
|
/** 见 {@link expiresAtMs} —— 窗三键之一,帧铸造时刻的服务器钟。 */
|
|
690
690
|
serverNowMs?: number;
|
|
691
691
|
/**
|
|
692
|
-
* "tool_approval" only
|
|
693
|
-
*
|
|
694
|
-
* {@link ToolApprovalsResource.respond}'s `persistRule.rule`.
|
|
695
|
-
*
|
|
696
|
-
* 📏 HOW MANY, TODAY: core 5.22.0's miner (`suggestRulesForCommand`) emits AT MOST ONE candidate, always
|
|
697
|
-
* `match: "exact"` — no shipped producer mints the broader prefix option. `prefix` stays in the closed
|
|
698
|
-
* vocabulary because the wire validator accepts it and a later miner may emit it; render whatever arrives,
|
|
699
|
-
* but do NOT build a UI that assumes a narrow/broad PAIR is on offer.
|
|
700
|
-
*
|
|
701
|
-
* 🔴 **PRESENCE IS THE PROMISE**: the key is present ONLY on a deployment that actually has a permission-rule
|
|
702
|
-
* store wired (the same object the engine's `permissionRules.storeWired` manifest bit reports). A deployment
|
|
703
|
-
* without one omits it rather than offering an option that has nowhere to redeem.
|
|
704
|
-
* 🔴 The CONVERSE does not hold: ABSENT means "THIS CARD has no redeemable candidate" — three causes produce
|
|
705
|
-
* it (no rule store wired, the engine minted no candidate for this command — compound / redirect /
|
|
706
|
-
* substitution — or the command bytes were unreadable), and one frame cannot tell them apart. Never diagnose
|
|
707
|
-
* the deployment's rule lane from a single absence, and never synthesize a candidate to fill the gap.
|
|
708
|
-
* 🔴 The values are the engine's VERBATIM (closed `match` vocabulary + engine-minted text); the server neither
|
|
709
|
-
* re-mints nor re-orders them, and neither should you — a hand-built rule string is refused
|
|
710
|
-
* (`ruleRefusal: "rule_not_offered"`), by construction.
|
|
711
|
-
*
|
|
712
|
-
* ⚠️ REDEMPTION SCOPE (stated honestly): this key also rides the durable card replay, but its only redemption
|
|
713
|
-
* channel is the LIVE respond leg keyed by the frame's `approvalId` — an in-process map that lives on ONE
|
|
714
|
-
* replica. Same-replica reconnect ⇒ redeemable; after a restart / on another replica that `approvalId` is a
|
|
715
|
-
* 404 and the person must use the durable decide leg
|
|
716
|
-
* ({@link ToolApprovalsResource.decideAsk}), which carries NO rule field in v1 (its body is strict — an extra
|
|
717
|
-
* `persistRule` is a loud 400, not a silent drop). This is the same availability envelope `approvalId` itself
|
|
718
|
-
* has; do not read a replayed suggestion as a promise that it is still redeemable.
|
|
719
|
-
*/
|
|
720
|
-
ruleSuggestions?: RuleSuggestion[];
|
|
721
|
-
/**
|
|
722
|
-
* "tool_approval" only(server ≥7.46.0;core 5.58.0 design/375。**BREAKING 换键** —— 它整体取代上面那条
|
|
723
|
-
* 退役键 {@link ruleSuggestions},server ≥7.46.0 的三腿上旧键**一个字都不铸**,无 alias)——
|
|
724
|
-
* 引擎为这次 ask 铸的「不再询问」选项,**判别联合** `single | batch`。
|
|
692
|
+
* "tool_approval" only(server ≥7.46.0;core 5.58.0 design/375。**BREAKING 换键** —— 整体取代 ≤7.45 的三元组键 `ruleSuggestions`,
|
|
693
|
+
* 无 alias;那只旧键 sdk 26.0.0 随底线 7.52.0 删)—— 引擎为这次 ask 铸的「不再询问」选项,**判别联合** `single | batch`。
|
|
725
694
|
*
|
|
726
695
|
* 形、序、在场性契约、两臂兑付法与**下标语义随腿不同**的硬条款,逐字见 {@link RuleOffer} 顶注。
|
|
727
696
|
*
|
|
728
|
-
* 🔴
|
|
729
|
-
*
|
|
730
|
-
* 这次 ask 的候选。现成的单点窄读器 = `@sema-agent/client-core` 的 `readRuleOfferSupply(offers, legacy)`
|
|
731
|
-
* (0.57.0 起是公面),自己再写一遍就是多一份会漂的判官。
|
|
697
|
+
* 🔴 **在场即承诺**:只在挂了规则店的部署上出现;**缺席**只说「这张卡没有可兑的选项」(三种成因 wire 上不可分:没挂规则店 / 引擎没为这条命令铸出候选 / 命令字节读不出)——
|
|
698
|
+
* 别据一次缺席诊断部署,也别自铸候选填空(手拼的规则文本被拒 `ruleRefusal: "rule_not_offered"`)。现成的单点窄读器 = `@sema-agent/client-core` 的 `readRuleOfferSupply`。
|
|
732
699
|
*
|
|
733
|
-
* ⚠️
|
|
700
|
+
* ⚠️ **兑付射程**:唯一兑付通道是按本帧 `approvalId` 的 **live respond 腿**
|
|
734
701
|
* (单副本进程内映射)。重放到另一副本 / 重启后那把 `approvalId` 是 404,人只能走 durable decide 腿,
|
|
735
702
|
* 而**那条腿的体不带规则位**——别把一条重放出来的 offer 读成「它还兑得动」。
|
|
736
703
|
*/
|
|
@@ -748,7 +715,7 @@ export interface ToolApprovalFrame {
|
|
|
748
715
|
mandated?: true;
|
|
749
716
|
/**
|
|
750
717
|
* "tool_approval" only, ADDITIVE(server ≥7.102.0 / S-721 / core 7.32.0 #1092)—— 强制位**站在哪一个词上**:
|
|
751
|
-
* {@link PersistedRuleMandate}
|
|
718
|
+
* {@link PersistedRuleMandate} 闭集之一(server `src/tool-approval.ts:841`,值经 `approval-card.ts` 的
|
|
752
719
|
* `readClosedWordSeat(req, "mandate")` 窄读 = core `isPersistedRuleMandate` 筛,集外词读作缺席 + 计一次 fail-open tag)。
|
|
753
720
|
* 只在 {@link mandated} 为真的**整因**是那一个词时在场 ⇒ 在场蕴含 `mandated:true`;反向不成立。
|
|
754
721
|
* 🔴 **缺席从不命名一个词,也不等于「不强制」**(读 {@link mandated})。echo-only。
|
|
@@ -763,13 +730,9 @@ export interface ToolApprovalFrame {
|
|
|
763
730
|
* ⚠️ **耐久腿(park 行)今天不携本键**(core 的 `PendingAction` 上没有这一位);卡面那一份走
|
|
764
731
|
* `card_json`,与 park 行的 `pendingAction` 是**两条腿**,别混。 */
|
|
765
732
|
denialLimitFallback?: DenialLimitFallback;
|
|
766
|
-
/** "tool_approval" only, ADDITIVE(server [7.13.0, 7.117.0);core 5.25.0 #144)—— 这只 ask **命中**了调用方的一条持久 allow 规则、而那条规则**清不掉**它:值 = 被越级的
|
|
767
|
-
* 那条规则**原文**(已脱敏 + 限长;UNTRUSTED-for-display,与 {@link message} 同待遇)。缺席 ≠「你没有规则」;与 {@link governanceForced} 刻意分列。
|
|
768
|
-
* ⚰️ **`persistedRuleShadowed` 退役(server 7.117.0 / core 7.42.0,BREAKING 无别名)**:server 自 7.117.0 起**恒不再铸它**;继任是 {@link allowRuleShadowed}
|
|
769
|
-
* (覆盖 allow 层五个成员,不只是规则店)。SDK 保留声明只为读 [7.13.0, 7.117.0) 窗内的旧 server;登记在 `_keyset-divergence.ts` 退役名单,删除条件 = 支持地板抬过 7.117.0。 */
|
|
770
|
-
persistedRuleShadowed?: string;
|
|
771
733
|
/**
|
|
772
|
-
* "tool_approval" only, ADDITIVE (**server ≥7.117.0 / core 7.42.0 — BREAKING rename**, replacing the retired string
|
|
734
|
+
* "tool_approval" only, ADDITIVE (**server ≥7.117.0 / core 7.42.0 — BREAKING rename**, replacing the retired string `persistedRuleShadowed` of servers [7.13.0, 7.117.0); no alias —
|
|
735
|
+
* sdk 26.0.0 deleted that key's declaration):
|
|
773
736
|
* the allow-layer members that **matched this call and could NOT clear this ask** — one record `{ member, entries, omitted? }` per matching member (see
|
|
774
737
|
* {@link AllowRuleShadow}). `member` ∈ `hook` / `deployment` / `persisted` / `skill` / `request` (see {@link ALLOW_RULE_MEMBERS}); `entries` = the entries that member
|
|
775
738
|
* matched, as their source spells them (UNTRUSTED-for-display like {@link message}, secret-redacted, ≤512 chars each, ≤32 listed; a `hook` record's `entries` is
|
|
@@ -889,22 +852,23 @@ export interface ToolApprovalFrame {
|
|
|
889
852
|
* ⚠️ **缺席不是证据**:旧 server 从不发它;本键说的仍是这只帧的收场,run 的去向照旧读 run 行 / checkpoint 面(见 {@link outcome})。
|
|
890
853
|
* 带系统成因的 `VOID` / `DENIED` 行被 CAS 输家读到时,同版起帧的 `outcome` 由 `denied` 变 `expired`,按本键分辨。 */
|
|
891
854
|
cause?: ApprovalSettleCause;
|
|
892
|
-
/** ADDITIVE(server [7.69.0, 7.72.0);core 7.10.0
|
|
855
|
+
/** ADDITIVE(server [7.69.0, 7.72.0);core 7.10.0)—— **为什么这一问会到我手上**:分类器被咨询过但答不了。
|
|
893
856
|
* 形与三条硬读法(开集 `cause` / 缺席不是断言 / switch 带 default)逐字见 {@link ClassifierUnavailable}。
|
|
894
|
-
* ⚰️
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
857
|
+
* ⚰️ **退役(server 7.72.0 / core 7.14.0,BREAKING 无别名)**:server 三腿自 7.72.0 起**恒不再铸它**;继任是 `tool_end.gate` / `permissionDenied.gate` 上的
|
|
858
|
+
* `disposition.cause`(闭二词 `unavailable` / `parse_error`,答的是「这次 deny 是什么形」而非「为什么不可用」,旧 switch 搬不过去)。
|
|
859
|
+
* 🔴 **为什么 26.0.0 帧上还声明它**:支持面 [7.52.0, ∞) 内 server 7.69–7.71 的帧仍发它,闭形 `InboxRow` 上的同名键具型 ⇒ 帧与行同读(同一个事实不一处具型、一处读 `unknown`)。
|
|
860
|
+
* 退役条件:支持底线 ≥ 7.106.0 时随下一个 major 删(与 {@link ruleStoreUnreadable} 一并)。 */
|
|
898
861
|
classifierUnavailable?: ClassifierUnavailable;
|
|
899
|
-
/** ADDITIVE(server
|
|
862
|
+
/** ADDITIVE(server [7.72.0, 7.106.0);core 7.14.0)—— **规则车道读不通的是哪一半**。在场 ⇔ `origin ===
|
|
900
863
|
* "rule_store_unavailable"`:`store` = 接上的规则店读不了(去看店与网络);`call` = 店读到了但**这条命令**按人的
|
|
901
864
|
* deny/ask 行读不出来(去看命令写法)。一个 `origin` 词对这两件事同形,不投它人只能把两者都读成「我的规则坏了」,
|
|
902
865
|
* 而两者的恢复动词一个在运维一个在提示词。帧与 inbox 行同投;`card_json` 卡刻意不带(它跟 `origin` 走,而
|
|
903
866
|
* `origin` 本就不在卡上)。缺席 = `origin` 不是该词(不是「规则店没问题」的断言)。
|
|
904
|
-
* ⚰️ **退役(server 7.106.0 / core 7.34.0
|
|
905
|
-
*
|
|
906
|
-
*
|
|
907
|
-
*
|
|
867
|
+
* ⚰️ **退役(server 7.106.0 / core 7.34.0,BREAKING — wire,无别名)**:server 两面自 7.106.0 起**恒不再铸它** —— 规则店读不出不再
|
|
868
|
+
* 起卡;信号改走会话流的用户面通告 `engine_notice` **`permission.rule_store_unavailable`**(`detail.at` = `prepare` / `call`;规则读不出期间这条 run 怎么裁决,
|
|
869
|
+
* 以该通告原文为准,见 `events.ts` engine_notice 臂)。`origin` 词表里的 `rule_store_unavailable` 仍在(不再带判别位)。
|
|
870
|
+
* 🔴 **为什么 26.0.0 帧上还声明它**:支持面内 server 7.72–7.105 的帧仍发它,闭形 `InboxRow` 上的同名键具型 ⇒ 帧与行同读。
|
|
871
|
+
* 退役条件:支持底线 ≥ 7.106.0 时随下一个 major 删(与 {@link classifierUnavailable} 一并)。 */
|
|
908
872
|
ruleStoreUnreadable?: "store" | "call";
|
|
909
873
|
/** ADDITIVE(server ≥**7.78.1**;core 7.19.0)—— 这只**根外读** ask 的**清障目录**:把 `dir` 加进本会话的
|
|
910
874
|
* 读目录(壳侧既有的 `/add-dir` 口),同一条调用就不会再问。
|
|
@@ -923,6 +887,11 @@ export interface ToolApprovalFrame {
|
|
|
923
887
|
* 🔴 **第二成员的域只有字面 `true`** —— 上游刻意把它做成「形而不是值」,好让这个座不能被悄悄放宽成
|
|
924
888
|
* 「也许有帮助」的提示。写得出 `clearsThisAsk: false` 的代码当场编译红。
|
|
925
889
|
*
|
|
890
|
+
* 🔴 **`covers`(可选;引擎 core 7.22.0 起,server 经读边界的窄读逐键带出)**:缺席 = `dir` 是一个**目录**(把它加进读目录,目录里的东西随之放行);
|
|
891
|
+
* `"exact"` = `dir` 是命令**点名的那一条路径本身**(一个文件 / 一条具体路径,不是包含它的目录),按原样提供 —— 消费方**加的就是这个串本身**,
|
|
892
|
+
* 把它展开成模式什么也授不到。域 = {@link READ_ROOT_COVERS}(今天只有 `"exact"` 这一词;引擎 `ReadRootGrantCandidate.covers`;集外词 ⇒ server 整只候选丢,不带半截);
|
|
893
|
+
* `covers` 在场时壳**不得**把这一行渲成「加目录」。呈卡帧({@link ApprovalRequestFrame})与本帧读同一处定义。
|
|
894
|
+
*
|
|
926
895
|
* ⚠️ **只此一面,别在别处找它**:`card_json` / inbox 行 / `/v1/approvals` 富行 / park 面**都不带**这一位
|
|
927
896
|
* (上游的负控逐字写着「耐久 park 行在这一版没有本座的孪生」)—— 一只 **PARKED** 的根外读 ask 渲的仍是
|
|
928
897
|
* 单独那张确认卡。所以 {@link ApprovalCard} 上没有本键,那不是漏声明。
|
|
@@ -932,6 +901,7 @@ export interface ToolApprovalFrame {
|
|
|
932
901
|
* 可能加完根还会再问一次。 */
|
|
933
902
|
readRootCandidate?: {
|
|
934
903
|
dir: string;
|
|
904
|
+
covers?: ReadRootCover;
|
|
935
905
|
clearsThisAsk: true;
|
|
936
906
|
};
|
|
937
907
|
[k: string]: unknown;
|
|
@@ -996,21 +966,12 @@ export interface ApprovalCard {
|
|
|
996
966
|
/** ADDITIVE(server ≥7.116.0;真才带、永不 `false`;缺席 = 这张卡上「本会话放行」记得住 **或** 老 server):与 {@link ToolApprovalFrame.rememberRefused} **同一位同一件事**
|
|
997
967
|
* (帧 / `card_json` / 重放帧三面同一份素材)—— 决定照收、只放行这一次,回执 `rememberApplied` 恒 `false`。 */
|
|
998
968
|
rememberRefused?: true;
|
|
999
|
-
/**
|
|
1000
|
-
* 「不再询问」,回决时用 `persistRule.rule` 报出选中的那一条。
|
|
1001
|
-
* 语义、**「在场性即承诺」**(只在规则店真装配时在场)与兑付面的射程逐字见
|
|
1002
|
-
* {@link ToolApprovalFrame.ruleSuggestions} —— live 帧 / `card_json` / 重放帧三面**同一份素材**。 */
|
|
1003
|
-
ruleSuggestions?: RuleSuggestion[];
|
|
1004
|
-
/** server ≥7.46.0(core 5.58.0 design/375,**BREAKING 换键**,取代上面那条退役键):引擎为这次 ask 铸的
|
|
969
|
+
/** server ≥7.46.0(core 5.58.0 design/375,**BREAKING 换键**,取代 ≤7.45 的三元组键;那只旧键 sdk 26.0.0 删):引擎为这次 ask 铸的
|
|
1005
970
|
* 「不再询问」选项,判别联合 `single | batch`。语义、序即契约、在场性即承诺、两臂兑付法与**下标语义
|
|
1006
971
|
* 随腿不同**的硬条款,逐字见 {@link RuleOffer} 与 {@link ToolApprovalFrame.ruleOffers} ——
|
|
1007
972
|
* live 帧 / `card_json` / 重放帧三面**同一份素材**(server 侧同一只 `copyRuleOffer` 投影)。 */
|
|
1008
973
|
ruleOffers?: RuleOffer[];
|
|
1009
|
-
/** ADDITIVE(server [7.13.0, 7.117.0)
|
|
1010
|
-
* ⚰️ **`persistedRuleShadowed` 退役(server 7.117.0 / core 7.42.0,BREAKING 无别名)**:server 自 7.117.0 起**恒不再铸它**(严格卡 schema 连带有这个键的存量卡也拒读);
|
|
1011
|
-
* 继任是 {@link allowRuleShadowed}。SDK 保留声明只为读 [7.13.0, 7.117.0) 窗内的旧 server;登记在 `_keyset-divergence.ts` 退役名单。 */
|
|
1012
|
-
persistedRuleShadowed?: string;
|
|
1013
|
-
/** ADDITIVE(**server ≥7.117.0 / core 7.42.0,BREAKING 换名**,取代上面那条退役键):allow 层里命中了这次调用、却清不掉这只 ask 的成员,`{ member, entries, omitted? }[]`。
|
|
974
|
+
/** ADDITIVE(**server ≥7.117.0 / core 7.42.0,BREAKING 换名**,取代 [7.13.0, 7.117.0) 的串 `persistedRuleShadowed`;那只旧键 sdk 26.0.0 删):allow 层里命中了这次调用、却清不掉这只 ask 的成员,`{ member, entries, omitted? }[]`。
|
|
1014
975
|
* 语义、五个 `member`、`hook` 成员的 `entries` 点名注册(≥7.132.0;此前恒空表)、卡上那句话**在 {@link message} 里**、**「缺席 ≠ 你没有规则」** 与同 {@link governanceForced} 的分列,逐字见 {@link ToolApprovalFrame.allowRuleShadowed} ——
|
|
1015
976
|
* live 帧 / `card_json` / 重放帧 / `approval_request` 呈卡帧四面**同一份素材**(server 同一只窄读)。`card_json` 是严格信封:7.116.x 副本写下的、带旧键的卡新副本读不动(重放跳过)。 */
|
|
1016
977
|
allowRuleShadowed?: AllowRuleShadow[];
|
|
@@ -1042,7 +1003,7 @@ export interface ApprovalCard {
|
|
|
1042
1003
|
};
|
|
1043
1004
|
/** ADDITIVE(server ≥7.23.0;A-057.④ 补公示):规则出处证据——每员=值或具名缺席词;展示/对账元数据,
|
|
1044
1005
|
* 永不是裁决输入。形状与语义逐字见 {@link ToolApprovalFrame.ruleEvidence}(帧与卡同一份素材)。 */
|
|
1045
|
-
ruleEvidence?: ToolApprovalFrame["ruleEvidence"]
|
|
1006
|
+
ruleEvidence?: NonNullable<ToolApprovalFrame["ruleEvidence"]>;
|
|
1046
1007
|
/** ADDITIVE(server ≥7.55.0;S-139 补公示 —— server 早随卡投出,帧与卡走**同一只窄读函数**同值):
|
|
1047
1008
|
* {@link ApprovalCard.ruleOffers} 的**缺席因由**。语义、闭四词集(server ≥7.129.0)与每一臂的壳指路义务逐字见
|
|
1048
1009
|
* {@link RuleOffersAbsence} / {@link ToolApprovalFrame.ruleOffersAbsence}。 */
|
|
@@ -1058,20 +1019,40 @@ export interface ApprovalCard {
|
|
|
1058
1019
|
askClass?: AskClass;
|
|
1059
1020
|
/** ADDITIVE(K-37 扩项;server ≥7.109.0):这一问属于的全部类(非空,首员 = {@link askClass});见 {@link ToolApprovalFrame.classes}。 */
|
|
1060
1021
|
classes?: AskClass[];
|
|
1061
|
-
/**
|
|
1062
|
-
*
|
|
1063
|
-
*
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
* SDK 保留声明只为读 [7.69.0, 7.72.0) 窗内的旧 server;登记在 `_keyset-divergence.ts` 退役名单。 */
|
|
1022
|
+
/** (server [7.69.0, 7.72.0) 铸;core 7.10.0 #616)分类器答不了的因由 —— 形与三条硬读法见 {@link ClassifierUnavailable}。
|
|
1023
|
+
* ⚰️ **退役(server 7.72.0 / core 7.14.0,BREAKING 无别名)**:server 三腿自 7.72.0 起**恒不再铸它**;继任是 `tool_end.gate` / `permissionDenied.gate` 上的
|
|
1024
|
+
* `disposition.cause`(闭二词 `unavailable` / `parse_error`,答的是「这次 deny 是什么形」而非「为什么不可用」,旧 switch 搬不过去)。
|
|
1025
|
+
* 🔴 **为什么卡上还声明它**(帧上的同名键另有退役窗口,见 {@link ToolApprovalFrame.classifierUnavailable}):钉版 server(7.134.0)的卡 schema(`ApprovalCardSchema`)**仍收这一位** —— 7.69–7.71 写下、仍待决的
|
|
1026
|
+
* `card_json` 存行原样回放到 `approval_request.card` / 重放帧上。本包的开形面以钉版 server 的那张面为准:它还声明,本包就声明;它删了,本包同版删。 */
|
|
1067
1027
|
classifierUnavailable?: ClassifierUnavailable;
|
|
1068
1028
|
}
|
|
1069
1029
|
/** 同源锚对账面(照 {@link TOOL_APPROVAL_FRAME_KEYS} 先例):`ApprovalRequestFrame` 的**字段名清单**,
|
|
1070
1030
|
* 给下游值拷贝(client-core / web 各自持同名闭集 copy)做机器对账用。
|
|
1071
1031
|
* **新增帧字段必须同步进本清单**(有测试钉)。 */
|
|
1072
|
-
export declare const APPROVAL_REQUEST_FRAME_KEYS: readonly ["type", "schemaVersion", "askId", "taskId", "kind", "card", "expiresInMs", "expiresAtMs", "serverNowMs", "approvalId"];
|
|
1032
|
+
export declare const APPROVAL_REQUEST_FRAME_KEYS: readonly ["type", "schemaVersion", "askId", "taskId", "kind", "card", "expiresInMs", "expiresAtMs", "serverNowMs", "approvalId", "mandated", "mandate", "origin", "boundGrantDigest", "boundGrants", "classifierNoRuling", "boundGrantAbsence", "approvalCard", "readRootCandidate", "probeReason"];
|
|
1033
|
+
/**
|
|
1034
|
+
* 呈卡帧顶层**卡外活面事实座**的键名表(server ≥7.133.0;server `APPROVAL_REQUEST_LIVE_FACT_KEYS`,同名同序)。一问一帧族之后,呈卡腿的开卡帧是这只 ask 的**全部**开卡事实:
|
|
1035
|
+
* 耐久的那张卡在 `card` 里,卡外那十位(强制位 / 强制词 / 出身 / 技能授予摘要与值 / 分类器未裁 / 授予缺席 / 引擎卡词 / 读根候选 / 探测原因)在帧顶层 ——
|
|
1036
|
+
* 与旧族活卡帧 {@link ToolApprovalFrame} 上同名键**同一份素材**(型就是它的 `Pick`,不手抄第二份)。
|
|
1037
|
+
* 🔴 **只有活铸的那一帧带**(durable 腿的账本记下的是铸帧当时的那一帧,所以账本重放里的历史帧带着铸帧时给到的那几位);断连重放帧(`buildReplayFrame` 从 `card_json` 回读)恒缺席这十位 ——
|
|
1038
|
+
* 卡外事实不在耐久的卡里。缺席不是「没有」,是「这一帧不带」。
|
|
1039
|
+
*/
|
|
1040
|
+
export declare const APPROVAL_REQUEST_LIVE_FACT_KEYS: readonly ["mandated", "mandate", "origin", "boundGrantDigest", "boundGrants", "classifierNoRuling", "boundGrantAbsence", "approvalCard", "readRootCandidate", "probeReason"];
|
|
1041
|
+
/** 呈卡帧活面事实座的类型面 = 旧族活卡帧同名座的 `Pick`。{@link ApprovalRequestFrame} `extends` 本型 —— 十位只在这里声明一次(测试钉:键清单 ≡ `keyof` 本型,呈卡帧自己的成员里没有这十位,
|
|
1042
|
+
* 十位各是旧族帧与 spec 的具名成员,座上可选位不收显式 `undefined`)。 */
|
|
1043
|
+
export type ApprovalRequestLiveFacts = Pick<ToolApprovalFrame, (typeof APPROVAL_REQUEST_LIVE_FACT_KEYS)[number]>;
|
|
1073
1044
|
/** {@link ApprovalCard} 的字段名清单(同上,卡是嵌套结构,单独一份)。 */
|
|
1074
|
-
export declare const APPROVAL_CARD_KEYS: readonly ["toolName", "message", "args", "argsOmitted", "toolCallId", "risk", "governanceForced", "rememberRefused", "
|
|
1045
|
+
export declare const APPROVAL_CARD_KEYS: readonly ["toolName", "message", "args", "argsOmitted", "toolCallId", "risk", "governanceForced", "rememberRefused", "ruleOffers", "allowRuleShadowed", "fromSubagent", "sourceTaskId", "sourceAgentName", "delegation", "inputHasBidi", "probeCause", "ruleEvidence", "ruleOffersAbsence", "denialLimitFallback", "classifierUnavailable", "askClass", "classes"];
|
|
1046
|
+
/**
|
|
1047
|
+
* 审批开卡帧的**帧族词表**(闭集;server `APPROVAL_FRAME_FAMILIES` 逐词同序,`dist/tool-approval.d.ts`)—— wire 上一只 ask 的开卡帧可能属于的族:
|
|
1048
|
+
* · `tool_approval` —— 旧族(活卡帧 `tool_approval` / 消卡帧 `tool_approval_complete`);
|
|
1049
|
+
* · `approval_request` —— 呈卡族(开卡帧 `approval_request` / 消卡帧 `approval_complete` / 批级撤卡帧 `approval_revoke`)。
|
|
1050
|
+
* **两处读同一只词表**(一个事实一处声明):能力位 {@link import("../types.js").Capabilities.approvalFrameFamilies}(这台 worker 呈卡用哪一族)与请求键
|
|
1051
|
+
* {@link import("../settings.js").SemaSettings.approvalFrameFamilies}(server ≥7.134.0:这条 run 的客户端**渲染得了**哪些族)。加族 = server 下一版 + 本常量同批加(同源锚当场红)。
|
|
1052
|
+
*/
|
|
1053
|
+
export declare const APPROVAL_FRAME_FAMILIES: readonly ["tool_approval", "approval_request"];
|
|
1054
|
+
/** {@link APPROVAL_FRAME_FAMILIES} 的成员型。 */
|
|
1055
|
+
export type ApprovalFrameFamily = (typeof APPROVAL_FRAME_FAMILIES)[number];
|
|
1075
1056
|
/** 流内审批呈卡帧(SSE,`type` 即事件名;design/172 §3.1 + 车3 §4.1)。**两腿两形**:live 腿上它与
|
|
1076
1057
|
* `tool_approval`/`question`/`elicitation` 同一条 out-of-band 通道、在 token 流上交织,**不是**
|
|
1077
1058
|
* `AgentEvent` 臂(按 SSE `event:` 名分派);durable 腿上 server 会 append 它,于是同一帧在
|
|
@@ -1091,7 +1072,7 @@ export declare const APPROVAL_CARD_KEYS: readonly ["toolName", "message", "args"
|
|
|
1091
1072
|
* 非流式 `POST /v1/tasks`(无投递面)/ council/team 子任务腿(无 seam)不产卡;adhoc(非 durable)
|
|
1092
1073
|
* sync 流的 taskId 是一次性 id,**无重放句柄**;宿主 run 终结后到达的 bg 子代 ask 不投死流,经 core
|
|
1093
1074
|
* park 落 durable gate(inbox 既有可见面)。 */
|
|
1094
|
-
export interface ApprovalRequestFrame {
|
|
1075
|
+
export interface ApprovalRequestFrame extends ApprovalRequestLiveFacts {
|
|
1095
1076
|
type: Extract<HitlFrameType, "approval_request">;
|
|
1096
1077
|
/** 帧形版本 —— **本类型只描述 v1**。别的版本不是这个形状,走 {@link ApprovalFrameEnvelope}。 */
|
|
1097
1078
|
schemaVersion: 1;
|
|
@@ -1113,11 +1094,48 @@ export interface ApprovalRequestFrame {
|
|
|
1113
1094
|
expiresAtMs: number;
|
|
1114
1095
|
/** 铸帧时刻的 server 时钟(壳用它与本地时钟校偏)。 */
|
|
1115
1096
|
serverNowMs: number;
|
|
1116
|
-
/**
|
|
1117
|
-
*
|
|
1097
|
+
/** `POST /v1/tool-approvals/{id}/respond` 与 `GET /v1/tool-approvals/{id}` 的 id —— **server ≥7.133.0 恒等于 {@link askId}**(行的键就是这只 ask 唯一的 wire 身份,64 位十六进制串;
|
|
1098
|
+
* 本族的消卡帧 {@link ApprovalCompleteFrame} 同带它)。当**不透明串**用,别按 uuid 解析。≤7.132.x 上它是与并行 `tool_approval` 帧同值的 uuid(旧帧桥 / 去重键)。 */
|
|
1118
1099
|
approvalId: string;
|
|
1119
1100
|
[k: string]: unknown;
|
|
1120
1101
|
}
|
|
1102
|
+
/** {@link ApprovalCompleteFrame} 的字段名清单(同源锚对账面,照 {@link APPROVAL_REQUEST_FRAME_KEYS} 先例)。 */
|
|
1103
|
+
export declare const APPROVAL_COMPLETE_FRAME_KEYS: readonly ["type", "schemaVersion", "askId", "taskId", "approvalId", "outcome", "cause", "parked", "serverNowMs"];
|
|
1104
|
+
/**
|
|
1105
|
+
* 呈卡族的**单卡消卡帧**(`approval_complete`;server ≥7.133.0)—— 一只 ask 落定时发给每一条**收到过它的呈卡帧**的呈卡腿连接(SSE,`type` 即事件名;durable 腿同帧落账本、重放里也出现)。
|
|
1106
|
+
*
|
|
1107
|
+
* 🔴 **一条腿一个帧族**:呈卡协议在一条腿上场(`capabilities.approvalFrameFamilies` = `["approval_request"]`)⇒ 这条腿上一只 ask 的开卡 / 消卡 / 撤卡只走
|
|
1108
|
+
* `approval_request` / 本帧 / {@link ApprovalRevokeFrame},旧族 `tool_approval` / `tool_approval_complete` 一帧都不发(BREAKING;补偿 = `STREAM_APPROVAL_ENABLED=false`)。
|
|
1109
|
+
* 同一只 ask 在同一条腿上不再有两种开卡帧,消费方不再按 `approvalId` 去重。
|
|
1110
|
+
*
|
|
1111
|
+
* 语义与旧族 `tool_approval_complete` 逐字同一件事(同一次 settle 的同一份判决:`outcome` 三词、非人结局的 `cause`、park 路由的 `parked`),只是它属于本族:键与开卡帧对位
|
|
1112
|
+
* (`askId` / `taskId` / `approvalId`),消卡**按开卡帧的 `askId`**。与撤卡帧的分工:撤卡帧是**批级**的(兄弟被赢家连坐成 `VOID` 的那一批,不带逐卡终局);本帧是**单卡**终局
|
|
1113
|
+
* (人答 / 窗到期 / park 路由 / 取消 …)。同一只 ask 两帧都可能收到(被撤的兄弟自己的登记也按 settle 收场)—— 按 `askId` 清卡即可,两帧不冲突。
|
|
1114
|
+
* 门 = 这条连接的**开卡帧真的送达过**(没见过开卡帧的连接不会收到消卡帧)。**帧只活着通知,行才是真源**:丢帧由开流 preamble 对账补偿(见 {@link ApprovalRequestFrame})。
|
|
1115
|
+
*
|
|
1116
|
+
* ⇒ **读法**:本包只描述 v1(`schemaVersion: 1`);SSE 解析腿不跑谓词,所以 {@link AgentEvent} 的 `approval_complete` 臂载荷是 {@link ApprovalFrameEnvelope},
|
|
1117
|
+
* 用 {@link isApprovalCompleteFrameV1} 窄化才拿得到本类型;窄不下来 ⇒ 按 `askId`(若有)清卡,别猜结局。
|
|
1118
|
+
*/
|
|
1119
|
+
export interface ApprovalCompleteFrame {
|
|
1120
|
+
type: Extract<HitlFrameType, "approval_complete">;
|
|
1121
|
+
/** 帧形版本 —— **本类型只描述 v1**。 */
|
|
1122
|
+
schemaVersion: 1;
|
|
1123
|
+
/** 持久层身份 —— 消卡按它(对位开卡帧的 `askId`)。 */
|
|
1124
|
+
askId: string;
|
|
1125
|
+
/** wire run id(同开卡帧)。 */
|
|
1126
|
+
taskId: string;
|
|
1127
|
+
/** 恒等于 {@link askId}(同开卡帧的 `approvalId`)。 */
|
|
1128
|
+
approvalId: string;
|
|
1129
|
+
/** 这只 ask 怎么落定 —— 与旧族 {@link ToolApprovalFrame.outcome} 同三词:`allowed` / `denied` = 一次决议;`expired` = 非人结局(成因在 {@link cause})。 */
|
|
1130
|
+
outcome: "allowed" | "denied" | "expired";
|
|
1131
|
+
/** 非人结局的成因(`outcome: "expired"` 才在;审批席「结局成因」闭集里非人结局的十四词,与审计 settle 行同一个词,见 {@link ApprovalSettleCause});人答缺席。**缺席不是证据**。 */
|
|
1132
|
+
cause?: ApprovalSettleCause;
|
|
1133
|
+
/** 这只 ask 按 park 路由收尾(行已转 PARKING / PARKED、迟到回决可达);**真才带**。缺席 = 无证据,**禁读作真拒**(同 {@link ToolApprovalFrame.parked})。 */
|
|
1134
|
+
parked?: true;
|
|
1135
|
+
/** 铸帧时刻的 server 钟。 */
|
|
1136
|
+
serverNowMs: number;
|
|
1137
|
+
[k: string]: unknown;
|
|
1138
|
+
}
|
|
1121
1139
|
/** {@link ApprovalRevokeFrame} 的字段名清单(同源锚对账面)。 */
|
|
1122
1140
|
export declare const APPROVAL_REVOKE_FRAME_KEYS: readonly ["type", "schemaVersion", "batchId", "askIds", "reason", "serverNowMs", "taskId"];
|
|
1123
1141
|
/** 批级撤卡帧(SSE;车5-6 §3,design/172 §3.3)。批 = **一次 run 级 abort 的连坐域**(该 run 全部在飞
|
|
@@ -1165,7 +1183,7 @@ export interface ApprovalRevokeFrame {
|
|
|
1165
1183
|
* 窄化;窄不下来 ⇒ **呈通用卡(安全元数据 + 人工 approve/deny),永不 auto-deny**。 */
|
|
1166
1184
|
export interface ApprovalFrameEnvelope {
|
|
1167
1185
|
/** SSE 事件名的回声。开集:未来可能有第三族帧。 */
|
|
1168
|
-
type: "approval_request" | "approval_revoke" | (string & {});
|
|
1186
|
+
type: "approval_request" | "approval_complete" | "approval_revoke" | (string & {});
|
|
1169
1187
|
/** 帧形版本。非 1 ⇒ 本包不描述它的载荷。 */
|
|
1170
1188
|
schemaVersion: number;
|
|
1171
1189
|
[k: string]: unknown;
|
|
@@ -1177,6 +1195,11 @@ export interface ApprovalFrameEnvelope {
|
|
|
1177
1195
|
* + **全部必填键的类型** + **在场可选键的类型**(见上方逐键判据的说明)。
|
|
1178
1196
|
* 判否 ⇒ 走通用卡(安全元数据 + 人工 approve/deny),**不是**拒绝。 */
|
|
1179
1197
|
export declare function isApprovalRequestFrameV1(f: unknown): f is ApprovalRequestFrame;
|
|
1198
|
+
/** 窄化谓词:给定值是否是**本包所描述的** v1 呈卡族消卡帧({@link ApprovalCompleteFrame};server ≥7.133.0)。
|
|
1199
|
+
* `outcome` 查闭三词(它决定卡怎么收,不认识的词不能当已知);`cause` / `parked` 按「**在场必须成形**」查(缺席合法 —— 人答没有成因、非 park 路由没有 `parked`;
|
|
1200
|
+
* 在场但形错 ⇒ 拒:谓词承诺整个 interface,含可选键的类型)。`cause` 查是不是 {@link APPROVAL_SETTLE_CAUSES}(型 {@link ApprovalSettleCause} 与 spec 都是闭集,守卫不比它们宽;
|
|
1201
|
+
* 引擎 / server 加成因词时本表与 spec 同批加员)。判否 ⇒ 按 `askId`(若有)清卡,别猜结局。 */
|
|
1202
|
+
export declare function isApprovalCompleteFrameV1(f: unknown): f is ApprovalCompleteFrame;
|
|
1180
1203
|
/** 窄化谓词:给定值是否是**本包所描述的** v1 撤卡帧。`reason` 只查是不是串(值域开集,见
|
|
1181
1204
|
* {@link ApprovalRevokeFrame.reason});`askIds` 必须真是串数组,否则「清哪些卡」无从谈起。
|
|
1182
1205
|
* `taskId`(S-58)按「**在场必须成形**」查:≤7.54.0 的旧帧无此键(容忍缺席——把它设必查会让旧 server
|
|
@@ -1258,6 +1281,14 @@ export interface AskDecisionAck {
|
|
|
1258
1281
|
* `decision_note`)。**行上有才发**,从不发 `null`/空键 ⇒ 缺席 = 这条决议没留理由(不是「server 藏了」)。
|
|
1259
1282
|
* 与 `updatedInputForwarded` 不同,本字段**落行**,所以幂等回放承诺字节等同。老 server 恒不带。 */
|
|
1260
1283
|
decisionNote?: string;
|
|
1284
|
+
/** server ≥7.133.0:这次请求带的 `note` 有没有**落成行上那段文字**(与 {@link ToolApprovalRespondApplied.noteRecorded} 两口同形同义)——
|
|
1285
|
+
* **只在请求带了 `note` 时在场**;`true` ⇔ 行上 `decisionNote` 逐字就是这次提交的(哪怕是别人先写的同一段文字也算),`false` = 没确认(行上是别人的理由 / 店读不出)。
|
|
1286
|
+
* 首决与幂等回放两形都带;PARKED 赎回腿不带(按「未知」读)。**缺席 ≠ `false`**:没带 `note` 的请求、老 server 都不带这一键。 */
|
|
1287
|
+
noteRecorded?: boolean;
|
|
1288
|
+
/** server ≥7.133.0 在耐久决断口 200 上**确认存在的**披露位(同名同值同义见 {@link ToolApprovalRespondApplied.consumerState}):**本副本上没有引擎腿在等这只问**,只记真(`"absent"`)——
|
|
1289
|
+
* 行判了(幂等回放读得到、审计面记得住),但本机没有任何东西因此续跑;持有悬挂 promise 的可能是另一个副本,或本副本重启后本地窗已空。续没续跑读 run 面,
|
|
1290
|
+
* **绝不把 200 无此键当成「run 已续跑」的证明**(老 server 从不发这个键)。不是 409 / 410:这次决议**确实生效了**。 */
|
|
1291
|
+
consumerState?: "absent";
|
|
1261
1292
|
}
|
|
1262
1293
|
/** The respond route's own refusal code (server `src/tool-approval.ts`, `404 tool_approval.not_pending`): a non-owner AND an
|
|
1263
1294
|
* unknown / settled / expired / wrong-replica id all read the same (no existence oracle). For a consumer holding a card it
|
|
@@ -1285,15 +1316,25 @@ export interface ToolApprovalRespondReplayed {
|
|
|
1285
1316
|
decidedAtMs: number;
|
|
1286
1317
|
decisionNote?: string;
|
|
1287
1318
|
rememberApplied?: false;
|
|
1319
|
+
/** 与 {@link ToolApprovalRespondApplied.noteRecorded} 同形同义(server ≥7.133.0 两口同形):**只在这次请求带了 `note` 时在场**;`true` = 行上那段文字**就是**这次提交的(逐字相等才算),
|
|
1320
|
+
* `false` = 没确认(已决行上是别人的理由 / 没有店 / 确认读也读不到)。晚答的 `note` 从不覆盖首决的理由 —— 要看首决的理由读 {@link decisionNote}。 */
|
|
1321
|
+
noteRecorded?: boolean;
|
|
1322
|
+
/** 这次晚答带了 `persistRule` 而首决已落、**这一次请求不再兑付规则**:恒 `false` + {@link ruleRefusal} `rule_lane_unavailable`(规则只在首决那一拍兑,晚答不补存);没带 `persistRule` ⇒ 键缺席。 */
|
|
1323
|
+
rulePersisted?: false;
|
|
1324
|
+
/** `rulePersisted: false` 时的机读理由(这一臂上只会是 `rule_lane_unavailable` —— 已发布的晚答路径只铸这一词)。 */
|
|
1325
|
+
ruleRefusal?: Extract<RuleRefusalReason, "rule_lane_unavailable">;
|
|
1288
1326
|
}
|
|
1289
1327
|
/** The 200 ack of {@link ToolApprovalsResource.respond}: the decision was APPLIED to a live gate
|
|
1290
|
-
* ({@link ToolApprovalRespondApplied}, `delivery: "applied"`) or the ask was already decided and the first decision is
|
|
1291
|
-
* REPLAYED ({@link ToolApprovalRespondReplayed}, `idempotent: true`)
|
|
1292
|
-
* {@link
|
|
1328
|
+
* ({@link ToolApprovalRespondApplied}, `delivery: "applied"`), or the ask was already decided and the first decision is
|
|
1329
|
+
* REPLAYED ({@link ToolApprovalRespondReplayed}, `idempotent: true`), or (server ≥7.133.0) the answer REDEEMED a parked card
|
|
1330
|
+
* ({@link ToolApprovalRespondParkedRedeemed}, `accepted: "parked_redeemed"`). The discriminants are `delivery` / `idempotent` / `accepted` — read them with
|
|
1331
|
+
* {@link isToolApprovalReplayed} / {@link isToolApprovalParkedRedeemed} before touching the applied-only members (`rememberApplied` and the rule-persistence
|
|
1293
1332
|
* echoes are applied-arm facts; a replay never carries a `delivery`). */
|
|
1294
|
-
export type ToolApprovalRespondAck = ToolApprovalRespondApplied | ToolApprovalRespondReplayed;
|
|
1295
|
-
/** `ack` is the replayed arm of {@link ToolApprovalRespondAck}. */
|
|
1333
|
+
export type ToolApprovalRespondAck = ToolApprovalRespondApplied | ToolApprovalRespondReplayed | ToolApprovalRespondParkedRedeemed;
|
|
1334
|
+
/** `ack` is the replayed arm of {@link ToolApprovalRespondAck} (the first decision of an already-DECIDED ask replayed; a replayed PARKED redemption is its own arm — {@link isToolApprovalParkedRedeemed}). */
|
|
1296
1335
|
export declare function isToolApprovalReplayed(ack: ToolApprovalRespondAck): ack is ToolApprovalRespondReplayed;
|
|
1336
|
+
/** `ack` is the parked-redemption arm of {@link ToolApprovalRespondAck} (server ≥7.133.0): the late answer redeemed a PARKED card through the durable redemption leg. */
|
|
1337
|
+
export declare function isToolApprovalParkedRedeemed(ack: ToolApprovalRespondAck): ack is ToolApprovalRespondParkedRedeemed;
|
|
1297
1338
|
/** The 200 ack of a respond that settled a LIVE gate (server `src/tool-approval.ts`, the ack assembly inside
|
|
1298
1339
|
* `ToolApprovalCoordinator.respond` — exact shape, `decision` echoed). */
|
|
1299
1340
|
export interface ToolApprovalRespondApplied {
|
|
@@ -1365,12 +1406,106 @@ export interface ToolApprovalRespondApplied {
|
|
|
1365
1406
|
* 未带 `note` 的回决 / 老 server ⇒ 字段省略。🔴 **缺席 ≠ `false`**:老 server 对未知请求键静默忽略
|
|
1366
1407
|
* 且照回 200,所以「这台不认识 note」与「记上了」只能靠 `capabilities.approvalDecisionNote` 分 ——
|
|
1367
1408
|
* 位缺席就别发 `note`。
|
|
1409
|
+
* server ≥7.133.0:耐久决断口 {@link AskDecisionAck.noteRecorded}、晚答回放臂 {@link ToolApprovalRespondReplayed.noteRecorded} 与本键**同形同义**(三口一只判据:请求带了 `note` 才在,`true` ⇔ 行上那段文本逐字就是这次提交的)。
|
|
1368
1410
|
*/
|
|
1369
1411
|
noteRecorded?: boolean;
|
|
1412
|
+
/**
|
|
1413
|
+
* server ≥7.133.0 —— **本副本上没有引擎腿在等这只问**:与耐久决断口 {@link AskDecisionAck.consumerState} 同名同值同义的那一位,**只记真**(`"absent"`;缺席 = 本副本有引擎腿在等它,或老 server)。
|
|
1414
|
+
* 在场 ⇔ 本回执结算的是审批机起服时从问账**接管**的登记(前一个进程 / 别的副本铸下、行仍待决):决议照常落行、回执照常 200,但这一决**不会让本副本上任何在跑的东西续跑**
|
|
1415
|
+
* —— 续没续跑读 run 面,别把 200 读成「run 已续跑」。同一位也在 {@link import("../types.js").LivePendingRow.consumerState}(列表行)与 {@link ToolApprovalReadBody} 的 `pending` 臂上。
|
|
1416
|
+
*/
|
|
1417
|
+
consumerState?: "absent";
|
|
1418
|
+
}
|
|
1419
|
+
/** `T` 的**具名成员**(去掉字符串 / 数字索引签名):开集信封里「已知键」那一半 —— 拼封闭的回执臂用,键集只有 `T` 声明的那些,不再是开集。 */
|
|
1420
|
+
type KnownMembers<T> = {
|
|
1421
|
+
[K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
|
|
1422
|
+
};
|
|
1423
|
+
/**
|
|
1424
|
+
* 迟到答复**赎回了一张已停驻的卡**的 200 回执(server ≥7.133.0;`accepted: "parked_redeemed"`):卡的窗到期后这只 ask 转了后台候批(停驻),此时在**另一副本 / 重启之后**按 Yes / No ——
|
|
1425
|
+
* 此前这是 404 `tool_approval.not_pending`(`cause: "unknown_or_other_replica"`),现在答复**走既有的耐久赎回腿**(与 `POST /v1/approvals/:sessionId/decide` 同一道 CAS)并回这张回执。
|
|
1426
|
+
* 体 = 那道赎回腿的回执(见 {@link import("../types.js").ApprovalDecisionResult},`status` / `taskId` / `sessionId` 等原样)+ 本口加的三位:
|
|
1427
|
+
* `approvalId` / `askId`(同值,64 位十六进制串)与判别位 `accepted`;`decision` 在**重放形**上是两词方向(`allow` / `deny`,`allow_session` 折成 `allow`),首次赎回形随赎回腿回执原样(开串);`rememberApplied: false` 只在这次请求要的是 `allow_session`
|
|
1428
|
+
* (停驻赎回不记「本会话放行」);`rulePersisted` / `ruleRefusal` / `persistedRule*` 是 `persistRule` 在赎回腿上的兑付结果(同 {@link ToolApprovalRespondApplied} 的同名键,**规则没存上从不翻转裁决**)。
|
|
1429
|
+
* `idempotent: true` 只在**重放**(同一张已赎回的卡再答一次,回同一份首赎回执)上在场。判别读 {@link isToolApprovalParkedRedeemed};**不要**用 {@link isToolApprovalReplayed} 去读它的重放形。
|
|
1430
|
+
* **封闭**(与「已应用 / 已回放」两兄弟臂、随包 spec 的 `additionalProperties: false` 同形):键集只有 `ApprovalDecisionResult` 声明的具名键加上本口加的那些,没有开放索引签名 ——
|
|
1431
|
+
* 多写一个未知键编译红。
|
|
1432
|
+
*/
|
|
1433
|
+
export interface ToolApprovalRespondParkedRedeemed extends KnownMembers<import("../types.js").ApprovalDecisionResult> {
|
|
1434
|
+
approvalId: string;
|
|
1435
|
+
askId: string;
|
|
1436
|
+
accepted: "parked_redeemed";
|
|
1437
|
+
/** 只在这次请求要的是 `allow_session` 时在场(停驻赎回不记「本会话放行」)。 */
|
|
1438
|
+
rememberApplied?: false;
|
|
1439
|
+
/** 兑付结果键(`persistRule` 在赎回腿上的结果;语义同 {@link ToolApprovalRespondApplied} 的同名键,缺席同样不是 `false`)。 */
|
|
1440
|
+
rulePersisted?: boolean;
|
|
1441
|
+
ruleRefusal?: RuleRefusalReason;
|
|
1442
|
+
persistedRule?: string;
|
|
1443
|
+
persistedRules?: string[];
|
|
1444
|
+
persistedRuleAnchors?: PersistedRuleAnchor[];
|
|
1370
1445
|
}
|
|
1446
|
+
/**
|
|
1447
|
+
* `GET /v1/tool-approvals/:id` 应答体 `state` 的**闭集**(server ≥7.133.0;一只 ask 此刻在哪一态,读法与应答口逐条同源,穷举读):
|
|
1448
|
+
* · `pending` —— 本副本上有在等它的活登记(应答口此刻收得下;体 = 列表面 {@link import("../types.js").LivePendingRow} 的同一只行投影 + `state`);
|
|
1449
|
+
* · `decided` —— 行 `DECIDED`(有人 / 有策略决过;回执三键同晚答回放体:`decision` / `decidedAtMs` / `decisionNote?`);
|
|
1450
|
+
* · `parked` —— 行 `PARKING` / `PARKED`(转后台候批;应答口走迟到受理 / 赎回,耐久回决口照收;`decidePath?` 指耐久回决路径);
|
|
1451
|
+
* · `void` —— 行 `DENIED` / `VOID`(没有人决过它,答案无处兑现;`cause?` 同晚答 404 的成因词,见 {@link AskRowEndingCause})。
|
|
1452
|
+
*
|
|
1453
|
+
* 🔴 **server ≥7.134.0:停驻行(`PARKED`)过门判官**(与应答口判 `409 approval_stale` 同一只)—— 问账行不随赎回 / 取消改写,所以读口去问 checkpoint
|
|
1454
|
+
* 「这张卡的门此刻还是不是该会话当前待决的审批门」,词表**不加字**:
|
|
1455
|
+
* · 门仍开 ⇒ `parked`(+ `decidePath`,不变)—— **只有这一态才渲「去决定」**;
|
|
1456
|
+
* · 门已被人 / 策略结算(checkpoint 上有方向与引擎写的结算时刻)⇒ `decided`(`decision` / `decidedAtMs` / `decisionNote?`,**无 `decidePath`**)—— 渲「已答」;
|
|
1457
|
+
* · 门已过期(取消先把门 expire)/ 被取代 / 结算方是宿主 SLA 扫·窗到期·无人可答 ⇒ `void`(**无 `cause`**:行上没写成因)—— 渲「失效」;
|
|
1458
|
+
* · checkpoint 行没了,或已结算却读不出可用的方向 / 时刻 ⇒ `404 tool_approval.not_pending`(**无 `cause`**)—— 渲「消卡」;
|
|
1459
|
+
* · 门读不出(店故障)⇒ 退回 `parked`(应答口对同一张卡仍按自己的判官 fail-closed)。
|
|
1460
|
+
* **已知边界**(以重读为准):停驻行的 `decided` 可回到 `parked` —— 续跑腿在被批准的动作开跑前失败(环境恢复失败 / 工具不在 / 配置被拒 / 决议输入被拒)时引擎**重开**同一张门
|
|
1461
|
+
* (一次已送达的拒不重开;工具不在与决议输入被拒要重新决);续跑被取消 ⇒ server 把重开的门收掉,读作 `void`,收掉之前的一瞬(或收不掉、交给收割器时)仍可能读到 `parked`;
|
|
1462
|
+
* 重开瞬间两读之间可能读到 `void`。老 server(≤7.133.x)对这几类卡一律答 `parked` + `decidePath`。
|
|
1463
|
+
*/
|
|
1464
|
+
export declare const TOOL_APPROVAL_READ_STATES: readonly ["pending", "decided", "parked", "void"];
|
|
1465
|
+
/** {@link TOOL_APPROVAL_READ_STATES} 的成员型。 */
|
|
1466
|
+
export type ToolApprovalReadState = (typeof TOOL_APPROVAL_READ_STATES)[number];
|
|
1467
|
+
/** `GET /v1/tool-approvals/:id` 非 `pending` 三臂共用的**行投影**(键名是列表面 `livePending[]` 行的同名子集 —— 一个读者一套键):`frame` = 断连重放的那只**呈卡帧**
|
|
1468
|
+
* (`approval_request` 形;卡读不出 ⇒ 缺席,不编)。 */
|
|
1469
|
+
export interface ToolApprovalReadProjection {
|
|
1470
|
+
approvalId: string;
|
|
1471
|
+
/** 登记时刻(epoch ms)。 */
|
|
1472
|
+
ts: number;
|
|
1473
|
+
/** 窗死线(绝对 epoch ms,一次铸定永不重算)。 */
|
|
1474
|
+
expiresAtMs: number;
|
|
1475
|
+
sessionId?: string;
|
|
1476
|
+
toolName?: string;
|
|
1477
|
+
frame?: ApprovalRequestFrame;
|
|
1478
|
+
}
|
|
1479
|
+
/**
|
|
1480
|
+
* `GET /v1/tool-approvals/:id` 的 200 体(server ≥7.133.0):**按 `state` 判别**的四臂联合(读一句 `switch (body.state)`)。纯读:零写、零结算、不碰本地登记。
|
|
1481
|
+
* `pending` 臂 = 列表面行 {@link import("../types.js").LivePendingRow} 原样 + `state`(`frame` 是同一格同一个形:呈卡腿上 {@link ApprovalRequestFrame},旧族腿上 {@link ToolApprovalFrame},按 `frame.type` 判 —— 一处声明,见 `LivePendingRow.frame`)。
|
|
1482
|
+
* 404 `tool_approval.not_pending`(经 {@link isToolApprovalNotPending};`err.extra.cause` 见 {@link ToolApprovalNotPendingCause})= 属主不过 / 未知 id / 行仍待决而本副本没有在等它的登记(活在别的副本上,
|
|
1483
|
+
* `cause: "unknown_or_other_replica"`);没有 ask 账的部署 ⇒ 同句 404、**不带 `cause`**。`toolApproval` 面没开 ⇒ 501 `feature.tool_approval_disabled`。
|
|
1484
|
+
*/
|
|
1485
|
+
export type ToolApprovalReadBody = ({
|
|
1486
|
+
state: "pending";
|
|
1487
|
+
} & import("../types.js").LivePendingRow) | ({
|
|
1488
|
+
state: "decided";
|
|
1489
|
+
decision: "allow" | "deny";
|
|
1490
|
+
decidedAtMs: number;
|
|
1491
|
+
decisionNote?: string;
|
|
1492
|
+
} & ToolApprovalReadProjection) | ({
|
|
1493
|
+
state: "parked";
|
|
1494
|
+
decidePath?: string;
|
|
1495
|
+
} & ToolApprovalReadProjection) | ({
|
|
1496
|
+
state: "void";
|
|
1497
|
+
cause?: AskRowEndingCause;
|
|
1498
|
+
} & ToolApprovalReadProjection);
|
|
1371
1499
|
export declare class ToolApprovalsResource {
|
|
1372
1500
|
private readonly t;
|
|
1373
1501
|
constructor(t: Transport);
|
|
1502
|
+
/** GET /v1/tool-approvals/:id — **按问读口**(server ≥7.133.0):一只 ask 此刻在哪一态({@link ToolApprovalReadBody} 的 `state` 四词,{@link TOOL_APPROVAL_READ_STATES})。
|
|
1503
|
+
* 与 {@link ToolApprovalsResource.respond} 同根同门(同一只鉴权 / 属主身份;属主不过与未知 id **同形** 404,无存在性谕示)。用途:拿着重放来的卡(或 `livePending` 行)的壳,在答之前
|
|
1504
|
+
* / 重连之后问一句「这张卡还活着吗、被谁决过没有」,而不是靠 `respond` 的 404 反推。`approvalId` 恒等于 {@link ApprovalRequestFrame.askId}(64 位十六进制串,当不透明串)。
|
|
1505
|
+
* 老 server(≤7.132.x)没有这一口 ⇒ 路由级 404 `not_found.route`(与本口的 404 `tool_approval.not_pending` 靠 `errorCode` 分,**别按状态码分**)。 */
|
|
1506
|
+
get(approvalId: string, opts?: {
|
|
1507
|
+
signal?: AbortSignal;
|
|
1508
|
+
}): Promise<ToolApprovalReadBody>;
|
|
1374
1509
|
/** POST /v1/tool-approvals/:id/respond — settle a parked LIVE tool-approval gate with the human's decision.
|
|
1375
1510
|
* The engine's suspended tool call resumes (allow) or is refused (deny) on the still-open task connection.
|
|
1376
1511
|
*
|
|
@@ -1407,7 +1542,7 @@ export declare class ToolApprovalsResource {
|
|
|
1407
1542
|
* 合取批没有单条文本可抄,选择键 = 帧上 `ruleOffers` 的**下标**;成功回执带
|
|
1408
1543
|
* {@link ToolApprovalRespondApplied.persistedRules} + {@link ToolApprovalRespondApplied.persistedRuleAnchors}。
|
|
1409
1544
|
*
|
|
1410
|
-
* ⚠️ 帧上 `ruleOffers`
|
|
1545
|
+
* ⚠️ 帧上 `ruleOffers` 缺席时**别发这一键**:**这张卡**没有可兑的
|
|
1411
1546
|
* 东西,发了拿回的必定是 `rulePersisted:false` + **`rule_lane_unavailable`**(素材缺席在候选比对
|
|
1412
1547
|
* **之前**就短路了,所以不会是 `rule_not_offered`)。缺席有多个成因 —— 没接规则店 / 引擎对这条命令
|
|
1413
1548
|
* 铸不出候选 / 命令原字节读不出 / 这只 ask 属七族不铸 offer 之一 —— 所以**别**据一帧、也别据这一个
|
|
@@ -1495,4 +1630,5 @@ export declare class ToolApprovalsResource {
|
|
|
1495
1630
|
signal?: AbortSignal;
|
|
1496
1631
|
}): Promise<AskDecisionAck>;
|
|
1497
1632
|
}
|
|
1633
|
+
export {};
|
|
1498
1634
|
//# sourceMappingURL=tool-approvals.d.ts.map
|