@opengeni/sdk 4.2.1-canary.39593846423001 → 4.3.1

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 (55) hide show
  1. package/dist/adapters/next.js +3 -3
  2. package/dist/artifacts.js +5 -5
  3. package/dist/browser.js +3 -3
  4. package/dist/chat/index.js +6 -6
  5. package/dist/{chunk-NWAFR5MV.js → chunk-55GBKF7P.js} +2 -2
  6. package/dist/{chunk-MDH4DVHY.js → chunk-72YZCZWF.js} +26 -2
  7. package/dist/chunk-72YZCZWF.js.map +1 -0
  8. package/dist/{chunk-TEGGC6O6.js → chunk-AYRVQVHK.js} +2 -2
  9. package/dist/{chunk-SA556DB2.js → chunk-EX75IJAN.js} +5 -5
  10. package/dist/{chunk-3N4DFMLW.js → chunk-G53Y7PIB.js} +5 -5
  11. package/dist/{chunk-3N4DFMLW.js.map → chunk-G53Y7PIB.js.map} +1 -1
  12. package/dist/{chunk-HXEJSFM5.js → chunk-LVH6IWCL.js} +2 -2
  13. package/dist/{chunk-GNHC2T6W.js → chunk-NYGAWWXV.js} +1 -1
  14. package/dist/chunk-NYGAWWXV.js.map +1 -0
  15. package/dist/{chunk-FQT3CNV2.js → chunk-OZ5TBBDP.js} +3 -3
  16. package/dist/{chunk-H5KERQJ6.js → chunk-TS7XHDYJ.js} +73 -6
  17. package/dist/chunk-TS7XHDYJ.js.map +1 -0
  18. package/dist/codex-realtime-controller.js +1 -1
  19. package/dist/core.js +4 -4
  20. package/dist/desktop-bridge.d.ts +280 -0
  21. package/dist/desktop-bridge.js +53 -0
  22. package/dist/desktop-bridge.js.map +1 -0
  23. package/dist/document-authority.js +4 -4
  24. package/dist/editable-artifacts.js +1 -1
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +49 -67
  27. package/dist/index.js.map +1 -1
  28. package/dist/realtime.js +5 -5
  29. package/dist/session-proxy.js +3 -3
  30. package/dist/site-bridge-host.js +4 -4
  31. package/dist/site-browser-runtime.gen.d.ts +1 -1
  32. package/dist/site-document.js +1 -1
  33. package/dist/site-document.js.map +1 -1
  34. package/dist/site.js +4 -4
  35. package/dist/stream.d.ts +18 -2
  36. package/dist/types.d.ts +49 -4
  37. package/dist/workspace-live-stream.d.ts +8 -1
  38. package/package.json +7 -3
  39. package/src/client.ts +3 -0
  40. package/src/desktop-bridge.ts +323 -0
  41. package/src/index.ts +9 -0
  42. package/src/session-proxy.ts +1 -1
  43. package/src/site-browser-runtime.gen.ts +1 -1
  44. package/src/stream.ts +51 -3
  45. package/src/types.ts +58 -4
  46. package/src/workspace-live-stream.ts +24 -3
  47. package/dist/chunk-GNHC2T6W.js.map +0 -1
  48. package/dist/chunk-H5KERQJ6.js.map +0 -1
  49. package/dist/chunk-MDH4DVHY.js.map +0 -1
  50. package/dist/site-document.test.d.ts +0 -1
  51. /package/dist/{chunk-NWAFR5MV.js.map → chunk-55GBKF7P.js.map} +0 -0
  52. /package/dist/{chunk-TEGGC6O6.js.map → chunk-AYRVQVHK.js.map} +0 -0
  53. /package/dist/{chunk-SA556DB2.js.map → chunk-EX75IJAN.js.map} +0 -0
  54. /package/dist/{chunk-HXEJSFM5.js.map → chunk-LVH6IWCL.js.map} +0 -0
  55. /package/dist/{chunk-FQT3CNV2.js.map → chunk-OZ5TBBDP.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createSessionProxyHandler
3
- } from "../chunk-3N4DFMLW.js";
3
+ } from "../chunk-G53Y7PIB.js";
4
4
  import "../chunk-UM4ZXXJR.js";
