@sema-agent/sdk 23.1.0 → 25.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 +201 -4
- package/dist/client.d.ts +6 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -1
- 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 -31
- package/dist/device/index.js.map +1 -1
- package/dist/errors.d.ts +318 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +121 -10
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +165 -23
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +19 -0
- package/dist/events.js.map +1 -1
- package/dist/health.d.ts +29 -1
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js.map +1 -1
- package/dist/index.d.ts +38 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -4
- 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/registry/errors.d.ts +3 -0
- package/dist/registry/errors.d.ts.map +1 -1
- package/dist/registry/errors.js +3 -2
- package/dist/registry/errors.js.map +1 -1
- package/dist/registry/me-config.d.ts +1 -0
- package/dist/registry/me-config.d.ts.map +1 -1
- package/dist/registry/me-config.js +1 -1
- package/dist/registry/me-config.js.map +1 -1
- package/dist/registry/scope-config-feedback.d.ts +1 -0
- package/dist/registry/scope-config-feedback.d.ts.map +1 -1
- package/dist/registry/scope-config-feedback.js +1 -1
- package/dist/registry/scope-config-feedback.js.map +1 -1
- 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 +22 -2
- package/dist/resources/approvals.d.ts.map +1 -1
- package/dist/resources/approvals.js +12 -2
- package/dist/resources/approvals.js.map +1 -1
- package/dist/resources/elicitations.d.ts +2 -1
- package/dist/resources/elicitations.d.ts.map +1 -1
- package/dist/resources/elicitations.js.map +1 -1
- package/dist/resources/fleet.d.ts +65 -6
- 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/questions.d.ts +2 -1
- package/dist/resources/questions.d.ts.map +1 -1
- package/dist/resources/questions.js.map +1 -1
- package/dist/resources/session-sync.d.ts +4 -2
- package/dist/resources/session-sync.d.ts.map +1 -1
- package/dist/resources/session-sync.js +4 -2
- package/dist/resources/session-sync.js.map +1 -1
- package/dist/resources/tool-approvals.d.ts +201 -22
- package/dist/resources/tool-approvals.d.ts.map +1 -1
- package/dist/resources/tool-approvals.js +183 -36
- package/dist/resources/tool-approvals.js.map +1 -1
- package/dist/settings.d.ts +73 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/sse.d.ts +8 -1
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +9 -5
- package/dist/sse.js.map +1 -1
- package/dist/types.d.ts +475 -113
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -5
- package/dist/types.js.map +1 -1
- package/openapi.yaml +1296 -153
- package/package.json +6 -2
package/dist/errors.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type { ApprovalStaleCurrentPending, PendingGateMaterial } from "./types.j
|
|
|
12
12
|
export declare class APIError extends Error {
|
|
13
13
|
readonly status: number;
|
|
14
14
|
readonly errorCode: string | undefined;
|
|
15
|
+
name: string;
|
|
15
16
|
/**
|
|
16
17
|
* 🔴 **错误体上 `error` / `errorCode` 之外的全部键,原样**(K-09 销账,SDK 11.1.0)。`{}` = 这条体上
|
|
17
18
|
* 没有附加键(**不是** `undefined`:「没有附加材料」只该有一种读法)。
|
|
@@ -27,7 +28,7 @@ export declare class APIError extends Error {
|
|
|
27
28
|
*
|
|
28
29
|
* ⚠️ 既有的具名位({@link retriable}、`retryAfterMs`、各子类的结构化字段)是**先于本格存在**的镜像,
|
|
29
30
|
* 值来自同一张体 —— 它们不因本格而改变,新键也不再因此长出第 N 个属性。例外只由票面裁定开出,开了也仍同在本格:
|
|
30
|
-
* 现有一例 = K-19 `ParkedResumeStartupError.startupCause`(wire 键 `cause`;跨仓请托 [8537] / 认领 [8539] 点名要一个具型的读位;23.0.0
|
|
31
|
+
* 现有一例 = K-19 `ParkedResumeStartupError.startupCause`(wire 键 `cause`;跨仓请托 [8537] / 认领 [8539] 点名要一个具型的读位;23.0.0 起是引擎的成因闭集(core 7.52.0 起六词)
|
|
31
32
|
* `ResumeStartupCause`;值仍原样在 `extra.cause`)。
|
|
32
33
|
* ⚠️ **未清洗**:`message` 是给人看/进日志的那一半,过 `scrub()`;本格是给机器分支的那一半,原样透传
|
|
33
34
|
* (是 server 契约里的机读键,不是自由文本)。要把它打进日志的调用方自己负责清洗。
|
|
@@ -56,6 +57,11 @@ export declare class APIError extends Error {
|
|
|
56
57
|
* 🔴 **server ≥7.124.0:这一码的体多两只版本键** `writerVersion` / `readerVersion`(每个铸点同律 —— core 原码镜像与 server 自铸的两只读法记号拒都带;形见
|
|
57
58
|
* {@link CheckpointUnsupportedVersionExtra},值经 {@link extra} 到达)。「停驻行的格式比本引擎新」只有这一个来源:`writerVersion` 比 `readerVersion` 新 ⇒ 回到那一版(或更新的一版)去决,不是在本引擎上重试。
|
|
58
59
|
*
|
|
60
|
+
* 🔴 **server ≥7.132.0 一只写点、一条律**:三类续跑拒(server 重放存量体前的拒、准入策略折叠 `resume_blocked_by_policy`、引擎拒的续跑)上 `retriable: true` 在场 ⇔ **有一张待批卡仍在等、
|
|
61
|
+
* run 行留 `suspended`**(server `resumeRefusalWithCard` 一处追加,排在体尾)。由此两处订正:① `resume_blocked_by_policy` 自 7.132.0 起**同带** `retriable: true`(卡同样仍 pending;此前不带);
|
|
62
|
+
* ② **终态 run 的 `POST /v1/runs/:id/steer` 在铸唤醒卡之前拒的路径不带它**(没有卡)—— `checkpoint.unsupported_version` 的 allow 读法 / 模式词读法两臂在那条路径上此前自述 `true`,是错的。
|
|
63
|
+
* 同批:引擎拒的续跑体多三只判别位 `blockedBy` / `field` / `reason`(加性,见 {@link ResumeRefusalExtra});体键序变(`taskId` 移到 `errorCode` 之后、`retriable` 在体尾,键集不变)。
|
|
64
|
+
*
|
|
59
65
|
* 🔴 `undefined` means "the server did not say", NOT "not retriable" — it is a CONDITIONAL field server-side
|
|
60
66
|
* (absent ⇒ key omitted), so reading its absence as an explicit `false` over-reads the wire.
|
|
61
67
|
*
|
|
@@ -76,6 +82,7 @@ export declare class APIError extends Error {
|
|
|
76
82
|
* 🔴 [2400] CB-3(SDK 4.2.0):状态兜底**只剩 401**。无码 503 已改归 {@link ServiceStateError} —— 那条臂
|
|
77
83
|
* 上真正可达的是中间层的无码 503(「上游暂时不可用」),把它铸成本类等于把「稍后重试」说成「你没权限」。 */
|
|
78
84
|
export declare class AuthError extends APIError {
|
|
85
|
+
name: string;
|
|
79
86
|
}
|
|
80
87
|
/** `request.*` 前缀族 —— **请求本身有问题,改请求即可**(400 为主,另有 413 / 422 / 4xx 兜底粗码)。
|
|
81
88
|
* 一律 NOT retryable verbatim:同一个 body 重发永远同一个结果。子类 {@link PayloadTooLargeError} 专指
|
|
@@ -141,12 +148,14 @@ export declare class AuthError extends APIError {
|
|
|
141
148
|
* (体里同时还有别的毛病而先撞上的是那一个时,`message` 说那个毛病、`field` 照带)。要「去掉这只键重发」的调用方按**码 + `err.extra.field`** 判,**别解析句子**
|
|
142
149
|
* (三口的句子在 7.119.0 收成逐字同一句,≤7.118.x 各说各的)。体里没有这只键的坏体**没有** `field`。本类不为它开具名属性(同上:开形一格)。 */
|
|
143
150
|
export declare class BadRequestError extends APIError {
|
|
151
|
+
name: string;
|
|
144
152
|
}
|
|
145
153
|
/** [2420] `attachment.*` 族(上传面拒收):`attachment.too_large`(413)携 {@link maxBytes},
|
|
146
154
|
* `attachment.mime_not_allowed`(415)携 {@link allowed}——两键是用户能改正的唯一量(压到多大/换什么类型)。 */
|
|
147
155
|
export declare class AttachmentRejectedError extends APIError {
|
|
148
156
|
readonly maxBytes?: number | undefined;
|
|
149
157
|
readonly allowed?: string[] | undefined;
|
|
158
|
+
name: string;
|
|
150
159
|
constructor(status: number, errorCode: string | undefined, message: string, maxBytes?: number | undefined, allowed?: string[] | undefined);
|
|
151
160
|
}
|
|
152
161
|
/** `not_found.*` 前缀族 —— 资源不存在。⚠️ 也包含**属主门**:server 对非属主一律回 404 同码同文
|
|
@@ -170,12 +179,14 @@ export declare class AttachmentRejectedError extends APIError {
|
|
|
170
179
|
* 反枚举不变式),永远走不到这两个码 —— 所以它们泄漏的全部信息是「**你自己**这条 run 的状态」,
|
|
171
180
|
* 而那本来就是 `runs.get(taskId)` 直答的东西。 */
|
|
172
181
|
export declare class NotFoundError extends APIError {
|
|
182
|
+
name: string;
|
|
173
183
|
}
|
|
174
184
|
/** `limit.*` 前缀族 —— 配额 / 限流 / 保留窗(429 限流与成本配额、416 续读点过保留窗)。
|
|
175
185
|
* `retryAfterMs` 来自 `Retry-After` 头(由 transport 喂入)。
|
|
176
186
|
* ⚠️ 429 那两个成员码({@link RateLimitedError} 起)走更具体的子类,见下。 */
|
|
177
187
|
export declare class LimitExceededError extends APIError {
|
|
178
188
|
readonly retryAfterMs?: number | undefined;
|
|
189
|
+
name: string;
|
|
179
190
|
constructor(status: number, errorCode: string | undefined, message: string, retryAfterMs?: number | undefined);
|
|
180
191
|
}
|
|
181
192
|
/** `capability.*` 前缀族 —— **本部署没接这个面**(501)。重试无意义、开开关也没用:要么换部署形态
|
|
@@ -191,6 +202,7 @@ export declare class LimitExceededError extends APIError {
|
|
|
191
202
|
* `capability.snapshot_store_required`(history blob GET)· `capability.policy_purge_required`(同步整族,嵌入方形)。**唯一登记例外**:`a2aServe` 的两条路由不可用时答 404(反指纹)。
|
|
192
203
|
* ⚠️ **按状态码判「没权限 / 不存在 / 不可用」的分支要改按 `errorCode`**:403 可能是「不在名单」也可能(≤7.115.x)是名单空;404 可能是「真不存在」也可能(≤7.115.x)是「这台没挂这一族」。 */
|
|
193
204
|
export declare class CapabilityUnavailableError extends APIError {
|
|
205
|
+
name: string;
|
|
194
206
|
}
|
|
195
207
|
/** `feature.*` 前缀族 —— **面存在,但开关是关的**(501;`feature.metrics_disabled` 是 404)。
|
|
196
208
|
* 处置:提示管理员打开对应开关(`RESOURCE_SUSPEND` / 三个 LIVE HITL 开关 / `STREAM_APPROVAL_ENABLED` /
|
|
@@ -201,6 +213,7 @@ export declare class CapabilityUnavailableError extends APIError {
|
|
|
201
213
|
* server ≥7.116.0 新增两员(都是 501,开旋钮即可):`feature.memory_consolidation_disabled`(记忆整理两口,`MEMORY_CONSOLIDATION_DRIVER` 关或出厂缺省派生关 ——
|
|
202
214
|
* 没配便宜模型;此前 404)· `feature.config_catalog_disabled`(`CONFIG_CATALOG_ENABLED=false` 时 `GET /v1/config/catalog`;此前 404)。 */
|
|
203
215
|
export declare class FeatureDisabledError extends APIError {
|
|
216
|
+
name: string;
|
|
204
217
|
}
|
|
205
218
|
/** `internal.*` 前缀族 —— 服务端自己出错(500 / 502)。细节不上 wire。
|
|
206
219
|
* 部分成员**明确可重试**(`internal.cancel_not_terminalized` = 重试 cancel;
|
|
@@ -210,6 +223,7 @@ export declare class FeatureDisabledError extends APIError {
|
|
|
210
223
|
* (会话规则店读不出)**不在本族**(不以 `internal.` 开头)⇒ 落带码的 {@link APIError},同样不自动重试;按 `.errorCode` 分支,
|
|
211
224
|
* `error` 是引擎 / 店的原句(给运维看,不含盘上路径)。 */
|
|
212
225
|
export declare class InternalServerError extends APIError {
|
|
226
|
+
name: string;
|
|
213
227
|
}
|
|
214
228
|
/** `state.*` 前缀族 —— 服务端**当前状态**不接受这个请求(503)。开集,下面是本包逐码注过的成员(附录 A 为准;server ≥7.119.0 新增 `state.scenario_assignment_unknown`):
|
|
215
229
|
* · `state.model_roster_pending`(roster 还没拉到)/ `state.no_sandbox_base`(没有可用的 sandbox-base)
|
|
@@ -254,6 +268,7 @@ export declare class InternalServerError extends APIError {
|
|
|
254
268
|
* {@link import("./types.js").CenterWiringCapability.failMode} / `leaseHealth`。 */
|
|
255
269
|
export declare class ServiceStateError extends APIError {
|
|
256
270
|
readonly retryAfterMs?: number | undefined;
|
|
271
|
+
name: string;
|
|
257
272
|
/**
|
|
258
273
|
* 等待提示(**毫秒**,单位与 {@link LimitExceededError.retryAfterMs} 同口径)。缺席 = server 这一支
|
|
259
274
|
* **没给**窗(如 `state.sse_connection_cap` 那些「换通道」成员),不是「可以立刻重打」。
|
|
@@ -282,6 +297,7 @@ export declare class ServiceStateError extends APIError {
|
|
|
282
297
|
export declare class WorkspaceFileTooLargeError extends APIError {
|
|
283
298
|
readonly sizeBytes: number;
|
|
284
299
|
readonly limit: number;
|
|
300
|
+
name: string;
|
|
285
301
|
constructor(status: number, errorCode: string | undefined, message: string, sizeBytes: number, limit: number);
|
|
286
302
|
}
|
|
287
303
|
/** 429 — per-principal rate limit. `retryAfterMs` from `Retry-After` (the SDK honors it on retry). */
|
|
@@ -301,6 +317,7 @@ export declare class WorkspaceFileTooLargeError extends APIError {
|
|
|
301
317
|
* codeless 503 arm to {@link ServiceStateError}; the status tariff now falls back to AuthError for 401 ONLY.) */
|
|
302
318
|
export declare class DrainingError extends APIError {
|
|
303
319
|
readonly retryAfterMs?: number | undefined;
|
|
320
|
+
name: string;
|
|
304
321
|
constructor(status: number, errorCode: string | undefined, message: string, retryAfterMs?: number | undefined);
|
|
305
322
|
}
|
|
306
323
|
/** 429 —— per-principal 限流。`retryAfterMs` 来自 `Retry-After`(SDK 重试时遵守它)。
|
|
@@ -323,6 +340,7 @@ export declare class RateLimitedError extends LimitExceededError {
|
|
|
323
340
|
readonly usedMicroUsd?: number | undefined;
|
|
324
341
|
/** `limit.cost_quota_exceeded` only —— 本窗口的上限(micro-USD)。缺席同上。 */
|
|
325
342
|
readonly limitMicroUsd?: number | undefined;
|
|
343
|
+
name: string;
|
|
326
344
|
constructor(status: number, errorCode: string | undefined, message: string, retryAfterMs?: number,
|
|
327
345
|
/** `limit.cost_quota_exceeded` only —— 本窗口已花费(micro-USD)。缺席 = 服务端没给/给了坏值。 */
|
|
328
346
|
usedMicroUsd?: number | undefined,
|
|
@@ -353,6 +371,7 @@ export interface QuotaExhaustedDetail {
|
|
|
353
371
|
* usage window=引擎部署级 token 治理窗(design/166,`USAGE_WINDOWS`)。两类同为 429 但处置来源不同。 */
|
|
354
372
|
export declare class QuotaExhaustedError extends RateLimitedError {
|
|
355
373
|
readonly detail: QuotaExhaustedDetail;
|
|
374
|
+
name: string;
|
|
356
375
|
constructor(status: number, errorCode: string | undefined, message: string, retryAfterMs: number | undefined, detail: QuotaExhaustedDetail);
|
|
357
376
|
}
|
|
358
377
|
/** 429 `errorCode:"usage.window_exhausted"` — 部署级 token 治理窗耗尽(server ≥6.1.0 提交面
|
|
@@ -364,6 +383,7 @@ export declare class QuotaExhaustedError extends RateLimitedError {
|
|
|
364
383
|
export declare class UsageWindowExhaustedError extends RateLimitedError {
|
|
365
384
|
/** 响应体的 retryAfterSec(秒,上取整;与 Retry-After 头同源)。缺席=服务端没给。 */
|
|
366
385
|
readonly retryAfterSec?: number | undefined;
|
|
386
|
+
name: string;
|
|
367
387
|
constructor(status: number, errorCode: string | undefined, message: string, retryAfterMs: number | undefined,
|
|
368
388
|
/** 响应体的 retryAfterSec(秒,上取整;与 Retry-After 头同源)。缺席=服务端没给。 */
|
|
369
389
|
retryAfterSec?: number | undefined);
|
|
@@ -380,6 +400,7 @@ export declare class UsageWindowExhaustedError extends RateLimitedError {
|
|
|
380
400
|
export declare class MemoryAdmissionError extends APIError {
|
|
381
401
|
/** 仅 transient 形(admission_required)可能在场;terminal 形恒缺席(等待提示在终局拒上是方向性谎言)。 */
|
|
382
402
|
readonly retryAfterSec?: number | undefined;
|
|
403
|
+
name: string;
|
|
383
404
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
384
405
|
/** 仅 transient 形(admission_required)可能在场;terminal 形恒缺席(等待提示在终局拒上是方向性谎言)。 */
|
|
385
406
|
retryAfterSec?: number | undefined);
|
|
@@ -392,12 +413,14 @@ export declare class MemoryAdmissionError extends APIError {
|
|
|
392
413
|
export declare class ScenarioNotAllowedError extends APIError {
|
|
393
414
|
/** The principal's allowed scenario names (may be empty on an older service / defensive drop). */
|
|
394
415
|
readonly allowlist: string[];
|
|
416
|
+
name: string;
|
|
395
417
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
396
418
|
/** The principal's allowed scenario names (may be empty on an older service / defensive drop). */
|
|
397
419
|
allowlist: string[]);
|
|
398
420
|
}
|
|
399
421
|
/** errorCode `budget.precall` / `budget.exceeded` — per-task or per-principal cost ceiling. NOT retryable. */
|
|
400
422
|
export declare class BudgetExceededError extends APIError {
|
|
423
|
+
name: string;
|
|
401
424
|
}
|
|
402
425
|
/** 409 — session already has an active run, or an idempotency conflict / session CAS conflict.
|
|
403
426
|
*
|
|
@@ -436,6 +459,7 @@ export declare class ConflictError extends APIError {
|
|
|
436
459
|
* resume 入口(gateKind 分路),cancel 是保底。自愈臂判别:只对 409 重试,2xx 已接受的提交绝不 cancel([2265]/[2267])。 */
|
|
437
460
|
readonly activeTaskStatus?: string | undefined;
|
|
438
461
|
readonly pendingGate?: PendingGateMaterial | undefined;
|
|
462
|
+
name: string;
|
|
439
463
|
constructor(status: number, errorCode: string | undefined, message: string, activeTaskId?: string | undefined,
|
|
440
464
|
/** [2255]① server ≥3.21:conflict.session_active_run 携带的真出路材料(ADDITIVE / tolerate-absent)。
|
|
441
465
|
* running ⇒ steer/cancel 两条路;suspended/needs_review ⇒ pendingGate.decidePath 是那一个正确的
|
|
@@ -488,6 +512,7 @@ export declare class DeviceError extends ConflictError {
|
|
|
488
512
|
/** `device.rebind_rev_conflict` 的当前 rev(顶层键)—— 壳一跳重定位:直接拿它重发换绑。
|
|
489
513
|
* 其余码上缺席(**守卫式**:非有限数丢弃 ⇒ 缺席,绝不把垃圾当前态)。 */
|
|
490
514
|
readonly currentRev?: number | undefined;
|
|
515
|
+
name: string;
|
|
491
516
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
492
517
|
/** `device.rebind_rev_conflict` 的当前 rev(顶层键)—— 壳一跳重定位:直接拿它重发换绑。
|
|
493
518
|
* 其余码上缺席(**守卫式**:非有限数丢弃 ⇒ 缺席,绝不把垃圾当前态)。 */
|
|
@@ -508,6 +533,7 @@ export declare class SyncConflictError extends ConflictError {
|
|
|
508
533
|
relation: "fork" | "stale";
|
|
509
534
|
[k: string]: unknown;
|
|
510
535
|
};
|
|
536
|
+
name: string;
|
|
511
537
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
512
538
|
/** The §7 `fork`/`stale` relation with the exclusive entry sets (untyped at the JSON boundary). */
|
|
513
539
|
relation: {
|
|
@@ -515,9 +541,15 @@ export declare class SyncConflictError extends ConflictError {
|
|
|
515
541
|
[k: string]: unknown;
|
|
516
542
|
});
|
|
517
543
|
}
|
|
518
|
-
/**
|
|
519
|
-
*
|
|
520
|
-
*
|
|
544
|
+
/** 409 `approval_stale` — **one code, two causes**, told apart by the body:
|
|
545
|
+
* - **with {@link ApprovalStaleError.terminal}** = the checkpoint you tried to decide is already TERMINAL (someone else resolved it, it was
|
|
546
|
+
* GC'd past its abandonment-TTL, or its SLA deadline fired a resolve-deny). That pending is gone → REFETCH the inbox; do not retry the decide.
|
|
547
|
+
* - **no `terminal` and {@link ApprovalStaleError.currentPending} present** = the binding you echoed is STALE (the `boundCallId` no longer matches the row
|
|
548
|
+
* that is pending now — the card was superseded between your read and your decide). The pending row is still alive: use `currentPending` to
|
|
549
|
+
* re-point (one hop) and decide again; no full inbox re-pull needed.
|
|
550
|
+
* - Neither key = the server could not name a current pending (no pending, a non-tool gate, or the row read failed): REFETCH.
|
|
551
|
+
* Only a wrong `boundInputHash` (with the right `boundCallId`) is NOT this error: it lands in core's bare 409 `approval_binding_mismatch`
|
|
552
|
+
* ({@link ApprovalBindingMismatchError}). DISTINCT from the session-CAS 409. */
|
|
521
553
|
export declare class ApprovalStaleError extends APIError {
|
|
522
554
|
readonly terminal?: "resolved" | "expired_abort" | "expired_sla" | undefined;
|
|
523
555
|
/** S-02(server ≥7.52)—— 本会话**当前** pending 的三件 D-1 坐标(additive 指路键):壳拿它一跳
|
|
@@ -530,6 +562,7 @@ export declare class ApprovalStaleError extends APIError {
|
|
|
530
562
|
* (S-57 前它穿透成 `approval_binding_mismatch`+`field:"boundCallId"`,无指路;那条臂现只剩
|
|
531
563
|
* server 比对与 core CAS 之间的竞态窗)。 */
|
|
532
564
|
readonly currentPending?: ApprovalStaleCurrentPending | undefined;
|
|
565
|
+
name: string;
|
|
533
566
|
constructor(status: number, errorCode: string | undefined, message: string, terminal?: "resolved" | "expired_abort" | "expired_sla" | undefined,
|
|
534
567
|
/** S-02(server ≥7.52)—— 本会话**当前** pending 的三件 D-1 坐标(additive 指路键):壳拿它一跳
|
|
535
568
|
* 重定位再 decide,免整队重拉。缺席=无 pending/非工具门/行读失败(server F 类留痕臂)或老 server。
|
|
@@ -553,6 +586,7 @@ export declare class ApprovalStaleError extends APIError {
|
|
|
553
586
|
* 对着 ≤7.123.x 的 server,那一席仍借本码到达:{@link field} 按闭集读,不认识的词读作缺席,原值在 `err.extra.field`。`retriable: true` 形不变(卡仍 pending、run 行重新 park)。 */
|
|
554
587
|
export declare class ApprovalBindingMismatchError extends APIError {
|
|
555
588
|
readonly field?: ApprovalBindingField | undefined;
|
|
589
|
+
name: string;
|
|
556
590
|
constructor(status: number, errorCode: string | undefined, message: string, field?: ApprovalBindingField | undefined);
|
|
557
591
|
}
|
|
558
592
|
/** design/80 D-1 (core 1.101.0) — a concurrent resolve/reopen advanced the checkpoint's revision inside the
|
|
@@ -560,6 +594,7 @@ export declare class ApprovalBindingMismatchError extends APIError {
|
|
|
560
594
|
* do NOT treat as ApprovalStaleError. Client action: REFETCH the PendingCheckpoint + re-present, then decide
|
|
561
595
|
* again (retryable). */
|
|
562
596
|
export declare class ApprovalConcurrentlyReopenedError extends APIError {
|
|
597
|
+
name: string;
|
|
563
598
|
}
|
|
564
599
|
/** `steering.*` 族的基类(SDK 1.1.0 —— 从**逐码枚举**改成**前缀分派**,与 `stop.*` / `decide.*` 同形)。
|
|
565
600
|
*
|
|
@@ -572,16 +607,19 @@ export declare class ApprovalConcurrentlyReopenedError extends APIError {
|
|
|
572
607
|
* 这是有意的 —— 「409」是传输层的巧合,「steer 目标有歧义」才是消费端要分支的东西;按 [clean-cut] 硬切,
|
|
573
608
|
* 不留双继承之类的兼容层。整族一把接:`catch (e instanceof SteeringError)`。 */
|
|
574
609
|
export declare class SteeringError extends APIError {
|
|
610
|
+
name: string;
|
|
575
611
|
}
|
|
576
612
|
/** design/80 D-A — you steered a run that is NOT running (it is durable-`suspended`, terminal, or unknown).
|
|
577
613
|
* Steer is at-most-once and NOT queued. Client action: surface "task isn't running"; if suspended, the path
|
|
578
614
|
* forward is the approval decide, not a steer. */
|
|
579
615
|
export declare class SteeringNotRunningError extends SteeringError {
|
|
616
|
+
name: string;
|
|
580
617
|
}
|
|
581
618
|
/** design/80 D-A — the steer text carried a control-plane escape (e.g. `</system-reminder>`) and core rejected
|
|
582
619
|
* it (runtask.ts:489). Client action: it's an injection attempt or a malformed steer — surface it; don't retry
|
|
583
620
|
* verbatim. (The BFF also fences steer text defensively; this is core's authoritative reject.) */
|
|
584
621
|
export declare class SteeringInvalidContentError extends SteeringError {
|
|
622
|
+
name: string;
|
|
585
623
|
}
|
|
586
624
|
/** `steering.ambiguous_target`(子代 steer/resume 面,server `http/routes/runs.ts`)/
|
|
587
625
|
* `steering.ambiguous_label`(workflow agent steer 面,`http/routes/workflows.ts`)—— **这一个 run 里有
|
|
@@ -589,12 +627,14 @@ export declare class SteeringInvalidContentError extends SteeringError {
|
|
|
589
627
|
* Client action:两个码同一个处置 —— **换一个唯一的定位方式**(子代面用 `parentToolCallId`;workflow 面
|
|
590
628
|
* 用更具体的 label/句柄),原样重试永远同一个结果。`.errorCode` 区分是哪条轴上歧义。 */
|
|
591
629
|
export declare class SteeringAmbiguousTargetError extends SteeringError {
|
|
630
|
+
name: string;
|
|
592
631
|
}
|
|
593
632
|
/** `steering.still_running` —— 你对一个**还在飞**的子代调了 `resume`(revive 只在 settle 之后合法;
|
|
594
633
|
* 也可能是上一次 resume 还没落地)。409。
|
|
595
634
|
* Client action:要么改调 steer(给在跑的它递话),要么等它 settle 再 resume。**与
|
|
596
635
|
* {@link SteeringNotRunningError} 正好互为反面**,两个码塌在一起会让 UI 说反话。 */
|
|
597
636
|
export declare class SteeringStillRunningError extends SteeringError {
|
|
637
|
+
name: string;
|
|
598
638
|
}
|
|
599
639
|
/** `steering.queue_full`(server ≥7.3.0 / core 5.14.0 #147)—— 这条 run **确实**挂着,但它 checkpoint 上
|
|
600
640
|
* 已 park 的转向队列**满了**。队列是有界且 **fail-loud** 的:引擎绝不驱逐一条已被接受的指令来腾位子
|
|
@@ -603,6 +643,7 @@ export declare class SteeringStillRunningError extends SteeringError {
|
|
|
603
643
|
* 只是现在放不下。让它 resume 把已 park 的投递掉(或减少并发转向)之后再发。两个码塌在一起会让 UI
|
|
604
644
|
* 说反话(同 `still_running` 的先例),所以它有自己的类而不是落基类。 */
|
|
605
645
|
export declare class SteeringQueueFullError extends SteeringError {
|
|
646
|
+
name: string;
|
|
606
647
|
}
|
|
607
648
|
/** `steering.ledger_unavailable`(server ≥7.110.0,S-928;子代 steer 路由自 server ≥7.111.0 / S-966 起同样可达)—— server 在回 `200 applied`
|
|
608
649
|
* (interrupt{text}:`202 queued-immediate`;子代 steer:`200 applied`)**之前**
|
|
@@ -612,6 +653,7 @@ export declare class SteeringQueueFullError extends SteeringError {
|
|
|
612
653
|
* 照用,server 侧零受理、零注入 ⇒ 不会重复)。不是改内容(invalid_content / blocked_by_hook)、不是换 key(duplicate_input_id)、
|
|
613
654
|
* 不是等 resume(queue_full)。处置分岔 ⇒ 自己的类(判据二),`.errorCode` 保留。 */
|
|
614
655
|
export declare class SteeringLedgerUnavailableError extends SteeringError {
|
|
656
|
+
name: string;
|
|
615
657
|
}
|
|
616
658
|
/** `steering.duplicate_input_id`(parked 腿 server ≥7.3.0 / core 5.14.0 #147;live 腿 server ≥7.23.0 /
|
|
617
659
|
* core 5.35.0 #257 起同样可达)—— 你带的 `Idempotency-Key` 已经
|
|
@@ -629,6 +671,7 @@ export declare class SteeringDuplicateInputIdError extends SteeringError {
|
|
|
629
671
|
/** 体 `detail.differs`:{@link STEER_REPLAY_FACETS} 的非空子集(引擎的序)。整体成形或整体缺席 —— 不是数组 / 空 / 含集外词 ⇒ undefined
|
|
630
672
|
* (原值仍在 {@link APIError.extra};与 server 自己的读口同判:读不出就不铸)。 */
|
|
631
673
|
readonly differs?: readonly SteerReplayFacet[] | undefined;
|
|
674
|
+
name: string;
|
|
632
675
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
633
676
|
/** 体 `detail.differs`:{@link STEER_REPLAY_FACETS} 的非空子集(引擎的序)。整体成形或整体缺席 —— 不是数组 / 空 / 含集外词 ⇒ undefined
|
|
634
677
|
* (原值仍在 {@link APIError.extra};与 server 自己的读口同判:读不出就不铸)。 */
|
|
@@ -650,7 +693,11 @@ export type SteerReplayFacet = (typeof STEER_REPLAY_FACETS)[number];
|
|
|
650
693
|
* ⚠️ 这一条**必须**是拒:`reason` 自 1.284.0 起在直连门的 HMAC 签名载荷里(ASSISTANT-WIRE-CONTRACT §6.2),
|
|
651
694
|
* 服务端截过的字节与签名方签的字节必然不同 ⇒ MAC 恒不匹配,截断只会把可诊断的 413 变成费解的 401。
|
|
652
695
|
* Client action:缩短该字段后重发(重试原文没有意义);两个上限都是 server 侧常量,别在客户端猜。 */
|
|
696
|
+
/** ⚠️ 同一类也接 `413 request.payload_too_large`(`request.*` 族里唯一的分岔,处置同样是「缩短后重发」)—— server ≥7.132.0:TiDB / MySQL 协议部署上**提交体**超库的单行墙 / 包墙
|
|
697
|
+
* (`min(8 MiB, 库的单行上限 − 64 KiB)`,按体的 JSON 字节判)也落这一码,体带 `wallSource`(墙从哪来,见 {@link PayloadWallRefusalExtra});写续跑输入那一笔被库以「一行装不下」拒的答复同码
|
|
698
|
+
* (活流腿是终帧 `done`,`result.errorCode` 同码)。此前受理、写库那一刻 500。出路:缩小内联图 / 附件,或运维抬库的单行上限。 */
|
|
653
699
|
export declare class PayloadTooLargeError extends APIError {
|
|
700
|
+
name: string;
|
|
654
701
|
}
|
|
655
702
|
/** [1833] G13 — `runs.taskStop` 的 409 冲突家族(server `src/http/routes/runs.ts` 的 stop 路由,`errorCode`
|
|
656
703
|
* 判别;design/158 A9 域拆分后已不在 `src/http/server.ts`):
|
|
@@ -659,6 +706,7 @@ export declare class PayloadTooLargeError extends APIError {
|
|
|
659
706
|
* 恢复赢了)/ `stop.park_arbiter_unreachable`(仲裁店不可达,真相未知——core 1.397 三分)。
|
|
660
707
|
* 开集:未来新 `stop.*` 码同样落到本类(`errorCode` 原样携带),消费方 switch 要留 default。 */
|
|
661
708
|
export declare class TaskStopConflictError extends ConflictError {
|
|
709
|
+
name: string;
|
|
662
710
|
}
|
|
663
711
|
/** 409 `interrupt.*` 族(core #504 / server ≥7.52 `POST /v1/runs/:id/interrupt`)—— 前缀开集,与 `stop.*`
|
|
664
712
|
* 同形。两个现役码,处置相反所以**都别盲重试**,按 `.errorCode` 分支:
|
|
@@ -668,27 +716,32 @@ export declare class TaskStopConflictError extends ConflictError {
|
|
|
668
716
|
* 那两条腿返回结果不返回流)⇒ 要 run 级停用 `POST /v1/runs/:id/cancel`;证得出他副本时文案会指路重发。
|
|
669
717
|
* 终态/刚落定臂复用 `steering.not_running`(→ {@link SteeringNotRunningError}),不在本族。 */
|
|
670
718
|
export declare class InterruptConflictError extends ConflictError {
|
|
719
|
+
name: string;
|
|
671
720
|
}
|
|
672
721
|
/** design/80 D-G (direct-connect door, service [84]) — the signed principal JWT (`X-Approval-Principal-Token`)
|
|
673
722
|
* failed to verify against the worker's projected pubkey anchor (bad sig / exp / iss / aud / alg-not-pinned).
|
|
674
723
|
* 401. Client action: re-sign a fresh short-TTL JWT; persistent ⇒ BFF signing key/anchor misaligned. FORWARD-
|
|
675
724
|
* DRAFT: wire codes are service-locked; the BFF signer + live path land at M2. */
|
|
676
725
|
export declare class PrincipalUnverifiedError extends APIError {
|
|
726
|
+
name: string;
|
|
677
727
|
}
|
|
678
728
|
/** design/80 D-G — the JWT verified but its `cnf.bnd` ≠ SHA256(checkpointToken): the identity assertion was
|
|
679
729
|
* minted for a DIFFERENT decision and lifted onto this one (token-lift). A SAFETY signal. 401. Client action:
|
|
680
730
|
* NEVER retry verbatim; re-mint the JWT bound to THIS checkpointToken. */
|
|
681
731
|
export declare class PrincipalUnboundError extends APIError {
|
|
732
|
+
name: string;
|
|
682
733
|
}
|
|
683
734
|
/** ASSISTANT-WIRE-CONTRACT §4b(service main 6cd0164)— 你对一个 human/policy_ask 门调了 resume(CONTINUE)。
|
|
684
735
|
* 409 errorCode `gate_not_resumable`。一个 "continue" 绝不能绕过人审。SEMANTIC(错门), NOT session-CAS ConflictError。
|
|
685
736
|
* Client action: 这条路是 /decide(approve/deny), 不是 resume —— 改走人审 UI。 */
|
|
686
737
|
export declare class GateNotResumableError extends APIError {
|
|
738
|
+
name: string;
|
|
687
739
|
}
|
|
688
740
|
/** ASSISTANT-WIRE-CONTRACT §4c(service main 6cd0164)— 你对一个非 plan_review 门调了 plan_review。
|
|
689
741
|
* 409 errorCode `gate_not_plan_review`。一个 plan 决策绝不能解 tool 审批 / resource_limit。SEMANTIC(错门), NOT ConflictError。
|
|
690
742
|
* Client action: 按 gateKind 选对的决策端点(/decide 或 /resume), 重取 inbox。 */
|
|
691
743
|
export declare class GateNotPlanReviewError extends APIError {
|
|
744
|
+
name: string;
|
|
692
745
|
}
|
|
693
746
|
/** [2400] CB-2(SDK 4.2.0)—— 语义错门守卫的**第三个**成员(与上面两兄弟同形):你对一个**不是工具审批门**
|
|
694
747
|
* 的挂起调了 `/v1/approvals/:sessionId/decide`。409 errorCode `gate_not_tool_approval`
|
|
@@ -699,6 +752,7 @@ export declare class GateNotPlanReviewError extends APIError {
|
|
|
699
752
|
* 🔴 与 session-CAS `ConflictError` 刻意不同类:两者都是 409,但这一条说的是「你敲错门了」,处置是**换端点**,
|
|
700
753
|
* 不是「重读再试」。 */
|
|
701
754
|
export declare class GateNotToolApprovalError extends APIError {
|
|
755
|
+
name: string;
|
|
702
756
|
}
|
|
703
757
|
/** 409 `conflict.ask_decided` —— 这张卡**已经被结算过**,而你送的是**不同**的决议(同 `idempotencyKey`
|
|
704
758
|
* 的重试走的是 200 回放,不到这里)。body 携带**首决回显**:谁、什么决议、什么时刻。
|
|
@@ -712,6 +766,7 @@ export declare class AskDecidedError extends ConflictError {
|
|
|
712
766
|
readonly decidedAtMs?: number | undefined;
|
|
713
767
|
/** 首决者身份断言(server 自铸;actor 永不参与权限判定,仅审计/呈现)。 */
|
|
714
768
|
readonly actor?: ActorAssertion | undefined;
|
|
769
|
+
name: string;
|
|
715
770
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
716
771
|
/** 首决:被接受的那个决议。 */
|
|
717
772
|
firstDecision?: "approve" | "deny" | undefined,
|
|
@@ -725,6 +780,7 @@ export declare class AskDecidedError extends ConflictError {
|
|
|
725
780
|
* 条款排除了它(一次同意不得被复用到另一次未经确认的征询)。
|
|
726
781
|
* Client action:换一个 key 重发(**不是**换 askId)。 */
|
|
727
782
|
export declare class AskIdempotencyConflictError extends ConflictError {
|
|
783
|
+
name: string;
|
|
728
784
|
}
|
|
729
785
|
/** 410 `gone.ask_parked` / `gone.ask` —— 窗已关闭,这张卡的结局**已经铸定**,流内回决面对它已不存在。
|
|
730
786
|
*
|
|
@@ -768,6 +824,7 @@ export declare class AskGoneError extends APIError {
|
|
|
768
824
|
* `orphan_ttl_exceeded` / `crashed_before_park` / `shutdown_before_park`)。组外的词、词表外的词在 mapper 里就被丢弃(原值仍在 `err.extra.cause`),不会到这里。
|
|
769
825
|
* 缺席 = 行上没写成因(升级前落的存量行)或 ≤7.123.x 的 server(那一代的键叫 `deniedReason`)。 */
|
|
770
826
|
readonly endingCause?: AskRowEndingCause | undefined;
|
|
827
|
+
name: string;
|
|
771
828
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
772
829
|
/** `PARKED` | `DENIED` | `VOID`(`gone.ask` 腿携带;`gone.ask_parked` 腿恒 PARKED,可缺席)。具名闭集型 {@link AskGoneState}
|
|
773
830
|
* ({@link toApiError} 只会产出三词之一,越界值在 mapper 里就被丢弃)。 */
|
|
@@ -820,6 +877,234 @@ export interface CheckpointUnsupportedVersionExtra {
|
|
|
820
877
|
writerVersion?: string;
|
|
821
878
|
readerVersion?: string;
|
|
822
879
|
}
|
|
880
|
+
/**
|
|
881
|
+
* **续跑 409 体的三只判别位**(server ≥7.132.0 / core 7.52.0;值经 `err.extra`〔{@link APIError.extra}〕到达)—— 引擎拒一次续跑时 `CheckpointError.detail` 的三个机读位**原样过境**,
|
|
882
|
+
* 键名与 server 自己在重放存量体之前拒的 409 `resume_blocked_by_policy` 同义 ⇒ 两种「谁发现的」读同一组键(有则在,无则缺席,不造键):
|
|
883
|
+
* · `blockedBy` —— 挡住它的准入码 = 同一份坏配置在一次新跑上报的 `errorCode`(引擎拒那一侧今天只有 `checkpoint.config_refused` 带它,闭集属主 core `CHECKPOINT_CONFIG_REFUSAL_CODES`,
|
|
884
|
+
* core 7.53.0 起 40 词 —— 本包不枚举,按「新跑上的 errorCode」读;`resume_blocked_by_policy` 上它恒在,读位另有具名的 {@link ResumeBlockedByPolicyError.blockedBy});
|
|
885
|
+
* · `field` —— 哪一侧 / 哪一格(`checkpoint.config_refused` 上:`taskConfig` 改配置后同一张卡再决 / `deps`〔core 7.53.0 起〕部署自己的座位坏了,修部署后同一张卡再决 /
|
|
886
|
+
* `inheritedGate` 行自己记下的模式种子坏了,只能取消这条 run);
|
|
887
|
+
* · `reason` —— 同码多臂时哪一臂(闭集属主 core `CheckpointErrorReason`;**每一个**引擎码都过境 —— `checkpoint.unsupported_version` 的 `version_newer` 等自 7.132.0 起也上 wire)。
|
|
888
|
+
* 「改一格再决」与「只能在停它的那一版 worker 上跑完、或取消」靠 `field` + `blockedBy` + `reason` 分;`retriable: true` 在场 ⇔ 卡仍 pending(见 {@link APIError.retriable})。
|
|
889
|
+
* 一处如实例外:后台停驻子代腿被同类认领前拒时答 422 `parked_resume.startup_failed`,体只带 `cause`(到引擎的回执带上这几键为止)。
|
|
890
|
+
* 读法:`if (e instanceof ConflictError && e.errorCode?.startsWith("checkpoint.")) { const f = e.extra as ResumeRefusalExtra; … }`。
|
|
891
|
+
*/
|
|
892
|
+
export interface ResumeRefusalExtra {
|
|
893
|
+
blockedBy?: string;
|
|
894
|
+
field?: string;
|
|
895
|
+
reason?: string;
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* `400 request.field_invalid` 的**撞帽与坏条目机读位**(一组键,各面同名;值经 `err.extra` 到达,本类不为它们开具名属性)。
|
|
899
|
+
* · `field` —— 撞帽 / 坏条目那一处的**体内坐标**(`skills[1].allowedTools`、`agents[0].denyTools[3]`、`agents`、`allowTools`、`settings.permissions.allow`、`additionalDirectories` …);
|
|
900
|
+
* · `reason` —— 闭集四词,穷举读:`over_cap`(条数:数组的条目数)/ `too_long`(字符数:一段文字的长度;server ≥7.132.0)/ **`too_large`**(字节数:一份载荷的体积;**server ≥7.133.0**,只在 **413** 上 —— 见下)/ `bad_entry`(坏条目);
|
|
901
|
+
* · `count` + `cap` —— 撞帽形(`over_cap` / `too_long` / `too_large`):送来的量与帽(**量纲由 `reason` 定**:条数 / 字符数 / 字节数);`index` —— `bad_entry` 形的首个坏条目下标(数组本身不是数组时缺席)。
|
|
902
|
+
* 🔴 **量不出的形**(server ≥7.133.0):读体读到帽就停〔体没读完 —— 不为量一个数把 8 MiB 之外的字节再读进内存〕/ 库只说「一行装不下」时,**`count` 缺席、`cap` 只在帽已知时在**(不编数):
|
|
903
|
+
* **读体超 8 MiB 恒答 `413 request.payload_too_large`**,体 `{ field: "body", reason: "too_large", cap }`(无 `count`;此前多数口答 400、一批口折 400)—— 同一组机读位也在其余 413 / 400 的撞帽口上(`field` 高亮坐标);
|
|
904
|
+
* 射程:server ≥7.106.0 起 `settings.permissions.{allow,deny,ask}` 三桶(`over_cap` / `bad_entry`);**server ≥7.132.0 扩到**提交体上全部工具名清单(技能 `allowedTools` / `disallowedTools`
|
|
905
|
+
* 顶层与子代两层、根 `allowTools` / `excludeTools`、子代 `allowTools` / `denyTools`)、子代定义(条数 32、`name` 64 字、`whenToUse` / `whenToUseLean` / `observer` / `observerMessage` 4096 字、
|
|
906
|
+
* `systemPrompt` 65536 字、`allowTools` / `denyTools` 64 条与单条 128 字)、`additionalDirectories` / `additionalReadDirectories`(64 条;坏条目同 `bad_entry`)。
|
|
907
|
+
* 撞帽句的头一句恒为 `<field> has <count> entries|characters — at most <cap> are accepted`(句子给人看,机器读本组键)。请求体上其余的帽(`systemPrompt` / `appendSystemPrompt`、
|
|
908
|
+
* `settings.outputStyle` / `settings.env`、`jobId`、`clientContext`、`sandboxImageProfile`、`outputSchema`、`resumeAt`、技能 `content`、`images` 的 413)仍只有句子;形错(不是串 / 空串 / 不是数组)只有句子、不铸 `reason`。
|
|
909
|
+
* ⚠️ 同一个码上另有两种机读版式,按 `field` 区分(不按键猜):`field === "settings.hooks"` ⇒ 嵌套 `detail`({@link SettingsHooksRefusalDetail});领养 principals 两句的 `detail` 是**串**。
|
|
910
|
+
* 续跑腿同判:折成 409 `resume_blocked_by_policy`(`blockedBy: "request.field_invalid"`),本组键随体原样带上。
|
|
911
|
+
*/
|
|
912
|
+
export interface RequestFieldRefusalExtra {
|
|
913
|
+
field?: string;
|
|
914
|
+
reason?: RequestFieldRefusalReason;
|
|
915
|
+
count?: number;
|
|
916
|
+
cap?: number;
|
|
917
|
+
index?: number;
|
|
918
|
+
}
|
|
919
|
+
/** {@link RequestFieldRefusalExtra.reason} 的闭集(server 契约附录 A `request.field_invalid` 行;`too_large` 是 server ≥7.133.0 加的第四词 —— **量纲词**三个 `over_cap` / `too_long` / `too_large`
|
|
920
|
+
* 与一个坏条目词 `bad_entry`:见 {@link RequestFieldRefusalExtra.reason} 注)。闭集成员增长是加性的,但对它做 `switch` 穷举的消费端要补一条 `case`。 */
|
|
921
|
+
export type RequestFieldRefusalReason = "over_cap" | "too_long" | "too_large" | "bad_entry";
|
|
922
|
+
/** `settings.hooks` 拒判决的坐标:契约分类器的段形数组,相对请求体的 `settings` 对象(如 `["hooks","PreToolUse",0,"hooks",1]`);用户文本段经契约包的出门读法,凭据形不原样回显,
|
|
923
|
+
* 每个串段过拒句回显口径(剥控制与双向字符、截到 64 字、超出加 `…`)。 */
|
|
924
|
+
export type SettingsHooksConfigPath = Array<string | number>;
|
|
925
|
+
/**
|
|
926
|
+
* `400 request.field_invalid` 上 `field === "settings.hooks"` 那一族的 `detail`(对象形;server ≥7.115.0 起 matcher 拒带它,**server ≥7.132.0 起 `settings.hooks` 的每一只拒都带**,
|
|
927
|
+
* 且**恒带 `path`** —— 判决所在的坐标,见 {@link SettingsHooksConfigPath})。按 `reason` 分形,穷举读(多一形 = server 侧编译红,本包同批加)。
|
|
928
|
+
* 支持地板之内的老 server 交的老形照收(一条律:老 server 缺的键在型上可选):server 7.126.0–7.131.x 的 matcher 三形(`dead_alias` / `over_budget` / `invalid_regex`)**无 `path`**;
|
|
929
|
+
* server 7.115.0–7.125.x 只有死别名一形且**无 `reason`**(`{ event, alias, canonical }`,末一臂 —— `reason === undefined` 判它)。7.132.0 才有的形 `path` 必有。
|
|
930
|
+
* · matcher 四形(fresh 提交面的 matcher 判据):`dead_alias`(选中别名而选不中正名;`alias` / `canonical` 取自引擎静态目录)· `over_budget`(单次求值超每次额度 `budgetMs`)·
|
|
931
|
+
* `budget_exceeded`(server ≥7.132.0:一次受理里所有已完成正则形求值的耗时之和超过受理总额度 `totalMs`〔5 000 ms〕)· `invalid_regex`(正则编不过;7.132.0 起写在任一契约事件上都判);
|
|
932
|
+
* 四形都带 `event`,后三形带 `groupIndex`(从 0 起);
|
|
933
|
+
* · 配置读者的拒:契约分类器的码原样(`HOOKS_REJECTION_CODES` 六词 / `HOOKS_DROPPED_PIECE_CODES` 五词,连字符拼法)+ 可选 `key`(那一块上让它坏的键);
|
|
934
|
+
* · `unsupported_entry_type` + `type`(本服务不执行的条目类型,`path` 指那一条的 `type`);
|
|
935
|
+
* · `over_cap` / `too_long` + `count` / `cap`(服务侧上限:组数 16、一个事件的条目总数 32〔`path` 指第一条超出的条目〕、命令 / URL 8192 字、header 32 个 / 合计 8192 字、`allowedEnvVars` 32 个);
|
|
936
|
+
* · `unnamed_refusal`(分类器说拒却一块都没点名 —— 契约漂移,fail-closed);
|
|
937
|
+
* · **`wire_key_invalid`**(server ≥7.133.0)—— 本服务自己读的三只 wire 键形错:组上的 `source`(闭集见 {@link import("./settings.js").SettingsHookGroupSource})· command 条目上的 `plugin` / `args`
|
|
938
|
+
* (见 {@link import("./settings.js").SettingsHookPluginContext});`key` 点名那一只,`path` 指那一只键的坐标。**整份拒,不剥**(此前它们被分类器当未知键静默剥掉:剥 `source` = 托管组落进非托管车道,剥 `args` = exec 形只剩可执行名)。
|
|
939
|
+
* 另:插件上下文合计一道 8192 字的总字符帽 —— 超了走既有的 `over_cap` 形(`count` / `cap`)。
|
|
940
|
+
* 读法:`if (e.extra.field === "settings.hooks") { const d = e.extra.detail as SettingsHooksRefusalDetail; switch (d.reason) { … } }` —— 分流后提示用户改那一处,**不要解析句子**。
|
|
941
|
+
*/
|
|
942
|
+
export type SettingsHooksRefusalDetail = {
|
|
943
|
+
reason: "dead_alias";
|
|
944
|
+
event: string;
|
|
945
|
+
alias: string;
|
|
946
|
+
canonical: string;
|
|
947
|
+
path?: SettingsHooksConfigPath;
|
|
948
|
+
} | {
|
|
949
|
+
reason: "over_budget";
|
|
950
|
+
event: string;
|
|
951
|
+
groupIndex: number;
|
|
952
|
+
budgetMs: number;
|
|
953
|
+
path?: SettingsHooksConfigPath;
|
|
954
|
+
} | {
|
|
955
|
+
reason: "budget_exceeded";
|
|
956
|
+
event: string;
|
|
957
|
+
groupIndex: number;
|
|
958
|
+
totalMs: number;
|
|
959
|
+
path: SettingsHooksConfigPath;
|
|
960
|
+
} | {
|
|
961
|
+
reason: "invalid_regex";
|
|
962
|
+
event: string;
|
|
963
|
+
groupIndex: number;
|
|
964
|
+
path?: SettingsHooksConfigPath;
|
|
965
|
+
} | {
|
|
966
|
+
reason: SettingsHooksPieceCode;
|
|
967
|
+
path: SettingsHooksConfigPath;
|
|
968
|
+
key?: string;
|
|
969
|
+
} | {
|
|
970
|
+
reason: "unsupported_entry_type";
|
|
971
|
+
path: SettingsHooksConfigPath;
|
|
972
|
+
type: string;
|
|
973
|
+
} | {
|
|
974
|
+
reason: "over_cap" | "too_long";
|
|
975
|
+
path: SettingsHooksConfigPath;
|
|
976
|
+
count: number;
|
|
977
|
+
cap: number;
|
|
978
|
+
} | {
|
|
979
|
+
reason: "unnamed_refusal";
|
|
980
|
+
path: SettingsHooksConfigPath;
|
|
981
|
+
} | {
|
|
982
|
+
reason: "wire_key_invalid";
|
|
983
|
+
key: "source" | "plugin" | "args" | (string & {});
|
|
984
|
+
path: SettingsHooksConfigPath;
|
|
985
|
+
} | {
|
|
986
|
+
reason?: undefined;
|
|
987
|
+
event: string;
|
|
988
|
+
alias: string;
|
|
989
|
+
canonical: string;
|
|
990
|
+
path?: undefined;
|
|
991
|
+
};
|
|
992
|
+
/** 契约包(`@sema-agent/settings-schema/hooks`)分类器的码:`HOOKS_REJECTION_CODES` 六词 ∪ `HOOKS_DROPPED_PIECE_CODES` 五词(镜像;门钉对钉版 server 依赖的契约包运行期常量)。 */
|
|
993
|
+
export declare const SETTINGS_HOOKS_PIECE_CODES: readonly ["guard-outside-hooks", "hooks-is-matcher", "guard-under-unknown-event", "guard-event-not-array", "guard-matcher-invalid", "guard-entry-invalid", "hooks-not-object", "unknown-event", "event-not-array", "matcher-invalid", "entry-invalid"];
|
|
994
|
+
/** {@link SETTINGS_HOOKS_PIECE_CODES} 的成员型。 */
|
|
995
|
+
export type SettingsHooksPieceCode = (typeof SETTINGS_HOOKS_PIECE_CODES)[number];
|
|
996
|
+
/**
|
|
997
|
+
* `400 request.invalid_json` 的 `reason` 闭集(server ≥7.133.0;体 `{ error, errorCode, reason }`,值经 `err.extra.reason` 到达):请求体不是这一口要的 JSON ——
|
|
998
|
+
* `not_json`(体不是合法 JSON)/ `not_object`(体是合法 JSON 但不是对象,而这一口要对象;如 `compact` 口)。**读开集**(未知词按「请求体形不对」处置)。
|
|
999
|
+
* 🔴 **BREAKING(wire 码,server 7.133.0)**:坏 JSON 体恒答 `400 request.invalid_json`。此前同一件事在多数口答 `request.rejected`(状态兜底粗码)、`notify` / `wake` / 权限规则三口答 `request.body_shape`,
|
|
1000
|
+
* 一批口读体超限折 400 —— 按那几个码识别「坏 JSON」的代码要改读 `errorCode === "request.invalid_json"` + `reason`(零别名、零开关)。≤7.132.x 的 server 仍是旧码:**本包的读法恒是按 wire 上的 `errorCode` 分,不按版本猜**。
|
|
1001
|
+
*/
|
|
1002
|
+
export declare const INVALID_JSON_REASONS: readonly ["not_json", "not_object"];
|
|
1003
|
+
/** {@link INVALID_JSON_REASONS} 的成员型(读侧开集)。 */
|
|
1004
|
+
export type InvalidJsonReason = (typeof INVALID_JSON_REASONS)[number];
|
|
1005
|
+
/** `400 request.invalid_json` 体上的机读位(值经 `err.extra` 到达,本类不为它开具名属性;落 {@link BadRequestError})。 */
|
|
1006
|
+
export interface InvalidJsonRefusalExtra {
|
|
1007
|
+
reason?: InvalidJsonReason | (string & {});
|
|
1008
|
+
}
|
|
1009
|
+
/**
|
|
1010
|
+
* `400 request.field_conflict` 的 `detail.kind` 闭集(server ≥7.133.0,**十四词**):一份请求体**自己跟自己矛盾**(两个键不能同带)是哪一类约束。同一个约束的几个拒点同一个词。体 `detail`:
|
|
1011
|
+
* `{ kind, fields[], count?, cap? }` —— `fields` = 被点名的请求体坐标(主语在前,至少一个;动态下标用 `agents[1].skills` 形),`count` / `cap` 只在「折叠上限」那一类带(合起来的量与帽)。句子与码不变;老 server 只有一句英文。
|
|
1012
|
+
* 每类的坐标闭集:`cascade_verify`(`verify` / `cascade` / `sandboxImageProfile` / `resumeAt` / `suggestNextPrompts`)· `image_profile`(`capabilitiesNeeded` / `sandboxImageProfile`)·
|
|
1013
|
+
* `resume_anchor`(`resumeAtMode` / `resumeAt`)· `system_prompt_fold`(`appendSystemPrompt` / `settings.outputStyle`)· `file_history_restore`(`fileHistory` / `restoreFiles` / `rewindFilesTo` / `rewindFiles`)·
|
|
1014
|
+
* `skills_disabled`(`disableSkills` / `skills` / `agents[i].skills`)· `existing_session`(`requireExistingSession` / `sessionId`)· `scratchpad_root`(`cwd` / `scratchpadDir`)· `ask_answer`(`decision` / `answer`)·
|
|
1015
|
+
* `policy_person_ask`(`decision` / `decidedBy`)· `plan_edit`(`decision` / `editedPlan`)· `plan_mode_after`(`decision` / `permissionModeAfter`)· `bound_call_door`(`boundCallId`)· `remember_decision`(`remember` / `decision`)。
|
|
1016
|
+
* 壳按 `detail.kind` 分支、按 `detail.fields` 高亮冲突的两处输入;**读开集**(未知 kind 按「请求体自相矛盾」处置)。
|
|
1017
|
+
*/
|
|
1018
|
+
export declare const FIELD_CONFLICT_KINDS: readonly ["cascade_verify", "image_profile", "resume_anchor", "system_prompt_fold", "file_history_restore", "skills_disabled", "existing_session", "scratchpad_root", "ask_answer", "policy_person_ask", "plan_edit", "plan_mode_after", "bound_call_door", "remember_decision"];
|
|
1019
|
+
/** {@link FIELD_CONFLICT_KINDS} 的成员型(读侧开集)。 */
|
|
1020
|
+
export type FieldConflictKind = (typeof FIELD_CONFLICT_KINDS)[number];
|
|
1021
|
+
/** `400 request.field_conflict` 体上的机读位(值经 `err.extra` 到达;落 {@link BadRequestError};顶层 `detail` 见 {@link FIELD_CONFLICT_KINDS})。 */
|
|
1022
|
+
export interface FieldConflictRefusalExtra {
|
|
1023
|
+
detail?: {
|
|
1024
|
+
kind: FieldConflictKind | (string & {});
|
|
1025
|
+
fields: string[];
|
|
1026
|
+
count?: number;
|
|
1027
|
+
cap?: number;
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
/**
|
|
1031
|
+
* 工具名清单与设置规则拒体 / 受理告知上的一条**条目问题**(server ≥7.133.0;`detail.problems[]` / 200 体 `warnings[]` 同一只形):
|
|
1032
|
+
* · `code` —— 这条问题所属拒码(拒体里 = 该拒的码;`warnings[]` 里 = 引擎对该条的读数码);
|
|
1033
|
+
* · `field` —— 条目所在清单在请求体里的坐标(`settings.permissions.allow` / `skills[i].allowedTools` …);
|
|
1034
|
+
* · `entry` —— 条目**原串**(server 过脱敏口回显,不是你发的原字节保证);
|
|
1035
|
+
* · `reason` —— 机读原因:多数是**引擎的词原样**(引擎读成空的原因词);server 自铸两词 {@link SERVER_ENTRY_PROBLEM_REASONS}:`not_in_roster`(放行侧选择器清单里的这个名字不在名册、也不是协议命名空间名 —— 引擎照旧受理,之后只告运维;**只在受理告知 `warnings[]`**)·
|
|
1036
|
+
* `home_unresolvable`(设置规则 422 的词:`~/` 形路径规则而本部署解不出执行环境的家目录)。另有一个**不是 server 自铸**的词:`below_trust_floor`(契约包 `LAYER_ADMISSION_VERDICTS` 里的词,server 在调用方信任档低于该成员的准入门槛时拿它当 `reason`,见 {@link BelowTrustFloorExtra};
|
|
1037
|
+
* **不在** {@link SERVER_ENTRY_PROBLEM_REASONS} 里)。**读开集**。
|
|
1038
|
+
*/
|
|
1039
|
+
export interface EntryProblem {
|
|
1040
|
+
code: string;
|
|
1041
|
+
field: string;
|
|
1042
|
+
entry: string;
|
|
1043
|
+
reason: string;
|
|
1044
|
+
}
|
|
1045
|
+
/** server 自铸的两个条目问题词(闭集,其余 `reason` 是引擎的词原样):`not_in_roster`(受理告知 `warnings[]` 的词)· `home_unresolvable`(设置规则 422 的词)。 */
|
|
1046
|
+
export declare const SERVER_ENTRY_PROBLEM_REASONS: readonly ["not_in_roster", "home_unresolvable"];
|
|
1047
|
+
/** {@link SERVER_ENTRY_PROBLEM_REASONS} 的成员型。 */
|
|
1048
|
+
export type ServerEntryProblemReason = (typeof SERVER_ENTRY_PROBLEM_REASONS)[number];
|
|
1049
|
+
/**
|
|
1050
|
+
* 条目问题拒体上的机读位(server ≥7.133.0;值经 `err.extra` 到达):顶层 `field` = 第一条问题的坐标(句子点名的那张清单),`detail = { problems[], total }` ——
|
|
1051
|
+
* `problems` 至多 1000 条(= 一张清单的条数帽),`total` 是真数(`total > problems.length` ⇒ 被截,没列全)。工具名清单(技能 `allowedTools` / `disallowedTools`、子代 `allowTools` / `denyTools`、根 `allowTools` / `excludeTools`)
|
|
1052
|
+
* 与 `settings.permissions` 三桶的拒都带它。逐条提示用户改哪一条,**别解析句子**。
|
|
1053
|
+
*/
|
|
1054
|
+
export interface EntryProblemsRefusalExtra {
|
|
1055
|
+
field?: string;
|
|
1056
|
+
detail?: {
|
|
1057
|
+
problems: EntryProblem[];
|
|
1058
|
+
total: number;
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* `400 request.field_invalid` 上 `detail.problems[].reason === "below_trust_floor"` 的拒体(server ≥7.133.0):请求里「不经人答就生效」的规则表(`settings.permissions` 各桶、被按名点用的自带技能的 `allowedTools` /
|
|
1063
|
+
* `disallowedTools`)按**调用方信任档**准入 —— `allow` 放宽免问面要 `global`;`deny` / `ask` 只收紧、任何档都收。低于门槛的放宽**响亮拒而不是静默丢**(契约要求);`detail.callerTrust` = 这次请求被准入的档
|
|
1064
|
+
* (`global` / `project`,**开集读**,与 `capabilities.settings.permissions.callerTrust` 同词表);`detail.problems[]` 逐条点名被拒的条目(`reason: "below_trust_floor"`)。
|
|
1065
|
+
* 出路:答卡(本地同意出口)/ 抬角色到治理域写角色 / 把规则放进部署的 `APPROVAL_GRANT` / 去掉 `allow` 开跑时答卡 —— 壳提交前读 `callerTrust` 能力位就不会撞。续跑腿不读本档(存储体在自己的受理口按当时的档准入过)。
|
|
1066
|
+
*/
|
|
1067
|
+
export interface BelowTrustFloorExtra {
|
|
1068
|
+
field?: string;
|
|
1069
|
+
detail?: {
|
|
1070
|
+
problems: EntryProblem[];
|
|
1071
|
+
total: number;
|
|
1072
|
+
callerTrust: "global" | "project" | (string & {});
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
/** `400 config.user_attachment_invalid` 体上的 `detail`(server ≥7.132.0 / core 7.53.0;体 = `{ error, errorCode, detail? }`,值经 `err.extra.detail` 到达):引擎在句首点名的字段 ——
|
|
1076
|
+
* `path` = 句子开头那一段(`TaskSpec.userAttachments[2].text`),`index` = 0 起的附件位置,**只在句子点名一只附件时在场**(整只席位的拒 —— 不是数组 / 超条数 —— 只有 `path`)。
|
|
1077
|
+
* 与流式 `done.result` / run 记录上 `terminal.detail.detail` 同一份(那两面上的同一只码同形)。本码今天是附录 A 里唯一随码带 `detail` 的 400。 */
|
|
1078
|
+
export interface UserAttachmentRefusalExtra {
|
|
1079
|
+
detail?: {
|
|
1080
|
+
path: string;
|
|
1081
|
+
index?: number;
|
|
1082
|
+
};
|
|
1083
|
+
}
|
|
1084
|
+
/**
|
|
1085
|
+
* 413 拒体上「拒它的那堵墙的数字是不是库自己报的」(server ≥7.132.0;server `SqlWallSource`):`reported` = 库报的墙(引擎在连接初始化时读到的);`assumed` = 不是库报的,
|
|
1086
|
+
* 按受支持引擎里最保守的缺省墙拒 —— 引擎事实还没建立(连接初始化被拒 / 还没读到),或事实在场但这一堵墙读失败退了文档缺省(TiDB < 7.6 又无 `CONFIG` 权限读不到
|
|
1087
|
+
* `txn-entry-size-limit`;`max_allowed_packet` 读不出)。事实没建立的窗口里稍后重试按库报的墙重判;读失败退缺省的墙不会自己变真 —— 持续则要运维让服务读得到那个上限。
|
|
1088
|
+
*/
|
|
1089
|
+
export type SqlWallSource = "reported" | "assumed";
|
|
1090
|
+
/** `413 request.payload_too_large` 在**提交口**(`POST /v1/tasks` / `/v1/tasks/stream` / `/v1/runs`)因库的单行墙 / 包墙拒时体上的机读位(server ≥7.132.0;值经 `err.extra` 到达,
|
|
1091
|
+
* 本码落 {@link PayloadTooLargeError})。同码的其余 413(体超 8 MiB、附件、内联图片)不带它 ⇒ 缺席。 */
|
|
1092
|
+
export interface PayloadWallRefusalExtra {
|
|
1093
|
+
wallSource?: SqlWallSource;
|
|
1094
|
+
/** server ≥7.133.0:同体另带统一撞帽机读位({@link RequestFieldRefusalExtra}):`field: "body"` · `reason: "too_large"` · `count`(这份体的 JSON 字节数)· `cap`(这一堵墙的字节数)。老 server 只有 `wallSource`。 */
|
|
1095
|
+
field?: string;
|
|
1096
|
+
reason?: RequestFieldRefusalReason;
|
|
1097
|
+
count?: number;
|
|
1098
|
+
cap?: number;
|
|
1099
|
+
}
|
|
1100
|
+
/** SQL 快照 blob 的帽**从哪来**(server ≥7.132.0;server `SqlBlobCapReading.source`):`operator` = 运维设的 `SNAPSHOT_BLOB_SQL_MAX_BYTES`;`reported` / `assumed` = 由库的墙
|
|
1101
|
+
* 推出时那一条腿的墙数字出处(同 {@link SqlWallSource})。 */
|
|
1102
|
+
export type BlobSqlCapSource = "operator" | SqlWallSource;
|
|
1103
|
+
/** `PUT /v1/sessions/:id/sync/blobs/:hash` 的 `413 blob_too_large_for_sql` 体上的机读位(server ≥7.132.0;体 = `{ error, errorCode, wallSource }`,值经 `err.extra` 到达)。
|
|
1104
|
+
* 句子按三形分,不把旋钮或假定说成库的上限。`reported` / `operator` 形重试同一份 blob 不会自己变好(出路:配对象存储);`assumed` 形可稍后重试 / 让服务读得到库的上限 / 设旋钮。 */
|
|
1105
|
+
export interface BlobTooLargeForSqlExtra {
|
|
1106
|
+
wallSource?: BlobSqlCapSource;
|
|
1107
|
+
}
|
|
823
1108
|
/** `DENIED` 态的唯一合法结局成因(server 全仓 `DENIED` 只有一个写点)—— {@link ASK_ROW_ENDING_CAUSES} 的首员。导出是因为消费端要拿它做
|
|
824
1109
|
* 「路由失败 vs 人拒」的判别与文案分支 —— 手抄一份字符串正是这条界线被抹掉的常见方式。server ≥7.124.0 起它住在 410 体的 `cause` 键上(此前 `deniedReason`)。 */
|
|
825
1110
|
export declare const DENY_REASON_ROUTING_FAILURE = "routing_failure_fail_closed";
|
|
@@ -840,6 +1125,7 @@ export declare class AskParkingError extends APIError {
|
|
|
840
1125
|
readonly retryAfterMs?: number | undefined;
|
|
841
1126
|
/** body 里的秒制成对键(与头同源;守卫式提取,非有限数丢弃)。 */
|
|
842
1127
|
readonly retryAfterSec?: number | undefined;
|
|
1128
|
+
name: string;
|
|
843
1129
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
844
1130
|
/** `Retry-After` 头解析出的毫秒(transport 统一喂入)。 */
|
|
845
1131
|
retryAfterMs?: number | undefined,
|
|
@@ -848,6 +1134,7 @@ export declare class AskParkingError extends APIError {
|
|
|
848
1134
|
}
|
|
849
1135
|
/** design/80 D-G — the direct-connect door requires the HMAC envelope (`X-Approval-Mac`) and it was absent. */
|
|
850
1136
|
export declare class ApprovalMacRequiredError extends APIError {
|
|
1137
|
+
name: string;
|
|
851
1138
|
}
|
|
852
1139
|
/** design/80 D-G — the HMAC envelope failed verification (wrong key/kid, or a tampered [token,callId,hash,
|
|
853
1140
|
* decision] tuple). 401. Client action: re-sign with the active HMAC kid; persistent ⇒ key rotation skew.
|
|
@@ -858,6 +1145,7 @@ export declare class ApprovalMacRequiredError extends APIError {
|
|
|
858
1145
|
* 删除、零双读、混版两向皆 401)对**本包的调用方**零动作 —— 除非它自己就是那个签名器,那时它按 server 的
|
|
859
1146
|
* 契约 §6 改形。**没有直连门的部署完全不受影响**。 */
|
|
860
1147
|
export declare class ApprovalMacInvalidError extends APIError {
|
|
1148
|
+
name: string;
|
|
861
1149
|
}
|
|
862
1150
|
/** `resume_outcome_invalid` — a plan_review / dry-run-review outcome was REJECTED BY CONTENT SANITIZE
|
|
863
1151
|
* (`editedPlan`/`reason` carried a forbidden tag), or — on the tool-approval gate — one cell of the decision body is not valid:
|
|
@@ -871,6 +1159,7 @@ export declare class ApprovalMacInvalidError extends APIError {
|
|
|
871
1159
|
* precisely so a UI routes to the right recovery (fix the text and re-submit) instead of the action-binding
|
|
872
1160
|
* flow. Collapsing the two back into one type in the SDK would undo that split. Usually `retriable`. */
|
|
873
1161
|
export declare class ResumeOutcomeInvalidError extends APIError {
|
|
1162
|
+
name: string;
|
|
874
1163
|
}
|
|
875
1164
|
/** `resume_blocked_by_policy` — an admission policy CHANGED between suspend and resume, and the resume is no
|
|
876
1165
|
* longer admissible. Not a race: retrying as-is stays blocked until the policy or the request changes.
|
|
@@ -894,6 +1183,7 @@ export declare class ResumeBlockedByPolicyError extends APIError {
|
|
|
894
1183
|
* 「The check that refused it: resume_blocked_by_policy」—— 编一个值比缺席更坏。支持地板抬过 7.104.0 的那一版可改必有(那时缺席不再可达)。
|
|
895
1184
|
*/
|
|
896
1185
|
readonly blockedBy?: string | undefined;
|
|
1186
|
+
name: string;
|
|
897
1187
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
898
1188
|
/**
|
|
899
1189
|
* **哪一道检查拒的**:被折叠的那只拒绝**直接**出去时会带的 `errorCode`。server ≥7.104.0(S-607)起 wire 上**恒在**:带码的原拒绝 ⇒
|
|
@@ -913,6 +1203,7 @@ export declare class ResumeBlockedByPolicyError extends APIError {
|
|
|
913
1203
|
* session_not_found。前缀开集:core 未来新码至少落到本类(`.errorCode` 判别),不塌匿名 409。
|
|
914
1204
|
* ⚠️ 与下划线形的 resume_outcome_invalid / resume_blocked_by_policy 是**两族**(那两个在上面,先判)。 */
|
|
915
1205
|
export declare class SubagentResumeConflictError extends ConflictError {
|
|
1206
|
+
name: string;
|
|
916
1207
|
}
|
|
917
1208
|
/** A-075.10 —— resume 族的**时间性拒绝**二码(前码 server ≥7.47.0、后码 ≥7.51.0;亲读 `http/server.ts` 拒绝体铸点):
|
|
918
1209
|
* `resume.usage_window_exhausted`(#449 G1,core 5.60.1:该行账本键上的部署治理窗满了;「什么都没消费、
|
|
@@ -928,6 +1219,7 @@ export declare class ResumeRetryLaterError extends SubagentResumeConflictError {
|
|
|
928
1219
|
readonly retryAfterMs?: number | undefined;
|
|
929
1220
|
/** 响应体的 `retryAfterSec`(秒;守卫式提取,非有限数当缺席)。缺席=服务端没给窗。 */
|
|
930
1221
|
readonly retryAfterSec?: number | undefined;
|
|
1222
|
+
name: string;
|
|
931
1223
|
constructor(status: number, errorCode: string | undefined, message: string,
|
|
932
1224
|
/** `Retry-After` 头解析出的毫秒(transport 喂入;该腿 server 今天不发头 ⇒ 通常缺席)。 */
|
|
933
1225
|
retryAfterMs?: number | undefined,
|
|
@@ -939,10 +1231,12 @@ export declare class ResumeRetryLaterError extends SubagentResumeConflictError {
|
|
|
939
1231
|
* ⚠️ [2400] CB-2 起 `wake.` 是**前缀开集**:未来的 `wake.*` 新码至少落到 {@link ConflictError}
|
|
940
1232
|
* (`.errorCode` 原样携带),不再塌成匿名 409。 */
|
|
941
1233
|
export declare class WakeGatePendingError extends ConflictError {
|
|
1234
|
+
name: string;
|
|
942
1235
|
}
|
|
943
1236
|
/** 409 `compact.not_running` / `detach.not_running` —— replica-local live-verb 族:run 已终态,或活在
|
|
944
1237
|
* 另一副本(手动 compact/detach 只对本副本的活流有效)。`.errorCode` 判别是哪个 verb。 */
|
|
945
1238
|
export declare class RunNotLiveError extends ConflictError {
|
|
1239
|
+
name: string;
|
|
946
1240
|
}
|
|
947
1241
|
/** Base of the `decide.*` family — catch this to handle the whole decide door in one place.
|
|
948
1242
|
* Codes that fall on THIS class rather than a subclass need a human: `row_unrevivable` (damaged row),
|
|
@@ -967,6 +1261,7 @@ export declare class DecideError extends APIError {
|
|
|
967
1261
|
* AND by which server sent it — 7.72.0 changed the "host not parked" answer without renaming the code,
|
|
968
1262
|
* see that class's doc). */
|
|
969
1263
|
readonly runId?: string | undefined;
|
|
1264
|
+
name: string;
|
|
970
1265
|
constructor(status: number, errorCode: string | undefined, message: string, taskId?: string | undefined,
|
|
971
1266
|
/** revive legs only — the claim-rollback disposition the server reported. */
|
|
972
1267
|
rollback?: string | undefined,
|
|
@@ -986,6 +1281,7 @@ export declare class DecideError extends APIError {
|
|
|
986
1281
|
* different occupant. The re-fetch then usually shows the card GONE (a 7.104.0 session delete retires its parked children's cards) —
|
|
987
1282
|
* nothing is left to decide; this form mostly meets cards left behind by a session deleted before 7.104.0. */
|
|
988
1283
|
export declare class DecideParkMovedError extends DecideError {
|
|
1284
|
+
name: string;
|
|
989
1285
|
}
|
|
990
1286
|
/** `decide.parked_answer_required` / `decide.parked_remember_unsupported` — this park shape does not accept
|
|
991
1287
|
* the decide you sent (an AskUserQuestion approve without `body.answer` — server 5.12.0/core 5.7.0 RB-459;
|
|
@@ -994,18 +1290,22 @@ export declare class DecideParkMovedError extends DecideError {
|
|
|
994
1290
|
* `decide.parked_answer_unsupported` / `..._question_unsupported` are retired: the answer HAS a hookpoint
|
|
995
1291
|
* now and a parked question CAN be approved (with an answer). */
|
|
996
1292
|
export declare class DecideUnsupportedError extends DecideError {
|
|
1293
|
+
name: string;
|
|
997
1294
|
}
|
|
998
1295
|
/**
|
|
999
|
-
* Why a parked resume could not start its approved action — the engine's closed set `RESUME_STARTUP_CAUSES` (core 7.51.0), word for word and in
|
|
1296
|
+
* Why a parked resume could not start its approved action — the engine's closed set `RESUME_STARTUP_CAUSES` (core 7.51.0; six words since core 7.52.0), word for word and in
|
|
1000
1297
|
* order. Server ≥ 7.129.0 relays it as the 422 `parked_resume.startup_failed` body's `cause`, screened against this set (a word the engine did
|
|
1001
1298
|
* not say, or one outside the set ⇒ the key is absent). What each word tells the caller to do:
|
|
1002
1299
|
* · `environment` — the leg's infrastructure failed (workspace restore, an abort); the decision is untouched — retrying replays it;
|
|
1003
1300
|
* · `session_gone` — the resumed agent's transcript session is missing;
|
|
1301
|
+
* · `transcript_corrupt` — (core 7.52.0 #1796, server ≥ 7.132.0) the resumed agent's transcript is there but damaged: no header its store wrote, a leaf
|
|
1302
|
+
* or parent entry missing from the log, or a lost tail the checkpoint was cut inside. The row reopens as for `session_gone` (a system retry, the
|
|
1303
|
+
* decision is untouched); only the receipt now says which. Servers ≤ 7.131.x answered `session_gone` / no cause for these;
|
|
1004
1304
|
* · `tool_unavailable` — the approved tool is not available to the resumed leg (gone, or replaced by a different contract) — this approval cannot run, decide afresh;
|
|
1005
1305
|
* · `configuration` — the deployment's configuration refuses the resumed leg; a retry under the same configuration fails the same way;
|
|
1006
1306
|
* · `decision_rejected` — the decision does not fit the checkpoint (another gate's answer, an input the constraints refuse) — correct it and resubmit.
|
|
1007
1307
|
*/
|
|
1008
|
-
export declare const RESUME_STARTUP_CAUSES: readonly ["environment", "session_gone", "tool_unavailable", "configuration", "decision_rejected"];
|
|
1308
|
+
export declare const RESUME_STARTUP_CAUSES: readonly ["environment", "session_gone", "transcript_corrupt", "tool_unavailable", "configuration", "decision_rejected"];
|
|
1009
1309
|
export type ResumeStartupCause = (typeof RESUME_STARTUP_CAUSES)[number];
|
|
1010
1310
|
/** `parked_resume.startup_failed` (422 — core code PASSTHROUGH, server 5.12.0/RB-459): the decide was
|
|
1011
1311
|
* accepted and the revive attempted, but the resume failed during startup — the child's session is gone,
|
|
@@ -1042,6 +1342,7 @@ export declare class ParkedResumeStartupError extends DecideError {
|
|
|
1042
1342
|
* raw value is still at `err.extra.cause`.
|
|
1043
1343
|
*/
|
|
1044
1344
|
readonly startupCause?: ResumeStartupCause | undefined;
|
|
1345
|
+
name: string;
|
|
1045
1346
|
constructor(status: number, errorCode: string | undefined, message: string, taskId?: string, rollback?: string, runId?: string,
|
|
1046
1347
|
/**
|
|
1047
1348
|
* K-19 — the machine-readable CAUSE WORD of this startup failure (client-core [8537] CC-225; server S-818 relays it
|
|
@@ -1064,6 +1365,7 @@ export declare class ParkedResumeStartupError extends DecideError {
|
|
|
1064
1365
|
}
|
|
1065
1366
|
/** `decide.store_unreachable` — the durable agent store is unreachable. Transient: retry the same decide. */
|
|
1066
1367
|
export declare class DecideStoreUnreachableError extends DecideError {
|
|
1368
|
+
name: string;
|
|
1067
1369
|
}
|
|
1068
1370
|
/** `decide.workflow_host_unknown` / `decide.workflow_host_not_parked` (409, server >=7.69.0 / S-185) — the
|
|
1069
1371
|
* pending belongs to a **workflow child** that parked on an approval gate, and the deployment could not hand
|
|
@@ -1089,6 +1391,7 @@ export declare class DecideStoreUnreachableError extends DecideError {
|
|
|
1089
1391
|
* (Grouped by what the caller must do — the same axis as {@link DecideParkMovedError} — rather than by status;
|
|
1090
1392
|
* both are 409 but neither is the "the park moved, refetch the list" doctrine.) */
|
|
1091
1393
|
export declare class DecideWorkflowHostError extends DecideError {
|
|
1394
|
+
name: string;
|
|
1092
1395
|
}
|
|
1093
1396
|
/** `decide.workflow_parks_unreadable` (409, server >=7.75.0 / S-252) — the pending belongs to a **workflow
|
|
1094
1397
|
* child**, and (the 7.75.0–7.117.x reading; a server ≥7.118.0 narrows the triggers — see the 7.118.0 paragraph at the end)
|
|
@@ -1159,6 +1462,7 @@ export declare class DecideWorkflowParksUnreadableError extends DecideError {
|
|
|
1159
1462
|
* (the body's top-level `readableHolderRunId`; absent when there is none or a tie — never `null`). Where the work can be carried
|
|
1160
1463
|
* on; it does NOT clear this refusal (the damaged record `.runId` names still blocks delivery until it is repaired). */
|
|
1161
1464
|
readonly readableHolderRunId?: string | undefined;
|
|
1465
|
+
name: string;
|
|
1162
1466
|
constructor(status: number, errorCode: string | undefined, message: string, taskId?: string, rollback?: string, runId?: string,
|
|
1163
1467
|
/** server ≥7.118.0, the "record cannot be read" cause only: the readable record that holds this card at the highest generation
|
|
1164
1468
|
* (the body's top-level `readableHolderRunId`; absent when there is none or a tie — never `null`). Where the work can be carried
|
|
@@ -1178,6 +1482,7 @@ export declare class DecideWorkflowParkForkedError extends DecideError {
|
|
|
1178
1482
|
/** The resumed runs that all hold this card (the body's `runIds`, ≥2 on the wire). Whole-or-nothing: absent when the body does
|
|
1179
1483
|
* not carry an array of non-empty strings (the raw value stays on {@link APIError.extra}). */
|
|
1180
1484
|
readonly runIds?: readonly string[] | undefined;
|
|
1485
|
+
name: string;
|
|
1181
1486
|
constructor(status: number, errorCode: string | undefined, message: string, taskId?: string, rollback?: string, runId?: string,
|
|
1182
1487
|
/** The resumed runs that all hold this card (the body's `runIds`, ≥2 on the wire). Whole-or-nothing: absent when the body does
|
|
1183
1488
|
* not carry an array of non-empty strings (the raw value stays on {@link APIError.extra}). */
|
|
@@ -1208,17 +1513,21 @@ export declare function toApiError(status: number, body: unknown, retryAfterMs?:
|
|
|
1208
1513
|
* failed. `message` is secret-scrubbed (a registry/proxy may echo an Authorization header into an error body). */
|
|
1209
1514
|
export declare class ControlError extends Error {
|
|
1210
1515
|
readonly status: number;
|
|
1516
|
+
name: string;
|
|
1211
1517
|
constructor(status: number, message: string);
|
|
1212
1518
|
}
|
|
1213
1519
|
/** 401 — missing/invalid registry Bearer (SEMA_REGISTRY_TOKEN). Fail-closed. */
|
|
1214
1520
|
export declare class ControlAuthError extends ControlError {
|
|
1521
|
+
name: string;
|
|
1215
1522
|
}
|
|
1216
1523
|
/** 403 — authenticated but the token's role is below what the write needs (editor / publisher per domain).
|
|
1217
1524
|
* Client action: surface "needs a higher role"; do NOT retry with the same token. */
|
|
1218
1525
|
export declare class ControlForbiddenError extends ControlError {
|
|
1526
|
+
name: string;
|
|
1219
1527
|
}
|
|
1220
1528
|
/** 404 — unknown domain / unknown change id / unknown worker. */
|
|
1221
1529
|
export declare class ControlNotFoundError extends ControlError {
|
|
1530
|
+
name: string;
|
|
1222
1531
|
}
|
|
1223
1532
|
/** 400 — zod validation failed. `issues` carries the flat `{ path, message }[]` (batch prefixes path with
|
|
1224
1533
|
* `[changeIndex, domain, …]`). Client action: fix the offending field; this is deterministic, do NOT retry. */
|
|
@@ -1228,6 +1537,7 @@ export declare class ControlValidationError extends ControlError {
|
|
|
1228
1537
|
message: string;
|
|
1229
1538
|
code?: string;
|
|
1230
1539
|
}[];
|
|
1540
|
+
name: string;
|
|
1231
1541
|
constructor(status: number, message: string, issues: {
|
|
1232
1542
|
path: (string | number)[];
|
|
1233
1543
|
message: string;
|
|
@@ -1240,6 +1550,7 @@ export declare class ControlValidationError extends ControlError {
|
|
|
1240
1550
|
* K-17: every 409 EXCEPT the scope-gone one — that is {@link ControlScopeGoneError}, deliberately not this class. */
|
|
1241
1551
|
export declare class ControlConflictError extends ControlError {
|
|
1242
1552
|
readonly currentVersion?: number | undefined;
|
|
1553
|
+
name: string;
|
|
1243
1554
|
constructor(status: number, message: string, currentVersion?: number | undefined);
|
|
1244
1555
|
}
|
|
1245
1556
|
/** 409 scope-gone (K-17; web-admin wave41 W41F): the rollback's TARGET scope was deleted — or deleted and re-created under
|
|
@@ -1251,6 +1562,7 @@ export declare class ControlConflictError extends ControlError {
|
|
|
1251
1562
|
* reviewed. Client action: stop, keep the intent, have a person confirm the scope is still the one to write. Still a
|
|
1252
1563
|
* {@link ControlError} (`status` 409, scrubbed `message`), so a family-wide catch keeps matching. */
|
|
1253
1564
|
export declare class ControlScopeGoneError extends ControlError {
|
|
1565
|
+
name: string;
|
|
1254
1566
|
}
|
|
1255
1567
|
/** Map a control-plane HTTP status + parsed body to the right typed error. Body envelope is `{ error, issues?,
|
|
1256
1568
|
* message?, currentVersion?, errorCode? }`. 🔴 message is scrubbed (Bearer / presigned) before surfacing.
|