@sema-agent/sdk 4.2.0 → 4.3.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 +12 -0
- package/dist/control-types.d.ts +22 -4
- package/dist/control-types.d.ts.map +1 -1
- package/dist/control-types.js +3 -1
- package/dist/control-types.js.map +1 -1
- package/dist/health.d.ts +76 -7
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js +40 -2
- package/dist/health.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/registry/health.d.ts +6 -1
- package/dist/registry/health.d.ts.map +1 -1
- package/dist/registry/health.js +6 -4
- package/dist/registry/health.js.map +1 -1
- package/dist/registry/index.d.ts +7 -1
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +7 -1
- package/dist/registry/index.js.map +1 -1
- package/dist/resources/attachments.d.ts +9 -2
- package/dist/resources/attachments.d.ts.map +1 -1
- package/dist/resources/attachments.js.map +1 -1
- package/dist/resources/control/secrets.d.ts +10 -1
- package/dist/resources/control/secrets.d.ts.map +1 -1
- package/dist/resources/control/secrets.js +10 -1
- package/dist/resources/control/secrets.js.map +1 -1
- package/dist/resources/fleet.d.ts +3 -2
- package/dist/resources/fleet.d.ts.map +1 -1
- package/dist/resources/fleet.js.map +1 -1
- package/dist/resources/images.d.ts +10 -1
- package/dist/resources/images.d.ts.map +1 -1
- package/dist/resources/images.js +20 -5
- package/dist/resources/images.js.map +1 -1
- package/dist/resources/leader.d.ts +7 -3
- package/dist/resources/leader.d.ts.map +1 -1
- package/dist/resources/leader.js +7 -3
- package/dist/resources/leader.js.map +1 -1
- package/dist/resources/ops.d.ts +29 -2
- package/dist/resources/ops.d.ts.map +1 -1
- package/dist/resources/ops.js +6 -1
- package/dist/resources/ops.js.map +1 -1
- package/dist/resources/session-sync.d.ts +77 -17
- package/dist/resources/session-sync.d.ts.map +1 -1
- package/dist/resources/session-sync.js +81 -20
- package/dist/resources/session-sync.js.map +1 -1
- package/dist/resources/sessions.d.ts +72 -12
- package/dist/resources/sessions.d.ts.map +1 -1
- package/dist/resources/sessions.js +29 -6
- package/dist/resources/sessions.js.map +1 -1
- package/dist/resources/trace.d.ts +17 -3
- package/dist/resources/trace.d.ts.map +1 -1
- package/dist/resources/trace.js +25 -5
- package/dist/resources/trace.js.map +1 -1
- package/dist/resources/workflows.d.ts +42 -10
- package/dist/resources/workflows.d.ts.map +1 -1
- package/dist/resources/workflows.js +46 -9
- package/dist/resources/workflows.js.map +1 -1
- package/dist/resources/workspace.d.ts +36 -11
- package/dist/resources/workspace.d.ts.map +1 -1
- package/dist/resources/workspace.js.map +1 -1
- package/dist/sync.d.ts +37 -8
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +24 -8
- package/dist/sync.js.map +1 -1
- package/dist/transport.d.ts +17 -3
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +18 -1
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +86 -9
- package/dist/types.d.ts.map +1 -1
- package/openapi.yaml +172 -54
- package/package.json +2 -2
- package/registry-openapi.yaml +34 -3
|
@@ -26,7 +26,16 @@ export declare class ControlSecretsResource {
|
|
|
26
26
|
* 🔴 The `value` goes up in the body ONCE and is NEVER returned/logged (I1) — the result carries only `name`
|
|
27
27
|
* + advisory next-steps. A collision with a DIFFERENT existing value → 409 ControlConflictError unless
|
|
28
28
|
* `overwrite`. publisher+. NOT submit-class (no idempotency key — a re-PUT of the same name/value is a
|
|
29
|
-
* server-side no-op; a key would not change the value-overwrite semantics).
|
|
29
|
+
* server-side no-op; a key would not change the value-overwrite semantics).
|
|
30
|
+
*
|
|
31
|
+
* 🔴 **`value` 不能含换行 —— registry 直接拒**(4.3.0 补,RC-10;此前这里对 value 的字符集零文档)。
|
|
32
|
+
* 这不是推测:sema-server 已经为它建了规避形并把理由写在码里(`src/config.ts:410-412` 逐字:
|
|
33
|
+
* 「A PEM key is multi-line, but **sema-registry's `POST /api/config/secrets` rejects newlines** — so let the
|
|
34
|
+
* value arrive base64-encoded (the recommended self-serve form) or with escaped `\n`, and reconstruct the real
|
|
35
|
+
* PEM here」,实现即 `normalizeSshPrivateKey`,`:414-425`)。
|
|
36
|
+
* ⇒ 多行密钥(PEM / SSH 私钥 / 证书链)**请先 base64 编码再送**(上游推荐的自助形),或送转义过的 `\n`;
|
|
37
|
+
* 消费端在使用处还原。直接 `set({name:"SSH_KEY", value: pemString})` 会拿到 400 ⇒ `ControlValidationError`,
|
|
38
|
+
* 而在这段话存在之前,操作者只能自己再踩一遍 server 早就写进注释的坑。 */
|
|
30
39
|
set(body: {
|
|
31
40
|
name: string;
|
|
32
41
|
value: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/resources/control/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;6CAY6C;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAC7F,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;qGACiG;IAC3F,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAK7F
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/resources/control/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;6CAY6C;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAC7F,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;qGACiG;IAC3F,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAK7F;;;;;;;;;;;;;iDAa6C;IACvC,GAAG,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOvH;;uFAEmF;IAC7E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIxF;;2DAEuD;IACjD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKzG;4GACwG;IAClG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAGvE"}
|
|
@@ -13,7 +13,16 @@ export class ControlSecretsResource {
|
|
|
13
13
|
* 🔴 The `value` goes up in the body ONCE and is NEVER returned/logged (I1) — the result carries only `name`
|
|
14
14
|
* + advisory next-steps. A collision with a DIFFERENT existing value → 409 ControlConflictError unless
|
|
15
15
|
* `overwrite`. publisher+. NOT submit-class (no idempotency key — a re-PUT of the same name/value is a
|
|
16
|
-
* server-side no-op; a key would not change the value-overwrite semantics).
|
|
16
|
+
* server-side no-op; a key would not change the value-overwrite semantics).
|
|
17
|
+
*
|
|
18
|
+
* 🔴 **`value` 不能含换行 —— registry 直接拒**(4.3.0 补,RC-10;此前这里对 value 的字符集零文档)。
|
|
19
|
+
* 这不是推测:sema-server 已经为它建了规避形并把理由写在码里(`src/config.ts:410-412` 逐字:
|
|
20
|
+
* 「A PEM key is multi-line, but **sema-registry's `POST /api/config/secrets` rejects newlines** — so let the
|
|
21
|
+
* value arrive base64-encoded (the recommended self-serve form) or with escaped `\n`, and reconstruct the real
|
|
22
|
+
* PEM here」,实现即 `normalizeSshPrivateKey`,`:414-425`)。
|
|
23
|
+
* ⇒ 多行密钥(PEM / SSH 私钥 / 证书链)**请先 base64 编码再送**(上游推荐的自助形),或送转义过的 `\n`;
|
|
24
|
+
* 消费端在使用处还原。直接 `set({name:"SSH_KEY", value: pemString})` 会拿到 400 ⇒ `ControlValidationError`,
|
|
25
|
+
* 而在这段话存在之前,操作者只能自己再踩一遍 server 早就写进注释的坑。 */
|
|
17
26
|
async set(body) {
|
|
18
27
|
const { signal, overwrite, name, value } = body;
|
|
19
28
|
const qs = overwrite ? "?overwrite=true" : "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/resources/control/secrets.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;qGACiG;IACjG,KAAK,CAAC,SAAS,CAAC,IAAkD;QAChE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/resources/control/secrets.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;qGACiG;IACjG,KAAK,CAAC,SAAS,CAAC,IAAkD;QAChE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;IAED;;;;;;;;;;;;;iDAa6C;IAC7C,KAAK,CAAC,GAAG,CAAC,IAAgF;QACxF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAChD,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,mEAAmE;QACnE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7G,CAAC;IAED;;uFAEmF;IACnF,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAA+B;QACxD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5I,CAAC;IAED;;2DAEuD;IACvD,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAgD;QACzE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClI,CAAC;IAED;4GACwG;IACxG,KAAK,CAAC,IAAI,CAAC,IAA+B;QACxC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;CACF"}
|
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
* agnostic `readSseFrames` (NOT `parseSse`, which is hardcoded to the AgentEvent union + auto-reconnect).
|
|
28
28
|
* Gated off (no `fleetBus` wired) → 501 (typed error) before any frame.
|
|
29
29
|
*
|
|
30
|
-
* Verified against
|
|
30
|
+
* Verified against sema-server **5.3.0** (2026-08-02 亲读): handler `streamFleet` (`src/http/routes/fleet.ts`)
|
|
31
|
+
* + `src/fleet/fleet-bus.ts` types. (4.3.0 坐标刷新:此前钉的是 commit `1bf7a5c`,在 server 仓已不可定位为
|
|
32
|
+
* 近期点 —— 版本号比 commit 短哈希更能被下一个人重放。)
|
|
31
33
|
*/
|
|
32
34
|
import type { Transport } from "../transport.js";
|
|
33
35
|
/** The fleet vocabulary the shell renders (MF-Fleet `FleetTask.status`, byte-aligned to service `FleetTaskStatus`
|
|
@@ -161,7 +163,6 @@ export type FleetFrame = {
|
|
|
161
163
|
sessionScoped?: boolean;
|
|
162
164
|
/** [1833] G2:bg 通知投递姿态恒 fail-closed 的如实自述(server 恒 true;老版缺席)。 */
|
|
163
165
|
bgNotifyFailClosed?: boolean;
|
|
164
|
-
ts?: number;
|
|
165
166
|
} | {
|
|
166
167
|
type: "snapshot";
|
|
167
168
|
tasks: FleetTaskRow[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../src/resources/fleet.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../src/resources/fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/resources/fleet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/resources/fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,16 @@ export declare class ImagesResource {
|
|
|
12
12
|
private readonly t;
|
|
13
13
|
constructor(t: Transport);
|
|
14
14
|
/** GET /v1/images — 分页镜像目录(visibility 按 principal scoped)。filter: profile/capability/status/latest。
|
|
15
|
-
* 信封 `{images, nextCursor
|
|
15
|
+
* 信封 `{images, nextCursor}`(cursor-agnostic:UI 用 nextCursor 翻页,不假设 cursor 内部形态)。
|
|
16
|
+
*
|
|
17
|
+
* 🔴 **`nextCursor` 是恒发键,末页的值是 `null`(不是缺席)** —— server 的生产者
|
|
18
|
+
* `plugins/image-index-sql.ts:377` 签名就是 `{ entries; nextCursor: string | null }`,`:447` 初始化为 `null`、
|
|
19
|
+
* 只在整页满时才赋值,`routes/images.ts:386` 把它**无条件**放进信封。
|
|
20
|
+
* ⇒ 翻页的终止判据必须是 **`r.nextCursor == null`**(或真值判断),
|
|
21
|
+
* **绝不能**写成 `"nextCursor" in r` / `r.nextCursor !== undefined` —— 那两种写法在末页恒为真,循环停不下来。
|
|
22
|
+
* (本方法的返回型仍标 `nextCursor?: string`;把它改成 `?: string | null` 会让既有消费方的
|
|
23
|
+
* `const c: string | undefined = r.nextCursor` 编译不过,属源码破坏性变更,留给下一个 major。
|
|
24
|
+
* 在那之前,以本段为准 —— 类型比 wire 窄,判据以 `== null` 写就两边都对。) */
|
|
16
25
|
list(opts?: {
|
|
17
26
|
profile?: string;
|
|
18
27
|
capability?: string;
|
|
@@ -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,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEtE,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"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"}
|
package/dist/resources/images.js
CHANGED
|
@@ -5,7 +5,16 @@ export class ImagesResource {
|
|
|
5
5
|
this.t = t;
|
|
6
6
|
}
|
|
7
7
|
/** GET /v1/images — 分页镜像目录(visibility 按 principal scoped)。filter: profile/capability/status/latest。
|
|
8
|
-
* 信封 `{images, nextCursor
|
|
8
|
+
* 信封 `{images, nextCursor}`(cursor-agnostic:UI 用 nextCursor 翻页,不假设 cursor 内部形态)。
|
|
9
|
+
*
|
|
10
|
+
* 🔴 **`nextCursor` 是恒发键,末页的值是 `null`(不是缺席)** —— server 的生产者
|
|
11
|
+
* `plugins/image-index-sql.ts:377` 签名就是 `{ entries; nextCursor: string | null }`,`:447` 初始化为 `null`、
|
|
12
|
+
* 只在整页满时才赋值,`routes/images.ts:386` 把它**无条件**放进信封。
|
|
13
|
+
* ⇒ 翻页的终止判据必须是 **`r.nextCursor == null`**(或真值判断),
|
|
14
|
+
* **绝不能**写成 `"nextCursor" in r` / `r.nextCursor !== undefined` —— 那两种写法在末页恒为真,循环停不下来。
|
|
15
|
+
* (本方法的返回型仍标 `nextCursor?: string`;把它改成 `?: string | null` 会让既有消费方的
|
|
16
|
+
* `const c: string | undefined = r.nextCursor` 编译不过,属源码破坏性变更,留给下一个 major。
|
|
17
|
+
* 在那之前,以本段为准 —— 类型比 wire 窄,判据以 `== null` 写就两边都对。) */
|
|
9
18
|
async list(opts) {
|
|
10
19
|
const q = new URLSearchParams();
|
|
11
20
|
if (opts?.profile)
|
|
@@ -94,11 +103,17 @@ export class BakesResource {
|
|
|
94
103
|
headers: { "x-bake-ingest-secret": ingestSecret },
|
|
95
104
|
...(opts?.signal ? { signal: opts.signal } : {}),
|
|
96
105
|
});
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
//
|
|
106
|
+
// 🔴 FW-8(4.3.0)——**先判 res.ok(409 除外)再解 JSON**,与同文件的 `claimNext` 同序。
|
|
107
|
+
// 此前是反的:无条件 `await res.json()` 打头。server 自己的错误路径都走 `sendError` 发 JSON,所以直连
|
|
108
|
+
// 时看不出问题;但 ingest 跑在 runner→server 之间,中间任何一跳(ingress / mesh / 网关)在超时或过载时
|
|
109
|
+
// 回一个**非 JSON 体**(HTML 502、空体 504),`res.json()` 就直接抛 `SyntaxError: Unexpected token '<'`
|
|
110
|
+
// —— **绕过整个 typed-error 通路**:runner 既拿不到状态码也拿不到机器码,只看到一条 JSON 解析错误,
|
|
111
|
+
// 于是把网关故障误诊成契约破坏。
|
|
112
|
+
// 409 是唯一的例外:lease 失效/被抢时契约上**仍带**三态体(runner 用 cancelRequested/leaseValid 决策),
|
|
113
|
+
// 所以它不抛、要继续读 body。
|
|
100
114
|
if (!res.ok && res.status !== 409)
|
|
101
|
-
throw this.t.
|
|
115
|
+
throw await this.t.errorFrom(res);
|
|
116
|
+
const body = (await res.json());
|
|
102
117
|
return body;
|
|
103
118
|
}
|
|
104
119
|
/** GET /v1/images/bakes/:id/events — 烧制实况 SSE(§P2.2,run-trace-SSE 同形;resumable,`id:` 行=事件 seq,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,14 +10,18 @@ export declare class LeaderResource {
|
|
|
10
10
|
private readonly t;
|
|
11
11
|
constructor(t: Transport);
|
|
12
12
|
/** POST /v1/leader → 202 receipt(server `src/http/routes/leader.ts` 实拆:同 /v1/runs 的身份门——
|
|
13
|
-
* REQUIRE_PRINCIPAL 下验证主体 401 先行,记录为 run owner;限速/配额/lease 门同任务提交)。
|
|
14
|
-
*
|
|
13
|
+
* REQUIRE_PRINCIPAL 下验证主体 401 先行,记录为 run owner;限速/配额/lease 门同任务提交)。
|
|
14
|
+
* 🔴 **LEADER_ENABLED 关闭时恒 404,没有 501 这条臂**(4.3.0 更正,FW-11):`routes/leader.ts:26` 的
|
|
15
|
+
* `if (deps.leaderEndpoint)` 不成立时整条路由**未匹配**,落 `:64` 的 `miss.fell = true` ⇒ 最终由主体的
|
|
16
|
+
* 路由兜底发 404 `not_found.route`。所以别写「catch CapabilityUnavailableError 当作面缺席」的分支 ——
|
|
17
|
+
* 它永远不触发;面缺席请用 `capabilities().leader` 预判。(SDK 全覆盖批 2026-07-17:原 TODO(M3+) 桩接线。)
|
|
15
18
|
*
|
|
16
19
|
* 🔴 facade 审计(2026-07-24,SDK 全量核查 GD 组):此前这五个字段里只有 `objective` 是类型必填,
|
|
17
20
|
* `durableRemote`/`testCmd`/`seedCmd`/`baseSha` 全靠 `[k:string]:unknown` 兜底——但服务端后台
|
|
18
21
|
* runLeader 实际无条件要求全部五个非空(`wire.ts:368`),同步 HTTP 门此前只查 `objective`,一个
|
|
19
22
|
* "看起来对"的最小请求会拿到 202 然后**必然**在后台异步失败,只能靠后续 GET 才发现。server 侧
|
|
20
|
-
* 同班车把这个校验前移到同步门(`
|
|
23
|
+
* 同班车把这个校验前移到同步门(真坐标 = `src/boot/leader.ts:104` 的 `requiredFields`;`main.ts:701`
|
|
24
|
+
* 只是调 `createLeaderFace`。4.3.0 坐标刷新);SDK 这边把类型收紧到诚实
|
|
21
25
|
* 反映真实约束,让编译期就能拦住这个坑,不用等真机复现才发现。
|
|
22
26
|
*
|
|
23
27
|
* 🔴 facade 审计(2026-07-24,批次②-8):此前 opts 还有一个 `idempotencyKey` —— 纯装饰,两端都是假
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leader.d.ts","sourceRoot":"","sources":["../../src/resources/leader.ts"],"names":[],"mappings":"AAAA;;;;;qGAKqG;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC
|
|
1
|
+
{"version":3,"file":"leader.d.ts","sourceRoot":"","sources":["../../src/resources/leader.ts"],"names":[],"mappings":"AAAA;;;;;qGAKqG;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;;;;;;;;;;;;;;;;;;;;;uCAsBmC;IAC7B,MAAM,CACV,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAC1H,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,aAAa,CAAC;IAIzB,gEAAgE;IAC1D,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAGvF"}
|
package/dist/resources/leader.js
CHANGED
|
@@ -4,14 +4,18 @@ export class LeaderResource {
|
|
|
4
4
|
this.t = t;
|
|
5
5
|
}
|
|
6
6
|
/** POST /v1/leader → 202 receipt(server `src/http/routes/leader.ts` 实拆:同 /v1/runs 的身份门——
|
|
7
|
-
* REQUIRE_PRINCIPAL 下验证主体 401 先行,记录为 run owner;限速/配额/lease 门同任务提交)。
|
|
8
|
-
*
|
|
7
|
+
* REQUIRE_PRINCIPAL 下验证主体 401 先行,记录为 run owner;限速/配额/lease 门同任务提交)。
|
|
8
|
+
* 🔴 **LEADER_ENABLED 关闭时恒 404,没有 501 这条臂**(4.3.0 更正,FW-11):`routes/leader.ts:26` 的
|
|
9
|
+
* `if (deps.leaderEndpoint)` 不成立时整条路由**未匹配**,落 `:64` 的 `miss.fell = true` ⇒ 最终由主体的
|
|
10
|
+
* 路由兜底发 404 `not_found.route`。所以别写「catch CapabilityUnavailableError 当作面缺席」的分支 ——
|
|
11
|
+
* 它永远不触发;面缺席请用 `capabilities().leader` 预判。(SDK 全覆盖批 2026-07-17:原 TODO(M3+) 桩接线。)
|
|
9
12
|
*
|
|
10
13
|
* 🔴 facade 审计(2026-07-24,SDK 全量核查 GD 组):此前这五个字段里只有 `objective` 是类型必填,
|
|
11
14
|
* `durableRemote`/`testCmd`/`seedCmd`/`baseSha` 全靠 `[k:string]:unknown` 兜底——但服务端后台
|
|
12
15
|
* runLeader 实际无条件要求全部五个非空(`wire.ts:368`),同步 HTTP 门此前只查 `objective`,一个
|
|
13
16
|
* "看起来对"的最小请求会拿到 202 然后**必然**在后台异步失败,只能靠后续 GET 才发现。server 侧
|
|
14
|
-
* 同班车把这个校验前移到同步门(`
|
|
17
|
+
* 同班车把这个校验前移到同步门(真坐标 = `src/boot/leader.ts:104` 的 `requiredFields`;`main.ts:701`
|
|
18
|
+
* 只是调 `createLeaderFace`。4.3.0 坐标刷新);SDK 这边把类型收紧到诚实
|
|
15
19
|
* 反映真实约束,让编译期就能拦住这个坑,不用等真机复现才发现。
|
|
16
20
|
*
|
|
17
21
|
* 🔴 facade 审计(2026-07-24,批次②-8):此前 opts 还有一个 `idempotencyKey` —— 纯装饰,两端都是假
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leader.js","sourceRoot":"","sources":["../../src/resources/leader.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C
|
|
1
|
+
{"version":3,"file":"leader.js","sourceRoot":"","sources":["../../src/resources/leader.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;;;;;;;;;;;;;;;;;;;;;;uCAsBmC;IACnC,KAAK,CAAC,MAAM,CACV,GAA0H,EAC1H,IAA+B;QAE/B,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,IAA+B;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxH,CAAC;CACF"}
|
package/dist/resources/ops.d.ts
CHANGED
|
@@ -45,16 +45,43 @@ export declare class OutcomesResource {
|
|
|
45
45
|
outcomes: OutcomeRow[];
|
|
46
46
|
}>;
|
|
47
47
|
}
|
|
48
|
-
/** 一条 sendfile
|
|
48
|
+
/** 一条 sendfile 分发链接台账行。
|
|
49
|
+
*
|
|
50
|
+
* 🔴 这是一个**确定的封闭投影**,不是开集 sink 转发:server `routes/sessions-list.ts:95-105` 逐字铸 8 个
|
|
51
|
+
* **恒发**键 + 2 个条件键。此前这里只 typed 了 `id`、其余全落开集 —— 治理面板渲 `row.filename` / `row.size`
|
|
52
|
+
* 都要 `as string` / `as number`,typo 编译期不报。(对照:同文件的 {@link OutcomeRow} 只 typed 一键**是对的**
|
|
53
|
+
* —— 那一族的行形真由 sink 决定。两者曾被写成同一姿势,把「诚实开集」和「该 typed 却没 typed」混为一谈。)
|
|
54
|
+
*
|
|
55
|
+
* ⚠️ server 自注:**故意不返 `url`** —— 公开轨的 URL 可由 `bucket` + `key` 重建,预签名轨的早已过期。 */
|
|
49
56
|
export interface SendfileLinkRow {
|
|
57
|
+
/** uuidv7 链接 id —— 同时是 `before` 分页游标。 */
|
|
50
58
|
id: string;
|
|
59
|
+
filename: string;
|
|
60
|
+
size: number;
|
|
61
|
+
ttlSec: number;
|
|
62
|
+
/** 分发轨(公开 / 预签名等)。 */
|
|
63
|
+
track: string;
|
|
64
|
+
bucket: string;
|
|
65
|
+
/** 对象键(server 侧字段名是 `objectKey`,上 wire 时改名为 `key`)。 */
|
|
66
|
+
key: string;
|
|
67
|
+
/** ISO-8601(server 侧存的是 epoch,投影时 `toISOString()`)。 */
|
|
68
|
+
createdAt: string;
|
|
69
|
+
/** 条件键:发起该链接的 run。 */
|
|
70
|
+
taskId?: string;
|
|
71
|
+
/** 条件键:发起该链接的会话。 */
|
|
72
|
+
sessionId?: string;
|
|
51
73
|
[k: string]: unknown;
|
|
52
74
|
}
|
|
53
75
|
export declare class SendfileLinksResource {
|
|
54
76
|
private readonly t;
|
|
55
77
|
constructor(t: Transport);
|
|
56
78
|
/** GET /v1/sendfile-links — 台账分页。`limit` 1..100(缺省 50);`before` = 上页 `nextBefore`/行 `id`
|
|
57
|
-
* (uuidv7,坏形 400 fail-loud——F6 修后绝不静默降级)
|
|
79
|
+
* (uuidv7,坏形 400 fail-loud——F6 修后绝不静默降级)。
|
|
80
|
+
*
|
|
81
|
+
* `scope` **仅 fleet 凭证生效**:principal 调用方被钉死在本人 scope,送了 `?scope=` 也被忽略
|
|
82
|
+
* (server `routes/sessions-list.ts:75-77`);fleet-wide 调用方缺省落单用户哨兵 `"_"`。
|
|
83
|
+
* 🔴 fleet-wide 调用方给了坏 `scope` 有**两条 400 `request.query_invalid`**(`:83-86`,此前 JSDoc 一条都没写):
|
|
84
|
+
* **空串**(trim 后为空)与**超过 190 字符**(`sendfile_link.scope` 的列宽)。 */
|
|
58
85
|
list(opts?: {
|
|
59
86
|
limit?: number;
|
|
60
87
|
before?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/resources/ops.ts"],"names":[],"mappings":"AAAA;;;;;;;yEAOyE;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC,kFAAkF;IAC5E,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlE,8EAA8E;IACxE,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAIhG,kFAAkF;IAC5E,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAG/F;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC,6EAA6E;IACvE,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;CAO/H;AAED
|
|
1
|
+
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/resources/ops.ts"],"names":[],"mappings":"AAAA;;;;;;;yEAOyE;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC,kFAAkF;IAC5E,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlE,8EAA8E;IACxE,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAIhG,kFAAkF;IAC5E,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAG/F;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC,6EAA6E;IACvE,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;CAO/H;AAED;;;;;;;gFAOgF;AAChF,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;;;;;qEAMiE;IAC3D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAQ/K"}
|
package/dist/resources/ops.js
CHANGED
|
@@ -43,7 +43,12 @@ export class SendfileLinksResource {
|
|
|
43
43
|
this.t = t;
|
|
44
44
|
}
|
|
45
45
|
/** GET /v1/sendfile-links — 台账分页。`limit` 1..100(缺省 50);`before` = 上页 `nextBefore`/行 `id`
|
|
46
|
-
* (uuidv7,坏形 400 fail-loud——F6 修后绝不静默降级)
|
|
46
|
+
* (uuidv7,坏形 400 fail-loud——F6 修后绝不静默降级)。
|
|
47
|
+
*
|
|
48
|
+
* `scope` **仅 fleet 凭证生效**:principal 调用方被钉死在本人 scope,送了 `?scope=` 也被忽略
|
|
49
|
+
* (server `routes/sessions-list.ts:75-77`);fleet-wide 调用方缺省落单用户哨兵 `"_"`。
|
|
50
|
+
* 🔴 fleet-wide 调用方给了坏 `scope` 有**两条 400 `request.query_invalid`**(`:83-86`,此前 JSDoc 一条都没写):
|
|
51
|
+
* **空串**(trim 后为空)与**超过 190 字符**(`sendfile_link.scope` 的列宽)。 */
|
|
47
52
|
async list(opts) {
|
|
48
53
|
const q = new URLSearchParams();
|
|
49
54
|
if (opts?.limit !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/resources/ops.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C,kFAAkF;IAClF,KAAK,CAAC,UAAU,CAAC,IAA+B;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9I,uDAAuD;QACvD,0EAA0E;QAC1E,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,OAAO,CAAC,IAA+B;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,SAAS,CAAC,IAA+B;QAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;CACF;AAQD,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,IAA6E;QACtF,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,SAAS;YAAE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,IAAI,EAAE,cAAc;YAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/resources/ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,17 @@
|
|
|
9
9
|
* PLAN (dry run): plan() classifies what a PUSH WOULD do, no write.
|
|
10
10
|
*
|
|
11
11
|
* Owner-gated exactly like fork/delete (§9): a PULL 404s a non-owner (no existence oracle); a PUSH is own-or-FRESH
|
|
12
|
-
* (a session that does not exist yet, the caller is about to import it, is allowed). A
|
|
12
|
+
* (a session that does not exist yet, the caller is about to import it, is allowed). A
|
|
13
13
|
* PUSH/PLAN that would lose dst history (fork/stale) without `resolution:"overwrite-dst"` → a typed
|
|
14
|
-
* {@link import("../errors.js").SyncConflictError} (409).
|
|
14
|
+
* {@link import("../errors.js").SyncConflictError} (409).
|
|
15
|
+
*
|
|
16
|
+
* 🔴 ID 形状(2026-08-02 更正,server `routes/session-sync.ts:135-138` 亲读):这一族的 id 门是
|
|
17
|
+
* `isUuidShape` = **任意 uuid 版本**,NOT `isUuidV7`. server 的旁注逐字说明了为什么这是**故意**的:
|
|
18
|
+
* 「a v4-keyed legacy shell session must be pushable (it was creatable via the lenient submit face)」——
|
|
19
|
+
* crafted-id 类(LIKE 元字符、超长)仍被挡在门外。此前 SDK 与 spec 三处都写「400 on a non-uuidv7 id」,
|
|
20
|
+
* 会让持 uuidv4 legacy 会话的消费方在客户端先自判「本会话不支持 sync」而根本不发请求,把 server 明确
|
|
21
|
+
* 为迁移开的通道自己封死。对照组:`sessions.fork`/`delete`/`policy` 用的**确实是** `isUuidV7`(那三处
|
|
22
|
+
* 的同款说法是对的)—— 差别只出在 sync 这一族。 */
|
|
15
23
|
import type { Transport } from "../transport.js";
|
|
16
24
|
import type { SessionManifest, SyncEntry, SyncSnapshot, SessionRulesRecord, SyncAnchor, SyncRelation, ImportStaged, ImportCommitted } from "../types.js";
|
|
17
25
|
export declare class SessionSyncResource {
|
|
@@ -21,8 +29,9 @@ export declare class SessionSyncResource {
|
|
|
21
29
|
* policy + anchors + leaf), NO entry payloads and NO blob bytes (those stream / are content-addressed). The
|
|
22
30
|
* server wraps it as `{ manifest }`; this unwraps to the bare {@link SessionManifest}. Feed `manifest.entryIds`
|
|
23
31
|
* to `classifySyncRelationshipByIds` to decide fast-forward/fork BEFORE pulling the entry stream + only the
|
|
24
|
-
* blob hashes the local peer lacks. Owner-scoped (non-owner → 404, no oracle); 400 on
|
|
25
|
-
*
|
|
32
|
+
* blob hashes the local peer lacks. Owner-scoped (non-owner → 404, no oracle); 400 on an id that is not
|
|
33
|
+
* uuid-SHAPED (any uuid version passes — see the module header; a v4 legacy session is deliberately
|
|
34
|
+
* pushable); 501 without a durable session store. */
|
|
26
35
|
manifest(sessionId: string, opts?: {
|
|
27
36
|
signal?: AbortSignal;
|
|
28
37
|
}): Promise<{
|
|
@@ -51,16 +60,24 @@ export declare class SessionSyncResource {
|
|
|
51
60
|
/** PUSH one content-addressed blob INTO the cloud's snapshot store — `PUT …/sync/blobs/:hash` (the bare path; the
|
|
52
61
|
* PULL is scoped under `snapshots/:key`). RAW bytes body, octet-stream. The cloud verifies sha256(body)===:hash
|
|
53
62
|
* (the content-address integrity guard) — a mismatch → 400 `blob hash mismatch`; the SDK validates the hash
|
|
54
|
-
* shape locally first. own-or-FRESH gate.
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
63
|
+
* shape locally first. own-or-FRESH gate.
|
|
64
|
+
*
|
|
65
|
+
* 🔴 **两种 413,语义相反**(server `routes/session-sync.ts:250` vs `:253-263`,2026-08-02 亲读):
|
|
66
|
+
* - 通用超 cap(`readRawBody` 的 64 MiB per-blob 帽)—— 换小 blob / 分片是唯一出路;
|
|
67
|
+
* - `blob_too_large_for_sql`(SQL 店的行宽帽,body 带 `sizeBytes`/`limit`)—— 这块字节在**这个后端上
|
|
68
|
+
* 永远落不了地**,重试是纯浪费;运维要么换对象存储轨,要么这条 blob 不同步。
|
|
69
|
+
* 两者都是 413,只有机器码能区分 —— 别对 413 统一写「重试」。
|
|
70
|
+
*
|
|
71
|
+
* A backend write failure (e.g. a MinIO non-2xx) → 502 `blob store write failed`. `openRaw` does **NOT** retry;
|
|
72
|
+
* the caller re-PUTs (the blob is content-addressed ⇒ idempotent). 204 on success (no body).
|
|
73
|
+
* Call this for every blob hash the manifest references that the cloud lacks BEFORE import Phase A. */
|
|
58
74
|
putBlob(sessionId: string, hash: string, bytes: Uint8Array, opts?: {
|
|
59
75
|
signal?: AbortSignal;
|
|
60
76
|
}): Promise<void>;
|
|
61
77
|
/** PLAN (dry-run) — `POST …/sync/plan` body `{ entryIds }` (the LOCAL peer's entry-id list, oldest-first) →
|
|
62
78
|
* classify what a PUSH WOULD do against the cloud's current log, WITHOUT writing. Returns the §7 {@link SyncRelation}
|
|
63
|
-
* (`fresh` for a fresh cloud session). own-or-FRESH gate; 400 on a non-string-array body / a non-
|
|
79
|
+
* (`fresh` for a fresh cloud session). own-or-FRESH gate; 400 on a non-string-array body / a non-uuid-SHAPED id
|
|
80
|
+
* (any uuid version passes — see the module header).
|
|
64
81
|
* NB: unlike import, plan never 409s — it is a pure read-side classify (a fork/stale is REPORTED in the relation,
|
|
65
82
|
* not raised). Use it to surface the keep-local/keep-cloud divergence before committing to a PUSH. */
|
|
66
83
|
plan(sessionId: string, body: {
|
|
@@ -68,21 +85,50 @@ export declare class SessionSyncResource {
|
|
|
68
85
|
}, opts?: {
|
|
69
86
|
signal?: AbortSignal;
|
|
70
87
|
}): Promise<SyncRelation>;
|
|
71
|
-
/** PUSH Phase A — `POST …/sync/import` body `{ entryIds, snapshots, policy, anchors, resolution? }`
|
|
72
|
-
* metadata; entries stream in Phase B). The cloud classifies (§7), pre-checks blob presence (every
|
|
73
|
-
* hash must have been PUT — a missing one → 422 `missing_blob`), guards the import lease + any active
|
|
74
|
-
* then mints a stagingId. Returns {@link ImportStaged}:
|
|
75
|
-
* - `identical` → `{ relation:"identical" }` with NO `stagingId` (
|
|
88
|
+
/** PUSH Phase A — `POST …/sync/import` body `{ entryIds, snapshots, policy, anchors, resolution?, logDigest? }`
|
|
89
|
+
* (the SMALL metadata; entries stream in Phase B). The cloud classifies (§7), pre-checks blob presence (every
|
|
90
|
+
* referenced hash must have been PUT — a missing one → 422 `missing_blob`), guards the import lease + any active
|
|
91
|
+
* run (409), then mints a stagingId. Returns {@link ImportStaged}:
|
|
92
|
+
* - `identical` → `{ relation:"identical", basis, payloadVerified }` with NO `stagingId` (skip Phase B).
|
|
76
93
|
* - `fresh`/`fast_forward` → `{ stagingId, relation }` — drive Phase B with the `stagingId`.
|
|
77
94
|
* 🔴 a `fork`/`stale` WITHOUT `resolution:"overwrite-dst"` → a typed SyncConflictError (409, carrying the relation).
|
|
78
|
-
* An active run on the session → ConflictError (409, `session_active`, `activeTaskId`)
|
|
79
|
-
*
|
|
95
|
+
* An active run on the session → ConflictError (409, `session_active`, `activeTaskId`).
|
|
96
|
+
*
|
|
97
|
+
* ⚠️ `identical` is **not** a bare short-circuit: the cloud idempotently REPLAYS snapshots/policy/anchors on this
|
|
98
|
+
* arm (server `routes/session-sync.ts:367-384`) — that is the self-heal for "the conversation synced but the file
|
|
99
|
+
* tree did not" (a previous run's post-commit replay 422'd). So it can still answer 422 `missing_blob` /
|
|
100
|
+
* `restore_failed`; re-PUT the blob and retry. Do NOT read `identical` as "zero side effects".
|
|
101
|
+
*
|
|
102
|
+
* ⚠️ `import_in_flight` (409) is **not** a permanent state: the cloud carries `retryAfterSec` on the error body
|
|
103
|
+
* and TAKES OVER a stale lease itself (default 600 s without activity — server `:405-434`). Wait the advertised
|
|
104
|
+
* seconds and retry; never surface it to the user as "this session is locked".
|
|
105
|
+
*
|
|
106
|
+
* Not a submit (it mints a distinct staging token) → no SDK retry. */
|
|
80
107
|
import(sessionId: string, body: {
|
|
81
108
|
entryIds: string[];
|
|
82
109
|
snapshots: SyncSnapshot[];
|
|
83
110
|
policy: SessionRulesRecord[];
|
|
84
111
|
anchors: SyncAnchor[];
|
|
85
112
|
resolution?: "overwrite-dst";
|
|
113
|
+
/** 🔴 OPTIONAL content digest of the SOURCE's whole entry log — the ONE key that makes
|
|
114
|
+
* {@link ImportStaged.payloadVerified `payloadVerified:true`} reachable (方案 B,黑板 [1701]→[1707] 三端对齐;
|
|
115
|
+
* server `routes/session-sync.ts:295,310,357-366`).
|
|
116
|
+
*
|
|
117
|
+
* Why it matters: `identical` is classified from the **entry-id SETS** alone, and an entry id is a uuidv7 —
|
|
118
|
+
* NOT content-addressed. "Same ids, different payloads" is structurally possible, and without a digest the
|
|
119
|
+
* cloud answers `{relation:"identical", basis:"entry-ids", payloadVerified:false}` and Phase B is skipped —
|
|
120
|
+
* a genuinely diverged session reads as "already synced" while the destination keeps its own content.
|
|
121
|
+
* Supply this and the cloud recomputes the digest over ITS log: equal ⇒ `basis:"entry-ids+digest"` +
|
|
122
|
+
* `payloadVerified:true` (a real short-circuit); different or not comparable ⇒ it does **not** short-circuit
|
|
123
|
+
* and opens staging for a full sync (the safe direction).
|
|
124
|
+
*
|
|
125
|
+
* 🔴 The SDK does NOT compute this — it has **zero runtime dependencies** by constitution, and the digest
|
|
126
|
+
* algorithm belongs to core (`sessionLogDigest`, scheme `sema-log-v3`; core ≥ 1.416.0 is the server's own
|
|
127
|
+
* floor for this leg). Callers that already hold core pass its value through; callers that don't simply omit
|
|
128
|
+
* the key and get byte-identical pre-4.3.0 behavior. A malformed value is NOT rejected — the cloud treats it
|
|
129
|
+
* as absent (a digest mismatch must never become an error / a 409 / a refusal to sync; it only means "do the
|
|
130
|
+
* work"). */
|
|
131
|
+
logDigest?: string;
|
|
86
132
|
}, opts?: {
|
|
87
133
|
signal?: AbortSignal;
|
|
88
134
|
}): Promise<ImportStaged>;
|
|
@@ -93,9 +139,23 @@ export declare class SessionSyncResource {
|
|
|
93
139
|
* (NOT JSON.stringify of an array — the cloud line-buffers). Re-POSTing the same stagingId is idempotent
|
|
94
140
|
* (appendBatch dedups; the commit re-runs). Typed errors: a per-entry/structural violation → 422 `invalid_entries`;
|
|
95
141
|
* a line too large → 413; a commit-time TOCTOU flip to fork/stale → a typed SyncConflictError (409); a refused
|
|
96
|
-
* policy loosen → 403 `loosen_forbidden`; a wrong/foreign stagingId → 404.
|
|
142
|
+
* policy loosen → 403 `loosen_forbidden`; a wrong/foreign stagingId → 404.
|
|
143
|
+
*
|
|
144
|
+
* ⚠️ Idempotency is HALF true: re-POSTing the same stagingId after a *transport* drop is fine (appendBatch dedups,
|
|
145
|
+
* the commit re-runs), but any PrecheckError / SessionError path server-side `abort()`s and cleans up the staging
|
|
146
|
+
* (server `:561,:565,:573-574`) ⇒ after a typed 4xx the SAME stagingId is DEAD — reopen Phase A.
|
|
147
|
+
*
|
|
148
|
+
* 🔴 **Memory** (`stream`, 4.3.0): by DEFAULT the SDK serializes the whole iterator into one NDJSON string before
|
|
149
|
+
* sending — peak memory is O(entire log). Until 4.3.0 three JSDocs here and in `sync.ts` claimed the opposite
|
|
150
|
+
* ("pipe a PULL stream straight into a PUSH without materializing the whole log"); that was false, and it is what
|
|
151
|
+
* {@link PushSessionOptions} sized its own trade-off note against. Pass `stream: true` to send a real
|
|
152
|
+
* `ReadableStream` request body (constant memory, one entry at a time — the server side has always been truly
|
|
153
|
+
* streaming: it reads chunk-wise with an 8 MiB per-line cap and a 500-entry append batch). It is OPT-IN because a
|
|
154
|
+
* streaming request body needs `duplex: "half"` support: Node ≥18 undici and Deno have it, but a polyfilled /
|
|
155
|
+
* proxied `fetch` may not, and silently switching the default would break those callers. */
|
|
97
156
|
importEntries(sessionId: string, stagingId: string, entries: Iterable<SyncEntry> | AsyncIterable<SyncEntry>, opts?: {
|
|
98
157
|
signal?: AbortSignal;
|
|
158
|
+
stream?: boolean;
|
|
99
159
|
}): Promise<ImportCommitted>;
|
|
100
160
|
}
|
|
101
161
|
//# sourceMappingURL=session-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sync.d.ts","sourceRoot":"","sources":["../../src/resources/session-sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-sync.d.ts","sourceRoot":"","sources":["../../src/resources/session-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;kCAqBkC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC;AAMrB,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;;;;;0DAMsD;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,eAAe,CAAA;KAAE,CAAC;IAS1G;;;;;;mGAM+F;IACxF,OAAO,CACZ,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAC9B,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,cAAc,CAAC,SAAS,CAAC;IAQ5B;;;;+GAI2G;IACrG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,UAAU,CAAC;IAYtB;;;;;;;;;;;;;4GAawG;IAClG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;2GAKuG;IACjG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,EAC5B,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,YAAY,CAAC;IASxB;;;;;;;;;;;;;;;;;;2EAkBuE;IACjE,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,EAAE,YAAY,EAAE,CAAC;QAC1B,MAAM,EAAE,kBAAkB,EAAE,CAAC;QAC7B,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,UAAU,CAAC,EAAE,eAAe,CAAC;QAC7B;;;;;;;;;;;;;;;;;sBAiBc;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,EACD,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,YAAY,CAAC;IASxB;;;;;;;;;;;;;;;;;;;;iGAoB6F;IACvF,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,EACvD,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAChD,OAAO,CAAC,eAAe,CAAC;CAY5B"}
|