5
5
  import "../chunk-QGEIL4TR.js";
6
- import "../chunk-MDH4DVHY.js";
7
- import "../chunk-GNHC2T6W.js";
6
+ import "../chunk-72YZCZWF.js";
7
+ import "../chunk-NYGAWWXV.js";
8
8
  import "../chunk-ODKRQUWR.js";
9
9
 
10
10
  // src/adapters/next.ts
package/dist/artifacts.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  OpenGeniClient
3
- } from "./chunk-TEGGC6O6.js";
4
- import "./chunk-HXEJSFM5.js";
5
- import "./chunk-H5KERQJ6.js";
3
+ } from "./chunk-AYRVQVHK.js";
4
+ import "./chunk-LVH6IWCL.js";
5
+ import "./chunk-TS7XHDYJ.js";
6
6
  import "./chunk-X5ITQVXE.js";
7
- import "./chunk-MDH4DVHY.js";
8
- import "./chunk-GNHC2T6W.js";
7
+ import "./chunk-72YZCZWF.js";
8
+ import "./chunk-NYGAWWXV.js";
9
9
  import "./chunk-POYRW6KT.js";
10
10
  import "./chunk-ODKRQUWR.js";
11
11
  export {
package/dist/browser.js CHANGED
@@ -8,13 +8,13 @@ import {
8
8
  } from "./chunk-ORYDCRFM.js";
9
9
  import {
10
10
  OpenGeniClient
11
- } from "./chunk-H5KERQJ6.js";
11
+ } from "./chunk-TS7XHDYJ.js";
12
12
  import "./chunk-X5ITQVXE.js";
13
- import "./chunk-MDH4DVHY.js";
13
+ import "./chunk-72YZCZWF.js";
14
14
  import {
15
15
  OPENGENI_API_CONTRACT_HEADER,
16
16
  OPENGENI_API_CONTRACT_REVISION
17
- } from "./chunk-GNHC2T6W.js";
17
+ } from "./chunk-NYGAWWXV.js";
18
18
  import "./chunk-POYRW6KT.js";
19
19
  import {
20
20
  OpenGeniAllowanceExhaustedError,
@@ -9,9 +9,9 @@ import {
9
9
  } from "../chunk-JO6THLOG.js";
10
10
  import {
11
11
  OpenGeniEmbeddingClient
12
- } from "../chunk-NWAFR5MV.js";
13
- import "../chunk-TEGGC6O6.js";
14
- import "../chunk-HXEJSFM5.js";
12
+ } from "../chunk-55GBKF7P.js";
13
+ import "../chunk-AYRVQVHK.js";
14
+ import "../chunk-LVH6IWCL.js";
15
15
  import {
16
16
  chatDefaults
17
17
  } from "../chunk-UM4ZXXJR.js";
@@ -24,12 +24,12 @@ import {
24
24
  humanInputPending,
25
25
  stringValue
26
26
  } from "../chunk-OV3POE62.js";
27
- import "../chunk-H5KERQJ6.js";
27
+ import "../chunk-TS7XHDYJ.js";
28
28
  import "../chunk-X5ITQVXE.js";
29
29
  import {
30
30
  parseSseStream
31
- } from "../chunk-MDH4DVHY.js";
32
- import "../chunk-GNHC2T6W.js";
31
+ } from "../chunk-72YZCZWF.js";
32
+ import "../chunk-NYGAWWXV.js";
33
33
  import "../chunk-POYRW6KT.js";
34
34
  import {
35
35
  OpenGeniApiError,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  OpenGeniClient
3
- } from "./chunk-TEGGC6O6.js";
3
+ } from "./chunk-AYRVQVHK.js";
4
4
 
5
5
  // src/embedding-client.ts
