@trigger.dev/core 0.0.0-prerelease-20260909121655 → 0.0.0-prerelease-20260911094758

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.
Files changed (57) hide show
  1. package/dist/commonjs/v3/apiClient/index.d.ts +0 -1
  2. package/dist/commonjs/v3/runEngineWorker/supervisor/http.d.ts +5 -0
  3. package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.d.ts +36 -0
  4. package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.js +18 -1
  5. package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.js.map +1 -1
  6. package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +2 -1
  7. package/dist/commonjs/v3/runEngineWorker/workload/http.js +5 -2
  8. package/dist/commonjs/v3/runEngineWorker/workload/http.js.map +1 -1
  9. package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +22 -0
  10. package/dist/commonjs/v3/runEngineWorker/workload/schemas.js +2 -1
  11. package/dist/commonjs/v3/runEngineWorker/workload/schemas.js.map +1 -1
  12. package/dist/commonjs/v3/schemas/api.d.ts +14 -1
  13. package/dist/commonjs/v3/schemas/api.js +8 -5
  14. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  15. package/dist/commonjs/v3/schemas/checkpoints.d.ts +9 -0
  16. package/dist/commonjs/v3/schemas/runEngine.d.ts +11 -1
  17. package/dist/commonjs/v3/schemas/runEngine.js +5 -2
  18. package/dist/commonjs/v3/schemas/runEngine.js.map +1 -1
  19. package/dist/commonjs/v3/schemas/snapshotRoute.d.ts +33 -0
  20. package/dist/commonjs/v3/schemas/snapshotRoute.js +33 -0
  21. package/dist/commonjs/v3/schemas/snapshotRoute.js.map +1 -0
  22. package/dist/commonjs/v3/sessionStreams/chatSnapshot.d.ts +91 -1
  23. package/dist/commonjs/v3/sessionStreams/chatSnapshot.js +236 -4
  24. package/dist/commonjs/v3/sessionStreams/chatSnapshot.js.map +1 -1
  25. package/dist/commonjs/v3/sessionStreams/router.d.ts +39 -1
  26. package/dist/commonjs/v3/sessionStreams/router.js +62 -0
  27. package/dist/commonjs/v3/sessionStreams/router.js.map +1 -1
  28. package/dist/commonjs/version.js +1 -1
  29. package/dist/esm/v3/apiClient/index.d.ts +0 -1
  30. package/dist/esm/v3/runEngineWorker/supervisor/http.d.ts +5 -0
  31. package/dist/esm/v3/runEngineWorker/supervisor/schemas.d.ts +36 -0
  32. package/dist/esm/v3/runEngineWorker/supervisor/schemas.js +17 -0
  33. package/dist/esm/v3/runEngineWorker/supervisor/schemas.js.map +1 -1
  34. package/dist/esm/v3/runEngineWorker/workload/http.d.ts +2 -1
  35. package/dist/esm/v3/runEngineWorker/workload/http.js +5 -2
  36. package/dist/esm/v3/runEngineWorker/workload/http.js.map +1 -1
  37. package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +22 -0
  38. package/dist/esm/v3/runEngineWorker/workload/schemas.js +2 -1
  39. package/dist/esm/v3/runEngineWorker/workload/schemas.js.map +1 -1
  40. package/dist/esm/v3/schemas/api.d.ts +14 -1
  41. package/dist/esm/v3/schemas/api.js +4 -1
  42. package/dist/esm/v3/schemas/api.js.map +1 -1
  43. package/dist/esm/v3/schemas/checkpoints.d.ts +9 -0
  44. package/dist/esm/v3/schemas/runEngine.d.ts +11 -1
  45. package/dist/esm/v3/schemas/runEngine.js +7 -0
  46. package/dist/esm/v3/schemas/runEngine.js.map +1 -1
  47. package/dist/esm/v3/schemas/snapshotRoute.d.ts +33 -0
  48. package/dist/esm/v3/schemas/snapshotRoute.js +30 -0
  49. package/dist/esm/v3/schemas/snapshotRoute.js.map +1 -0
  50. package/dist/esm/v3/sessionStreams/chatSnapshot.d.ts +91 -1
  51. package/dist/esm/v3/sessionStreams/chatSnapshot.js +229 -3
  52. package/dist/esm/v3/sessionStreams/chatSnapshot.js.map +1 -1
  53. package/dist/esm/v3/sessionStreams/router.d.ts +39 -1
  54. package/dist/esm/v3/sessionStreams/router.js +62 -0
  55. package/dist/esm/v3/sessionStreams/router.js.map +1 -1
  56. package/dist/esm/version.js +1 -1
  57. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runEngine.js","sourceRoot":"","sources":["../../../../src/v3/schemas/runEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runEngine.js","sourceRoot":"","sources":["../../../../src/v3/schemas/runEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * A run's versioned storage route (control metadata, never a TRES column), stamped on the queue message
