@sema-agent/sdk 4.1.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 +34 -1
- package/dist/client.d.ts +10 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +7 -2
- package/dist/client.js.map +1 -1
- 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/errors.d.ts +42 -5
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +81 -7
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +63 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.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/idempotency.d.ts +11 -1
- package/dist/idempotency.d.ts.map +1 -1
- package/dist/idempotency.js +11 -1
- package/dist/idempotency.js.map +1 -1
- package/dist/index.d.ts +18 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- 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/approvals.d.ts +43 -13
- package/dist/resources/approvals.d.ts.map +1 -1
- package/dist/resources/approvals.js +35 -12
- package/dist/resources/approvals.js.map +1 -1
- package/dist/resources/assistant.d.ts +21 -4
- package/dist/resources/assistant.d.ts.map +1 -1
- package/dist/resources/assistant.js +10 -3
- package/dist/resources/assistant.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 +11 -5
- package/dist/resources/fleet.d.ts.map +1 -1
- package/dist/resources/fleet.js +2 -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/runs.d.ts +89 -18
- package/dist/resources/runs.d.ts.map +1 -1
- package/dist/resources/runs.js +53 -17
- package/dist/resources/runs.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 +82 -13
- package/dist/resources/sessions.d.ts.map +1 -1
- package/dist/resources/sessions.js +39 -7
- package/dist/resources/sessions.js.map +1 -1
- package/dist/resources/tool-approvals.d.ts +8 -5
- package/dist/resources/tool-approvals.d.ts.map +1 -1
- package/dist/resources/tool-approvals.js +2 -1
- package/dist/resources/tool-approvals.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/sse.d.ts +58 -14
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +88 -15
- package/dist/sse.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 +31 -4
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +38 -6
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +156 -51
- package/dist/types.d.ts.map +1 -1
- package/openapi.yaml +377 -59
- package/package.json +2 -2
- package/registry-openapi.yaml +34 -3
package/dist/sync.d.ts
CHANGED
|
@@ -11,8 +11,14 @@
|
|
|
11
11
|
* entry id 是 uuidv7、**不是内容寻址**,而 wire 本身就收调用方给的 entries ⇒「同 id、异载荷」结构上完全可能。
|
|
12
12
|
* 于是集合比较会把它判成 `identical`,entries **整段跳过**,调用方拿到"已同步"而目的端仍是自己那份内容。
|
|
13
13
|
* 集合比较能精确回答的是「**id 集合**是否分叉」,**不能**回答「内容是否相同」—— 这两件事在这个契约里被
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* 长期混为一谈。
|
|
15
|
+
*
|
|
16
|
+
* ✅ **真修已接线(4.3.0)**:方案 B 的 `logDigest`(黑板 [1701]/[1702] 三端对齐)此前只在 server 落地,SDK 这一端
|
|
17
|
+
* 从未送过这个键 ⇒ `payloadVerified:true` 在本 SDK 上**结构性不可达**,而三处 JSDoc 把「SDK 的遗漏」写成了
|
|
18
|
+
* 「server 的现状」(「现值恒 `entry-ids`」/「现值恒 `false`」)。现在 {@link PushSessionOptions.logDigest} 会
|
|
19
|
+
* 透传到 Phase A,且**给了摘要就不再在本地短路 identical** —— 因为本地 dry-run 只比 id 集合,短路会把服务端
|
|
20
|
+
* 唯一能做内容判定的那一步跳掉。给了摘要 ⇒ 由 server 判:相等 ⇒ `basis:"entry-ids+digest"` + `payloadVerified:true`;
|
|
21
|
+
* 不等/不可比 ⇒ 开 staging 走完整同步(安全方向)。不给 ⇒ 与 4.2.0 逐字节同行为。
|
|
16
22
|
*
|
|
17
23
|
* No I/O, no dependencies — a byte-faithful copy so the local peer and the cloud agree on the relation without a
|
|
18
24
|
* round-trip. `srcIds`/`dstIds` are OLDEST-FIRST so the fork `commonAncestor` (the deepest shared id) and the
|
|
@@ -33,6 +39,19 @@ export interface PushSessionOptions {
|
|
|
33
39
|
/** Echoed into import Phase A. REQUIRED to apply a `fork`/`stale` push (dst history would be lost);
|
|
34
40
|
* never defaulted — the caller must have shown the divergence to a human first. */
|
|
35
41
|
resolution?: "overwrite-dst";
|
|
42
|
+
/** 🔴 源端整条 entry 日志的**内容摘要**(core `sessionLogDigest`,scheme `sema-log-v3`;server 这条腿的
|
|
43
|
+
* core 下限是 ^1.416.0)。SDK 零运行时依赖、**不自己算** —— 手里已有 core 的调用方透传它,没有的省略。
|
|
44
|
+
*
|
|
45
|
+
* 给了它会改变两件事(缺省不给 = 与 4.2.0 逐字节同行为):
|
|
46
|
+
* ① **本地 dry-run 的 `identical` 短路被跳过** —— 本地 plan 只比 id 集合,短路会把服务端唯一能做内容
|
|
47
|
+
* 判定的那一步跳掉。给了摘要就一路走到 Phase A,让 server 拿它自己的日志算一次摘要来判。
|
|
48
|
+
* ② Phase A 回的 {@link PushSessionResult.payloadVerified} 才可能为 `true`(相等 ⇒ 真短路);
|
|
49
|
+
* 不等或不可比 ⇒ server 开 staging 走完整同步 —— 「同 id 异载荷」的分叉会话不再被判成已同步。 */
|
|
50
|
+
logDigest?: string;
|
|
51
|
+
/** Phase B 用**真流式**请求体(`ReadableStream`,常量内存)而不是先在内存里拼完整条 NDJSON。
|
|
52
|
+
* opt-in:流式请求体要求运行时 `fetch` 支持 `duplex:"half"`(Node ≥18 undici / Deno 有;polyfill 未必)。
|
|
53
|
+
* 详见 {@link import("./resources/session-sync.js").SessionSyncResource.importEntries}。 */
|
|
54
|
+
stream?: boolean;
|
|
36
55
|
signal?: AbortSignal;
|
|
37
56
|
}
|
|
38
57
|
export interface PushSessionResult {
|
|
@@ -42,11 +61,14 @@ export interface PushSessionResult {
|
|
|
42
61
|
* ⚠️ 后一种情况下**不能**推断"dst 已逐字持有" —— 这个类型此前的注释就是这么写的,而它不成立
|
|
43
62
|
* (见文件顶注的纠正)。要判"内容真的同步了",看 {@link payloadVerified}。 */
|
|
44
63
|
pushed: boolean;
|
|
45
|
-
/** 🔴 分类**判据**(server ≥1.277 / 本地 dry-run 同值)
|
|
64
|
+
/** 🔴 分类**判据**(server ≥1.277 / 本地 dry-run 同值)。两个真值:
|
|
65
|
+
* - `"entry-ids"` —— 只比了 entry id 集合,**内容未校验**(没送 {@link PushSessionOptions.logDigest} 时的形);
|
|
66
|
+
* - `"entry-ids+digest"` —— 调用方送了可比摘要且相等,**内容真的验过**。
|
|
46
67
|
* 开集串,未知值按"未验证内容"降级。仅在 `identical` 这类**跳过写入**的路径上有值 —— 真走完 Phase B 时
|
|
47
68
|
* entries 是实际传输过去的,不存在"判据"问题,那时本字段缺席。 */
|
|
48
|
-
basis?: "entry-ids" | (string & {});
|
|
49
|
-
/** 🔴
|
|
69
|
+
basis?: "entry-ids" | "entry-ids+digest" | (string & {});
|
|
70
|
+
/** 🔴 是否**验证过载荷**。要它为 `true`,调用方必须送 {@link PushSessionOptions.logDigest}(4.3.0 起可送);
|
|
71
|
+
* 不送则恒 `false` —— 那是判据的如实回声,不是 bug。
|
|
50
72
|
* ⚠️ **缺席 ≠ 已验证**:老 server(<1.277)不带这个字段而判据同样只有 id 集合;真走完 Phase B 时也缺席
|
|
51
73
|
* (那时内容确实传过去了)。所以要表达"内容未被校验"请配合 `relation` 一起读:
|
|
52
74
|
* `relation === "identical" && payloadVerified !== true` 才是"跳过了写入且未校验内容"。 */
|
|
@@ -67,8 +89,13 @@ export interface PushSessionResult {
|
|
|
67
89
|
/**
|
|
68
90
|
* PUSH one session from peer `src` into peer `dst` (same-id, cross-backend):
|
|
69
91
|
* src manifest → dst dry-run plan (§7 classify) → [conflict? return, don't write] → blobs (content-addressed
|
|
70
|
-
* PUTs) → import Phase A (small metadata + lease/active-run guards) → Phase B (
|
|
71
|
-
*
|
|
92
|
+
* PUTs) → import Phase A (small metadata + lease/active-run guards) → Phase B (the src entry stream into the
|
|
93
|
+
* staged import).
|
|
94
|
+
*
|
|
95
|
+
* 🔴 Phase B memory (corrected 4.3.0): by default the NDJSON body is BUILT IN MEMORY first — peak = the whole log.
|
|
96
|
+
* This module used to claim the opposite ("never materializes the whole log in memory beyond the NDJSON body") and
|
|
97
|
+
* `pullSessionBundle`'s "unlike the push pipe" contrast was written against that false premise. Pass
|
|
98
|
+
* {@link PushSessionOptions.stream `stream:true`} for the constant-memory streaming body.
|
|
72
99
|
*
|
|
73
100
|
* Conflict contract (③): a `fork`/`stale` seen at plan time is RETURNED (`{pushed:false, conflict}`) so the
|
|
74
101
|
* caller can render the divergence; a TOCTOU flip after the plan (dst advanced mid-push) THROWS the typed
|
|
@@ -92,7 +119,9 @@ export interface PulledSession {
|
|
|
92
119
|
/**
|
|
93
120
|
* PULL one session OUT of peer `src` into memory (manifest + full entry log [+ blobs]) for callers that land
|
|
94
121
|
* the state outside an engine — e.g. the sema shell converting entries into its CC-format `<id>.jsonl`.
|
|
95
|
-
* 🔴 This MATERIALIZES the whole entry log
|
|
122
|
+
* 🔴 This MATERIALIZES the whole entry log — the caller owns the memory trade-off. (Until 4.3.0 this line read
|
|
123
|
+
* "unlike the push pipe"; that contrast was FALSE — the push path also built the whole NDJSON body in memory.
|
|
124
|
+
* It now holds only against `pushSessionBundle(..., {stream:true})`.)
|
|
96
125
|
* A truncated entry stream throws SyncTruncatedError (the NDJSON trailer guard) — never a silently short log.
|
|
97
126
|
*/
|
|
98
127
|
export declare function pullSessionBundle(src: SessionSyncPeer, sessionId: string, opts?: PullSessionOptions): Promise<PulledSession>;
|
package/dist/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,oBAAoB,EAEpB,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;2GAC2G;AAC3G,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,YAAY,CAkCrG;AAoBD,gHAAgH;AAChH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE;QAAE,IAAI,EAAE,mBAAmB,CAAA;KAAE,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC;wFACoF;IACpF,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B;;;;;;;0EAOsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;8FAE0F;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,gHAAgH;IAChH,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACnC;;4DAEwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB;;;;8CAI0C;IAC1C,KAAK,CAAC,EAAE,WAAW,GAAG,kBAAkB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACzD;;;;kFAI8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;8GAC0G;IAC1G,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,WAAW,EAAE,MAAM,CAAC;IACpB,mGAAmG;IACnG,QAAQ,EAAE,eAAe,CAAC;IAC1B;sFACkF;IAClF,IAAI,EAAE,YAAY,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CA0E5B;AAED,MAAM,WAAW,kBAAkB;IACjC;6GACyG;IACzG,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,wEAAwE;IACxE,MAAM,EAAE,aAAa,CAAC;IACtB,6EAA6E;IAC7E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,aAAa,CAAC,CAyBxB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,EAC5D,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CA8D5B"}
|
package/dist/sync.js
CHANGED
|
@@ -36,8 +36,13 @@ export function classifySyncRelationshipByIds(srcIds, dstIds) {
|
|
|
36
36
|
/**
|
|
37
37
|
* PUSH one session from peer `src` into peer `dst` (same-id, cross-backend):
|
|
38
38
|
* src manifest → dst dry-run plan (§7 classify) → [conflict? return, don't write] → blobs (content-addressed
|
|
39
|
-
* PUTs) → import Phase A (small metadata + lease/active-run guards) → Phase B (
|
|
40
|
-
*
|
|
39
|
+
* PUTs) → import Phase A (small metadata + lease/active-run guards) → Phase B (the src entry stream into the
|
|
40
|
+
* staged import).
|
|
41
|
+
*
|
|
42
|
+
* 🔴 Phase B memory (corrected 4.3.0): by default the NDJSON body is BUILT IN MEMORY first — peak = the whole log.
|
|
43
|
+
* This module used to claim the opposite ("never materializes the whole log in memory beyond the NDJSON body") and
|
|
44
|
+
* `pullSessionBundle`'s "unlike the push pipe" contrast was written against that false premise. Pass
|
|
45
|
+
* {@link PushSessionOptions.stream `stream:true`} for the constant-memory streaming body.
|
|
41
46
|
*
|
|
42
47
|
* Conflict contract (③): a `fork`/`stale` seen at plan time is RETURNED (`{pushed:false, conflict}`) so the
|
|
43
48
|
* caller can render the divergence; a TOCTOU flip after the plan (dst advanced mid-push) THROWS the typed
|
|
@@ -50,7 +55,9 @@ export async function pushSessionBundle(src, dst, sessionId, opts) {
|
|
|
50
55
|
// Dry-run classify BEFORE any write (and before any blob upload — don't spend bandwidth on a push the
|
|
51
56
|
// conflict gate will refuse).
|
|
52
57
|
const rel = await dst.sessions.sync.plan(sessionId, { entryIds: manifest.entryIds }, sopts);
|
|
53
|
-
|
|
58
|
+
// 🔴 只在**没有内容摘要**时本地短路 identical:本地 dry-run 只比 id 集合,短路会把服务端唯一能做内容判定的
|
|
59
|
+
// 那一步(Phase A 拿 logDigest 与目的端日志摘要对比)整个跳掉 —— 「同 id 异载荷」就永远被判成已同步。
|
|
60
|
+
if (rel.relation === "identical" && opts?.logDigest === undefined) {
|
|
54
61
|
// 本地 dry-run 判 identical ⇒ 同样只比了 id 集合,如实标注(否则调用方在这条路上连字段都看不到)
|
|
55
62
|
return { relation: "identical", pushed: true, entryCount: 0, blobsPushed: 0, manifest, plan: rel, basis: "entry-ids", payloadVerified: false };
|
|
56
63
|
}
|
|
@@ -88,6 +95,7 @@ export async function pushSessionBundle(src, dst, sessionId, opts) {
|
|
|
88
95
|
policy: manifest.policy,
|
|
89
96
|
anchors: manifest.anchors,
|
|
90
97
|
...(opts?.resolution ? { resolution: opts.resolution } : {}),
|
|
98
|
+
...(opts?.logDigest !== undefined ? { logDigest: opts.logDigest } : {}),
|
|
91
99
|
}, sopts);
|
|
92
100
|
if (!staged.stagingId) {
|
|
93
101
|
// Phase A itself classified `identical` (raced to equality) — dst already holds the log.
|
|
@@ -99,14 +107,17 @@ export async function pushSessionBundle(src, dst, sessionId, opts) {
|
|
|
99
107
|
...(staged.payloadVerified !== undefined ? { payloadVerified: staged.payloadVerified } : {}),
|
|
100
108
|
};
|
|
101
109
|
}
|
|
102
|
-
// Phase B —
|
|
103
|
-
|
|
110
|
+
// Phase B — the src entry stream into the staged import (async-iterable in, NDJSON out; `stream:true` makes it
|
|
111
|
+
// a real constant-memory pipe, see PushSessionOptions.stream).
|
|
112
|
+
const committed = await dst.sessions.sync.importEntries(sessionId, staged.stagingId, src.sessions.sync.entries(sessionId, undefined, sopts), { ...sopts, ...(opts?.stream === true ? { stream: true } : {}) });
|
|
104
113
|
return { relation: committed.relation, pushed: true, entryCount: manifest.entryCount, blobsPushed, manifest, plan: rel };
|
|
105
114
|
}
|
|
106
115
|
/**
|
|
107
116
|
* PULL one session OUT of peer `src` into memory (manifest + full entry log [+ blobs]) for callers that land
|
|
108
117
|
* the state outside an engine — e.g. the sema shell converting entries into its CC-format `<id>.jsonl`.
|
|
109
|
-
* 🔴 This MATERIALIZES the whole entry log
|
|
118
|
+
* 🔴 This MATERIALIZES the whole entry log — the caller owns the memory trade-off. (Until 4.3.0 this line read
|
|
119
|
+
* "unlike the push pipe"; that contrast was FALSE — the push path also built the whole NDJSON body in memory.
|
|
120
|
+
* It now holds only against `pushSessionBundle(..., {stream:true})`.)
|
|
110
121
|
* A truncated entry stream throws SyncTruncatedError (the NDJSON trailer guard) — never a silently short log.
|
|
111
122
|
*/
|
|
112
123
|
export async function pullSessionBundle(src, sessionId, opts) {
|
|
@@ -150,7 +161,8 @@ export async function importSessionBundle(dst, pulled, opts) {
|
|
|
150
161
|
const { manifest, bundle, blobs } = pulled;
|
|
151
162
|
const sessionId = bundle.sessionId;
|
|
152
163
|
const rel = await dst.sessions.sync.plan(sessionId, { entryIds: manifest.entryIds }, sopts);
|
|
153
|
-
|
|
164
|
+
// 与 pushSessionBundle 同判据:给了 logDigest 就不本地短路,交给 Phase A 做内容判定。
|
|
165
|
+
if (rel.relation === "identical" && opts?.logDigest === undefined) {
|
|
154
166
|
// 本地 dry-run 判 identical ⇒ 同样只比了 id 集合,如实标注(否则调用方在这条路上连字段都看不到)
|
|
155
167
|
return { relation: "identical", pushed: true, entryCount: 0, blobsPushed: 0, manifest, plan: rel, basis: "entry-ids", payloadVerified: false };
|
|
156
168
|
}
|
|
@@ -185,6 +197,7 @@ export async function importSessionBundle(dst, pulled, opts) {
|
|
|
185
197
|
policy: bundle.policy,
|
|
186
198
|
anchors: bundle.anchors,
|
|
187
199
|
...(opts?.resolution ? { resolution: opts.resolution } : {}),
|
|
200
|
+
...(opts?.logDigest !== undefined ? { logDigest: opts.logDigest } : {}),
|
|
188
201
|
}, sopts);
|
|
189
202
|
if (!staged.stagingId) {
|
|
190
203
|
// 透传服务端的判据 —— cli 黑板 [1704] 抓到的管道缺口:字段只加在 `ImportStaged` 上、这一层没穿透,
|
|
@@ -195,7 +208,10 @@ export async function importSessionBundle(dst, pulled, opts) {
|
|
|
195
208
|
...(staged.payloadVerified !== undefined ? { payloadVerified: staged.payloadVerified } : {}),
|
|
196
209
|
};
|
|
197
210
|
}
|
|
198
|
-
const committed = await dst.sessions.sync.importEntries(sessionId, staged.stagingId, bundle.entries,
|
|
211
|
+
const committed = await dst.sessions.sync.importEntries(sessionId, staged.stagingId, bundle.entries, {
|
|
212
|
+
...sopts,
|
|
213
|
+
...(opts?.stream === true ? { stream: true } : {}),
|
|
214
|
+
});
|
|
199
215
|
return { relation: committed.relation, pushed: true, entryCount: bundle.entries.length, blobsPushed, manifest, plan: rel };
|
|
200
216
|
}
|
|
201
217
|
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/transport.d.ts
CHANGED
|
@@ -18,8 +18,24 @@ export interface TransportOptions {
|
|
|
18
18
|
* The retry MATRIX is unchanged (RETRYABLE_STATUS) — only the typed surface differs, so the control plane's
|
|
19
19
|
* CAS 409 / validation 400 are surfaced (never retried), identical to how the worker treats its 409. */
|
|
20
20
|
mapError?: ErrorMapper;
|
|
21
|
+
/** [2400] CB-4 — the header name `buildHeaders` writes the principal into (lowercase). Default
|
|
22
|
+
* `x-agent-principal`. It is threaded here for ONE reason: the RESERVED-header guard below must reserve the
|
|
23
|
+
* name actually in use, otherwise renaming the header silently hands caller extras the power to forge the
|
|
24
|
+
* identity header. */
|
|
25
|
+
principalHeader?: string;
|
|
21
26
|
}
|
|
22
|
-
/** Statuses the SDK retries (with backoff). 409 is NOT here — it's a semantic conflict, surfaced typed.
|
|
27
|
+
/** Statuses the SDK retries (with backoff). 409 is NOT here — it's a semantic conflict, surfaced typed.
|
|
28
|
+
*
|
|
29
|
+
* 🔴 [2400] X-16 —— **request() 这一条腿的闭集重试矩阵**,六个码,没有第七个。
|
|
30
|
+
* - 语义:只重试「同一个请求再发一次是安全的、且服务端明确表示了这次不算数」的码。
|
|
31
|
+
* 408 请求超时 / 429 限流 / 500 / 502 / 503 / 504 —— 全是「重来可能成功」且**不会**产生第二份副作用的形。
|
|
32
|
+
* - **不在集内的一律不重试**,尤其是 409(冲突:CAS 基线错了,重发只会再错一次)、400 / 422(形错)、
|
|
33
|
+
* 401 / 403(凭证/权限)、404、413 —— 这些码重试是纯浪费,且会把一个确定性的失败拖成一串超时。
|
|
34
|
+
* - **只有 {@link Transport.request} 消费它**。{@link Transport.openStream} 与 {@link Transport.openRaw}
|
|
35
|
+
* 是 SINGLE-SHOT by construction:它们各自只发一次 fetch、把 Response 原样交出去,**从不查这张表**。
|
|
36
|
+
* 流的「重试」在语义上是「从 Last-Event-ID 重开」,只有调用方的游标知道从哪继续 —— 所以那件事归
|
|
37
|
+
* `parseSse` / `parseFrameStream` / `approvals.stream` 的循环,不归 transport。别把这张表读成全局策略。
|
|
38
|
+
* - 另有一层**正交**的门:非幂等的提交类动词即使拿到 503 也不重试(见 `request` 的 `submit` 判据)。 */
|
|
23
39
|
export declare const RETRYABLE_STATUS: Set<number>;
|
|
24
40
|
/**
|
|
25
41
|
* 🔴 **非 2xx `Response` → typed Error 的唯一拼装口**(S2 收编,SDK 1.1.0)。
|
|
@@ -48,12 +64,20 @@ export interface RequestOptions {
|
|
|
48
64
|
}
|
|
49
65
|
export declare class Transport {
|
|
50
66
|
private readonly o;
|
|
67
|
+
/** [2400] CB-4 — the effective reserved set for THIS transport: the constant set plus whatever name the
|
|
68
|
+
* principal header was configured to use (so renaming it never opens a forge-the-identity hole). */
|
|
69
|
+
private readonly reserved;
|
|
51
70
|
constructor(o: TransportOptions);
|
|
52
71
|
headers(idempotencyKey?: string | null): Record<string, string>;
|
|
53
72
|
/** JSON request with timeout + retry matrix + typed errors. */
|
|
54
73
|
request<T>(opts: RequestOptions): Promise<T>;
|
|
55
74
|
/** Raw streaming fetch (returns the Response for sse.ts to parse). NO per-attempt timeout (a stream lives
|
|
56
|
-
* long); heartbeat watchdog lives in sse.ts.
|
|
75
|
+
* long); heartbeat watchdog lives in sse.ts.
|
|
76
|
+
* 🔴 [2400] X-16 — SINGLE-SHOT by construction: this method issues **exactly one** `fetch` and returns whatever
|
|
77
|
+
* it gets. It does NOT consult {@link RETRYABLE_STATUS}, does not back off, and does not retry — a 503 here is
|
|
78
|
+
* handed straight back. Resume/retry on a stream is the CALLER's loop (`parseSse` / `parseFrameStream` /
|
|
79
|
+
* `approvals.stream`), because "retry" on a stream means "re-open from Last-Event-ID", which only the caller's
|
|
80
|
+
* cursor knows. Do not read the request-side retry matrix as applying here.
|
|
57
81
|
* `headers` = generic caller extras (e.g. a shell's `x-detach-on-disconnect` — the SDK carries NO detach
|
|
58
82
|
* semantics; the caller assembles them). 🔴 Merge order: caller extras first, BUILT-INS ALWAYS WIN —
|
|
59
83
|
* authorization / x-agent-principal / idempotency-key / content-type / accept / last-event-id can never be
|
|
@@ -72,8 +96,11 @@ export declare class Transport {
|
|
|
72
96
|
openRaw(opts: {
|
|
73
97
|
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
74
98
|
path: string;
|
|
75
|
-
/** RAW request body (bytes for a blob PUT, an NDJSON string for a Phase-B stream). NOT JSON-serialized.
|
|
76
|
-
|
|
99
|
+
/** RAW request body (bytes for a blob PUT, an NDJSON string for a Phase-B stream). NOT JSON-serialized.
|
|
100
|
+
* 🔴 A `ReadableStream<Uint8Array>` is a TRUE streaming body (constant memory — session-sync Phase B's
|
|
101
|
+
* `stream:true` leg). It requires `duplex: "half"`, which this method sets; Node ≥18 undici and Deno honor
|
|
102
|
+
* it, a polyfilled `fetch` may not — that is why every streaming leg in the SDK is opt-in, never the default. */
|
|
103
|
+
rawBody?: Uint8Array | string | ReadableStream<Uint8Array>;
|
|
77
104
|
accept?: string;
|
|
78
105
|
contentType?: string;
|
|
79
106
|
/** Generic caller extras — SAME reserved-guard + merge order as openStream (built-ins always win;
|
package/dist/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAeA;;sGAEsG;AACtG,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;AAE1F,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB;;;;;4GAKwG;IACxG,YAAY,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzE;;6GAEyG;IACzG,QAAQ,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAeA;;sGAEsG;AACtG,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;AAE1F,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB;;;;;4GAKwG;IACxG,YAAY,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzE;;6GAEyG;IACzG,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB;;;2BAGuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;wEAWwE;AACxE,eAAO,MAAM,gBAAgB,aAA0C,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAE,WAAwB,GAAG,OAAO,CAAC,KAAK,CAAC,CAGzG;AAgBD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,qBAAa,SAAS;IAKR,OAAO,CAAC,QAAQ,CAAC,CAAC;IAJ9B;yGACqG;IACrG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;gBAEV,CAAC,EAAE,gBAAgB;IAIhD,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI/D,+DAA+D;IACzD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IA8ClD;;;;;;;;;;;4GAWwG;IAClG,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAetH;;;;;gHAK4G;IACtG,OAAO,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpD,IAAI,EAAE,MAAM,CAAC;QACb;;;0HAGkH;QAClH,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;4FACoF;QACpF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;KAClC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwBrB;;;;2CAIuC;IACvC,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAIxC;8CAC0C;IAC1C,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK;IAKlD,8FAA8F;IAC9F,OAAO,CAAC,aAAa;CAatB"}
|
package/dist/transport.js
CHANGED
|
@@ -12,7 +12,18 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { toApiError } from "./errors.js";
|
|
14
14
|
import { resolveIdempotencyKey } from "./idempotency.js";
|
|
15
|
-
/** Statuses the SDK retries (with backoff). 409 is NOT here — it's a semantic conflict, surfaced typed.
|
|
15
|
+
/** Statuses the SDK retries (with backoff). 409 is NOT here — it's a semantic conflict, surfaced typed.
|
|
16
|
+
*
|
|
17
|
+
* 🔴 [2400] X-16 —— **request() 这一条腿的闭集重试矩阵**,六个码,没有第七个。
|
|
18
|
+
* - 语义:只重试「同一个请求再发一次是安全的、且服务端明确表示了这次不算数」的码。
|
|
19
|
+
* 408 请求超时 / 429 限流 / 500 / 502 / 503 / 504 —— 全是「重来可能成功」且**不会**产生第二份副作用的形。
|
|
20
|
+
* - **不在集内的一律不重试**,尤其是 409(冲突:CAS 基线错了,重发只会再错一次)、400 / 422(形错)、
|
|
21
|
+
* 401 / 403(凭证/权限)、404、413 —— 这些码重试是纯浪费,且会把一个确定性的失败拖成一串超时。
|
|
22
|
+
* - **只有 {@link Transport.request} 消费它**。{@link Transport.openStream} 与 {@link Transport.openRaw}
|
|
23
|
+
* 是 SINGLE-SHOT by construction:它们各自只发一次 fetch、把 Response 原样交出去,**从不查这张表**。
|
|
24
|
+
* 流的「重试」在语义上是「从 Last-Event-ID 重开」,只有调用方的游标知道从哪继续 —— 所以那件事归
|
|
25
|
+
* `parseSse` / `parseFrameStream` / `approvals.stream` 的循环,不归 transport。别把这张表读成全局策略。
|
|
26
|
+
* - 另有一层**正交**的门:非幂等的提交类动词即使拿到 503 也不重试(见 `request` 的 `submit` 判据)。 */
|
|
16
27
|
export const RETRYABLE_STATUS = new Set([408, 429, 500, 502, 503, 504]);
|
|
17
28
|
/**
|
|
18
29
|
* 🔴 **非 2xx `Response` → typed Error 的唯一拼装口**(S2 收编,SDK 1.1.0)。
|
|
@@ -33,16 +44,26 @@ export async function errorFromResponse(res, mapError = toApiError) {
|
|
|
33
44
|
const retryAfterMs = parseRetryAfter(res.headers.get("retry-after"));
|
|
34
45
|
return mapError(res.status, await safeJson(res), retryAfterMs);
|
|
35
46
|
}
|
|
36
|
-
/** Header keys a caller-supplied `headers` extra may NEVER set (openStream merge): auth +
|
|
37
|
-
* protocol headers are the transport's alone. Lowercase (extras are lowercased before the check).
|
|
47
|
+
/** Header keys a caller-supplied `headers` extra may NEVER set (openStream merge): auth + identity + idempotency
|
|
48
|
+
* + protocol headers are the transport's alone. Lowercase (extras are lowercased before the check).
|
|
49
|
+
*
|
|
50
|
+
* 🔴 CLOSED SET, by design ([2400] X-16 wording fix): a header not on this list is passed through verbatim.
|
|
51
|
+
* The set is exactly "what the transport itself asserts" — widening it would start silently dropping legitimate
|
|
52
|
+
* caller headers (a mesh tag, a tracing header), which is the opposite failure. The one MOVING member is the
|
|
53
|
+
* principal header: [2400] CB-4 made its NAME configurable, so the effective set is computed per Transport
|
|
54
|
+
* instance ({@link Transport.reserved}) rather than read off this constant. */
|
|
38
55
|
const RESERVED_HEADERS = new Set(["authorization", "x-agent-principal", "content-type", "idempotency-key", "accept", "last-event-id"]);
|
|
39
56
|
const BACKOFF_BASE_MS = 250;
|
|
40
57
|
const BACKOFF_CAP_MS = 10_000;
|
|
41
58
|
const RETRY_AFTER_CAP_MS = 60_000;
|
|
42
59
|
export class Transport {
|
|
43
60
|
o;
|
|
61
|
+
/** [2400] CB-4 — the effective reserved set for THIS transport: the constant set plus whatever name the
|
|
62
|
+
* principal header was configured to use (so renaming it never opens a forge-the-identity hole). */
|
|
63
|
+
reserved;
|
|
44
64
|
constructor(o) {
|
|
45
65
|
this.o = o;
|
|
66
|
+
this.reserved = o.principalHeader ? new Set([...RESERVED_HEADERS, o.principalHeader.toLowerCase()]) : RESERVED_HEADERS;
|
|
46
67
|
}
|
|
47
68
|
headers(idempotencyKey) {
|
|
48
69
|
return this.o.buildHeaders(idempotencyKey);
|
|
@@ -95,7 +116,12 @@ export class Transport {
|
|
|
95
116
|
throw lastErr; // exhausted retries
|
|
96
117
|
}
|
|
97
118
|
/** Raw streaming fetch (returns the Response for sse.ts to parse). NO per-attempt timeout (a stream lives
|
|
98
|
-
* long); heartbeat watchdog lives in sse.ts.
|
|
119
|
+
* long); heartbeat watchdog lives in sse.ts.
|
|
120
|
+
* 🔴 [2400] X-16 — SINGLE-SHOT by construction: this method issues **exactly one** `fetch` and returns whatever
|
|
121
|
+
* it gets. It does NOT consult {@link RETRYABLE_STATUS}, does not back off, and does not retry — a 503 here is
|
|
122
|
+
* handed straight back. Resume/retry on a stream is the CALLER's loop (`parseSse` / `parseFrameStream` /
|
|
123
|
+
* `approvals.stream`), because "retry" on a stream means "re-open from Last-Event-ID", which only the caller's
|
|
124
|
+
* cursor knows. Do not read the request-side retry matrix as applying here.
|
|
99
125
|
* `headers` = generic caller extras (e.g. a shell's `x-detach-on-disconnect` — the SDK carries NO detach
|
|
100
126
|
* semantics; the caller assembles them). 🔴 Merge order: caller extras first, BUILT-INS ALWAYS WIN —
|
|
101
127
|
* authorization / x-agent-principal / idempotency-key / content-type / accept / last-event-id can never be
|
|
@@ -105,7 +131,7 @@ export class Transport {
|
|
|
105
131
|
const extras = {};
|
|
106
132
|
for (const [k, v] of Object.entries(opts.headers ?? {})) {
|
|
107
133
|
const key = k.toLowerCase();
|
|
108
|
-
if (!
|
|
134
|
+
if (!this.reserved.has(key))
|
|
109
135
|
extras[key] = v;
|
|
110
136
|
}
|
|
111
137
|
const h = { ...extras, ...this.headers(opts.submit ? resolveIdempotencyKey(opts.idempotencyKey) : null) };
|
|
@@ -129,7 +155,7 @@ export class Transport {
|
|
|
129
155
|
const extras = {};
|
|
130
156
|
for (const [k, v] of Object.entries(opts.headers ?? {})) {
|
|
131
157
|
const key = k.toLowerCase();
|
|
132
|
-
if (!
|
|
158
|
+
if (!this.reserved.has(key))
|
|
133
159
|
extras[key] = v;
|
|
134
160
|
}
|
|
135
161
|
const h = { ...extras, ...this.headers(null) };
|
|
@@ -139,11 +165,17 @@ export class Transport {
|
|
|
139
165
|
h["content-type"] = opts.contentType;
|
|
140
166
|
else
|
|
141
167
|
delete h["content-type"]; // a GET / a no-body request should not assert a JSON content-type
|
|
168
|
+
// `duplex` is not in the DOM `RequestInit` lib type yet — declared here as a typed widening (NOT an assertion),
|
|
169
|
+
// so the streaming-body leg stays inside the type checker.
|
|
142
170
|
const init = { method: opts.method, headers: h };
|
|
143
171
|
if (opts.rawBody !== undefined) {
|
|
144
172
|
init.body = opts.rawBody; // Uint8Array is a valid fetch body at runtime (the DOM BodyInit lib type omits it)
|
|
145
173
|
if (!opts.contentType)
|
|
146
174
|
h["content-type"] = "application/octet-stream";
|
|
175
|
+
// A ReadableStream request body is only legal with `duplex: "half"` — undici throws
|
|
176
|
+
// "RequestInit: duplex option is required when sending a body" otherwise.
|
|
177
|
+
if (typeof ReadableStream !== "undefined" && opts.rawBody instanceof ReadableStream)
|
|
178
|
+
init.duplex = "half";
|
|
147
179
|
}
|
|
148
180
|
if (opts.signal)
|
|
149
181
|
init.signal = opts.signal;
|
package/dist/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|