6
6
  function hasStaticHeader(options, names) {
@@ -329,4 +329,4 @@ function usageQuery(query) {
329
329
  export {
330
330
  OpenGeniEmbeddingClient
331
331
  };
332
- //# sourceMappingURL=chunk-NWAFR5MV.js.map
332
+ //# sourceMappingURL=chunk-55GBKF7P.js.map
@@ -110,11 +110,21 @@ async function* streamSessionEvents(transport, options = {}) {
110
110
  let failedAttempts = 0;
111
111
  let delayMs = baseDelayMs;
112
112
  let everConnected = false;
113
+ let attempted = false;
113
114
  while (true) {
114
115
  if (signal?.aborted) break;
115
116
  options.onStateChange?.(everConnected || failedAttempts > 0 ? "reconnecting" : "connecting");
116
- const cursorAtOpen = cursor;
117
+ let cursorAtOpen = cursor;
117
118
  try {
119
+ if (attempted && options.beforeReconnect) {
120
+ const resumeAfter = await runBeforeReconnect(options.beforeReconnect, cursor, signal);
121
+ if (signal?.aborted) return;
122
+ if (typeof resumeAfter === "number" && Number.isSafeInteger(resumeAfter)) {
123
+ cursor = Math.max(cursor, resumeAfter);
124
+ }
125
+ cursorAtOpen = cursor;
126
+ }
127
+ attempted = true;
118
128
  const body = await transport.openStream(cursor, signal);
119
129
  everConnected = true;
120
130
  failedAttempts = 0;
@@ -196,6 +206,20 @@ async function runBeforeLive(beforeLive, timeoutMs, signal) {
196
206
  if (signal && abortListener) signal.removeEventListener("abort", abortListener);
197
207
  }
198
208
  }
209
+ async function runBeforeReconnect(beforeReconnect, cursor, signal) {
210
+ if (!signal) return await beforeReconnect(cursor);
211
+ if (signal.aborted) throw new DOMException("Aborted", "AbortError");
212
+ let abortListener;
213
+ const aborted = new Promise((_resolve, reject) => {
214
+ abortListener = () => reject(new DOMException("Aborted", "AbortError"));
215
+ signal.addEventListener("abort", abortListener, { once: true });
216
+ });
217
+ try {
218
+ return await Promise.race([Promise.resolve().then(() => beforeReconnect(cursor)), aborted]);
219
+ } finally {
220
+ if (abortListener) signal.removeEventListener("abort", abortListener);
221
+ }
222
+ }
199
223
  function jitteredDelay(delayMs, ratio) {
200
224
  if (delayMs <= 0 || ratio <= 0) return delayMs;
201
225
  const boundedRatio = Math.min(ratio, 1);
@@ -319,4 +343,4 @@ export {
319
343
  withStreamInactivityTimeout,
320
344
  sessionEventStreamCoveredThrough
321
345
  };
322
- //# sourceMappingURL=chunk-MDH4DVHY.js.map
346
+ //# sourceMappingURL=chunk-72YZCZWF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/session-sequence.ts","../src/sse.ts","../src/stream.ts"],"sourcesContent":["/**\n * Read consistency for session projections (prompt queue, pending questions,\n * goal, lineage). The server reads the session's event sequence before the\n * projection and returns it in this header, so the projection reflects every\n * event at or below that sequence. A client that also loads the event log can\n * then re-read a projection only for an event after it, instead of after every\n * historical event it happens to see first.\n */\nexport const SESSION_SEQUENCE_HEADER = \"X-OpenGeni-Session-Sequence\";\n\nconst observed = new WeakMap<object, number>();\n\n/** @internal Record the header for one parsed response body. */\nexport function recordObservedSessionSequence(value: unknown, header: string | null): void {\n if (header === null || typeof value !== \"object\" || value === null) return;\n const sequence = Number(header);\n if (Number.isSafeInteger(sequence) && sequence >= 0) observed.set(value, sequence);\n}\n\n/** @internal Carry a recorded sequence to a value unwrapped from the response body. */\nexport function copyObservedSessionSequence(from: unknown, to: unknown): void {\n if (typeof from !== \"object\" || from === null || typeof to !== \"object\" || to === null) return;\n const sequence = observed.get(from);\n if (sequence !== undefined) observed.set(to, sequence);\n}\n\n/**\n * The session event sequence a value read from the API reflects, or\n * `undefined` when the server (or a proxy in between) did not report one.\n * Values from `getQueue`, `listHumanInputRequests`, `getGoal`/`findGoal` and\n * `getSessionLineage` carry it on current servers.\n */\nexport function observedSessionSequence(value: unknown): number | undefined {\n return typeof value === \"object\" && value !== null ? observed.get(value) : undefined;\n}\n","/**\n * Minimal incremental Server-Sent Events parser over a byte stream.\n *\n * Implements the parts of the SSE wire format Opengeni uses: `id`, `event`,\n * and `data` fields, multi-line data, comment lines, and both LF and CRLF\n * line endings. Messages without any `data` (comments, id-only blocks) are\n * not emitted.\n */\nexport type SseMessage = {\n id?: string;\n event?: string;\n data: string;\n};\n\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseMessage, void, void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let id: string | undefined;\n let event: string | undefined;\n let dataLines: string[] | null = null;\n\n const dispatch = (): SseMessage | null => {\n const message =\n dataLines === null\n ? null\n : {\n ...(id !== undefined ? { id } : {}),\n ...(event !== undefined ? { event } : {}),\n data: dataLines.join(\"\\n\"),\n };\n id = undefined;\n event = undefined;\n dataLines = null;\n return message;\n };\n\n const handleLine = (line: string): SseMessage | null => {\n if (line === \"\") {\n return dispatch();\n }\n if (line.startsWith(\":\")) {\n return null;\n }\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n if (field === \"data\") {\n (dataLines ??= []).push(value);\n } else if (field === \"event\") {\n event = value;\n } else if (field === \"id\") {\n id = value;\n }\n // Other fields (e.g. `retry`) are ignored; reconnect pacing is the\n // streaming layer's concern.\n return null;\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let newline = buffer.indexOf(\"\\n\");\n while (newline !== -1) {\n let line = buffer.slice(0, newline);\n buffer = buffer.slice(newline + 1);\n if (line.endsWith(\"\\r\")) {\n line = line.slice(0, -1);\n }\n const message = handleLine(line);\n if (message) {\n yield message;\n }\n newline = buffer.indexOf(\"\\n\");\n }\n }\n // Per the SSE spec, a block is only dispatched on a blank line. Anything\n // still pending at end-of-stream came from a truncated connection and is\n // discarded — the streaming layer replays from its cursor on reconnect.\n } finally {\n // Never await cancel(): some fetch bodies settle it only once their request\n // aborts, which would deadlock the consumer's unwinding.\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A pending read (older stream implementations) keeps the lock; cancel releases it.\n }\n }\n}\n","import { isAbortError, isRetryableStreamError, OpenGeniStreamError } from \"./errors\";\nimport { parseSseStream } from \"./sse\";\nimport type { SessionEvent } from \"./types\";\n\nconst SESSION_EVENT_STREAM_COVERAGE = Symbol.for(\n \"@opengeni/sdk/session-event-stream-covered-through\",\n);\n\n/**\n * Transport boundary for the streaming core. The client implements it with\n * `fetch`; unit tests script it directly.\n */\nexport type SessionEventStreamTransport = {\n /** Open the SSE stream, replaying durable events after `after` first. */\n openStream: (\n after: number,\n signal: AbortSignal | undefined,\n ) => Promise<ReadableStream<Uint8Array>>;\n /** Replay durable events by sequence (`GET .../events?after=&limit=`). */\n listEvents: (after: number, limit: number) => Promise<SessionEvent[]>;\n};\n\nexport type StreamConnectionState = \"connecting\" | \"live\" | \"reconnecting\";\n\nexport type StreamSessionEventsOptions = {\n /** Resume after this sequence number (exclusive). Defaults to 0 (full replay). */\n after?: number;\n /** Aborting ends the stream gracefully (the generator returns). */\n signal?: AbortSignal;\n /** Reconnect on transient drops. Defaults to true. */\n reconnect?: boolean;\n /** Initial reconnect backoff. Defaults to 500ms. */\n reconnectDelayMs?: number;\n /** Backoff ceiling. Defaults to 10s. */\n maxReconnectDelayMs?: number;\n /** Random backoff spread as a fraction of the delay. Defaults to 0.2. */\n reconnectJitterRatio?: number;\n /**\n * Give up after this many consecutive failed reconnect attempts (i.e. N\n * reconnects = N+1 total open-stream calls). Defaults to unlimited.\n */\n maxReconnectAttempts?: number;\n /**\n * Notify the consumer as soon as the SSE response body is open. This callback\n * is deliberately synchronous and non-blocking: use it to start projection\n * reconciliation without delaying consumption of live event bytes.\n */\n onOpen?: (() => void) | undefined;\n /** Await authoritative client reconciliation before exposing `live`. */\n beforeLive?: (() => void | Promise<void>) | undefined;\n /** Maximum reconciliation time before reconnecting. Defaults to 15s. */\n beforeLiveTimeoutMs?: number;\n /** Maximum time without any SSE bytes before reconnecting. Defaults to 45s. */\n heartbeatTimeoutMs?: number;\n onStateChange?: (state: StreamConnectionState) => void;\n /**\n * Session event streams only (other streams ignore it); opt-in. Runs before\n * every reconnect, including a retry after a failed first attempt, but not\n * before the first attempt, with the sequence the stream would resume\n * after. Resolve a larger sequence to resume after it instead: the events\n * in between are then NOT delivered, so the caller must already hold an\n * equivalent view (for example, it re-read a bounded newest window after a\n * long disconnect). Resolve nothing, or a sequence at or below the cursor,\n * to replay exactly once from the cursor. A rejection counts as a failed\n * reconnect attempt: retryable errors back off and call this again, others\n * end the stream. Aborting `signal` ends the stream without waiting for it;\n * the callback should bound its own work. Without it, reconnects keep\n * exactly-once replay.\n */\n beforeReconnect?: ((cursor: number) => number | void | Promise<number | void>) | undefined;\n};\n\n/**\n * Stream a session's events with exactly-once, in-order delivery.\n *\n * Guarantees, anchored on the per-session contiguous `sequence`:\n * - **No duplicates**: events at or below the cursor are dropped, so server\n * replay overlap and reconnect overlap never re-yield.\n * - **No gaps**: each reconnect resumes from the last seen sequence (unless\n * an opt-in `beforeReconnect` deliberately moves it forward), and a gap\n * observed inside one connection is backfilled from the durable replay\n * endpoint before the newer event is yielded (events are durable before\n * they are published live, so the backfill always finds them).\n * - **Ordered**: sequences are yielded strictly ascending.\n *\n * The generator ends when `signal` aborts, when the server closes and\n * `reconnect` is false, or with an error for non-retryable failures.\n */\nexport async function* streamSessionEvents(\n transport: SessionEventStreamTransport,\n options: StreamSessionEventsOptions = {},\n): AsyncGenerator<SessionEvent, void, void> {\n const signal = options.signal;\n const reconnect = options.reconnect ?? true;\n const baseDelayMs = options.reconnectDelayMs ?? 500;\n const maxDelayMs = options.maxReconnectDelayMs ?? 10_000;\n const jitterRatio = options.reconnectJitterRatio ?? 0.2;\n const beforeLiveTimeoutMs = options.beforeLiveTimeoutMs ?? 15_000;\n const heartbeatTimeoutMs = options.heartbeatTimeoutMs ?? 45_000;\n const maxAttempts = options.maxReconnectAttempts ?? Number.POSITIVE_INFINITY;\n let cursor = options.after ?? 0;\n let failedAttempts = 0;\n let delayMs = baseDelayMs;\n let everConnected = false;\n let attempted = false;\n\n while (true) {\n if (signal?.aborted) break;\n options.onStateChange?.(everConnected || failedAttempts > 0 ? \"reconnecting\" : \"connecting\");\n let cursorAtOpen = cursor;\n try {\n if (attempted && options.beforeReconnect) {\n const resumeAfter = await runBeforeReconnect(options.beforeReconnect, cursor, signal);\n if (signal?.aborted) return;\n if (typeof resumeAfter === \"number\" && Number.isSafeInteger(resumeAfter)) {\n cursor = Math.max(cursor, resumeAfter);\n }\n cursorAtOpen = cursor;\n }\n attempted = true;\n const body = await transport.openStream(cursor, signal);\n everConnected = true;\n failedAttempts = 0;\n delayMs = baseDelayMs;\n try {\n options.onOpen?.();\n } catch {\n // A notification observer cannot own or interrupt the event transport.\n }\n await runBeforeLive(options.beforeLive, beforeLiveTimeoutMs, signal);\n options.onStateChange?.(\"live\");\n for await (const message of parseSseStream(\n withStreamInactivityTimeout(body, heartbeatTimeoutMs, signal),\n )) {\n // Re-check after every yield resumption: an abort from the consumer\n // must not let already-buffered events keep flowing.\n if (signal?.aborted) {\n return;\n }\n const event = parseSessionEvent(message.data);\n if (!event) {\n continue;\n }\n const coveredSequence = trustedSseSequence(message.id, event.sequence);\n markSessionEventStreamCoverage(event, coveredSequence);\n if (coveredSequence <= cursor) continue;\n if (event.sequence > cursor + 1) {\n for await (const missed of backfillEvents(transport, cursor, event.sequence - 1)) {\n cursor = missed.sequence;\n yield missed;\n if (signal?.aborted) {\n return;\n }\n }\n }\n cursor = coveredSequence;\n yield event;\n }\n if (!reconnect) {\n return;\n }\n // Clean server close: reconnect immediately when the connection made\n // progress (servers legitimately cycle long SSE connections); pace\n // empty closes so a misbehaving server is not hammered in a hot loop.\n if (cursor === cursorAtOpen) {\n await sleep(jitteredDelay(baseDelayMs, jitterRatio), signal);\n }\n continue;\n } catch (error) {\n if (signal?.aborted || isAbortError(error)) {\n return;\n }\n if (!reconnect || !isRetryableStreamError(error)) {\n throw error;\n }\n failedAttempts += 1;\n if (failedAttempts > maxAttempts) {\n throw new OpenGeniStreamError(\n `event stream gave up after ${maxAttempts} consecutive failed reconnect attempts: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n await sleep(jitteredDelay(delayMs, jitterRatio), signal);\n delayMs = Math.min(Math.max(delayMs * 2, baseDelayMs), maxDelayMs);\n }\n}\n\nexport async function runBeforeLive(\n beforeLive: (() => void | Promise<void>) | undefined,\n timeoutMs: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (!beforeLive) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let abortListener: (() => void) | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new TypeError(`stream reconciliation timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n if (signal) {\n abortListener = () => reject(new DOMException(\"Aborted\", \"AbortError\"));\n signal.addEventListener(\"abort\", abortListener, { once: true });\n }\n });\n try {\n await Promise.race([Promise.resolve().then(beforeLive), timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n if (signal && abortListener) signal.removeEventListener(\"abort\", abortListener);\n }\n}\n\n// Races the caller's reconnect hook against abort so a hung callback can never\n// hold an aborted stream open. The hook bounds its own work (no timeout here:\n// a slow but progressing catch-up must not be cut short into a full replay).\nasync function runBeforeReconnect(\n beforeReconnect: (cursor: number) => number | void | Promise<number | void>,\n cursor: number,\n signal: AbortSignal | undefined,\n): Promise<number | void> {\n if (!signal) return await beforeReconnect(cursor);\n if (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n abortListener = () => reject(new DOMException(\"Aborted\", \"AbortError\"));\n signal.addEventListener(\"abort\", abortListener, { once: true });\n });\n try {\n return await Promise.race([Promise.resolve().then(() => beforeReconnect(cursor)), aborted]);\n } finally {\n if (abortListener) signal.removeEventListener(\"abort\", abortListener);\n }\n}\n\nexport function jitteredDelay(delayMs: number, ratio: number): number {\n if (delayMs <= 0 || ratio <= 0) return delayMs;\n const boundedRatio = Math.min(ratio, 1);\n const spread = delayMs * boundedRatio;\n return Math.max(0, delayMs - spread + Math.random() * spread * 2);\n}\n\nexport function withStreamInactivityTimeout(\n stream: ReadableStream<Uint8Array>,\n timeoutMs: number,\n signal: AbortSignal | undefined,\n): ReadableStream<Uint8Array> {\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new RangeError(\"stream heartbeat timeout must be a positive safe integer\");\n }\n const reader = stream.getReader();\n return new ReadableStream<Uint8Array>({\n pull: async (controller) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let abortListener: (() => void) | undefined;\n try {\n const result = await Promise.race([\n reader.read(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new TypeError(`event stream heartbeat timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n if (signal) {\n abortListener = () => reject(new DOMException(\"Aborted\", \"AbortError\"));\n signal.addEventListener(\"abort\", abortListener, { once: true });\n }\n }),\n ]);\n if (result.done) controller.close();\n else controller.enqueue(result.value);\n } catch (error) {\n void reader.cancel(error).catch(() => {});\n controller.error(error);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n if (signal && abortListener) signal.removeEventListener(\"abort\", abortListener);\n }\n },\n cancel: (reason) => {\n // Do not wait for the underlying body: it may settle cancel() only after\n // its request aborts (see parseSseStream).\n void reader.cancel(reason).catch(() => {});\n },\n });\n}\n\n/**\n * Yield the durable events with `fromExclusive < sequence <= toInclusive`,\n * in order. Sequences are contiguous, so every one of them must exist in the\n * replay endpoint; if any is missing the function throws instead of skipping\n * it — continuing would silently break the gap-free delivery guarantee.\n */\nasync function* backfillEvents(\n transport: SessionEventStreamTransport,\n fromExclusive: number,\n toInclusive: number,\n): AsyncGenerator<SessionEvent, void, void> {\n let cursor = fromExclusive;\n while (cursor < toInclusive) {\n const page = await transport.listEvents(cursor, Math.min(500, toInclusive - cursor));\n const advancing = page\n .filter((event) => event.sequence > cursor && event.sequence <= toInclusive)\n .sort((a, b) => a.sequence - b.sequence);\n if (advancing.length === 0) {\n throw new OpenGeniStreamError(\n `event replay backfill stalled: expected sequences ${cursor + 1}..${toInclusive} but the replay endpoint returned none of them`,\n );\n }\n for (const event of advancing) {\n if (event.sequence !== cursor + 1) {\n throw new OpenGeniStreamError(\n `event replay backfill is missing sequence ${cursor + 1} (replay endpoint skipped to ${event.sequence}); refusing to deliver with a gap`,\n );\n }\n cursor = event.sequence;\n yield event;\n }\n }\n}\n\nfunction parseSessionEvent(data: string): SessionEvent | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as { sequence?: unknown }).sequence !== \"number\" ||\n typeof (parsed as { type?: unknown }).type !== \"string\" ||\n typeof (parsed as { id?: unknown }).id !== \"string\"\n ) {\n return null;\n }\n return parsed as SessionEvent;\n}\n\n/** Trusted SSE coverage attached non-enumerably to a streamed event. */\nexport function sessionEventStreamCoveredThrough(event: SessionEvent): number | null {\n const covered = (event as SessionEvent & { [SESSION_EVENT_STREAM_COVERAGE]?: unknown })[\n SESSION_EVENT_STREAM_COVERAGE\n ];\n return typeof covered === \"number\" && Number.isSafeInteger(covered) && covered >= event.sequence\n ? covered\n : null;\n}\n\nfunction trustedSseSequence(id: string | undefined, sequence: number): number {\n if (id === undefined || !/^\\d+$/.test(id)) return sequence;\n const covered = Number(id);\n return Number.isSafeInteger(covered) && covered >= sequence ? covered : sequence;\n}\n\nfunction markSessionEventStreamCoverage(event: SessionEvent, covered: number): void {\n Object.defineProperty(event, SESSION_EVENT_STREAM_COVERAGE, {\n value: covered,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n}\n\nasync function sleep(delayMs: number, signal: AbortSignal | undefined): Promise<void> {\n if (signal?.aborted || delayMs <= 0) {\n return;\n }\n await new Promise<void>((resolve) => {\n const timer = setTimeout(done, delayMs);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  OpenGeniDocumentAuthorityClient
3
- } from "./chunk-HXEJSFM5.js";
3
+ } from "./chunk-LVH6IWCL.js";
4
4
 
5
5
  // src/artifact-client.ts
6
6
  var OpenGeniClient = class extends OpenGeniDocumentAuthorityClient {
@@ -121,4 +121,4 @@ var OpenGeniClient = class extends OpenGeniDocumentAuthorityClient {
121
121
  export {
122
122
  OpenGeniClient
123
123
  };
124
- //# sourceMappingURL=chunk-TEGGC6O6.js.map
124
+ //# sourceMappingURL=chunk-AYRVQVHK.js.map
@@ -2419,10 +2419,6 @@ function safeError2(error) {
2419
2419
  }
2420
2420
 
2421
2421
  export {
2422
- CodexRealtimeMicrophoneError,
2423
- startCodexRealtimeWebrtc,
2424
- acquireCodexRealtimeMicrophone,
2425
- codexRealtimeMicrophoneHealthy,
2426
2422
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
2427
2423
  CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS,
2428
2424
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
@@ -2437,6 +2433,10 @@ export {
2437
2433
  CODEX_REALTIME_V3_PENDING_MAX_ENTRIES,
2438
2434
  CODEX_REALTIME_V3_PENDING_MAX_BYTES,
2439
2435
  createCodexRealtimeV3Bridge,
2436
+ CodexRealtimeMicrophoneError,
2437
+ startCodexRealtimeWebrtc,
2438
+ acquireCodexRealtimeMicrophone,
2439
+ codexRealtimeMicrophoneHealthy,
2440
2440
  SESSION_REALTIME_MODELS,
2441
2441
  isSessionRealtimeModel,
2442
2442
  projectSessionRealtimeLifecycle,
@@ -2447,4 +2447,4 @@ export {
2447
2447
  hasStoredSessionRealtimeOwnerProof,
2448
2448
  createCodexRealtimeController
2449
2449
  };
2450
- //# sourceMappingURL=chunk-SA556DB2.js.map
2450
+ //# sourceMappingURL=chunk-EX75IJAN.js.map
@@ -9,11 +9,11 @@ import {
9
9
  SESSION_SEQUENCE_HEADER,
10
10
  observedSessionSequence,
11
11
  sessionEventStreamCoveredThrough
12
- } from "./chunk-MDH4DVHY.js";
12
+ } from "./chunk-72YZCZWF.js";
13
13
  import {
14
14
  OPENGENI_API_CONTRACT_HEADER,
15
15
  OPENGENI_API_CONTRACT_REVISION
16
- } from "./chunk-GNHC2T6W.js";
16
+ } from "./chunk-NYGAWWXV.js";
17
17
  import {
18
18
  OpenGeniApiError,
19
19
  OpenGeniSetupError
@@ -1604,8 +1604,8 @@ function workspaceLiveStream(client, workspaceId, params, request, heartbeatMs)
1604
1604
  const event = next.value;
1605
1605
  controller.enqueue(
1606
1606
  encoder.encode(
1607
- `id: ${event.sequence}
1608
- event: ${event.type}
1607
+ `${"sequence" in event ? `id: ${event.sequence}
1608
+ ` : ""}event: ${event.type}
1609
1609
  data: ${JSON.stringify(event)}
1610
1610
 
1611
1611
  `
@@ -1702,4 +1702,4 @@ export {
1702
1702
  createSessionProxyHandler,
1703
1703
  artifactViewerCapability
1704
1704
  };
1705
- //# sourceMappingURL=chunk-3N4DFMLW.js.map
1705
+ //# sourceMappingURL=chunk-G53Y7PIB.js.map