@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
|
@@ -12,8 +12,9 @@ export class SessionSyncResource {
|
|
|
12
12
|
* policy + anchors + leaf), NO entry payloads and NO blob bytes (those stream / are content-addressed). The
|
|
13
13
|
* server wraps it as `{ manifest }`; this unwraps to the bare {@link SessionManifest}. Feed `manifest.entryIds`
|
|
14
14
|
* to `classifySyncRelationshipByIds` to decide fast-forward/fork BEFORE pulling the entry stream + only the
|
|
15
|
-
* blob hashes the local peer lacks. Owner-scoped (non-owner → 404, no oracle); 400 on
|
|
16
|
-
*
|
|
15
|
+
* blob hashes the local peer lacks. Owner-scoped (non-owner → 404, no oracle); 400 on an id that is not
|
|
16
|
+
* uuid-SHAPED (any uuid version passes — see the module header; a v4 legacy session is deliberately
|
|
17
|
+
* pushable); 501 without a durable session store. */
|
|
17
18
|
async manifest(sessionId, opts) {
|
|
18
19
|
// 🔴 BREAKING(clay 拍 2026-07-28,信封归一):wire 原样 `{manifest}`,不再拆封。迁移:`(...).manifest`。
|
|
19
20
|
return this.t.request({
|
|
@@ -59,10 +60,17 @@ export class SessionSyncResource {
|
|
|
59
60
|
/** PUSH one content-addressed blob INTO the cloud's snapshot store — `PUT …/sync/blobs/:hash` (the bare path; the
|
|
60
61
|
* PULL is scoped under `snapshots/:key`). RAW bytes body, octet-stream. The cloud verifies sha256(body)===:hash
|
|
61
62
|
* (the content-address integrity guard) — a mismatch → 400 `blob hash mismatch`; the SDK validates the hash
|
|
62
|
-
* shape locally first. own-or-FRESH gate.
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
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. */
|
|
66
74
|
async putBlob(sessionId, hash, bytes, opts) {
|
|
67
75
|
if (!SHA256_HEX_RE.test(hash))
|
|
68
76
|
throw toApiError(400, { error: "blob hash must be 64 lowercase-hex chars" });
|
|
@@ -79,7 +87,8 @@ export class SessionSyncResource {
|
|
|
79
87
|
}
|
|
80
88
|
/** PLAN (dry-run) — `POST …/sync/plan` body `{ entryIds }` (the LOCAL peer's entry-id list, oldest-first) →
|
|
81
89
|
* classify what a PUSH WOULD do against the cloud's current log, WITHOUT writing. Returns the §7 {@link SyncRelation}
|
|
82
|
-
* (`fresh` for a fresh cloud session). own-or-FRESH gate; 400 on a non-string-array body / a non-
|
|
90
|
+
* (`fresh` for a fresh cloud session). own-or-FRESH gate; 400 on a non-string-array body / a non-uuid-SHAPED id
|
|
91
|
+
* (any uuid version passes — see the module header).
|
|
83
92
|
* NB: unlike import, plan never 409s — it is a pure read-side classify (a fork/stale is REPORTED in the relation,
|
|
84
93
|
* not raised). Use it to surface the keep-local/keep-cloud divergence before committing to a PUSH. */
|
|
85
94
|
async plan(sessionId, body, opts) {
|
|
@@ -90,15 +99,25 @@ export class SessionSyncResource {
|
|
|
90
99
|
signal: opts?.signal,
|
|
91
100
|
});
|
|
92
101
|
}
|
|
93
|
-
/** PUSH Phase A — `POST …/sync/import` body `{ entryIds, snapshots, policy, anchors, resolution? }`
|
|
94
|
-
* metadata; entries stream in Phase B). The cloud classifies (§7), pre-checks blob presence (every
|
|
95
|
-
* hash must have been PUT — a missing one → 422 `missing_blob`), guards the import lease + any active
|
|
96
|
-
* then mints a stagingId. Returns {@link ImportStaged}:
|
|
97
|
-
* - `identical` → `{ relation:"identical" }` with NO `stagingId` (
|
|
102
|
+
/** PUSH Phase A — `POST …/sync/import` body `{ entryIds, snapshots, policy, anchors, resolution?, logDigest? }`
|
|
103
|
+
* (the SMALL metadata; entries stream in Phase B). The cloud classifies (§7), pre-checks blob presence (every
|
|
104
|
+
* referenced hash must have been PUT — a missing one → 422 `missing_blob`), guards the import lease + any active
|
|
105
|
+
* run (409), then mints a stagingId. Returns {@link ImportStaged}:
|
|
106
|
+
* - `identical` → `{ relation:"identical", basis, payloadVerified }` with NO `stagingId` (skip Phase B).
|
|
98
107
|
* - `fresh`/`fast_forward` → `{ stagingId, relation }` — drive Phase B with the `stagingId`.
|
|
99
108
|
* 🔴 a `fork`/`stale` WITHOUT `resolution:"overwrite-dst"` → a typed SyncConflictError (409, carrying the relation).
|
|
100
|
-
* An active run on the session → ConflictError (409, `session_active`, `activeTaskId`)
|
|
101
|
-
*
|
|
109
|
+
* An active run on the session → ConflictError (409, `session_active`, `activeTaskId`).
|
|
110
|
+
*
|
|
111
|
+
* ⚠️ `identical` is **not** a bare short-circuit: the cloud idempotently REPLAYS snapshots/policy/anchors on this
|
|
112
|
+
* arm (server `routes/session-sync.ts:367-384`) — that is the self-heal for "the conversation synced but the file
|
|
113
|
+
* tree did not" (a previous run's post-commit replay 422'd). So it can still answer 422 `missing_blob` /
|
|
114
|
+
* `restore_failed`; re-PUT the blob and retry. Do NOT read `identical` as "zero side effects".
|
|
115
|
+
*
|
|
116
|
+
* ⚠️ `import_in_flight` (409) is **not** a permanent state: the cloud carries `retryAfterSec` on the error body
|
|
117
|
+
* and TAKES OVER a stale lease itself (default 600 s without activity — server `:405-434`). Wait the advertised
|
|
118
|
+
* seconds and retry; never surface it to the user as "this session is locked".
|
|
119
|
+
*
|
|
120
|
+
* Not a submit (it mints a distinct staging token) → no SDK retry. */
|
|
102
121
|
async import(sessionId, body, opts) {
|
|
103
122
|
return this.t.request({
|
|
104
123
|
method: "POST",
|
|
@@ -114,13 +133,26 @@ export class SessionSyncResource {
|
|
|
114
133
|
* (NOT JSON.stringify of an array — the cloud line-buffers). Re-POSTing the same stagingId is idempotent
|
|
115
134
|
* (appendBatch dedups; the commit re-runs). Typed errors: a per-entry/structural violation → 422 `invalid_entries`;
|
|
116
135
|
* a line too large → 413; a commit-time TOCTOU flip to fork/stale → a typed SyncConflictError (409); a refused
|
|
117
|
-
* policy loosen → 403 `loosen_forbidden`; a wrong/foreign stagingId → 404.
|
|
136
|
+
* policy loosen → 403 `loosen_forbidden`; a wrong/foreign stagingId → 404.
|
|
137
|
+
*
|
|
138
|
+
* ⚠️ Idempotency is HALF true: re-POSTing the same stagingId after a *transport* drop is fine (appendBatch dedups,
|
|
139
|
+
* the commit re-runs), but any PrecheckError / SessionError path server-side `abort()`s and cleans up the staging
|
|
140
|
+
* (server `:561,:565,:573-574`) ⇒ after a typed 4xx the SAME stagingId is DEAD — reopen Phase A.
|
|
141
|
+
*
|
|
142
|
+
* 🔴 **Memory** (`stream`, 4.3.0): by DEFAULT the SDK serializes the whole iterator into one NDJSON string before
|
|
143
|
+
* sending — peak memory is O(entire log). Until 4.3.0 three JSDocs here and in `sync.ts` claimed the opposite
|
|
144
|
+
* ("pipe a PULL stream straight into a PUSH without materializing the whole log"); that was false, and it is what
|
|
145
|
+
* {@link PushSessionOptions} sized its own trade-off note against. Pass `stream: true` to send a real
|
|
146
|
+
* `ReadableStream` request body (constant memory, one entry at a time — the server side has always been truly
|
|
147
|
+
* streaming: it reads chunk-wise with an 8 MiB per-line cap and a 500-entry append batch). It is OPT-IN because a
|
|
148
|
+
* streaming request body needs `duplex: "half"` support: Node ≥18 undici and Deno have it, but a polyfilled /
|
|
149
|
+
* proxied `fetch` may not, and silently switching the default would break those callers. */
|
|
118
150
|
async importEntries(sessionId, stagingId, entries, opts) {
|
|
119
|
-
const
|
|
151
|
+
const rawBody = opts?.stream === true ? toNdjsonStream(entries) : await toNdjson(entries);
|
|
120
152
|
const res = await this.t.openRaw({
|
|
121
153
|
method: "POST",
|
|
122
154
|
path: `/v1/sessions/${encodeURIComponent(sessionId)}/sync/import/${encodeURIComponent(stagingId)}/entries`,
|
|
123
|
-
rawBody
|
|
155
|
+
rawBody,
|
|
124
156
|
contentType: "application/x-ndjson",
|
|
125
157
|
signal: opts?.signal,
|
|
126
158
|
});
|
|
@@ -129,13 +161,42 @@ export class SessionSyncResource {
|
|
|
129
161
|
return (await res.json());
|
|
130
162
|
}
|
|
131
163
|
}
|
|
132
|
-
/** Serialize entries to
|
|
133
|
-
*
|
|
134
|
-
*
|
|
164
|
+
/** Serialize entries to ONE NDJSON string (one JSON value per `\n`-terminated line) — the whole-block Phase-B body.
|
|
165
|
+
* 🔴 This MATERIALIZES the whole log in memory. It is kept as the default because it works on every `fetch`
|
|
166
|
+
* implementation; {@link toNdjsonStream} is the constant-memory form. */
|
|
135
167
|
async function toNdjson(entries) {
|
|
136
168
|
let body = "";
|
|
137
169
|
for await (const e of entries)
|
|
138
170
|
body += `${JSON.stringify(e)}\n`;
|
|
139
171
|
return body;
|
|
140
172
|
}
|
|
173
|
+
/** Serialize entries to a `ReadableStream<Uint8Array>` NDJSON body — one line enqueued per `pull()`, so a
|
|
174
|
+
* `PULL …/sync/entries` async iterator really can be piped straight into a PUSH at CONSTANT memory. Requires the
|
|
175
|
+
* runtime `fetch` to accept a stream body (`duplex: "half"`, set by {@link import("../transport.js").Transport.openRaw}).
|
|
176
|
+
* A throw from the source iterator `error()`s the stream, which aborts the request — the caller sees the source's
|
|
177
|
+
* error (e.g. `SyncTruncatedError`), never a silently short body. */
|
|
178
|
+
function toNdjsonStream(entries) {
|
|
179
|
+
const it = entries[Symbol.asyncIterator]
|
|
180
|
+
? entries[Symbol.asyncIterator]()
|
|
181
|
+
: entries[Symbol.iterator]();
|
|
182
|
+
const enc = new TextEncoder();
|
|
183
|
+
return new ReadableStream({
|
|
184
|
+
async pull(controller) {
|
|
185
|
+
try {
|
|
186
|
+
const next = await it.next();
|
|
187
|
+
if (next.done === true) {
|
|
188
|
+
controller.close();
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
controller.enqueue(enc.encode(`${JSON.stringify(next.value)}\n`));
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
controller.error(e);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
async cancel(reason) {
|
|
198
|
+
await it.return?.(reason);
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
141
202
|
//# sourceMappingURL=session-sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sync.js","sourceRoot":"","sources":["../../src/resources/session-sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-sync.js","sourceRoot":"","sources":["../../src/resources/session-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,13 +67,54 @@ export type SessionNotifyStatus = "completed" | "failed" | "killed" | "cancelled
|
|
|
67
67
|
* 且这份形状此前只手抄在上面的 JSDoc 里,和这里各自维护一份——两处漂移风险。类型即文档:字段语义见
|
|
68
68
|
* `SessionsResource.notify` 的 JSDoc,此处不重复第二份手抄。 */
|
|
69
69
|
export interface SessionNotifyBody {
|
|
70
|
+
/** ≤190 字符非空串(server `routes/notify-wake.ts:61-64` 的列宽门)。 */
|
|
70
71
|
task_id: string;
|
|
71
72
|
status: SessionNotifyStatus;
|
|
72
73
|
summary: string;
|
|
73
74
|
result?: string;
|
|
75
|
+
/** ⚠️ server 要的是**正整数**(`Number.isInteger(n) && n >= 1`,`notify-wake.ts:75`)——`0` / 负数 / 小数
|
|
76
|
+
* 一律 400 `request.field_invalid`。TS 侧表达不了这个下限,别当成任意 number。 */
|
|
74
77
|
seq?: number;
|
|
78
|
+
/** ≤190 字符(同 `task_id` 的列宽门)。 */
|
|
75
79
|
source?: string;
|
|
76
80
|
}
|
|
81
|
+
/** POST /v1/sessions/:id/notify 的**判别联合**响应(server `routes/notify-wake.ts:98` / `:116` 两个出口)。
|
|
82
|
+
*
|
|
83
|
+
* 🔴 承重语义:server 用**状态码 + `delivery` 双载**表达同一件事 —— 200 `live` = 会话有活流、通知**已送达**;
|
|
84
|
+
* 202 `parked` = 没有活流,通知**排队等下次开流**才 drain。SDK 只把 body 交出来(拿不到状态码),所以
|
|
85
|
+
* `delivery` 是消费方唯一的判据。此前返回型是裸 `Record<string, unknown>`,这层区别在 TS 侧整个丢失,
|
|
86
|
+
* UI 只能强转或者向用户谎报"已通知"。 */
|
|
87
|
+
export type SessionNotifyResult = {
|
|
88
|
+
sessionId: string;
|
|
89
|
+
delivery: "live";
|
|
90
|
+
[k: string]: unknown;
|
|
91
|
+
} | {
|
|
92
|
+
sessionId: string;
|
|
93
|
+
delivery: "parked";
|
|
94
|
+
note: string;
|
|
95
|
+
[k: string]: unknown;
|
|
96
|
+
}
|
|
97
|
+
/** 老 server(无 `delivery` 键)/ 将来的第三态 —— 开集兜底,`delivery` 缺席时按"不确定"处理。 */
|
|
98
|
+
| {
|
|
99
|
+
sessionId?: string;
|
|
100
|
+
delivery?: undefined;
|
|
101
|
+
[k: string]: unknown;
|
|
102
|
+
};
|
|
103
|
+
/** POST /v1/sessions/:id/wake 的 200 形(server 直接下发 `resumeWake` 腿的 body;spec `openapi.yaml` wake 段
|
|
104
|
+
* 声明 required `[sessionId, status]` + 可选 `taskId`/`errorCode`/`errorMessage`/`retriable`)。
|
|
105
|
+
* `errorCode` 在场 = core 侧拒了(`wake.gate_pending` / `wake.nothing_to_deliver` 等),按码分支、别锚文案。 */
|
|
106
|
+
export interface SessionWakeResult {
|
|
107
|
+
sessionId: string;
|
|
108
|
+
status: string;
|
|
109
|
+
/** 续跑真的起来了才有 —— 这是新 run 的 id。 */
|
|
110
|
+
taskId?: string;
|
|
111
|
+
/** core 的机器码(`wake.*` 族)。在场 ⇒ 没续跑成。 */
|
|
112
|
+
errorCode?: string;
|
|
113
|
+
errorMessage?: string;
|
|
114
|
+
/** `true` = 换个时机重试有意义(如门未决);`false`/缺席 = 别自动重试。 */
|
|
115
|
+
retriable?: boolean;
|
|
116
|
+
[k: string]: unknown;
|
|
117
|
+
}
|
|
77
118
|
export declare class SessionsResource {
|
|
78
119
|
private readonly t;
|
|
79
120
|
/** 2c session-sync (P1d) — `client.sessions.sync.*`: PULL a cloud session's whole state (manifest + NDJSON entry
|
|
@@ -112,8 +153,18 @@ export declare class SessionsResource {
|
|
|
112
153
|
*
|
|
113
154
|
* 轮询→订阅的换轨面:每帧=`{ sessionId, leafId }` 新水位,
|
|
114
155
|
* 拿到即拉 tail 增量(内容职责仍在 tail/turns 面)。`lastLeafId` 传上次水位=命中现值时无首帧
|
|
115
|
-
* (304 同义);断线自动重连并以最近水位续(重复帧被服务端抑制)。
|
|
116
|
-
* `capabilities.sessionEvents`
|
|
156
|
+
* (304 同义);断线自动重连并以最近水位续(重复帧被服务端抑制)。
|
|
157
|
+
* 探测位 `capabilities.sessionEvents`(与本路由 501 同谓词)—— 别 trial-by-501。
|
|
158
|
+
* 会话被删/换主时 server 主动断流,重连将 404 → 迭代器抛出。
|
|
159
|
+
*
|
|
160
|
+
* 🔴 **503 有四个不同的机器码,回退方式不同**(server 在 `routes/sessions.ts:234-236` 专门解释了为什么
|
|
161
|
+
* 必须带码:它与 drain 的 503 走同一条流,没有码消费端只能靠自由文本区分)。别对 503 统一回退:
|
|
162
|
+
* - `state.sse_connection_cap`(`:238`)—— 连接帽满。**自愈**:回落 `/head` 轮询,稍后重试订阅。
|
|
163
|
+
* - `state.sse_probe_cap`(`:352`)—— 探针帽。同上,自愈。
|
|
164
|
+
* - `state.sse_owner_lookup_cap`(`:263`)—— 存储并发许可耗尽。退避重试,别热循环。
|
|
165
|
+
* - `state.sse_owner_lookup_stalled`(`:284`)—— 存储**悬死**。这个不自愈:该报警/换副本,
|
|
166
|
+
* 把它当"帽满"去永远轮询就是把一个需要人介入的故障静默掉。
|
|
167
|
+
* `parseFrameStream` 对非 2xx 直接抛(不重连),所以 503 不会变成热循环——异常到手后按上表分支。 */
|
|
117
168
|
watch(sessionId: string, opts?: {
|
|
118
169
|
lastLeafId?: string | null;
|
|
119
170
|
signal?: AbortSignal;
|
|
@@ -136,22 +187,23 @@ export declare class SessionsResource {
|
|
|
136
187
|
}): Promise<SessionSettingsResponse>;
|
|
137
188
|
/** POST /v1/sessions/:id/notify — 会话外事件注入(daemon 终态回报等;src/http/routes/notify-wake.ts 实拆)。
|
|
138
189
|
* body: {@link SessionNotifyBody}(`task_id, status, summary, result?, seq?, source?`);
|
|
139
|
-
* 坏形 400 typed;owner 门 fail-closed(未知/他人 session=404 无 oracle;env-only 无 ownerOf=501
|
|
190
|
+
* 坏形 400 typed;owner 门 fail-closed(未知/他人 session=404 无 oracle;env-only 无 ownerOf=501;
|
|
191
|
+
* 无 inbox 无法 park=501 `capability.workflow_store_required`)。
|
|
192
|
+
* 返回 {@link SessionNotifyResult} —— **分支 `delivery`**:`"live"`(200,已送达)vs `"parked"`(202,
|
|
193
|
+
* 排队等下次开流)。别把两者都渲染成"已通知"。 */
|
|
140
194
|
notify(sessionId: string, body: SessionNotifyBody, opts?: {
|
|
141
195
|
signal?: AbortSignal;
|
|
142
|
-
}): Promise<
|
|
143
|
-
[k: string]: unknown;
|
|
144
|
-
}>;
|
|
196
|
+
}): Promise<SessionNotifyResult>;
|
|
145
197
|
/** POST /v1/sessions/:id/wake — 唤醒 task_done 纯 park 的会话续跑(design/144 §3,core 1.283 wake 臂;
|
|
146
198
|
* src/http/routes/notify-wake.ts 实拆)。非门决策:绝不 allow/deny 任何 pending 动作——有未决门=core `wake.gate_pending`
|
|
147
|
-
* 拒;空 park 且无 message=`wake.nothing_to_deliver` 拒。`message` 作续跑首轮输入(可省=送 pendingSteer)
|
|
199
|
+
* 拒;空 park 且无 message=`wake.nothing_to_deliver` 拒。`message` 作续跑首轮输入(可省=送 pendingSteer);
|
|
200
|
+
* ⚠️ 给了就必须是**非空**串(server `notify-wake.ts:139-142`,空串 400)。
|
|
201
|
+
* 返回 {@link SessionWakeResult} —— 200 也可能带 `errorCode`(core 拒了),按码分支、别只看 HTTP 码。 */
|
|
148
202
|
wake(sessionId: string, body?: {
|
|
149
203
|
message?: string;
|
|
150
204
|
}, opts?: {
|
|
151
205
|
signal?: AbortSignal;
|
|
152
|
-
}): Promise<
|
|
153
|
-
[k: string]: unknown;
|
|
154
|
-
}>;
|
|
206
|
+
}): Promise<SessionWakeResult>;
|
|
155
207
|
/** GET /v1/sessions/:id?message=<index> — the single-message expand leg (server ≥1.162,
|
|
156
208
|
* the companion of a `blobCap`-truncated windowed read): full body of ONE message by its
|
|
157
209
|
* stable index within the current floorEntryId generation. Out-of-range → 404 (typed
|
|
@@ -182,8 +234,16 @@ export declare class SessionsResource {
|
|
|
182
234
|
sessionId: string;
|
|
183
235
|
}>;
|
|
184
236
|
/** E21 — DELETE /v1/sessions/:id → `{ deleted }` (idempotent: `false` when nothing existed). Purges the
|
|
185
|
-
* session's conversation history + the service-owned run-ledger/checkpoint/tool-result rows.
|
|
186
|
-
*
|
|
237
|
+
* session's conversation history + the service-owned run-ledger/checkpoint/tool-result rows.
|
|
238
|
+
*
|
|
239
|
+
* 🔴 **A non-owner gets 200 `{deleted:false}`, NOT 404** (server `routes/sessions.ts:498`, with the reason
|
|
240
|
+
* written down at `:495-497`: a 404-vs-200 split would be an existence oracle, while `deleted:false` is both
|
|
241
|
+
* honest and idempotent-shaped). This is the OPPOSITE of `fork`, which really does 404 a non-owner — the two
|
|
242
|
+
* verbs have different postures and this JSDoc used to claim they were the same. So
|
|
243
|
+
* `try { await delete() } catch (NotFoundError) {…}` NEVER fires for someone else's session: the promise
|
|
244
|
+
* RESOLVES and the UI happily reports "deleted" having deleted nothing. Branch on `deleted` instead.
|
|
245
|
+
*
|
|
246
|
+
* 🔴 409 (typed ConflictError, body `activeTaskId`) while a run is LIVE on the session —
|
|
187
247
|
* cancel it first (don't orphan the session lock). 501 without a durable session store. Server-idempotent;
|
|
188
248
|
* not a submit → no SDK retry. */
|
|
189
249
|
delete(sessionId: string, opts?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/resources/sessions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/resources/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,8 +68,18 @@ export class SessionsResource {
|
|
|
68
68
|
*
|
|
69
69
|
* 轮询→订阅的换轨面:每帧=`{ sessionId, leafId }` 新水位,
|
|
70
70
|
* 拿到即拉 tail 增量(内容职责仍在 tail/turns 面)。`lastLeafId` 传上次水位=命中现值时无首帧
|
|
71
|
-
* (304 同义);断线自动重连并以最近水位续(重复帧被服务端抑制)。
|
|
72
|
-
* `capabilities.sessionEvents`
|
|
71
|
+
* (304 同义);断线自动重连并以最近水位续(重复帧被服务端抑制)。
|
|
72
|
+
* 探测位 `capabilities.sessionEvents`(与本路由 501 同谓词)—— 别 trial-by-501。
|
|
73
|
+
* 会话被删/换主时 server 主动断流,重连将 404 → 迭代器抛出。
|
|
74
|
+
*
|
|
75
|
+
* 🔴 **503 有四个不同的机器码,回退方式不同**(server 在 `routes/sessions.ts:234-236` 专门解释了为什么
|
|
76
|
+
* 必须带码:它与 drain 的 503 走同一条流,没有码消费端只能靠自由文本区分)。别对 503 统一回退:
|
|
77
|
+
* - `state.sse_connection_cap`(`:238`)—— 连接帽满。**自愈**:回落 `/head` 轮询,稍后重试订阅。
|
|
78
|
+
* - `state.sse_probe_cap`(`:352`)—— 探针帽。同上,自愈。
|
|
79
|
+
* - `state.sse_owner_lookup_cap`(`:263`)—— 存储并发许可耗尽。退避重试,别热循环。
|
|
80
|
+
* - `state.sse_owner_lookup_stalled`(`:284`)—— 存储**悬死**。这个不自愈:该报警/换副本,
|
|
81
|
+
* 把它当"帽满"去永远轮询就是把一个需要人介入的故障静默掉。
|
|
82
|
+
* `parseFrameStream` 对非 2xx 直接抛(不重连),所以 503 不会变成热循环——异常到手后按上表分支。 */
|
|
73
83
|
async *watch(sessionId, opts) {
|
|
74
84
|
let cursor = opts?.lastLeafId;
|
|
75
85
|
const open = () => this.t.openRaw({
|
|
@@ -99,13 +109,18 @@ export class SessionsResource {
|
|
|
99
109
|
}
|
|
100
110
|
/** POST /v1/sessions/:id/notify — 会话外事件注入(daemon 终态回报等;src/http/routes/notify-wake.ts 实拆)。
|
|
101
111
|
* body: {@link SessionNotifyBody}(`task_id, status, summary, result?, seq?, source?`);
|
|
102
|
-
* 坏形 400 typed;owner 门 fail-closed(未知/他人 session=404 无 oracle;env-only 无 ownerOf=501
|
|
112
|
+
* 坏形 400 typed;owner 门 fail-closed(未知/他人 session=404 无 oracle;env-only 无 ownerOf=501;
|
|
113
|
+
* 无 inbox 无法 park=501 `capability.workflow_store_required`)。
|
|
114
|
+
* 返回 {@link SessionNotifyResult} —— **分支 `delivery`**:`"live"`(200,已送达)vs `"parked"`(202,
|
|
115
|
+
* 排队等下次开流)。别把两者都渲染成"已通知"。 */
|
|
103
116
|
async notify(sessionId, body, opts) {
|
|
104
117
|
return this.t.request({ method: "POST", path: `/v1/sessions/${encodeURIComponent(sessionId)}/notify`, body, signal: opts?.signal });
|
|
105
118
|
}
|
|
106
119
|
/** POST /v1/sessions/:id/wake — 唤醒 task_done 纯 park 的会话续跑(design/144 §3,core 1.283 wake 臂;
|
|
107
120
|
* src/http/routes/notify-wake.ts 实拆)。非门决策:绝不 allow/deny 任何 pending 动作——有未决门=core `wake.gate_pending`
|
|
108
|
-
* 拒;空 park 且无 message=`wake.nothing_to_deliver` 拒。`message` 作续跑首轮输入(可省=送 pendingSteer)
|
|
121
|
+
* 拒;空 park 且无 message=`wake.nothing_to_deliver` 拒。`message` 作续跑首轮输入(可省=送 pendingSteer);
|
|
122
|
+
* ⚠️ 给了就必须是**非空**串(server `notify-wake.ts:139-142`,空串 400)。
|
|
123
|
+
* 返回 {@link SessionWakeResult} —— 200 也可能带 `errorCode`(core 拒了),按码分支、别只看 HTTP 码。 */
|
|
109
124
|
async wake(sessionId, body, opts) {
|
|
110
125
|
return this.t.request({ method: "POST", path: `/v1/sessions/${encodeURIComponent(sessionId)}/wake`, body: body ?? {}, signal: opts?.signal });
|
|
111
126
|
}
|
|
@@ -155,8 +170,16 @@ export class SessionsResource {
|
|
|
155
170
|
});
|
|
156
171
|
}
|
|
157
172
|
/** E21 — DELETE /v1/sessions/:id → `{ deleted }` (idempotent: `false` when nothing existed). Purges the
|
|
158
|
-
* session's conversation history + the service-owned run-ledger/checkpoint/tool-result rows.
|
|
159
|
-
*
|
|
173
|
+
* session's conversation history + the service-owned run-ledger/checkpoint/tool-result rows.
|
|
174
|
+
*
|
|
175
|
+
* 🔴 **A non-owner gets 200 `{deleted:false}`, NOT 404** (server `routes/sessions.ts:498`, with the reason
|
|
176
|
+
* written down at `:495-497`: a 404-vs-200 split would be an existence oracle, while `deleted:false` is both
|
|
177
|
+
* honest and idempotent-shaped). This is the OPPOSITE of `fork`, which really does 404 a non-owner — the two
|
|
178
|
+
* verbs have different postures and this JSDoc used to claim they were the same. So
|
|
179
|
+
* `try { await delete() } catch (NotFoundError) {…}` NEVER fires for someone else's session: the promise
|
|
180
|
+
* RESOLVES and the UI happily reports "deleted" having deleted nothing. Branch on `deleted` instead.
|
|
181
|
+
*
|
|
182
|
+
* 🔴 409 (typed ConflictError, body `activeTaskId`) while a run is LIVE on the session —
|
|
160
183
|
* cancel it first (don't orphan the session lock). 501 without a durable session store. Server-idempotent;
|
|
161
184
|
* not a submit → no SDK retry. */
|
|
162
185
|
async delete(sessionId, opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/resources/sessions.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAyBxD,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/resources/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,13 @@ export declare class TraceResource {
|
|
|
22
22
|
nextCursor?: string;
|
|
23
23
|
}>;
|
|
24
24
|
/** GET /v1/tasks/source-summary?sinceSec= — per-door usage rollup `{rows:[{source,status,count}]}`
|
|
25
|
-
* (the pinned wire contract; trace-auth surface).
|
|
25
|
+
* (the pinned wire contract; trace-auth surface).
|
|
26
|
+
*
|
|
27
|
+
* 🔴 **ops-only** (server `routes/trace-usage.ts:51-54`): `if (!isFleetWide(req)) → 401 auth.unauthorized`.
|
|
28
|
+
* This is a CROSS-TENANT aggregate with no owner-scoped variant, so a plain principal caller gets 401 —
|
|
29
|
+
* ALWAYS, with a perfectly valid credential. Do NOT wire it behind an end-user JWT (the symptom reads as a
|
|
30
|
+
* login/credential problem and sends the investigation the wrong way); it is a fleet-console data source.
|
|
31
|
+
* `sinceSec` is clamped server-side to `[60 s, 30 d]`; absent ⇒ 24 h. */
|
|
26
32
|
sourceSummary(opts?: {
|
|
27
33
|
sinceSec?: number;
|
|
28
34
|
signal?: AbortSignal;
|
|
@@ -34,9 +40,17 @@ export declare class TraceResource {
|
|
|
34
40
|
count: number;
|
|
35
41
|
}[];
|
|
36
42
|
}>;
|
|
37
|
-
/** GET /v1/tasks/:id/turns — the
|
|
38
|
-
* `{ turns, nextCursor?, retainedFrom }` (pinned wire contract); turn item shape draft.
|
|
43
|
+
/** GET /v1/tasks/:id/turns[?limit=&cursor=] — the turn trace (the workspace action timeline). Envelope
|
|
44
|
+
* `{ turns, nextCursor?, retainedFrom }` (pinned wire contract); turn item shape draft.
|
|
45
|
+
*
|
|
46
|
+
* 🔴 **PAGED, newest-first** (server `routes/trace-usage.ts:223-232`): `limit` is clamped to 1..100 and
|
|
47
|
+
* DEFAULTS TO 20 — a 500-turn run does not come back whole. `cursor` is an opaque turn-seq: pass back the
|
|
48
|
+
* `nextCursor` of the previous page to walk BACKWARD (older). `nextCursor` is present only while more
|
|
49
|
+
* eligible turns remain. Until 4.3.0 this method took no query args at all, so the `nextCursor` it returned
|
|
50
|
+
* could not be sent anywhere — the older pages were unreachable through the SDK. */
|
|
39
51
|
turns(taskId: string, opts?: {
|
|
52
|
+
limit?: number;
|
|
53
|
+
cursor?: string;
|
|
40
54
|
signal?: AbortSignal;
|
|
41
55
|
}): Promise<{
|
|
42
56
|
turns: TraceTurn[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/resources/trace.ts"],"names":[],"mappings":"AAAA;;iGAEiG;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGtF,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;4DAEwD;IAClD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAYtM;
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/resources/trace.ts"],"names":[],"mappings":"AAAA;;iGAEiG;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGtF,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;4DAEwD;IAClD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAYtM;;;;;;;8EAO0E;IAGpE,aAAa,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IAOxK;;;;;;;yFAOqF;IAC/E,KAAK,CACT,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC/D,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ9E;2HACuH;IACjH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC;IASpG;;;;;;;;;;kFAU8E;IACvE,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,gBAAgB,CAAC;CA6BvH"}
|
package/dist/resources/trace.js
CHANGED
|
@@ -25,17 +25,37 @@ export class TraceResource {
|
|
|
25
25
|
return this.t.request({ method: "GET", path: `/v1/tasks${qs ? `?${qs}` : ""}`, signal: opts?.signal });
|
|
26
26
|
}
|
|
27
27
|
/** GET /v1/tasks/source-summary?sinceSec= — per-door usage rollup `{rows:[{source,status,count}]}`
|
|
28
|
-
* (the pinned wire contract; trace-auth surface).
|
|
28
|
+
* (the pinned wire contract; trace-auth surface).
|
|
29
|
+
*
|
|
30
|
+
* 🔴 **ops-only** (server `routes/trace-usage.ts:51-54`): `if (!isFleetWide(req)) → 401 auth.unauthorized`.
|
|
31
|
+
* This is a CROSS-TENANT aggregate with no owner-scoped variant, so a plain principal caller gets 401 —
|
|
32
|
+
* ALWAYS, with a perfectly valid credential. Do NOT wire it behind an end-user JWT (the symptom reads as a
|
|
33
|
+
* login/credential problem and sends the investigation the wrong way); it is a fleet-console data source.
|
|
34
|
+
* `sinceSec` is clamped server-side to `[60 s, 30 d]`; absent ⇒ 24 h. */
|
|
29
35
|
// 2.1.4:返回型对齐 server 实况(trace-usage.ts:61)——顶层恒发 sinceSec(生效窗口秒);store 三实现的
|
|
30
36
|
// source 签名均为 string|null(census 批2 三段发现的 spec 谎同源修)。
|
|
31
37
|
async sourceSummary(opts) {
|
|
32
|
-
|
|
38
|
+
// `!== undefined`,不是真值判断:`sinceSec: 0` 曾被 falsy-drop 成"没传"⇒ 落默认 24h,而调用方的本意是
|
|
39
|
+
// 让 server 把它夹到下限 60s。显式传了就发,值域由 server 判。
|
|
40
|
+
const qs = opts?.sinceSec !== undefined ? `?sinceSec=${encodeURIComponent(String(opts.sinceSec))}` : "";
|
|
33
41
|
return this.t.request({ method: "GET", path: `/v1/tasks/source-summary${qs}`, signal: opts?.signal });
|
|
34
42
|
}
|
|
35
|
-
/** GET /v1/tasks/:id/turns — the
|
|
36
|
-
* `{ turns, nextCursor?, retainedFrom }` (pinned wire contract); turn item shape draft.
|
|
43
|
+
/** GET /v1/tasks/:id/turns[?limit=&cursor=] — the turn trace (the workspace action timeline). Envelope
|
|
44
|
+
* `{ turns, nextCursor?, retainedFrom }` (pinned wire contract); turn item shape draft.
|
|
45
|
+
*
|
|
46
|
+
* 🔴 **PAGED, newest-first** (server `routes/trace-usage.ts:223-232`): `limit` is clamped to 1..100 and
|
|
47
|
+
* DEFAULTS TO 20 — a 500-turn run does not come back whole. `cursor` is an opaque turn-seq: pass back the
|
|
48
|
+
* `nextCursor` of the previous page to walk BACKWARD (older). `nextCursor` is present only while more
|
|
49
|
+
* eligible turns remain. Until 4.3.0 this method took no query args at all, so the `nextCursor` it returned
|
|
50
|
+
* could not be sent anywhere — the older pages were unreachable through the SDK. */
|
|
37
51
|
async turns(taskId, opts) {
|
|
38
|
-
|
|
52
|
+
const q = new URLSearchParams();
|
|
53
|
+
if (opts?.limit !== undefined)
|
|
54
|
+
q.set("limit", String(opts.limit));
|
|
55
|
+
if (opts?.cursor !== undefined)
|
|
56
|
+
q.set("cursor", opts.cursor);
|
|
57
|
+
const qs = q.toString();
|
|
58
|
+
return this.t.request({ method: "GET", path: `/v1/tasks/${encodeURIComponent(taskId)}/turns${qs ? `?${qs}` : ""}`, signal: opts?.signal });
|
|
39
59
|
}
|
|
40
60
|
/** GET /v1/tasks/:id/artifacts — workspace artifacts (projection of the persisted trace; co-signed
|
|
41
61
|
* the pinned wire contract). Job-level aggregation = list by jobId then fetch per run (each carries taskId+jobId). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/resources/trace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;;4DAEwD;IACxD,KAAK,CAAC,IAAI,CAAC,IAAkI;QAC3I,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,KAAK;YAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,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,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,KAAK;YAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,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,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACzG,CAAC;IAED;
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/resources/trace.ts"],"names":[],"mappings":"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"}
|