@sema-agent/sdk 6.17.2 → 7.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 +35 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/images.d.ts +52 -24
- package/dist/resources/images.d.ts.map +1 -1
- package/dist/resources/images.js +44 -10
- package/dist/resources/images.js.map +1 -1
- package/dist/resources/runs.d.ts +46 -10
- package/dist/resources/runs.d.ts.map +1 -1
- package/dist/resources/runs.js +49 -10
- package/dist/resources/runs.js.map +1 -1
- package/dist/resources/trace.d.ts +12 -3
- package/dist/resources/trace.d.ts.map +1 -1
- package/dist/resources/trace.js +12 -3
- package/dist/resources/trace.js.map +1 -1
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +12 -0
- package/dist/sse.js.map +1 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +9 -1
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +238 -27
- package/dist/types.d.ts.map +1 -1
- package/openapi.yaml +318 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -344,6 +344,41 @@ Doc/contract patch batch. Nothing here narrows a type or removes a face.
|
|
|
344
344
|
| `Scenario` = `KnownScenario \| (string & {})`, with `KnownScenario` = the six the server actually serves (`code`, `default`, `autonomous`, `code-review`, `scan`, `team`) | The union still listed the retired `oa` and was missing three live scenarios. Kept OPEN on purpose — deployments register their own, so closing it would break every caller naming a custom one |
|
|
345
345
|
| Corrections in the 4.0.0 table below, in `spec/openapi.yaml` (subagent-tail `meta.taskId`, memory `scopes`, the retired approvals path) and in the memory/draining/alias JSDoc | Each was a statement no code backed; the fixes ship with mechanical pins so they cannot rot back |
|
|
346
346
|
|
|
347
|
+
## 7.0.0 — BREAKING changes
|
|
348
|
+
|
|
349
|
+
**Supported floor: unchanged.** `docs/RELEASE.md` line 14 makes this batch **major-only**
|
|
350
|
+
(`收窄类型` = a narrowing is BREAKING); it must not ship under a minor. Of the three input narrowings,
|
|
351
|
+
**two** actually break source (`images.register` / `bakes.ingest` — each has required keys);
|
|
352
|
+
`bakes.create` measured out as additive. Pins for every row live in
|
|
353
|
+
`test/breaking-next-major-narrowing.test.ts` (a narrowing nobody watches is one that flows back) —
|
|
354
|
+
`@ts-expect-error` double-sided gates for the input narrowings, positive "the real shape now compiles"
|
|
355
|
+
assertions for the nullable/required repayments below.
|
|
356
|
+
|
|
357
|
+
| Narrowed / changed | Migration |
|
|
358
|
+
| --- | --- |
|
|
359
|
+
| `images.register(body)`: `Record<string, unknown>` → `ImageRegisterRequest` (requires `profile`/`repo`/`digest`) | Pass a literal (or a typed variable) with the three fields the server hard-requires — it 400s `request.field_invalid` without them, so any call that breaks here was already failing at runtime. A dynamic `Record<string, unknown>` no longer type-checks: narrow it first, or `satisfies ImageRegisterRequest` at the construction site |
|
|
360
|
+
| `bakes.create(body)`: `Record<string, unknown>` → `BakeCreateRequest` | **Not breaking — measured, not assumed.** Every field is optional, so `Record<string, unknown>` still satisfies TS's weak-type check and keeps compiling (a `@ts-expect-error` written on the assumption it would break came back as `TS2578 Unused` — the pin in `breaking-next-major-narrowing.test.ts` records that correction). ⚠️ `profile` XOR `bands` — exactly one, enforced server-side |
|
|
361
|
+
| `bakes.ingest(bakeId, secret, line)`: `Record<string, unknown>` → `BakeIngestLine` (requires `event`) | The type keeps an index signature, so every build.sh passthrough field still rides. Only the statically-unknown `event` forces a change |
|
|
362
|
+
| `images.byProfile()` / `images.byDigest()` return `{ image: ImageIndexEntry }`; `bakes.get()` returns `{ bake: BakeRecordView }` | **Additive in practice** — both types keep `[k: string]: unknown`, so they stay assignable to `Record<string, unknown>` and unknown-key reads still yield `unknown`. Known keys simply stop being `unknown` |
|
|
363
|
+
|
|
364
|
+
### Same-major repayment: the "type NARROWER than the wire" family
|
|
365
|
+
|
|
366
|
+
Folded in on purpose rather than deferred again. All of these share one pathology — **the server ALWAYS
|
|
367
|
+
sends the key and the value can be `null`, while the SDK declared it `?: T`**. That is not a documentation
|
|
368
|
+
gap, it is a **judgement pointing the wrong way**: `?: T` invites `!== undefined`, which is *always true*
|
|
369
|
+
when the server really sent `null`, and the next line calls a method on `null`. Splitting these across two
|
|
370
|
+
majors would have made consumers migrate twice for one disease.
|
|
371
|
+
|
|
372
|
+
| Narrowed / changed | Migration |
|
|
373
|
+
| --- | --- |
|
|
374
|
+
| `bakes.create()` returns `BakeSubmitAck` — `state` is now required and `string \| null` (was `state?: string`), `status` is now the closed `"queued" \| "running" \| "done" \| "failed"` (was `string`) | Judge with `r.state == null`, never `!== undefined` — a freshly queued bake really does carry `state: null` (the row's SQL column before the runner's first `state` line). `status` needs no cast to branch on now |
|
|
375
|
+
| `ImageSelectResult`: all seven keys required (the handler is a seven-key literal `sendJson`); `manifestSha` is `string \| null`; `podContract` / `capabilities` reuse the named `ImagePodContract` / `ImageCapabilities` | Drop the `!` / optional chaining on the seven keys. Judge `manifestSha` with `== null` |
|
|
376
|
+
|
|
377
|
+
**Not a debt after all** — `images.list()`'s `nextCursor` was cited as this family's precedent, but the
|
|
378
|
+
signature had *already* been `nextCursor: string | null` for some time; only the JSDoc still said "deferred
|
|
379
|
+
to the next major". That stale prose is deleted: a settled account left hanging on the wall as precedent is
|
|
380
|
+
what teaches the next person to defer this class by reflex.
|
|
381
|
+
|
|
347
382
|
## 4.0.0 — BREAKING changes
|
|
348
383
|
|
|
349
384
|
**Supported floor: `@sema-agent/server` >= 3.0.0 — unchanged.** Every removal below deletes a
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { AgentClient, type AgentClientConfig, type AgentAuthToken } from "./clie
|
|
|
3
3
|
/** Control plane (TOB): sema-registry / config-center `/api/config/*`. A peer client (different backend +
|
|
4
4
|
* secret) for managing the fleet config — see control-client.ts. */
|
|
5
5
|
export { ControlClient, type ControlClientConfig } from "./control-client.js";
|
|
6
|
-
export type { Principal, Scenario, RunStatus, TaskStats, TaskRequest, TaskAgentDefinition, TaskResult, ActiveRunConflictDoneResult, PendingGateMaterial, RunReceipt, RunRecord, CancelAck, Artifact, LeaderReceipt, LeaderRecord, SupervisorCostBreakdown, Capabilities, ScenarioDetail, PendingCheckpoint, SessionRecord, SkillSpec, TaskSummary, CheckpointGate, TraceTurn, TraceBlock, PromptManifest, PromptEpoch, SessionSummary, SessionListPage, SessionPermissionRules, StoredSessionRules, McpServerStatus, McpStatusPanel, SessionWindow, SessionMessageEnvelope, SyncEntry, SyncSnapshot, SyncAnchor, SessionRulesRecord, SessionManifest, SessionBundle, SyncRelation, SyncConflictRelation, ImportStaged, ImportCommitted, TraceStreamEvent, WorkflowStreamEvent, ToolResultSlice, CheckpointSummary, InboxRow, AssistantGate, AssistantTask, PlanReviewRequest, AssistantTaskStatus, ImageIndexEntry, ImageSelectResult, ModelInfo, UsageInfo, PolicyInfo, ModelUsageDelta, WorkflowRunStatus, WorkflowRunSummary, WorkflowRun, WorkflowAgentRow, WorkflowActivityBeat, WorkflowGroupNode, WiringManifest, ServerWiringGates, WiringDiagnostics, } from "./types.js";
|
|
6
|
+
export type { Principal, Scenario, RunStatus, TaskStats, TaskRequest, TaskAgentDefinition, TaskResult, ActiveRunConflictDoneResult, PendingGateMaterial, RunReceipt, RunRecord, CancelAck, Artifact, LeaderReceipt, LeaderRecord, SupervisorCostBreakdown, Capabilities, ScenarioDetail, PendingCheckpoint, SessionRecord, SkillSpec, TaskSummary, CheckpointGate, TraceTurn, TraceBlock, PromptManifest, PromptEpoch, SessionSummary, SessionListPage, SessionPermissionRules, StoredSessionRules, McpServerStatus, McpStatusPanel, SessionWindow, SessionMessageEnvelope, SyncEntry, SyncSnapshot, SyncAnchor, SessionRulesRecord, SessionManifest, SessionBundle, SyncRelation, SyncConflictRelation, ImportStaged, ImportCommitted, TraceStreamEvent, WorkflowStreamEvent, ToolResultSlice, CheckpointSummary, InboxRow, AssistantGate, AssistantTask, PlanReviewRequest, AssistantTaskStatus, ImageIndexEntry, ImageSelectResult, ImageCapabilities, ImagePodContract, ModelInfo, ImageRegisterRequest, BakeCreateRequest, BakeRecordView, BakeIngestLine, BakeSubmitAck, UsageInfo, PolicyInfo, ModelUsageDelta, WorkflowRunStatus, WorkflowRunSummary, WorkflowRun, WorkflowAgentRow, WorkflowActivityBeat, WorkflowGroupNode, WiringManifest, ServerWiringGates, WiringDiagnostics, } from "./types.js";
|
|
7
7
|
/** TOC `settings.json` — the SHARED environment-customization contract (CC-parity v1: permissions/hooks/env/model/
|
|
8
8
|
* outputStyle). ONE schema, two wirings: TOC-local (shell adapter → local Runner) + TOB-fleet (carried to service via
|
|
9
9
|
* {@link TaskRequest.settings}). SDK owns the CONTRACT only — no interpreter, no shell-hook runner. core/search AI
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF;qEACqE;AACrE,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EACV,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,2BAA2B,EAAE,mBAAmB,EACzI,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAChG,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAC1J,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAC5G,aAAa,EAAE,sBAAsB,EACrC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EACvF,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EACjE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EACtD,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EACjG,eAAe,EAAE,iBAAiB,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AACvF;qEACqE;AACrE,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* service 内部按 trusted principal `latestPublished(profile, viewer)` fail-closed 解析 digest + 再准入。
|
|
8
8
|
* caller **永远只送 profile,绝不送/缓存/重算 digest**(信 caller digest = fail-OPEN)。select 仅 UI 预览,非绑定凭证。 */
|
|
9
9
|
import type { Transport } from "../transport.js";
|
|
10
|
-
import type { ImageIndexEntry, ImageSelectResult } from "../types.js";
|
|
10
|
+
import type { BakeCreateRequest, BakeIngestLine, BakeRecordView, BakeSubmitAck, ImageIndexEntry, ImageRegisterRequest, ImageSelectResult } from "../types.js";
|
|
11
11
|
export declare class ImagesResource {
|
|
12
12
|
private readonly t;
|
|
13
13
|
constructor(t: Transport);
|
|
@@ -19,9 +19,11 @@ export declare class ImagesResource {
|
|
|
19
19
|
* 只在整页满时才赋值,`routes/images.ts:386` 把它**无条件**放进信封。
|
|
20
20
|
* ⇒ 翻页的终止判据必须是 **`r.nextCursor == null`**(或真值判断),
|
|
21
21
|
* **绝不能**写成 `"nextCursor" in r` / `r.nextCursor !== undefined` —— 那两种写法在末页恒为真,循环停不下来。
|
|
22
|
-
* (
|
|
23
|
-
* `
|
|
24
|
-
*
|
|
22
|
+
* (🔴 **本段的旧版本是陈旧散文**,#193 车8 清账时发现:它写着「返回型仍标 `nextCursor?: string`……留给
|
|
23
|
+
* 下一个 major」,而签名**早就**是 `nextCursor: string | null` —— 类型先被修好、注没跟上。留着它的害处是
|
|
24
|
+
* 实打实的:这段文字正是另外两笔同族欠账〈`bakes.create()` 的 `state`、`ImageSelectResult` 的七键〉援引的
|
|
25
|
+
* 先例,一条已经还完的账挂在墙上当先例,会把后来人引向「这类事一律推给下个 major」的错判。三处已随
|
|
26
|
+
* 7.0.0 一并收口。) */
|
|
25
27
|
list(opts?: {
|
|
26
28
|
profile?: string;
|
|
27
29
|
capability?: string;
|
|
@@ -42,23 +44,34 @@ export declare class ImagesResource {
|
|
|
42
44
|
capabilitiesNeeded?: string[];
|
|
43
45
|
signal?: AbortSignal;
|
|
44
46
|
}): Promise<ImageSelectResult>;
|
|
45
|
-
/** POST /v1/images/register — 登记一条镜像索引条目(src/http/routes/images.ts 实拆)→ `{ id }`。operator 面。
|
|
46
|
-
|
|
47
|
+
/** POST /v1/images/register — 登记一条镜像索引条目(`src/http/routes/images.ts` 实拆)→ `{ id }`。operator 面。
|
|
48
|
+
*
|
|
49
|
+
* 🔴 #193 车8 P1-12(2026-08-15):入参从裸 `Record<string, unknown>` 收成具名
|
|
50
|
+
* {@link ImageRegisterRequest}。理由不是洁癖:server 的白名单是「读已知键」而**不是**「拒未知键」——
|
|
51
|
+
* 一个打错的键名在 wire 上是静默 no-op(该字段落成默认值),两侧都不响。具名形让它在编译期就响。
|
|
52
|
+
* 三必填(profile/repo/digest)缺任一 ⇒ 400 `request.field_invalid`;`id`/`createdAt`/`updatedAt`
|
|
53
|
+
* handler 一个都不读,所以具名形里没有它们。 */
|
|
54
|
+
register(body: ImageRegisterRequest, opts?: {
|
|
47
55
|
signal?: AbortSignal;
|
|
48
56
|
}): Promise<{
|
|
49
57
|
id: string;
|
|
50
58
|
}>;
|
|
51
|
-
/** GET /v1/images/:profile — 取 profile 最新已发布条目(src/http/routes/images.ts 实拆)→ `{ image: entry }`。
|
|
59
|
+
/** GET /v1/images/:profile — 取 profile 最新已发布条目(`src/http/routes/images.ts` 实拆)→ `{ image: entry }`。
|
|
60
|
+
*
|
|
61
|
+
* 🔴 #193 车8 P1-12:`image` 就是 {@link ImageIndexEntry} —— 与 `list()` 的行**同一个 store 投影**
|
|
62
|
+
* (`latestPublished()` 与 `list()` 走同一个 `mapRow()`),spec 侧两条路早已 `$ref` 到同一个 schema,
|
|
63
|
+
* 只有 SDK 这一侧还写着 `Record<string, unknown>`。 */
|
|
52
64
|
byProfile(profile: string, opts?: {
|
|
53
65
|
signal?: AbortSignal;
|
|
54
66
|
}): Promise<{
|
|
55
|
-
image:
|
|
67
|
+
image: ImageIndexEntry;
|
|
56
68
|
}>;
|
|
57
|
-
/** GET /v1/images/digests/:digest — 按不可变 digest 取条目(src/http/routes/images.ts 实拆)→ `{ image: entry }`。
|
|
69
|
+
/** GET /v1/images/digests/:digest — 按不可变 digest 取条目(`src/http/routes/images.ts` 实拆)→ `{ image: entry }`。
|
|
70
|
+
* 同 {@link ImagesResource.byProfile}:`image` 是 {@link ImageIndexEntry}(#193 车8 P1-12)。 */
|
|
58
71
|
byDigest(digest: string, opts?: {
|
|
59
72
|
signal?: AbortSignal;
|
|
60
73
|
}): Promise<{
|
|
61
|
-
image:
|
|
74
|
+
image: ImageIndexEntry;
|
|
62
75
|
}>;
|
|
63
76
|
}
|
|
64
77
|
/** bakes — sandbox 镜像烧制控制面(IMAGE-API-DESIGN.md §P2;src/http/routes/images.ts 区实拆)。两种主体:
|
|
@@ -70,22 +83,33 @@ export declare class BakesResource {
|
|
|
70
83
|
private readonly t;
|
|
71
84
|
constructor(t: Transport);
|
|
72
85
|
/** POST /v1/images/bakes → 202 `{ bakeId, eventsUrl, status, state }`(白名单验参 400/501;同 argv 在飞
|
|
73
|
-
* 幂等复用 202;繁忙 409 `{activeBakeId?, eventsUrl?}`;429 提交限速带 retryAfterSec)。operator-only。
|
|
74
|
-
|
|
86
|
+
* 幂等复用 202;繁忙 409 `{activeBakeId?, eventsUrl?}`;429 提交限速带 retryAfterSec)。operator-only。
|
|
87
|
+
*
|
|
88
|
+
* 🔴 #193 车8 P1-12(2026-08-15):入参收成具名 {@link BakeCreateRequest}(字段集对
|
|
89
|
+
* `src/images/bake-validate.ts` 的 `validateBake` 亲读)。这条门是 §P2.4 的**反 RCE 核心** —— 每个值在
|
|
90
|
+
* 任何 argv 被拼出来之前就过冻结闭集 —— 而它的请求体此前连字段名都不具名,调用方无从知道「哪些键会被看」。
|
|
91
|
+
* ⚠️ `profile` 与 `bands` 是 **XOR**(恰好给一个),判据的属主是 server 的校验器,不是这个类型。
|
|
92
|
+
*
|
|
93
|
+
* 🔴 **`state` 是恒发键,新排队的行上它的值是 `null`(不是缺席)** —— server 的 `bakeAcceptedBody()`
|
|
94
|
+
* (`routes/images.ts`)四条臂都无条件放 `state: b.state`,而一条刚 INSERT 的 bake 行 SQL 上 `state` 就是
|
|
95
|
+
* NULL(runner 的第一条 `state` 行落地前),`BakeRecord.state` 的签名也是 `BakeState | null`。
|
|
96
|
+
* ⇒ 判据写 **`r.state == null`**(或真值判断),**绝不能**写 `"state" in r` / `r.state !== undefined`
|
|
97
|
+
* —— 那两种写法在**刚受理**(也就是最常见)的 bake 上恒为真,随后对 `null` 调字符串方法当场运行时炸。
|
|
98
|
+
* 返回型 7.0.0 已归位到具名 {@link BakeSubmitAck}(`state` 必填且可空、`status` 收成四值闭集);
|
|
99
|
+
* 此前的 `state?: string` 正是上面那条错判据的诱因。属源码破坏性变更,与本批入参收窄同乘 7.0.0。 */
|
|
100
|
+
create(body: BakeCreateRequest, opts?: {
|
|
75
101
|
signal?: AbortSignal;
|
|
76
|
-
}): Promise<
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
/** GET /v1/images/bakes/:id → `{ bake: bakeView }`(bakeId/status/state/profile/bands/baseRef/push/dryRun/
|
|
84
|
-
* logs/digest/repo…,开集)。operator-only。 */
|
|
102
|
+
}): Promise<BakeSubmitAck>;
|
|
103
|
+
/** GET /v1/images/bakes/:id → `{ bake: bakeView }`。operator-only。
|
|
104
|
+
*
|
|
105
|
+
* 🔴 #193 车8 P1-12(2026-08-15):`bake` 收成具名 {@link BakeRecordView} —— server `bakeView()`
|
|
106
|
+
* (`src/http/routes/images.ts`)对持久 `BakeRecord` 的逐字 21 键投影,**摘掉** runner 内部四件
|
|
107
|
+
* (ingestSecret/runnerId/leaseUntil/argv)与 cancelRequested/idemKey。三个闭集词表(`status`/`state`/
|
|
108
|
+
* `errorCode`)从此可直接分支,不必先做一次不安全 cast。索引签名保留 = 收窄是纯 additive(见类型注)。 */
|
|
85
109
|
get(bakeId: string, opts?: {
|
|
86
110
|
signal?: AbortSignal;
|
|
87
111
|
}): Promise<{
|
|
88
|
-
bake:
|
|
112
|
+
bake: BakeRecordView;
|
|
89
113
|
}>;
|
|
90
114
|
/** POST /v1/images/bakes/:id/cancel → 202 `{ bakeId, cancelRequested: true, note }`(只 flag 非终态行;
|
|
91
115
|
* runner 在下个 heartbeat 杀构建;已终态=no-op 诚实注记)。operator-only。 */
|
|
@@ -111,8 +135,12 @@ export declare class BakesResource {
|
|
|
111
135
|
}): Promise<BakeClaim>;
|
|
112
136
|
/** POST /v1/images/bakes/:id/ingest — runner 回传一行 build.sh 事件 + lease 心跳(`x-bake-ingest-secret`
|
|
113
137
|
* 头带 claim 时铸的 secret;line=`{event,...}`,event=heartbeat 只续约)。响应恒带
|
|
114
|
-
* `{ accepted, leaseValid, cancelRequested }`(409=lease 失效/被抢;cancelRequested=true → runner 应杀构建)。
|
|
115
|
-
|
|
138
|
+
* `{ accepted, leaseValid, cancelRequested }`(409=lease 失效/被抢;cancelRequested=true → runner 应杀构建)。
|
|
139
|
+
*
|
|
140
|
+
* 🔴 #193 车8 P1-12(2026-08-15):`line` 收成具名 {@link BakeIngestLine}(handler + `ingestBakeLine`
|
|
141
|
+
* 亲读的键逐条具名),但**刻意保留索引签名/开集** —— 非终态帧的其余键是 build.sh 帧字段的逐字透传,
|
|
142
|
+
* 封闭它等于在 SDK 里发明一份 build.sh 从没承诺过的帧契约。 */
|
|
143
|
+
ingest(bakeId: string, ingestSecret: string, line: BakeIngestLine, opts?: {
|
|
116
144
|
signal?: AbortSignal;
|
|
117
145
|
}): Promise<{
|
|
118
146
|
accepted: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AAAA;;;;;;;qGAOqG;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AAAA;;;;;;;qGAOqG;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;;;;;;;;;;;qBAYiB;IACX,IAAI,CAAC,IAAI,CAAC,EAAE;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAYrE;;yEAEqE;IAC/D,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAKxH;;;;;;oCAMgC;IAC1B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpG;;;;mDAI+C;IACzC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC;IAItG;+FAC2F;IACrF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC;CAGrG;AAED;;;;4EAI4E;AAC5E,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;;;;;;;;;;;;;sEAckE;IAC5D,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAI9F;;;;;2EAKuE;IACjE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC;IAI7F;kEAC8D;IACxD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAInI;0GACsG;IAChG,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAOzG,8EAA8E;IACxE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAI9G;;;;;;+CAM2C;IACrC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAsB9M;wFACoF;IAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAsBpK;AAED,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB"}
|
package/dist/resources/images.js
CHANGED
|
@@ -12,9 +12,11 @@ export class ImagesResource {
|
|
|
12
12
|
* 只在整页满时才赋值,`routes/images.ts:386` 把它**无条件**放进信封。
|
|
13
13
|
* ⇒ 翻页的终止判据必须是 **`r.nextCursor == null`**(或真值判断),
|
|
14
14
|
* **绝不能**写成 `"nextCursor" in r` / `r.nextCursor !== undefined` —— 那两种写法在末页恒为真,循环停不下来。
|
|
15
|
-
* (
|
|
16
|
-
* `
|
|
17
|
-
*
|
|
15
|
+
* (🔴 **本段的旧版本是陈旧散文**,#193 车8 清账时发现:它写着「返回型仍标 `nextCursor?: string`……留给
|
|
16
|
+
* 下一个 major」,而签名**早就**是 `nextCursor: string | null` —— 类型先被修好、注没跟上。留着它的害处是
|
|
17
|
+
* 实打实的:这段文字正是另外两笔同族欠账〈`bakes.create()` 的 `state`、`ImageSelectResult` 的七键〉援引的
|
|
18
|
+
* 先例,一条已经还完的账挂在墙上当先例,会把后来人引向「这类事一律推给下个 major」的错判。三处已随
|
|
19
|
+
* 7.0.0 一并收口。) */
|
|
18
20
|
async list(opts) {
|
|
19
21
|
const q = new URLSearchParams();
|
|
20
22
|
if (opts?.profile)
|
|
@@ -39,15 +41,26 @@ export class ImagesResource {
|
|
|
39
41
|
const { signal, ...payload } = body;
|
|
40
42
|
return this.t.request({ method: "POST", path: "/v1/images/select", body: payload, signal });
|
|
41
43
|
}
|
|
42
|
-
/** POST /v1/images/register — 登记一条镜像索引条目(src/http/routes/images.ts 实拆)→ `{ id }`。operator 面。
|
|
44
|
+
/** POST /v1/images/register — 登记一条镜像索引条目(`src/http/routes/images.ts` 实拆)→ `{ id }`。operator 面。
|
|
45
|
+
*
|
|
46
|
+
* 🔴 #193 车8 P1-12(2026-08-15):入参从裸 `Record<string, unknown>` 收成具名
|
|
47
|
+
* {@link ImageRegisterRequest}。理由不是洁癖:server 的白名单是「读已知键」而**不是**「拒未知键」——
|
|
48
|
+
* 一个打错的键名在 wire 上是静默 no-op(该字段落成默认值),两侧都不响。具名形让它在编译期就响。
|
|
49
|
+
* 三必填(profile/repo/digest)缺任一 ⇒ 400 `request.field_invalid`;`id`/`createdAt`/`updatedAt`
|
|
50
|
+
* handler 一个都不读,所以具名形里没有它们。 */
|
|
43
51
|
async register(body, opts) {
|
|
44
52
|
return this.t.request({ method: "POST", path: "/v1/images/register", body, signal: opts?.signal });
|
|
45
53
|
}
|
|
46
|
-
/** GET /v1/images/:profile — 取 profile 最新已发布条目(src/http/routes/images.ts 实拆)→ `{ image: entry }`。
|
|
54
|
+
/** GET /v1/images/:profile — 取 profile 最新已发布条目(`src/http/routes/images.ts` 实拆)→ `{ image: entry }`。
|
|
55
|
+
*
|
|
56
|
+
* 🔴 #193 车8 P1-12:`image` 就是 {@link ImageIndexEntry} —— 与 `list()` 的行**同一个 store 投影**
|
|
57
|
+
* (`latestPublished()` 与 `list()` 走同一个 `mapRow()`),spec 侧两条路早已 `$ref` 到同一个 schema,
|
|
58
|
+
* 只有 SDK 这一侧还写着 `Record<string, unknown>`。 */
|
|
47
59
|
async byProfile(profile, opts) {
|
|
48
60
|
return this.t.request({ method: "GET", path: `/v1/images/${encodeURIComponent(profile)}`, signal: opts?.signal });
|
|
49
61
|
}
|
|
50
|
-
/** GET /v1/images/digests/:digest — 按不可变 digest 取条目(src/http/routes/images.ts 实拆)→ `{ image: entry }`。
|
|
62
|
+
/** GET /v1/images/digests/:digest — 按不可变 digest 取条目(`src/http/routes/images.ts` 实拆)→ `{ image: entry }`。
|
|
63
|
+
* 同 {@link ImagesResource.byProfile}:`image` 是 {@link ImageIndexEntry}(#193 车8 P1-12)。 */
|
|
51
64
|
async byDigest(digest, opts) {
|
|
52
65
|
return this.t.request({ method: "GET", path: `/v1/images/digests/${encodeURIComponent(digest)}`, signal: opts?.signal });
|
|
53
66
|
}
|
|
@@ -63,12 +76,29 @@ export class BakesResource {
|
|
|
63
76
|
this.t = t;
|
|
64
77
|
}
|
|
65
78
|
/** POST /v1/images/bakes → 202 `{ bakeId, eventsUrl, status, state }`(白名单验参 400/501;同 argv 在飞
|
|
66
|
-
* 幂等复用 202;繁忙 409 `{activeBakeId?, eventsUrl?}`;429 提交限速带 retryAfterSec)。operator-only。
|
|
79
|
+
* 幂等复用 202;繁忙 409 `{activeBakeId?, eventsUrl?}`;429 提交限速带 retryAfterSec)。operator-only。
|
|
80
|
+
*
|
|
81
|
+
* 🔴 #193 车8 P1-12(2026-08-15):入参收成具名 {@link BakeCreateRequest}(字段集对
|
|
82
|
+
* `src/images/bake-validate.ts` 的 `validateBake` 亲读)。这条门是 §P2.4 的**反 RCE 核心** —— 每个值在
|
|
83
|
+
* 任何 argv 被拼出来之前就过冻结闭集 —— 而它的请求体此前连字段名都不具名,调用方无从知道「哪些键会被看」。
|
|
84
|
+
* ⚠️ `profile` 与 `bands` 是 **XOR**(恰好给一个),判据的属主是 server 的校验器,不是这个类型。
|
|
85
|
+
*
|
|
86
|
+
* 🔴 **`state` 是恒发键,新排队的行上它的值是 `null`(不是缺席)** —— server 的 `bakeAcceptedBody()`
|
|
87
|
+
* (`routes/images.ts`)四条臂都无条件放 `state: b.state`,而一条刚 INSERT 的 bake 行 SQL 上 `state` 就是
|
|
88
|
+
* NULL(runner 的第一条 `state` 行落地前),`BakeRecord.state` 的签名也是 `BakeState | null`。
|
|
89
|
+
* ⇒ 判据写 **`r.state == null`**(或真值判断),**绝不能**写 `"state" in r` / `r.state !== undefined`
|
|
90
|
+
* —— 那两种写法在**刚受理**(也就是最常见)的 bake 上恒为真,随后对 `null` 调字符串方法当场运行时炸。
|
|
91
|
+
* 返回型 7.0.0 已归位到具名 {@link BakeSubmitAck}(`state` 必填且可空、`status` 收成四值闭集);
|
|
92
|
+
* 此前的 `state?: string` 正是上面那条错判据的诱因。属源码破坏性变更,与本批入参收窄同乘 7.0.0。 */
|
|
67
93
|
async create(body, opts) {
|
|
68
94
|
return this.t.request({ method: "POST", path: "/v1/images/bakes", body, signal: opts?.signal });
|
|
69
95
|
}
|
|
70
|
-
/** GET /v1/images/bakes/:id → `{ bake: bakeView }
|
|
71
|
-
*
|
|
96
|
+
/** GET /v1/images/bakes/:id → `{ bake: bakeView }`。operator-only。
|
|
97
|
+
*
|
|
98
|
+
* 🔴 #193 车8 P1-12(2026-08-15):`bake` 收成具名 {@link BakeRecordView} —— server `bakeView()`
|
|
99
|
+
* (`src/http/routes/images.ts`)对持久 `BakeRecord` 的逐字 21 键投影,**摘掉** runner 内部四件
|
|
100
|
+
* (ingestSecret/runnerId/leaseUntil/argv)与 cancelRequested/idemKey。三个闭集词表(`status`/`state`/
|
|
101
|
+
* `errorCode`)从此可直接分支,不必先做一次不安全 cast。索引签名保留 = 收窄是纯 additive(见类型注)。 */
|
|
72
102
|
async get(bakeId, opts) {
|
|
73
103
|
return this.t.request({ method: "GET", path: `/v1/images/bakes/${encodeURIComponent(bakeId)}`, signal: opts?.signal });
|
|
74
104
|
}
|
|
@@ -93,7 +123,11 @@ export class BakesResource {
|
|
|
93
123
|
}
|
|
94
124
|
/** POST /v1/images/bakes/:id/ingest — runner 回传一行 build.sh 事件 + lease 心跳(`x-bake-ingest-secret`
|
|
95
125
|
* 头带 claim 时铸的 secret;line=`{event,...}`,event=heartbeat 只续约)。响应恒带
|
|
96
|
-
* `{ accepted, leaseValid, cancelRequested }`(409=lease 失效/被抢;cancelRequested=true → runner 应杀构建)。
|
|
126
|
+
* `{ accepted, leaseValid, cancelRequested }`(409=lease 失效/被抢;cancelRequested=true → runner 应杀构建)。
|
|
127
|
+
*
|
|
128
|
+
* 🔴 #193 车8 P1-12(2026-08-15):`line` 收成具名 {@link BakeIngestLine}(handler + `ingestBakeLine`
|
|
129
|
+
* 亲读的键逐条具名),但**刻意保留索引签名/开集** —— 非终态帧的其余键是 build.sh 帧字段的逐字透传,
|
|
130
|
+
* 封闭它等于在 SDK 里发明一份 build.sh 从没承诺过的帧契约。 */
|
|
97
131
|
async ingest(bakeId, ingestSecret, line, opts) {
|
|
98
132
|
const res = await this.t.openRaw({
|
|
99
133
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAW7C,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;;;;;;;;;;;;qBAYiB;IACjB,KAAK,CAAC,IAAI,CAAC,IAQV;QACC,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,OAAO;YAAE,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE,UAAU;YAAE,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,IAAI,EAAE,MAAM;YAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,MAAM;YAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS;YAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,IAAI,IAAI,EAAE,MAAM;YAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED;;yEAEqE;IACrE,KAAK,CAAC,MAAM,CAAC,IAA8E;QACzF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QACpC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED;;;;;;oCAMgC;IAChC,KAAK,CAAC,QAAQ,CAAC,IAA0B,EAAE,IAA+B;QACxE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrG,CAAC;IAED;;;;mDAI+C;IAC/C,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,IAA+B;QAC9D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpH,CAAC;IAED;+FAC2F;IAC3F,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAA+B;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3H,CAAC;CACF;AAED;;;;4EAI4E;AAC5E,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;;;;;;;;;;;;;;sEAckE;IAClE,KAAK,CAAC,MAAM,CAAC,IAAuB,EAAE,IAA+B;QACnE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IAED;;;;;2EAKuE;IACvE,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAA+B;QACvD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACzH,CAAC;IAED;kEAC8D;IAC9D,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,IAA+B;QAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3I,CAAC;IAED;0GACsG;IACtG,KAAK,CAAC,SAAS,CAAC,IAA4B,EAAE,IAA+B;QAC3E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7M,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,sCAAsC;QAC3E,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAqC;QACrF,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAc,CAAC;IACzC,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,IAA4B,EAAE,IAA+B;QACvF,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClJ,CAAC;IAED;;;;;;+CAM2C;IAC3C,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,YAAoB,EAAE,IAAoB,EAAE,IAA+B;QACtG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,SAAS;YAC7D,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7B,WAAW,EAAE,kBAAkB;YAC/B,OAAO,EAAE,EAAE,sBAAsB,EAAE,YAAY,EAAE;YACjD,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC,CAAC;QACH,qEAAqE;QACrE,2EAA2E;QAC3E,yEAAyE;QACzE,yFAAyF;QACzF,oEAAoE;QACpE,kBAAkB;QAClB,+EAA+E;QAC/E,mBAAmB;QACnB,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+F,CAAC;QAC9H,OAAO,IAAI,CAAC;IACd,CAAC;IAED;wFACoF;IACpF,KAAK,CAAC,CAAC,MAAM,CAAC,MAAc,EAAE,IAAqD;QACjF,IAAI,KAAK,GAAG,IAAI,EAAE,WAAW,CAAC;QAC9B,MAAM,MAAM,GAAG,gBAAgB,CAC7B,CAAC,WAAW,EAAE,EAAE;YACd,MAAM,EAAE,GAAG,WAAW,IAAI,KAAK,CAAC;YAChC,KAAK,GAAG,SAAS,CAAC;YAClB,MAAM,CAAC,GAA2C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACnI,IAAI,EAAE;gBAAE,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;YAC3B,IAAI,IAAI,EAAE,MAAM;gBAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACzC,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAChD,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CACnD,CAAC;QACF,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,SAAS,CAAC,uDAAuD;YACzG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAA4B,CAAC,CAAC,qDAAqD;YACjH,MAAM,EAAE,GAAkE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC;YAChH,IAAI,CAAC,CAAC,EAAE;gBAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;CACF"}
|
package/dist/resources/runs.d.ts
CHANGED
|
@@ -160,11 +160,15 @@ export declare class RunsResource {
|
|
|
160
160
|
* approve/deny). AT-MOST-ONCE — steer is NOT idempotent, so NO submit/retry. `trusted` is NOT a body field:
|
|
161
161
|
* the server derives it from the authenticated operator (the BFF's operator role), never a client-set flag.
|
|
162
162
|
*
|
|
163
|
-
* 🔴 STEER ITSELF IS LIVE/SHIPPED (service §K-6, runStore-gated).
|
|
164
|
-
*
|
|
163
|
+
* 🔴 STEER ITSELF IS LIVE/SHIPPED (service §K-6, runStore-gated). The spec entry is `x-status: live` as of
|
|
164
|
+
* #193 车8 (2026-08-15) — the old `draft` label's stated reason ("core landing the pendingSteer freeze /
|
|
165
|
+
* close-tag slice") had been stale for months, and `draft` is not cosmetic: the contract-test assertion set
|
|
166
|
+
* EXCLUDES planned|draft operations wholesale, so the label was a standing exemption from every gate.
|
|
167
|
+
* Branch on {@link SteerReceipt.delivery}, NOT on the status code — the three legs (`routes/runs.ts`, the
|
|
168
|
+
* steer section; file-level coords on purpose, line numbers rot):
|
|
165
169
|
* · 200 `applied` — injected into the live run on this replica.
|
|
166
170
|
* · 202 `queued` — the run is durably PARKED (`suspended` or `needs_review` — `status` carries
|
|
167
|
-
|
|
171
|
+
* the real row word, server 7.16.0): the steer is PARKED on its pending checkpoint
|
|
168
172
|
* and injected on resume. ⚠️ [2400] TR-3 correction: the previous note here said a
|
|
169
173
|
* `suspended` run yields `steering.not_running` (409). It does not — the server
|
|
170
174
|
* parks it. A 409 only comes from a run that is TERMINAL-with-no-park-path, or
|
|
@@ -172,14 +176,45 @@ export declare class RunsResource {
|
|
|
172
176
|
* · 202 `parked_for_wake` — the run already ENDED; the message sits on a freshly-minted `task_done`
|
|
173
177
|
* checkpoint and is delivered ONLY by `POST /v1/sessions/:id/wake`.
|
|
174
178
|
* Typed errors: `SteeringNotRunningError` (`steering.not_running`, 409) / `SteeringInvalidContentError`
|
|
175
|
-
* (`steering.invalid_content`, 422) / `CapabilityUnavailableError`
|
|
176
|
-
*
|
|
179
|
+
* (`steering.invalid_content`, 422) / `CapabilityUnavailableError` — TWO 501 codes, not one:
|
|
180
|
+
* `capability.run_store_required` (no durable run store at all: the whole async-run family is off) and
|
|
181
|
+
* `capability.checkpoint_store_required` (store wired, but parking a PARKED run needs the checkpoint store;
|
|
182
|
+
* the live 200 leg still works on such a worker).
|
|
177
183
|
*
|
|
178
|
-
* 🔴
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
184
|
+
* 🔴 413 here is `request.payload_too_large` (the worker's global 8 MiB body cap, raised by the shared JSON
|
|
185
|
+
* reader) — NOT `steer.content_too_large`. That code and its 256 KiB threshold belong to
|
|
186
|
+
* {@link RunsResource.steerSubagent} / the workflow-agent steer, which cap the steer TEXT itself; this verb
|
|
187
|
+
* has no separate text cap. (#193 车8: the spec claimed the subagent code on this path — a consumer keyed on
|
|
188
|
+
* it never matched.) 400 is likewise three distinct codes: `request.invalid_json` / `request.body_shape`
|
|
189
|
+
* (`text` missing or empty) / `request.field_invalid` (off-enum `mode`/`priority` — fail-loud, never coerced).
|
|
190
|
+
*
|
|
191
|
+
* 🔴 IDEMPOTENCY KEY — `opts.idempotencyKey` is EXPLICIT-ONLY (never auto-minted, unlike the submit-class
|
|
192
|
+
* verbs). Why it matters: since core 5.14.0 a parked steer goes into a BOUNDED queue, so a lost 202 followed
|
|
193
|
+
* by a keyless retry APPENDS A SECOND copy of the same operator instruction — and with only 3 slots, three
|
|
194
|
+
* retries fill it and every later legitimate steer 409s `steering.queue_full`. On the PARKED legs the server
|
|
195
|
+
* threads this header into core's `inputId`, making same-key+same-content an idempotent no-op (and
|
|
196
|
+
* same-key+different-content a loud `steering.duplicate_input_id` 409 rather than a silent pick). Why not
|
|
197
|
+
* auto-mint: steer is AT-MOST-ONCE and this verb is not submit-class, so minting a key by default would
|
|
198
|
+
* quietly convert "never retried" into "retry-safe" — a behaviour change, not a reachability fix. Passing a
|
|
199
|
+
* key does NOT enable transport retry.
|
|
200
|
+
* (#193 车8 — before this, the header was unreachable through the SDK entirely: non-submit calls never sent
|
|
201
|
+
* it and `RESERVED_HEADERS` blocks a hand-set one, so the documented `duplicate_input_id` arm was dead.)
|
|
202
|
+
*
|
|
203
|
+
* 🔴🔴 SCOPE — the key dedupes the PARKED legs ONLY (202 `queued` / `parked_for_wake`); the 200 `applied`
|
|
204
|
+
* leg does NOT dedupe (#193 车8, codex R2, verified against `routes/runs.ts`). Only the parked path threads
|
|
205
|
+
* the derived `inputId` into core (`setPendingSteer`); the live path calls `TaskStream.steer(text,
|
|
206
|
+
* {trusted})`, which takes no inputId today. So a LOST 200 retried with the same key injects the
|
|
207
|
+
* instruction a SECOND time — and because `messageId` is derived from that key, both receipts come back
|
|
208
|
+
* BYTE-IDENTICAL, making the duplicate look like an idempotent hit. Treat a lost 200 as "outcome unknown"
|
|
209
|
+
* (re-read the run), never as "safe to retry". Closing this needs a core/server-side seam (an inputId on
|
|
210
|
+
* the live steer path) — an UPSTREAM item, deliberately not worked around from this layer.
|
|
211
|
+
*
|
|
212
|
+
* 🔴 ONE narrow caveat (and it is a FIELD-level caveat, not "steer is a draft"): the per-call `mode` arg is
|
|
213
|
+
* currently a NO-OP — core's steer is HARNESS-LEVEL (`setSteeringMode`), set globally on the runner, not
|
|
214
|
+
* switched per steer call; the `mode` mapping is pending D-A core (search [76]). Sending `mode` is harmless
|
|
215
|
+
* (ignored); steer delivery itself works today. `mode` semantics (when wired): "all" = drain ALL queued
|
|
216
|
+
* steers at the next turn boundary; "one-at-a-time" (default) = one per turn, FIFO. `priority` is likewise
|
|
217
|
+
* advisory — see {@link SteerPriority}. */
|
|
183
218
|
steer(taskId: string, steer: {
|
|
184
219
|
text: string;
|
|
185
220
|
mode?: "all" | "one-at-a-time";
|
|
@@ -187,6 +222,7 @@ export declare class RunsResource {
|
|
|
187
222
|
}, opts?: {
|
|
188
223
|
session?: string;
|
|
189
224
|
signal?: AbortSignal;
|
|
225
|
+
idempotencyKey?: string;
|
|
190
226
|
}): Promise<SteerReceipt>;
|
|
191
227
|
/** core 1.219 C2 / server 1.89 — STEER a RUNNING SUBAGENT of this run (the CC "enter the agent's view and
|
|
192
228
|
* type to it" semantic, `AGe` pendingMessages: the message drains at the subagent's NEXT TOOL ROUND).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/resources/runs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/resources/runs.ts"],"names":[],"mappings":"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"}
|
package/dist/resources/runs.js
CHANGED
|
@@ -84,11 +84,15 @@ export class RunsResource {
|
|
|
84
84
|
* approve/deny). AT-MOST-ONCE — steer is NOT idempotent, so NO submit/retry. `trusted` is NOT a body field:
|
|
85
85
|
* the server derives it from the authenticated operator (the BFF's operator role), never a client-set flag.
|
|
86
86
|
*
|
|
87
|
-
* 🔴 STEER ITSELF IS LIVE/SHIPPED (service §K-6, runStore-gated).
|
|
88
|
-
*
|
|
87
|
+
* 🔴 STEER ITSELF IS LIVE/SHIPPED (service §K-6, runStore-gated). The spec entry is `x-status: live` as of
|
|
88
|
+
* #193 车8 (2026-08-15) — the old `draft` label's stated reason ("core landing the pendingSteer freeze /
|
|
89
|
+
* close-tag slice") had been stale for months, and `draft` is not cosmetic: the contract-test assertion set
|
|
90
|
+
* EXCLUDES planned|draft operations wholesale, so the label was a standing exemption from every gate.
|
|
91
|
+
* Branch on {@link SteerReceipt.delivery}, NOT on the status code — the three legs (`routes/runs.ts`, the
|
|
92
|
+
* steer section; file-level coords on purpose, line numbers rot):
|
|
89
93
|
* · 200 `applied` — injected into the live run on this replica.
|
|
90
94
|
* · 202 `queued` — the run is durably PARKED (`suspended` or `needs_review` — `status` carries
|
|
91
|
-
|
|
95
|
+
* the real row word, server 7.16.0): the steer is PARKED on its pending checkpoint
|
|
92
96
|
* and injected on resume. ⚠️ [2400] TR-3 correction: the previous note here said a
|
|
93
97
|
* `suspended` run yields `steering.not_running` (409). It does not — the server
|
|
94
98
|
* parks it. A 409 only comes from a run that is TERMINAL-with-no-park-path, or
|
|
@@ -96,19 +100,54 @@ export class RunsResource {
|
|
|
96
100
|
* · 202 `parked_for_wake` — the run already ENDED; the message sits on a freshly-minted `task_done`
|
|
97
101
|
* checkpoint and is delivered ONLY by `POST /v1/sessions/:id/wake`.
|
|
98
102
|
* Typed errors: `SteeringNotRunningError` (`steering.not_running`, 409) / `SteeringInvalidContentError`
|
|
99
|
-
* (`steering.invalid_content`, 422) / `CapabilityUnavailableError`
|
|
100
|
-
*
|
|
103
|
+
* (`steering.invalid_content`, 422) / `CapabilityUnavailableError` — TWO 501 codes, not one:
|
|
104
|
+
* `capability.run_store_required` (no durable run store at all: the whole async-run family is off) and
|
|
105
|
+
* `capability.checkpoint_store_required` (store wired, but parking a PARKED run needs the checkpoint store;
|
|
106
|
+
* the live 200 leg still works on such a worker).
|
|
101
107
|
*
|
|
102
|
-
* 🔴
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
108
|
+
* 🔴 413 here is `request.payload_too_large` (the worker's global 8 MiB body cap, raised by the shared JSON
|
|
109
|
+
* reader) — NOT `steer.content_too_large`. That code and its 256 KiB threshold belong to
|
|
110
|
+
* {@link RunsResource.steerSubagent} / the workflow-agent steer, which cap the steer TEXT itself; this verb
|
|
111
|
+
* has no separate text cap. (#193 车8: the spec claimed the subagent code on this path — a consumer keyed on
|
|
112
|
+
* it never matched.) 400 is likewise three distinct codes: `request.invalid_json` / `request.body_shape`
|
|
113
|
+
* (`text` missing or empty) / `request.field_invalid` (off-enum `mode`/`priority` — fail-loud, never coerced).
|
|
114
|
+
*
|
|
115
|
+
* 🔴 IDEMPOTENCY KEY — `opts.idempotencyKey` is EXPLICIT-ONLY (never auto-minted, unlike the submit-class
|
|
116
|
+
* verbs). Why it matters: since core 5.14.0 a parked steer goes into a BOUNDED queue, so a lost 202 followed
|
|
117
|
+
* by a keyless retry APPENDS A SECOND copy of the same operator instruction — and with only 3 slots, three
|
|
118
|
+
* retries fill it and every later legitimate steer 409s `steering.queue_full`. On the PARKED legs the server
|
|
119
|
+
* threads this header into core's `inputId`, making same-key+same-content an idempotent no-op (and
|
|
120
|
+
* same-key+different-content a loud `steering.duplicate_input_id` 409 rather than a silent pick). Why not
|
|
121
|
+
* auto-mint: steer is AT-MOST-ONCE and this verb is not submit-class, so minting a key by default would
|
|
122
|
+
* quietly convert "never retried" into "retry-safe" — a behaviour change, not a reachability fix. Passing a
|
|
123
|
+
* key does NOT enable transport retry.
|
|
124
|
+
* (#193 车8 — before this, the header was unreachable through the SDK entirely: non-submit calls never sent
|
|
125
|
+
* it and `RESERVED_HEADERS` blocks a hand-set one, so the documented `duplicate_input_id` arm was dead.)
|
|
126
|
+
*
|
|
127
|
+
* 🔴🔴 SCOPE — the key dedupes the PARKED legs ONLY (202 `queued` / `parked_for_wake`); the 200 `applied`
|
|
128
|
+
* leg does NOT dedupe (#193 车8, codex R2, verified against `routes/runs.ts`). Only the parked path threads
|
|
129
|
+
* the derived `inputId` into core (`setPendingSteer`); the live path calls `TaskStream.steer(text,
|
|
130
|
+
* {trusted})`, which takes no inputId today. So a LOST 200 retried with the same key injects the
|
|
131
|
+
* instruction a SECOND time — and because `messageId` is derived from that key, both receipts come back
|
|
132
|
+
* BYTE-IDENTICAL, making the duplicate look like an idempotent hit. Treat a lost 200 as "outcome unknown"
|
|
133
|
+
* (re-read the run), never as "safe to retry". Closing this needs a core/server-side seam (an inputId on
|
|
134
|
+
* the live steer path) — an UPSTREAM item, deliberately not worked around from this layer.
|
|
135
|
+
*
|
|
136
|
+
* 🔴 ONE narrow caveat (and it is a FIELD-level caveat, not "steer is a draft"): the per-call `mode` arg is
|
|
137
|
+
* currently a NO-OP — core's steer is HARNESS-LEVEL (`setSteeringMode`), set globally on the runner, not
|
|
138
|
+
* switched per steer call; the `mode` mapping is pending D-A core (search [76]). Sending `mode` is harmless
|
|
139
|
+
* (ignored); steer delivery itself works today. `mode` semantics (when wired): "all" = drain ALL queued
|
|
140
|
+
* steers at the next turn boundary; "one-at-a-time" (default) = one per turn, FIFO. `priority` is likewise
|
|
141
|
+
* advisory — see {@link SteerPriority}. */
|
|
107
142
|
async steer(taskId, steer, opts) {
|
|
108
143
|
return this.t.request({
|
|
109
144
|
method: "POST",
|
|
110
145
|
path: `/v1/runs/${encodeURIComponent(taskId)}/steer${this.sessionQs(opts?.session)}`,
|
|
111
146
|
body: steer,
|
|
147
|
+
// 🔴 #193 车8(codex 交叉复审 R1 high,验真后采纳):**显式选配,绝不自动铸**。见方法注的
|
|
148
|
+
// 「幂等键」一段 —— 自动铸会把 AT-MOST-ONCE 悄悄变成可重试语义。非 submit-class ⇒ 传了键也
|
|
149
|
+
// **不会**让 transport 重试;它纯粹是给 server 接 core `inputId` 的去重令牌。
|
|
150
|
+
idempotencyKey: opts?.idempotencyKey,
|
|
112
151
|
signal: opts?.signal,
|
|
113
152
|
});
|
|
114
153
|
}
|