4
+ * from its immutable BIRTH residency. Carried opaquely on the DequeuedMessage so the worker's separate
5
+ * start-attempt request honors durable residency even on a poll-lagging pod whose dial reads undefined.
6
+ *
7
+ * Kept in this leaf (only `zod` imported), not in `runEngine.ts`, so `supervisor/schemas.ts` can use it at
8
+ * module-eval time without the `messages -> supervisor/schemas -> runEngine` cycle leaving it undefined.
9
+ */
10
+ export declare const SnapshotRouteWire: z.ZodObject<{
11
+ version: z.ZodLiteral<1>;
12
+ residency: z.ZodEnum<{
13
+ mirrored: "mirrored";
14
+ postgres: "postgres";
15
+ "redis-primary": "redis-primary";
16
+ }>;
17
+ organizationId: z.ZodString;
18
+ }, z.core.$strip>;
19
+ export type SnapshotRouteWire = z.infer<typeof SnapshotRouteWire>;
20
+ /**
21
+ * The route as it crosses a MIXED-VERSION HTTP boundary. A rolling deploy can put a newer worker in
22
+ * front of an older webapp, so a route this build cannot read must never fail the whole request:
23
+ * every engine consumer treats an absent route as "unknown" and resolves residency durably instead.
24
+ *
25
+ * Accepts anything, keeps a valid v1 route normalized through the canonical schema above, and turns
26
+ * an unknown future version or a malformed value into `undefined`. Unrelated fields on the body keep
27
+ * their own strict validation.
28
+ */
29
+ export declare const SnapshotRouteWireLenient: z.ZodPipe<z.ZodUnknown, z.ZodTransform<{
30
+ version: 1;
31
+ residency: "mirrored" | "postgres" | "redis-primary";
32
+ organizationId: string;
33
+ } | undefined, unknown>>;
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * A run's versioned storage route (control metadata, never a TRES column), stamped on the queue message
4
+ * from its immutable BIRTH residency. Carried opaquely on the DequeuedMessage so the worker's separate
5
+ * start-attempt request honors durable residency even on a poll-lagging pod whose dial reads undefined.
6
+ *
7
+ * Kept in this leaf (only `zod` imported), not in `runEngine.ts`, so `supervisor/schemas.ts` can use it at
8
+ * module-eval time without the `messages -> supervisor/schemas -> runEngine` cycle leaving it undefined.
9
+ */
10
+ export const SnapshotRouteWire = z.object({
11
+ version: z.literal(1),
12
+ residency: z.enum(["postgres", "mirrored", "redis-primary"]),
13
+ organizationId: z.string(),
14
+ });
15
+ /**
16
+ * The route as it crosses a MIXED-VERSION HTTP boundary. A rolling deploy can put a newer worker in
17
+ * front of an older webapp, so a route this build cannot read must never fail the whole request:
18
+ * every engine consumer treats an absent route as "unknown" and resolves residency durably instead.
19
+ *
20
+ * Accepts anything, keeps a valid v1 route normalized through the canonical schema above, and turns
21
+ * an unknown future version or a malformed value into `undefined`. Unrelated fields on the body keep
22
+ * their own strict validation.
23
+ */
24
+ export const SnapshotRouteWireLenient = z
25
+ .unknown()
26
+ .transform((value) => {
27
+ const parsed = SnapshotRouteWire.safeParse(value);
28
+ return parsed.success ? parsed.data : undefined;
29
+ });
30
+ //# sourceMappingURL=snapshotRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotRoute.js","sourceRoot":"","sources":["../../../../src/v3/schemas/snapshotRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC5D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;CAC3B,CAAC,CAAC;AAGH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,OAAO,EAAE;KACT,SAAS,CAAC,CAAC,KAAK,EAAiC,EAAE;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC,CAAC,CAAC"}
@@ -101,7 +101,8 @@ export declare const TranscriptSnapshotV2Schema: z.ZodObject<{
101
101
  export declare function parseTranscriptSnapshot<TUIMessage extends UIMessage = UIMessage>(input: unknown): TranscriptSnapshotV2<TUIMessage> | undefined;
102
102
  /**
103
103
  * Select one page of transcript entries, newest last. `before` keeps only the
104
- * entries ordered before that id; `limit` keeps the last that many. A
104
+ * entries ordered before that id, and yields an empty page when the transcript
105
+ * no longer holds that id; `limit` keeps the last that many. A
105
106
  * non-positive `limit` is treated as no limit (every entry, no cursor), so a
106
107
  * caller cannot mistake an empty page for the end of the transcript. The
107
108
  * returned `nextCursor` is the id to pass as `before` for the previous page,
@@ -119,3 +120,92 @@ export declare function pageTranscriptEntries<TUIMessage extends UIMessage = UIM
119
120
  * URL routes prefix this with `packets/{projectRef}/{envSlug}/`.
120
121
  */
121
122
  export declare function chatSnapshotKeySuffix(sessionId: string): string;
123
+ /**
124
+ * Byte length of the fixed trailer that ends a version 2 blob:
125
+ * `#tt2:` + 16 zero-padded digits + `\n`. Fixed width so a reader can fetch
126
+ * exactly this many bytes from the end of the object and learn where the
127
+ * footer starts without a second guess.
128
+ */
129
+ export declare const TRANSCRIPT_TRAILER_BYTES = 22;
130
+ /**
131
+ * Media type a version 2 blob is stored under. Object stores return this on a
132
+ * ranged read, so a reader learns the format from the response it already made
133
+ * instead of inferring it from the bytes.
134
+ */
135
+ export declare const TRANSCRIPT_BLOB_CONTENT_TYPE = "application/vnd.trigger.transcript+ndjson";
136
+ /**
137
+ * Entry index at the end of a version 2 blob. Carries the stream cursors too,
138
+ * so serving a transcript page never has to fetch the header — which is where
139
+ * the private runtime state lives. `offsets` holds `ids.length + 1`
140
+ * byte offsets: entry `i` occupies `[offsets[i], offsets[i + 1] - 1)`, and the
141
+ * final sentinel is where the footer line itself begins. Carrying the sentinel
142
+ * means a reader can bound every entry, including the last, without knowing the
143
+ * object's total size.
144
+ */
145
+ export type TranscriptFooter = {
146
+ ids: string[];
147
+ offsets: number[];
148
+ savedAt?: number;
149
+ lastOutEventId?: string;
150
+ lastInEventId?: string;
151
+ };
152
+ /**
153
+ * Serialize a snapshot to the version 2 blob format: a header line carrying
154
+ * the cursors and the private runtime `state`, one JSON entry per line, an
155
+ * entry-index footer line, and the fixed trailer.
156
+ *
157
+ * The header holds `state`, so a reader that fetches only the end of the
158
+ * object to serve a transcript page cannot receive the model lane even by
159
+ * accident.
160
+ */
161
+ export declare function serializeTranscriptSnapshot<TUIMessage extends UIMessage>(snapshot: TranscriptSnapshotV2<TUIMessage>): string;
162
+ /**
163
+ * Read the fixed trailer from the last {@link TRANSCRIPT_TRAILER_BYTES} bytes
164
+ * of a version 2 blob. Returns the footer line's byte length, or `undefined`
165
+ * when the bytes are not a trailer (a version 1 blob, or a truncated write).
166
+ */
167
+ export declare function readTranscriptTrailer(trailer: string): {
168
+ footerLength: number;
169
+ } | undefined;
170
+ /** Parse a version 2 footer line into its entry index. */
171
+ export declare function parseTranscriptFooter(line: string): TranscriptFooter | undefined;
172
+ /**
173
+ * Byte window covering one page of entries within a single object, computed
174
+ * from its footer alone. Mirrors {@link pageTranscriptEntries}: newest last,
175
+ * `before` excludes that id and everything after it, `limit` keeps the last
176
+ * that many.
177
+ *
178
+ * `undefined` means the page is empty: the transcript is empty, `before` names
179
+ * its first entry, or `before` names an entry the transcript no longer holds
180
+ * (history trimmed since the caller last read it). Returning the newest entries
181
+ * for a cursor that cannot be found would present recent messages as older ones.
182
+ */
183
+ export type TranscriptPagePlan = {
184
+ start: number;
185
+ end: number;
186
+ ids: string[];
187
+ /** Set when the transcript still holds entries before the page. */
188
+ nextCursor: string | undefined;
189
+ /** Position of the page's first entry in the whole transcript. */
190
+ startIndex: number;
191
+ /** Entries in the whole transcript, so a caller can order pages against each other. */
192
+ totalEntries: number;
193
+ };
194
+ export declare function planTranscriptPage(footer: TranscriptFooter, opts: {
195
+ limit?: number;
196
+ before?: string;
197
+ } | undefined): TranscriptPagePlan | undefined;
198
+ /**
199
+ * Parse a run of whole entry lines, e.g. the byte window
200
+ * {@link planTranscriptPage} selected. Malformed lines are dropped, matching
201
+ * {@link parseTranscriptSnapshot}: a caller never sees an entry it would crash
202
+ * on or mis-order.
203
+ */
204
+ export declare function parseTranscriptEntryLines<TUIMessage extends UIMessage = UIMessage>(text: string): TranscriptSnapshotEntry<TUIMessage>[];
205
+ /**
206
+ * Parse a whole fetched blob of any known format. Version 2 is the line-based
207
+ * format {@link serializeTranscriptSnapshot} writes; anything else is handed to
208
+ * {@link parseTranscriptSnapshot}, which still reads the version 1 blobs
209
+ * written by released SDKs.
210
+ */
211
+ export declare function parseTranscriptBlob<TUIMessage extends UIMessage = UIMessage>(text: string): TranscriptSnapshotV2<TUIMessage> | undefined;
@@ -100,7 +100,8 @@ export function parseTranscriptSnapshot(input) {
100
100
  }
101
101
  /**
102
102
  * Select one page of transcript entries, newest last. `before` keeps only the
103
- * entries ordered before that id; `limit` keeps the last that many. A
103
+ * entries ordered before that id, and yields an empty page when the transcript
104
+ * no longer holds that id; `limit` keeps the last that many. A
104
105
  * non-positive `limit` is treated as no limit (every entry, no cursor), so a
105
106
  * caller cannot mistake an empty page for the end of the transcript. The
106
107
  * returned `nextCursor` is the id to pass as `before` for the previous page,
@@ -110,8 +111,9 @@ export function pageTranscriptEntries(all, opts) {
110
111
  let entries = all;
111
112
  if (opts?.before !== undefined) {
112
113
  const idx = entries.findIndex((e) => e.id === opts.before);
113
- if (idx !== -1)
114
- entries = entries.slice(0, idx);
114
+ if (idx === -1)
115
+ return { entries: [], nextCursor: undefined };
116
+ entries = entries.slice(0, idx);
115
117
  }
116
118
  let nextCursor;
117
119
  if (opts?.limit !== undefined && opts.limit > 0 && entries.length > opts.limit) {
@@ -127,4 +129,228 @@ export function pageTranscriptEntries(all, opts) {
127
129
  export function chatSnapshotKeySuffix(sessionId) {
128
130
  return `sessions/${sessionId}/snapshot.json`;
129
131
  }
132
+ /**
133
+ * Byte length of the fixed trailer that ends a version 2 blob:
134
+ * `#tt2:` + 16 zero-padded digits + `\n`. Fixed width so a reader can fetch
135
+ * exactly this many bytes from the end of the object and learn where the
136
+ * footer starts without a second guess.
137
+ */
138
+ export const TRANSCRIPT_TRAILER_BYTES = 22;
139
+ /**
140
+ * Media type a version 2 blob is stored under. Object stores return this on a
141
+ * ranged read, so a reader learns the format from the response it already made
142
+ * instead of inferring it from the bytes.
143
+ */
144
+ export const TRANSCRIPT_BLOB_CONTENT_TYPE = "application/vnd.trigger.transcript+ndjson";
145
+ const TRAILER_PREFIX = "#tt2:";
146
+ const V2_LINE_PREFIX = '{"v":2';
147
+ function utf8Length(value) {
148
+ return new TextEncoder().encode(value).length;
149
+ }
150
+ /**
151
+ * Serialize a snapshot to the version 2 blob format: a header line carrying
152
+ * the cursors and the private runtime `state`, one JSON entry per line, an
153
+ * entry-index footer line, and the fixed trailer.
154
+ *
155
+ * The header holds `state`, so a reader that fetches only the end of the
156
+ * object to serve a transcript page cannot receive the model lane even by
157
+ * accident.
158
+ */
159
+ export function serializeTranscriptSnapshot(snapshot) {
160
+ const header = JSON.stringify({
161
+ v: 2,
162
+ savedAt: snapshot.savedAt,
163
+ lastOutEventId: snapshot.lastOutEventId,
164
+ lastInEventId: snapshot.lastInEventId,
165
+ state: snapshot.state ?? null,
166
+ });
167
+ const ids = [];
168
+ const offsets = [];
169
+ const lines = [];
170
+ let cursor = utf8Length(header) + 1;
171
+ for (const entry of snapshot.messages) {
172
+ const line = JSON.stringify({ id: entry.id, final: entry.final, message: entry.message });
173
+ ids.push(entry.id);
174
+ offsets.push(cursor);
175
+ lines.push(line);
176
+ cursor += utf8Length(line) + 1;
177
+ }
178
+ offsets.push(cursor);
179
+ const footer = JSON.stringify({
180
+ ids,
181
+ offsets,
182
+ savedAt: snapshot.savedAt,
183
+ lastOutEventId: snapshot.lastOutEventId,
184
+ lastInEventId: snapshot.lastInEventId,
185
+ });
186
+ const trailer = `${TRAILER_PREFIX}${String(utf8Length(footer)).padStart(16, "0")}\n`;
187
+ return `${header}\n${lines.map((line) => `${line}\n`).join("")}${footer}\n${trailer}`;
188
+ }
189
+ /**
190
+ * Read the fixed trailer from the last {@link TRANSCRIPT_TRAILER_BYTES} bytes
191
+ * of a version 2 blob. Returns the footer line's byte length, or `undefined`
192
+ * when the bytes are not a trailer (a version 1 blob, or a truncated write).
193
+ */
194
+ export function readTranscriptTrailer(trailer) {
195
+ if (!trailer.startsWith(TRAILER_PREFIX) || trailer.length !== TRANSCRIPT_TRAILER_BYTES) {
196
+ return undefined;
197
+ }
198
+ const digits = trailer.slice(TRAILER_PREFIX.length, TRANSCRIPT_TRAILER_BYTES - 1);
199
+ if (!/^\d{16}$/.test(digits))
200
+ return undefined;
201
+ const footerLength = Number(digits);
202
+ return Number.isSafeInteger(footerLength) && footerLength >= 0 ? { footerLength } : undefined;
203
+ }
204
+ /** Parse a version 2 footer line into its entry index. */
205
+ export function parseTranscriptFooter(line) {
206
+ let parsed;
207
+ try {
208
+ parsed = JSON.parse(line);
209
+ }
210
+ catch {
211
+ return undefined;
212
+ }
213
+ if (!parsed || typeof parsed !== "object")
214
+ return undefined;
215
+ const { ids, offsets } = parsed;
216
+ if (!Array.isArray(ids) || !Array.isArray(offsets))
217
+ return undefined;
218
+ if (offsets.length !== ids.length + 1)
219
+ return undefined;
220
+ if (!ids.every((id) => typeof id === "string"))
221
+ return undefined;
222
+ if (!offsets.every((offset) => typeof offset === "number" && Number.isSafeInteger(offset))) {
223
+ return undefined;
224
+ }
225
+ // Offsets must strictly increase. Every entry is a non-empty JSON line plus a
226
+ // newline, so consecutive offsets always differ; equal or descending ones mean
227
+ // corrupt metadata. Accepting equality would hand the reader a zero-length
228
+ // window, which decodes to no entry at all and drops a message from the page
229
+ // while the cursor advances past it, instead of declining here so the caller
230
+ // takes the whole-object fallback.
231
+ const numeric = offsets;
232
+ if (numeric[0] < 0)
233
+ return undefined;
234
+ for (let i = 1; i < numeric.length; i++) {
235
+ if (numeric[i] <= numeric[i - 1])
236
+ return undefined;
237
+ }
238
+ const { savedAt, lastOutEventId, lastInEventId } = parsed;
239
+ return {
240
+ ids: ids,
241
+ offsets: offsets,
242
+ savedAt: typeof savedAt === "number" ? savedAt : undefined,
243
+ lastOutEventId: typeof lastOutEventId === "string" ? lastOutEventId : undefined,
244
+ lastInEventId: typeof lastInEventId === "string" ? lastInEventId : undefined,
245
+ };
246
+ }
247
+ export function planTranscriptPage(footer, opts) {
248
+ let endIndex = footer.ids.length;
249
+ if (opts?.before !== undefined) {
250
+ const idx = footer.ids.indexOf(opts.before);
251
+ if (idx === -1)
252
+ return undefined;
253
+ endIndex = idx;
254
+ }
255
+ const limit = opts?.limit !== undefined && opts.limit > 0 ? opts.limit : undefined;
256
+ let startIndex = 0;
257
+ let nextCursor;
258
+ if (limit !== undefined && endIndex > limit) {
259
+ startIndex = endIndex - limit;
260
+ nextCursor = footer.ids[startIndex];
261
+ }
262
+ if (endIndex <= startIndex)
263
+ return undefined;
264
+ return {
265
+ start: footer.offsets[startIndex],
266
+ end: footer.offsets[endIndex],
267
+ ids: footer.ids.slice(startIndex, endIndex),
268
+ nextCursor,
269
+ startIndex,
270
+ totalEntries: footer.ids.length,
271
+ };
272
+ }
273
+ function parseEntryLine(line) {
274
+ let parsed;
275
+ try {
276
+ parsed = JSON.parse(line);
277
+ }
278
+ catch {
279
+ return undefined;
280
+ }
281
+ if (!parsed || typeof parsed !== "object")
282
+ return undefined;
283
+ const { id, final, message } = parsed;
284
+ if (typeof id !== "string" || id.length === 0)
285
+ return undefined;
286
+ if (typeof message !== "object" || message === null)
287
+ return undefined;
288
+ if (message.id !== id)
289
+ return undefined;
290
+ return { id, final: final === true, message: message };
291
+ }
292
+ /**
293
+ * Parse a run of whole entry lines, e.g. the byte window
294
+ * {@link planTranscriptPage} selected. Malformed lines are dropped, matching
295
+ * {@link parseTranscriptSnapshot}: a caller never sees an entry it would crash
296
+ * on or mis-order.
297
+ */
298
+ export function parseTranscriptEntryLines(text) {
299
+ const entries = [];
300
+ for (const line of text.split("\n")) {
301
+ if (line.length === 0)
302
+ continue;
303
+ const entry = parseEntryLine(line);
304
+ if (entry)
305
+ entries.push(entry);
306
+ }
307
+ return entries;
308
+ }
309
+ /**
310
+ * Parse a whole fetched blob of any known format. Version 2 is the line-based
311
+ * format {@link serializeTranscriptSnapshot} writes; anything else is handed to
312
+ * {@link parseTranscriptSnapshot}, which still reads the version 1 blobs
313
+ * written by released SDKs.
314
+ */
315
+ export function parseTranscriptBlob(text) {
316
+ if (!text.startsWith(V2_LINE_PREFIX)) {
317
+ let parsed;
318
+ try {
319
+ parsed = JSON.parse(text);
320
+ }
321
+ catch {
322
+ return undefined;
323
+ }
324
+ return parseTranscriptSnapshot(parsed);
325
+ }
326
+ const newline = text.indexOf("\n");
327
+ if (newline === -1)
328
+ return undefined;
329
+ let header;
330
+ try {
331
+ header = JSON.parse(text.slice(0, newline));
332
+ }
333
+ catch {
334
+ return undefined;
335
+ }
336
+ const { savedAt, lastOutEventId, lastInEventId, state } = (header ?? {});
337
+ const trailerStart = text.length - TRANSCRIPT_TRAILER_BYTES;
338
+ const trailer = trailerStart >= 0 ? readTranscriptTrailer(text.slice(trailerStart)) : undefined;
339
+ let body = text.slice(newline + 1);
340
+ if (trailer) {
341
+ // Drop the footer line and the trailer; the entries are everything between
342
+ // the header and them.
343
+ const footerLine = text.lastIndexOf("\n", trailerStart - 2);
344
+ if (footerLine > newline)
345
+ body = text.slice(newline + 1, footerLine + 1);
346
+ }
347
+ return {
348
+ version: 2,
349
+ savedAt: typeof savedAt === "number" ? savedAt : 0,
350
+ messages: parseTranscriptEntryLines(body),
351
+ state: state ?? null,
352
+ lastOutEventId: typeof lastOutEventId === "string" ? lastOutEventId : undefined,
353
+ lastInEventId: typeof lastInEventId === "string" ? lastInEventId : undefined,
354
+ };
355
+ }
130
356
  //# sourceMappingURL=chatSnapshot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatSnapshot.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/chatSnapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatSnapshot.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/chatSnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAmB3B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AA+BH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC,CACH;IACD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAc;IAEd,MAAM,EAAE,GAAG,0BAA0B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACpC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,SAAS;YAC1E,IAAK,KAAK,CAAC,OAA4B,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;gBAAE,SAAS;YAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAqB,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;YAC7B,QAAQ;YACR,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;YAC5B,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc;YACtC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,EAAE,GAAI,GAA+B,EAAE,EAAE,CAAC;YAChD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAiB,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;YAC7B,QAAQ;YACR,KAAK,EAAE,IAAI;YACX,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc;YACtC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa;SACrC,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAA0C,EAC1C,IAAqD;IAErD,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QAC9D,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,UAA8B,CAAC;IACnC,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/E,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,YAAY,SAAS,gBAAgB,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,2CAA2C,CAAC;AAExF,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC;AAmBhC,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAA0C;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,CAAC,EAAE,CAAC;QACJ,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;KAC9B,CAAC,CAAC;IAEH,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,GAAG;QACH,OAAO;QACP,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;KACtC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,GAAG,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC;IAErF,OAAO,GAAG,MAAM,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,wBAAwB,EAAE,CAAC;QACvF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,wBAAwB,GAAG,CAAC,CAAC,CAAC;IAClF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChG,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAA8C,CAAC;IACxE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC3F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,8EAA8E;IAC9E,+EAA+E;IAC/E,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,mCAAmC;IACnC,MAAM,OAAO,GAAG,OAAmB,CAAC;IACpC,IAAI,OAAO,CAAC,CAAC,CAAE,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,CAAC,CAAE,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE;YAAE,OAAO,SAAS,CAAC;IACvD,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,MAIlD,CAAC;IACF,OAAO;QACL,GAAG,EAAE,GAAe;QACpB,OAAO,EAAE,OAAmB;QAC5B,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC1D,cAAc,EAAE,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;QAC/E,aAAa,EAAE,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;KAC7E,CAAC;AACJ,CAAC;AAyBD,MAAM,UAAU,kBAAkB,CAChC,MAAwB,EACxB,IAAqD;IAErD,IAAI,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IACjC,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACjC,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAA8B,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;QAC5C,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC9B,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,IAAI,UAAU;QAAE,OAAO,SAAS,CAAC;IAE7C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAE;QAClC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAE;QAC9B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;QAC3C,UAAU;QACV,UAAU;QACV,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,IAAY;IAEZ,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAA8D,CAAC;IAC9F,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtE,IAAK,OAA4B,CAAC,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE,OAAO,EAAE,OAAqB,EAAE,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAY;IAEZ,MAAM,OAAO,GAA0C,EAAE,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,KAAK,GAAG,cAAc,CAAa,IAAI,CAAC,CAAC;QAC/C,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY;IAEZ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,uBAAuB,CAAa,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAErC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAKtE,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,wBAAwB,CAAC;IAC5D,MAAM,OAAO,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,2EAA2E;QAC3E,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QAC5D,IAAI,UAAU,GAAG,OAAO;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClD,QAAQ,EAAE,yBAAyB,CAAa,IAAI,CAAC;QACrD,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,cAAc,EAAE,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;QAC/E,aAAa,EAAE,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;KAC7E,CAAC;AACJ,CAAC"}
@@ -57,7 +57,14 @@ export type RouterDropReason =
57
57
  */
58
58
  | "replayed"
59
59
  /** An `at-arrival` record with no handler attached right now. */
60
- | "no-handler";
60
+ | "no-handler"
61
+ /**
62
+ * A record the boot took responsibility for over HTTP (see
63
+ * {@link SessionChannelRouter.markRecovered}). It is dropped however late the
64
+ * live tail re-delivers it, so a recovered message is never also answered as
65
+ * a router turn.
66
+ */
67
+ | "recovered";
61
68
  export type RouterDecision =
62
69
  /** Handed to a consumer that was already waiting, or to a live handler. */
63
70
  {
@@ -127,6 +134,37 @@ export declare class SessionChannelRouter {
127
134
  restore(checkpoint: RouterCheckpoint): void;
128
135
  /** Where a boot should subscribe from: just past this sequence. */
129
136
  resumeFrom(): number | undefined;
137
+ /**
138
+ * Declare the sequences a continuation boot already read over HTTP and took
139
+ * responsibility for dispatching itself, so the live tail's re-read of the
140
+ * same records does not answer them a second time.
141
+ *
142
+ * Two effects, deliberately separate:
143
+ *
144
+ * - Every claimed sequence is dropped in {@link ingest} however late it
145
+ * arrives (`"recovered"`), so a record the boot owns never also becomes a
146
+ * router turn. This survives the boot settling it — the boot owns its
147
+ * disposition for the whole run, and the tail may re-deliver at any time.
148
+ * - Each claimed sequence is also *owed*: it holds the resume floor exactly
149
+ * like a queued record would, until the boot {@link settleRecovered}s it.
150
+ * Suppressing the second delivery without this would let a turn boundary
151
+ * publish a floor past a message the boot has not answered yet, turning a
152
+ * duplicate into a dropped message.
153
+ *
154
+ * `#highestSeq` is advanced over the contiguous run of claimed sequences from
155
+ * the current high water, so once every claim is settled the floor can move
156
+ * past them even if the tail never re-delivers (a silent tail then degrades
157
+ * to a duplicate, never a loss). The advance stops at the first gap so a
158
+ * record the boot left for the router is never skipped.
159
+ */
160
+ markRecovered(seqNums: Iterable<number>): void;
161
+ /**
162
+ * Release a claimed sequence's hold on the resume floor once the boot has
163
+ * decided its disposition (dispatched it as a turn, folded it into the seed
164
+ * chain, or deliberately dropped it). It stays claimed, so a late tail
165
+ * re-delivery is still dropped rather than answered again.
166
+ */
167
+ settleRecovered(seqNum: number): void;
130
168
  /**
131
169
  * Classify one record and act on it. The record's destination is decided
132
170
  * here, once, and never by whichever consumer happens to be waiting.
@@ -53,6 +53,8 @@ export class SessionChannelRouter {
53
53
  #highestSeq;
54
54
  #resumeFrom;
55
55
  #appliedThrough;
56
+ #claimed = new Set();
57
+ #owed = new Set();
56
58
  #onDrop;
57
59
  constructor(table, options) {
58
60
  this.table = table;
@@ -94,6 +96,57 @@ export class SessionChannelRouter {
94
96
  resumeFrom() {
95
97
  return this.#resumeFrom;
96
98
  }
99
+ /**
100
+ * Declare the sequences a continuation boot already read over HTTP and took
101
+ * responsibility for dispatching itself, so the live tail's re-read of the
102
+ * same records does not answer them a second time.
103
+ *
104
+ * Two effects, deliberately separate:
105
+ *
106
+ * - Every claimed sequence is dropped in {@link ingest} however late it
107
+ * arrives (`"recovered"`), so a record the boot owns never also becomes a
108
+ * router turn. This survives the boot settling it — the boot owns its
109
+ * disposition for the whole run, and the tail may re-deliver at any time.
110
+ * - Each claimed sequence is also *owed*: it holds the resume floor exactly
111
+ * like a queued record would, until the boot {@link settleRecovered}s it.
112
+ * Suppressing the second delivery without this would let a turn boundary
113
+ * publish a floor past a message the boot has not answered yet, turning a
114
+ * duplicate into a dropped message.
115
+ *
116
+ * `#highestSeq` is advanced over the contiguous run of claimed sequences from
117
+ * the current high water, so once every claim is settled the floor can move
118
+ * past them even if the tail never re-delivers (a silent tail then degrades
119
+ * to a duplicate, never a loss). The advance stops at the first gap so a
120
+ * record the boot left for the router is never skipped.
121
+ */
122
+ markRecovered(seqNums) {
123
+ const nums = [...seqNums].filter((n) => Number.isFinite(n)).sort((a, b) => a - b);
124
+ if (nums.length === 0)
125
+ return;
126
+ for (const n of nums) {
127
+ this.#claimed.add(n);
128
+ this.#owed.add(n);
129
+ }
130
+ let base = this.#highestSeq ?? nums[0] - 1;
131
+ while (this.#claimed.has(base + 1))
132
+ base++;
133
+ if (this.#highestSeq === undefined || base > this.#highestSeq) {
134
+ this.#highestSeq = base;
135
+ }
136
+ const maxClaimed = nums[nums.length - 1];
137
+ if (this.#appliedThrough === undefined || maxClaimed > this.#appliedThrough) {
138
+ this.#appliedThrough = maxClaimed;
139
+ }
140
+ }
141
+ /**
142
+ * Release a claimed sequence's hold on the resume floor once the boot has
143
+ * decided its disposition (dispatched it as a turn, folded it into the seed
144
+ * chain, or deliberately dropped it). It stays claimed, so a late tail
145
+ * re-delivery is still dropped rather than answered again.
146
+ */
147
+ settleRecovered(seqNum) {
148
+ this.#owed.delete(seqNum);
149
+ }
97
150
  /**
98
151
  * Classify one record and act on it. The record's destination is decided
99
152
  * here, once, and never by whichever consumer happens to be waiting.
@@ -109,6 +162,9 @@ export class SessionChannelRouter {
109
162
  this.#highestSeq = record.seqNum;
110
163
  }
111
164
  }
165
+ if (this.#claimed.has(record.seqNum)) {
166
+ return this.#drop(record, "recovered");
167
+ }
112
168
  const kind = this.#kindOf(record.data);
113
169
  if (kind === undefined) {
114
170
  return this.#drop(record, "malformed");
@@ -195,6 +251,10 @@ export class SessionChannelRouter {
195
251
  if (pending !== undefined)
196
252
  earliestPending = Math.min(earliestPending, pending);
197
253
  }
254
+ for (const owed of this.#owed) {
255
+ if (owed < earliestPending)
256
+ earliestPending = owed;
257
+ }
198
258
  if (earliestPending === Infinity)
199
259
  return this.#highestSeq;
200
260
  const floor = Math.min(this.#highestSeq, earliestPending - 1);
@@ -393,6 +453,8 @@ export class SessionChannelRouter {
393
453
  this.#highestSeq = undefined;
394
454
  this.#resumeFrom = undefined;
395
455
  this.#appliedThrough = undefined;
456
+ this.#claimed.clear();
457
+ this.#owed.clear();
396
458
  }
397
459
  }
398
460
  //# sourceMappingURL=router.js.map