@kortyx/react 0.4.3 → 0.6.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/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @kortyx/react
2
2
 
3
+ ## [0.6.0](https://github.com/kortyx-io/kortyx/compare/react-v0.5.0...react-v0.6.0) (2026-09-21)
4
+
5
+
6
+ ### Features
7
+
8
+ * **hooks:** add model-driven interrupt contracts to useReason ([#224](https://github.com/kortyx-io/kortyx/issues/224)) ([e0147d5](https://github.com/kortyx-io/kortyx/commit/e0147d5234ca38d450d452af924b242f8cbdeb16))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @kortyx/stream bumped to 0.13.0
16
+ * @kortyx/core bumped to 0.10.0
17
+
18
+ ## [0.5.0](https://github.com/kortyx-io/kortyx/compare/react-v0.4.3...react-v0.5.0) (2026-09-14)
19
+
20
+
21
+ ### ⚠ BREAKING CHANGES
22
+
23
+ * **errors:** public failure messages and default HTTP statuses change; malformed streams fail explicitly, provider error classes are shared, and retry helpers exclude control flow. Existing calls and legacy records remain supported. See the error-contract migration and release notes.
24
+
25
+ ### Features
26
+
27
+ * **errors:** harden failure contracts across execution and recovery ([#175](https://github.com/kortyx-io/kortyx/issues/175)) ([d231e36](https://github.com/kortyx-io/kortyx/commit/d231e364259a4f23fc3675d8783fde5ba338416e))
28
+
29
+
30
+ ### Dependencies
31
+
32
+ * The following workspace dependencies were updated
33
+ * dependencies
34
+ * @kortyx/stream bumped to 0.12.0
35
+ * @kortyx/core bumped to 0.9.0
36
+
3
37
  ## [0.4.3](https://github.com/kortyx-io/kortyx/compare/react-v0.4.2...react-v0.4.3) (2026-09-10)
4
38
 
5
39
 
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { StructuredStreamState, StreamChunk, StreamFromRouteArgs, StructuredDataChunk } from '@kortyx/stream/browser';
2
+ import * as _kortyx_core_errors from '@kortyx/core/errors';
3
+ import { FailureDescriptor } from '@kortyx/core/errors';
2
4
 
3
5
  type StructuredData = StructuredStreamState<Record<string, unknown>>;
4
6
  type HumanInputPiece = {
@@ -6,7 +8,7 @@ type HumanInputPiece = {
6
8
  type: "interrupt";
7
9
  resumeToken: string;
8
10
  requestId: string;
9
- kind: "text" | "choice" | "multi-choice";
11
+ kind: "text" | "choice" | "multi-choice" | "custom";
10
12
  question?: string;
11
13
  multiple: boolean;
12
14
  options: Array<{
@@ -16,6 +18,8 @@ type HumanInputPiece = {
16
18
  }>;
17
19
  schemaId?: string;
18
20
  schemaVersion?: string;
21
+ contract?: string;
22
+ request?: unknown;
19
23
  interruptId?: string;
20
24
  meta?: Record<string, unknown>;
21
25
  };
@@ -31,6 +35,7 @@ type ContentPiece = {
31
35
  id: string;
32
36
  type: "error";
33
37
  content: string;
38
+ failure?: FailureDescriptor;
34
39
  } | HumanInputPiece;
35
40
  type ChatMsg = {
36
41
  id: string;
@@ -51,6 +56,7 @@ type ChatMsg = {
51
56
  requestId: string;
52
57
  selected: string[];
53
58
  text?: string;
59
+ value?: unknown;
54
60
  };
55
61
  };
56
62
 
@@ -222,6 +228,7 @@ type LiveChatStructuredPiece<TStructuredData = unknown> = {
222
228
  type LiveChatErrorPiece = {
223
229
  id: string;
224
230
  type: "error";
231
+ failure?: FailureDescriptor;
225
232
  content: string;
226
233
  };
227
234
  type LiveChatCustomPiece = {
@@ -282,10 +289,13 @@ type UseChatValue = {
282
289
  requestId: string;
283
290
  selected: string[];
284
291
  text?: string;
292
+ value?: unknown;
293
+ hasValue?: boolean;
285
294
  }) => Promise<void> | void;
286
295
  respondToInterrupt: (piece: HumanInputPiece, response?: {
287
296
  selected?: string[] | undefined;
288
297
  text?: string | undefined;
298
+ value?: unknown;
289
299
  }) => Promise<void> | void;
290
300
  setMessages: React.Dispatch<React.SetStateAction<ChatMsg[]>>;
291
301
  checkpointForMessage: (messageId: string) => string | null;
@@ -419,6 +429,7 @@ declare function useChatStreamDebug(): {
419
429
  tool: string;
420
430
  toolCallId: string;
421
431
  message: string;
432
+ failure?: _kortyx_core_errors.FailureDescriptor;
422
433
  node?: string;
423
434
  id?: string;
424
435
  opId?: string;
@@ -441,6 +452,17 @@ declare function useChatStreamDebug(): {
441
452
  schemaVersion?: string;
442
453
  meta?: Record<string, unknown>;
443
454
  options?: never[];
455
+ } | {
456
+ kind: "custom";
457
+ multiple: false;
458
+ request: unknown;
459
+ schemaId: string;
460
+ schemaVersion: string;
461
+ question?: string;
462
+ contract?: string;
463
+ id?: string;
464
+ meta?: Record<string, unknown>;
465
+ options?: never[];
444
466
  } | {
445
467
  kind: "choice" | "multi-choice";
446
468
  multiple: boolean;
@@ -519,6 +541,7 @@ declare function useChatStreamDebug(): {
519
541
  } | {
520
542
  type: "error";
521
543
  message: string;
544
+ failure?: _kortyx_core_errors.FailureDescriptor;
522
545
  })[];
523
546
  clearStreamDebug: () => void;
524
547
  createRecorder: (initialMessage: string) => {
@@ -597,6 +620,7 @@ declare function useChatStreamDebug(): {
597
620
  tool: string;
598
621
  toolCallId: string;
599
622
  message: string;
623
+ failure?: _kortyx_core_errors.FailureDescriptor;
600
624
  node?: string;
601
625
  id?: string;
602
626
  opId?: string;
@@ -619,6 +643,17 @@ declare function useChatStreamDebug(): {
619
643
  schemaVersion?: string;
620
644
  meta?: Record<string, unknown>;
621
645
  options?: never[];
646
+ } | {
647
+ kind: "custom";
648
+ multiple: false;
649
+ request: unknown;
650
+ schemaId: string;
651
+ schemaVersion: string;
652
+ question?: string;
653
+ contract?: string;
654
+ id?: string;
655
+ meta?: Record<string, unknown>;
656
+ options?: never[];
622
657
  } | {
623
658
  kind: "choice" | "multi-choice";
624
659
  multiple: boolean;
@@ -697,6 +732,7 @@ declare function useChatStreamDebug(): {
697
732
  } | {
698
733
  type: "error";
699
734
  message: string;
735
+ failure?: _kortyx_core_errors.FailureDescriptor;
700
736
  })[];
701
737
  };
702
738
  };
package/dist/index.js CHANGED
@@ -175,6 +175,7 @@ function createBrowserChatStorage(options) {
175
175
  }
176
176
 
177
177
  // src/chat-transport.ts
178
+ var import_errors = require("@kortyx/core/errors");
178
179
  var import_browser = require("@kortyx/stream/browser");
179
180
  function createChatTransport(args) {
180
181
  return {
@@ -222,13 +223,19 @@ function createRouteChatTransport(args) {
222
223
  body: JSON.stringify(body)
223
224
  });
224
225
  if (!response.ok) {
226
+ let failure;
225
227
  let message = `Checkpoint request failed with status ${response.status}`;
226
228
  try {
227
229
  const parsed = await response.json();
230
+ failure = parsed.failure;
228
231
  if (typeof parsed.error === "string") message = parsed.error;
229
232
  } catch {
230
233
  }
231
- throw new Error(message);
234
+ throw (0, import_errors.isFailureDescriptor)(failure) ? (0, import_errors.errorFromFailure)(failure) : new import_errors.KortyxError("CHECKPOINT_REQUEST_FAILED", message, {
235
+ category: "transport",
236
+ status: response.status,
237
+ safeMessage: message
238
+ });
232
239
  }
233
240
  return await response.json();
234
241
  };
@@ -354,7 +361,8 @@ function createLiveChatPieces(args) {
354
361
  pushPiece({
355
362
  id: args.createId(),
356
363
  type: "error",
357
- content: chunk.message ?? "An error occurred"
364
+ content: chunk.message ?? "An error occurred",
365
+ ...chunk.failure ? { failure: chunk.failure } : {}
358
366
  });
359
367
  return true;
360
368
  }
@@ -390,6 +398,7 @@ function toHumanInputPiece(args) {
390
398
  input.schemaVersion
391
399
  );
392
400
  const interruptId = firstNonEmptyString(hi.id, input.id);
401
+ const contract = nonEmptyString(input.contract);
393
402
  const inputMeta = isRecord(input.meta) ? input.meta : void 0;
394
403
  const chunkMeta = isRecord(hi.meta) ? hi.meta : void 0;
395
404
  const meta = inputMeta || chunkMeta ? { ...inputMeta ?? {}, ...chunkMeta ?? {} } : void 0;
@@ -412,11 +421,14 @@ function toHumanInputPiece(args) {
412
421
  ...schemaId ? { schemaId } : {},
413
422
  ...schemaVersion ? { schemaVersion } : {},
414
423
  ...interruptId ? { interruptId } : {},
424
+ ...contract ? { contract } : {},
425
+ ...Object.hasOwn(input, "request") ? { request: input.request } : {},
415
426
  ...meta ? { meta } : {}
416
427
  };
417
428
  }
418
429
 
419
430
  // src/use-chat.ts
431
+ var import_errors2 = require("@kortyx/core/errors");
420
432
  var import_react3 = require("react");
421
433
 
422
434
  // src/use-chat-stream-debug.ts
@@ -897,7 +909,9 @@ function useChat(options) {
897
909
  return;
898
910
  }
899
911
  if (chunk.type === "error") {
900
- setError(new Error(chunk.message));
912
+ setError(
913
+ (0, import_errors2.isFailureDescriptor)(chunk.failure) ? (0, import_errors2.errorFromFailure)(chunk.failure) : new Error(chunk.message)
914
+ );
901
915
  }
902
916
  if (chunk.type === "done") {
903
917
  completedTrace = currentTrace;
@@ -935,12 +949,14 @@ function useChat(options) {
935
949
  requestId,
936
950
  selected,
937
951
  text,
952
+ value,
953
+ hasValue,
938
954
  baseMessages,
939
955
  sid
940
956
  }) => {
941
957
  if (isStreaming) return void 0;
942
958
  setError(null);
943
- const label = typeof text === "string" && text.length > 0 ? text : selected.length > 0 ? selected.length === 1 ? selected[0] : selected.join(", ") : "(selection)";
959
+ const label = typeof text === "string" && text.length > 0 ? text : selected.length > 0 ? selected.length === 1 ? selected[0] : selected.join(", ") : hasValue ? "(response)" : "(selection)";
944
960
  const userId = createId();
945
961
  const userMsg = {
946
962
  id: userId,
@@ -951,7 +967,8 @@ function useChat(options) {
951
967
  resumeToken,
952
968
  requestId,
953
969
  selected,
954
- ...text !== void 0 ? { text } : {}
970
+ ...text !== void 0 ? { text } : {},
971
+ ...hasValue ? { value } : {}
955
972
  }
956
973
  };
957
974
  const nextMessages = [...baseMessages ?? messages, userMsg];
@@ -964,7 +981,12 @@ function useChat(options) {
964
981
  abortControllerRef.current = abortController;
965
982
  try {
966
983
  const resumePayload = {
967
- resume: { token: resumeToken, requestId, selected }
984
+ resume: {
985
+ token: resumeToken,
986
+ requestId,
987
+ selected,
988
+ ...hasValue ? { value } : {}
989
+ }
968
990
  };
969
991
  const outgoing = {
970
992
  role: "user",
@@ -1007,12 +1029,14 @@ function useChat(options) {
1007
1029
  };
1008
1030
  const respondToInterrupt = async (piece, response) => {
1009
1031
  const text = response?.text;
1032
+ const hasValue = Boolean(response && Object.hasOwn(response, "value"));
1010
1033
  const selected = response?.selected ?? (typeof text === "string" && text.length > 0 ? [text] : []);
1011
1034
  await respondToHumanInput({
1012
1035
  resumeToken: piece.resumeToken,
1013
1036
  requestId: piece.requestId,
1014
1037
  selected,
1015
- ...text !== void 0 ? { text } : {}
1038
+ ...text !== void 0 ? { text } : {},
1039
+ ...hasValue ? { value: response?.value, hasValue: true } : {}
1016
1040
  });
1017
1041
  };
1018
1042
  const sendFromBase = async (text, baseMessages, sid) => {
@@ -1252,7 +1276,8 @@ function useChat(options) {
1252
1276
  selected: editedContent !== void 0 ? [editedContent] : userMessage.source.selected,
1253
1277
  baseMessages,
1254
1278
  sid: options2?.sid,
1255
- ...editedContent !== void 0 ? { text: editedContent } : userMessage.source.text !== void 0 ? { text: userMessage.source.text } : {}
1279
+ ...editedContent !== void 0 ? { text: editedContent } : userMessage.source.text !== void 0 ? { text: userMessage.source.text } : {},
1280
+ ...editedContent === void 0 && Object.hasOwn(userMessage.source, "value") ? { value: userMessage.source.value, hasValue: true } : {}
1256
1281
  });
1257
1282
  }
1258
1283
  return sendFromBase(content, baseMessages, options2?.sid);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/build-assistant-message.ts","../src/chat-storage.ts","../src/chat-transport.ts","../src/create-live-chat-pieces.ts","../src/to-human-input-piece.ts","../src/use-chat.ts","../src/use-chat-stream-debug.ts","../src/use-structured-streams.ts"],"sourcesContent":["export * from \"./build-assistant-message\";\nexport * from \"./chat-storage\";\nexport * from \"./chat-transport\";\nexport * from \"./chat-types\";\nexport * from \"./create-live-chat-pieces\";\nexport * from \"./to-human-input-piece\";\nexport * from \"./use-chat\";\nexport * from \"./use-chat-stream-debug\";\nexport * from \"./use-structured-streams\";\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { ChatMsg, ContentPiece } from \"./chat-types\";\n\nexport function buildAssistantMessage(args: {\n createId: () => string;\n pieces: ContentPiece[];\n debug: StreamChunk[];\n trace?:\n | {\n traceId: string;\n spanId: string;\n runId: string;\n }\n | undefined;\n checkpoint?:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n}): ChatMsg {\n const plainTextContent = args.pieces\n .filter(\n (piece): piece is Extract<ContentPiece, { type: \"text\" }> =>\n piece.type === \"text\",\n )\n .map((piece) => piece.content)\n .join(\"\");\n\n const base = {\n id: args.createId(),\n role: \"assistant\" as const,\n content: plainTextContent,\n debug: args.debug,\n ...(args.trace ? args.trace : {}),\n ...(args.checkpoint\n ? {\n checkpointId: args.checkpoint.id,\n checkpointTurnIndex: args.checkpoint.turnIndex,\n }\n : {}),\n };\n\n return args.pieces.length > 0\n ? { ...base, contentPieces: args.pieces }\n : base;\n}\n","type MaybePromise<T> = T | Promise<T>;\ntype StorageLike = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\nexport type PersistedChatState<TMessage> = {\n sessionId: string | null;\n workflowId: string;\n includeHistory: boolean;\n messages: TMessage[];\n branches?: Record<\n string,\n {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints?: unknown[];\n }\n >;\n responseVariants?: unknown[];\n};\n\nexport type ChatStorage<TMessage> = {\n load: () => MaybePromise<Partial<PersistedChatState<TMessage>>>;\n save: (state: PersistedChatState<TMessage>) => MaybePromise<void>;\n clearMessages: () => MaybePromise<void>;\n};\n\nexport type BrowserChatStorageKeys = {\n messages: string;\n includeHistory: string;\n sessionId: string;\n workflowId: string;\n branches: string;\n responseVariants: string;\n};\n\nexport type BrowserChatStorageOptions<TMessage> = {\n parseMessage?: ((value: unknown) => TMessage | null) | undefined;\n serializeMessage?: ((message: TMessage) => unknown) | undefined;\n maxMessages?: number | undefined;\n keys?: Partial<BrowserChatStorageKeys> | undefined;\n};\n\nconst DEFAULT_STORAGE_KEYS: BrowserChatStorageKeys = {\n messages: \"chat.messages.v1\",\n includeHistory: \"chat.includeHistory.v1\",\n sessionId: \"chat.sessionId\",\n workflowId: \"chat.workflowId\",\n branches: \"chat.branches.v1\",\n responseVariants: \"chat.responseVariants.v1\",\n};\n\nconst getLocalStorage = (): StorageLike | undefined => {\n const candidate = globalThis as { localStorage?: StorageLike };\n return candidate.localStorage;\n};\n\nconst defaultParseMessage = <TMessage>(value: unknown): TMessage | null =>\n value as TMessage;\n\nconst defaultSerializeMessage = <TMessage>(message: TMessage): unknown =>\n message;\n\n// TODO: Make remote/custom persistence more robust before freezing this API:\n// - add debouncing so repeated message updates do not trigger a full save each time\n// - surface save error handling/retry hooks instead of silently ignoring failures\n// - define a conflict/version strategy for multi-tab and server-synced storage\n// - support partial saves instead of rewriting the full persisted state on each change\nexport function createBrowserChatStorage<TMessage = unknown>(\n options?: BrowserChatStorageOptions<TMessage>,\n): ChatStorage<TMessage> {\n const keys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(options?.keys ?? {}),\n };\n const maxMessages = options?.maxMessages ?? 60;\n const parseMessage = options?.parseMessage ?? defaultParseMessage<TMessage>;\n const serializeMessage =\n options?.serializeMessage ?? defaultSerializeMessage<TMessage>;\n\n return {\n load() {\n try {\n const storage = getLocalStorage();\n if (!storage) {\n return {};\n }\n\n const sessionId = storage.getItem(keys.sessionId);\n const workflowId = storage.getItem(keys.workflowId) ?? \"\";\n const includeHistoryRaw = storage.getItem(keys.includeHistory);\n const rawMessages = storage.getItem(keys.messages);\n const rawBranches = storage.getItem(keys.branches);\n const rawResponseVariants = storage.getItem(keys.responseVariants);\n const parsedMessages = rawMessages\n ? (JSON.parse(rawMessages) as unknown)\n : [];\n const messages = Array.isArray(parsedMessages)\n ? parsedMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n : [];\n const parsedBranches = rawBranches\n ? (JSON.parse(rawBranches) as unknown)\n : undefined;\n const branches =\n parsedBranches && typeof parsedBranches === \"object\"\n ? Object.fromEntries(\n Object.entries(\n parsedBranches as Record<\n string,\n {\n sessionId?: unknown;\n parentSessionId?: unknown;\n forkedFrom?: unknown;\n messages?: unknown;\n checkpoints?: unknown;\n }\n >,\n ).flatMap(([sessionId, branch]) => {\n if (typeof branch.sessionId !== \"string\") return [];\n const rawBranchMessages = Array.isArray(branch.messages)\n ? branch.messages\n : [];\n const branchMessages = rawBranchMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n .slice(-maxMessages);\n return [\n [\n sessionId,\n {\n sessionId: branch.sessionId,\n ...(typeof branch.parentSessionId === \"string\"\n ? { parentSessionId: branch.parentSessionId }\n : {}),\n ...(typeof branch.forkedFrom === \"string\"\n ? { forkedFrom: branch.forkedFrom }\n : {}),\n messages: branchMessages,\n ...(Array.isArray(branch.checkpoints)\n ? { checkpoints: branch.checkpoints }\n : {}),\n },\n ],\n ];\n }),\n )\n : undefined;\n const parsedResponseVariants = rawResponseVariants\n ? (JSON.parse(rawResponseVariants) as unknown)\n : undefined;\n\n return {\n sessionId,\n workflowId,\n includeHistory: includeHistoryRaw !== \"0\",\n messages,\n ...(branches ? { branches } : {}),\n ...(Array.isArray(parsedResponseVariants)\n ? { responseVariants: parsedResponseVariants }\n : {}),\n };\n } catch {\n return {};\n }\n },\n\n save(state) {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n\n if (state.sessionId) {\n storage.setItem(keys.sessionId, state.sessionId);\n } else {\n storage.removeItem(keys.sessionId);\n }\n\n storage.setItem(keys.workflowId, state.workflowId);\n storage.setItem(keys.includeHistory, state.includeHistory ? \"1\" : \"0\");\n\n const trimmedMessages = state.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message));\n\n storage.setItem(keys.messages, JSON.stringify(trimmedMessages));\n if (state.branches) {\n const serializedBranches = Object.fromEntries(\n Object.entries(state.branches).map(([sessionId, branch]) => [\n sessionId,\n {\n ...branch,\n messages: branch.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message)),\n },\n ]),\n );\n storage.setItem(keys.branches, JSON.stringify(serializedBranches));\n } else {\n storage.removeItem(keys.branches);\n }\n\n if (state.responseVariants) {\n storage.setItem(\n keys.responseVariants,\n JSON.stringify(state.responseVariants),\n );\n } else {\n storage.removeItem(keys.responseVariants);\n }\n } catch {}\n },\n\n clearMessages() {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n storage.removeItem(keys.messages);\n storage.removeItem(keys.branches);\n storage.removeItem(keys.responseVariants);\n } catch {}\n },\n };\n}\n","import type { StreamChunk, StreamFromRouteArgs } from \"@kortyx/stream/browser\";\nimport { streamFromRoute } from \"@kortyx/stream/browser\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype DefaultChatContext = Record<string, unknown>;\n\nexport type OutgoingChatMessage = {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type ChatTransportContext<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n signal?: AbortSignal | undefined;\n};\n\nexport type ChatTransportChunkHandler = (\n chunk: StreamChunk,\n) => undefined | boolean | Promise<boolean | undefined>;\n\nexport type CheckpointSummary = {\n id: string;\n sessionId: string;\n turnIndex: number;\n createdAt: number;\n nodes: string[];\n workflow: string;\n label?: string;\n};\n\nexport type RollbackCheckpointResult = {\n sessionId: string;\n head: string;\n invalidatedStructuredStreamIds: string[];\n invalidatedInterruptTokens: string[];\n};\n\nexport type ForkPendingRequest = {\n token: string;\n requestId: string;\n schema?: {\n kind?: \"choice\" | \"multi-choice\" | \"text\";\n multiple?: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n };\n options?: Array<{ id: string; label: string; description?: string }>;\n};\n\nexport type ForkCheckpointResult = {\n sessionId: string;\n parentSessionId: string;\n forkedFrom: string;\n checkpoint?: {\n id: string;\n sessionId: string;\n turnIndex: number;\n activePendingRequests?: ForkPendingRequest[];\n };\n};\n\nexport type ChatTransport<TContext = DefaultChatContext> = {\n stream(\n args: ChatTransportContext<TContext> & {\n onChunk: ChatTransportChunkHandler;\n },\n ): Promise<void>;\n listCheckpoints?: (sessionId: string) => Promise<CheckpointSummary[]>;\n rollbackTo?: (checkpointId: string) => Promise<RollbackCheckpointResult>;\n fork?: (\n checkpointId: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n};\n\nexport type ChatTransportChunkSource =\n | Iterable<StreamChunk>\n | AsyncIterable<StreamChunk>;\n\nexport function createChatTransport<TContext = DefaultChatContext>(args: {\n stream: (\n context: ChatTransportContext<TContext>,\n ) => MaybePromise<ChatTransportChunkSource>;\n}): ChatTransport<TContext> {\n return {\n async stream({ onChunk, ...context }) {\n for await (const chunk of await args.stream(context)) {\n const shouldContinue = await onChunk(chunk);\n if (chunk.type === \"done\" || shouldContinue === false) {\n break;\n }\n }\n },\n };\n}\n\nexport type RouteChatRequestBody<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n};\n\nexport type CreateRouteChatTransportArgs<TBody, TContext> = Omit<\n StreamFromRouteArgs<TBody>,\n \"body\"\n> & {\n createBody?: ((context: ChatTransportContext<TContext>) => TBody) | undefined;\n checkpointEndpoint?: string | undefined;\n};\n\nexport function createRouteChatTransport<\n TContext = DefaultChatContext,\n TBody = RouteChatRequestBody<TContext>,\n>(\n args: CreateRouteChatTransportArgs<TBody, TContext>,\n): ChatTransport<TContext> {\n const transport = createChatTransport<TContext>({\n stream: (context) => {\n const body =\n args.createBody?.(context) ??\n ({\n sessionId: context.sessionId,\n workflowId: context.workflowId,\n messages: context.messages,\n context: context.context,\n } as TBody);\n const routeArgs: StreamFromRouteArgs<TBody> = {\n endpoint: args.endpoint,\n body,\n ...(args.method ? { method: args.method } : {}),\n ...(args.headers ? { headers: args.headers } : {}),\n ...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),\n ...(context.signal ? { signal: context.signal } : {}),\n };\n\n return streamFromRoute({\n ...routeArgs,\n });\n },\n });\n\n if (!args.checkpointEndpoint) return transport;\n\n const fetchJson = async <TResult>(\n body: Record<string, unknown>,\n ): Promise<TResult> => {\n const fetchImpl = args.fetchImpl ?? fetch;\n const response = await fetchImpl(args.checkpointEndpoint as string, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n let message = `Checkpoint request failed with status ${response.status}`;\n try {\n const parsed = (await response.json()) as { error?: unknown };\n if (typeof parsed.error === \"string\") message = parsed.error;\n } catch {}\n throw new Error(message);\n }\n return (await response.json()) as TResult;\n };\n\n return {\n ...transport,\n listCheckpoints: (sessionId) =>\n fetchJson<CheckpointSummary[]>({ action: \"list\", sessionId }),\n rollbackTo: (checkpointId) =>\n fetchJson<RollbackCheckpointResult>({\n action: \"rollback\",\n checkpointId,\n }),\n fork: (checkpointId, options) =>\n fetchJson<ForkCheckpointResult>({\n action: \"fork\",\n checkpointId,\n ...(options?.newSessionId\n ? { newSessionId: options.newSessionId }\n : {}),\n }),\n };\n}\n","import type {\n StreamChunk,\n StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport type { StructuredStreamItem } from \"./use-structured-streams\";\n\nexport type LiveChatTextPiece = {\n id: string;\n type: \"text\";\n content: string;\n};\n\nexport type LiveChatStructuredPiece<TStructuredData = unknown> = {\n id: string;\n type: \"structured\";\n data: StructuredStreamState<TStructuredData>;\n};\n\nexport type LiveChatErrorPiece = {\n id: string;\n type: \"error\";\n content: string;\n};\n\ntype LiveChatCustomPiece = {\n id: string;\n type: string;\n};\n\nexport type LiveChatPiece<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n> =\n | LiveChatTextPiece\n | LiveChatStructuredPiece<TStructuredData>\n | LiveChatErrorPiece\n | TCustomPiece;\n\ntype StructuredStreamsController<TStructuredData> = {\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TStructuredData> | undefined;\n};\n\nconst isNonEmptyTextPiece = <\n TStructuredData,\n TCustomPiece extends LiveChatCustomPiece,\n>(\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n) =>\n piece.type !== \"text\" ||\n (\"content\" in piece &&\n typeof piece.content === \"string\" &&\n piece.content.length > 0);\n\nexport function createLiveChatPieces<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n>(args: {\n createId: () => string;\n onChange: (pieces: LiveChatPiece<TStructuredData, TCustomPiece>[]) => void;\n structuredStreams: StructuredStreamsController<TStructuredData>;\n toHumanInputPiece: (chunk: StreamChunk) => TCustomPiece;\n}) {\n const keyedPieces: Array<{\n key: string;\n piece: LiveChatPiece<TStructuredData, TCustomPiece>;\n }> = [];\n let sawTextDelta = false;\n\n const emit = () => {\n args.onChange(\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n );\n };\n\n const findPieceIndex = (key: string) =>\n keyedPieces.findIndex((entry) => entry.key === key);\n\n const upsertPiece = (\n key: string,\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n ) => {\n const existingIndex = findPieceIndex(key);\n if (existingIndex >= 0) {\n keyedPieces[existingIndex] = { key, piece };\n } else {\n keyedPieces.push({ key, piece });\n }\n emit();\n };\n\n const pushPiece = (piece: LiveChatPiece<TStructuredData, TCustomPiece>) => {\n keyedPieces.push({\n key: `${piece.type}:${piece.id}`,\n piece,\n });\n emit();\n };\n\n const resolveTextStreamKey = (\n chunk: StreamChunk,\n fallbackNode?: string,\n ): string => {\n if (\"segmentId\" in chunk && typeof chunk.segmentId === \"string\") {\n const seg = chunk.segmentId.trim();\n if (seg.length > 0) {\n const op =\n \"opId\" in chunk && typeof chunk.opId === \"string\"\n ? chunk.opId.trim()\n : \"\";\n return op.length > 0 ? `${op}:${seg}` : seg;\n }\n }\n\n if (\"opId\" in chunk && typeof chunk.opId === \"string\") {\n const op = chunk.opId.trim();\n if (op.length > 0) {\n const node =\n (\"node\" in chunk && typeof chunk.node === \"string\"\n ? chunk.node\n : fallbackNode) ?? \"__unknown__\";\n return `${op}:${node}`;\n }\n }\n\n return fallbackNode && fallbackNode.length > 0\n ? fallbackNode\n : \"__unknown__\";\n };\n\n const ensureTextPiece = (key: string): LiveChatTextPiece => {\n const pieceKey = `text:${key}`;\n const existingIndex = findPieceIndex(pieceKey);\n if (existingIndex >= 0) {\n return keyedPieces[existingIndex]?.piece as LiveChatTextPiece;\n }\n\n const nextPiece: LiveChatTextPiece = {\n id: args.createId(),\n type: \"text\",\n content: \"\",\n };\n keyedPieces.push({ key: pieceKey, piece: nextPiece });\n return nextPiece;\n };\n\n const processChunk = (\n chunk: StreamChunk,\n _options?: { openDebugOnInterrupt?: boolean | undefined },\n ): boolean => {\n if (chunk.type === \"text-start\") {\n ensureTextPiece(resolveTextStreamKey(chunk, chunk.node));\n emit();\n return true;\n }\n\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n const streamKey = resolveTextStreamKey(chunk, chunk.node);\n const current = ensureTextPiece(streamKey);\n upsertPiece(`text:${streamKey}`, {\n ...current,\n content: current.content + chunk.delta,\n });\n return true;\n }\n\n if (chunk.type === \"text-end\") {\n emit();\n return true;\n }\n\n if (chunk.type === \"structured-data\") {\n const nextItem = args.structuredStreams.applyStreamChunk(chunk);\n if (nextItem) {\n upsertPiece(`structured:${nextItem.streamId}`, {\n id: nextItem.id,\n type: \"structured\",\n data: nextItem.state,\n });\n }\n return true;\n }\n\n if (chunk.type === \"interrupt\") {\n pushPiece(args.toHumanInputPiece(chunk));\n return true;\n }\n\n if (chunk.type === \"message\") {\n if (!sawTextDelta) {\n pushPiece({\n id: args.createId(),\n type: \"text\",\n content: chunk.content ?? \"\",\n });\n }\n return true;\n }\n\n if (chunk.type === \"error\") {\n pushPiece({\n id: args.createId(),\n type: \"error\",\n content: chunk.message ?? \"An error occurred\",\n });\n return true;\n }\n\n if (chunk.type === \"done\") {\n return false;\n }\n\n return true;\n };\n\n return {\n processChunk,\n getPieces: () =>\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n };\n}\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { HumanInputPiece } from \"./chat-types\";\n\ninterface HumanInputStreamChunk {\n type: \"interrupt\";\n requestId: string | undefined;\n resumeToken: string | undefined;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n input?: {\n kind?: \"text\" | \"choice\" | \"multi-choice\";\n question?: string;\n multiple?: boolean;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n options?: Array<{\n id?: string | number;\n label?: string;\n description?: string;\n }>;\n };\n}\n\nexport type ToHumanInputPiece = (args: {\n chunk: StreamChunk;\n createId: () => string;\n}) => HumanInputPiece;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst nonEmptyString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst firstNonEmptyString = (...values: unknown[]): string | undefined => {\n for (const value of values) {\n const result = nonEmptyString(value);\n if (result) return result;\n }\n return undefined;\n};\n\nexport function toHumanInputPiece(args: {\n chunk: StreamChunk;\n createId: () => string;\n}): HumanInputPiece {\n const hi = args.chunk as unknown as HumanInputStreamChunk;\n const input = hi.input ?? {};\n const kind = input.kind || (input.multiple ? \"multi-choice\" : \"choice\");\n const isText = kind === \"text\";\n const schemaId = firstNonEmptyString(hi.schemaId, input.schemaId);\n const schemaVersion = firstNonEmptyString(\n hi.schemaVersion,\n input.schemaVersion,\n );\n const interruptId = firstNonEmptyString(hi.id, input.id);\n const inputMeta = isRecord(input.meta) ? input.meta : undefined;\n const chunkMeta = isRecord(hi.meta) ? hi.meta : undefined;\n const meta =\n inputMeta || chunkMeta\n ? { ...(inputMeta ?? {}), ...(chunkMeta ?? {}) }\n : undefined;\n\n const question = isText\n ? input.question\n : typeof input.question === \"string\"\n ? input.question\n : \"Please choose\";\n\n const optionsSrc = Array.isArray(input.options) ? input.options : [];\n const optionsArr: Array<{\n id: string;\n label: string;\n description?: string;\n }> = optionsSrc\n .map((option) => ({\n id: String(option.id ?? \"\"),\n label: String(option.label ?? \"\"),\n ...(typeof option.description === \"string\" && option.description\n ? { description: option.description }\n : {}),\n }))\n .filter((option) => option.id && option.label);\n\n return {\n id: args.createId(),\n type: \"interrupt\",\n resumeToken: String(hi.resumeToken ?? \"\"),\n requestId: String(hi.requestId ?? \"\"),\n kind,\n ...(question !== undefined ? { question } : {}),\n multiple: Boolean(input.multiple),\n options: optionsArr,\n ...(schemaId ? { schemaId } : {}),\n ...(schemaVersion ? { schemaVersion } : {}),\n ...(interruptId ? { interruptId } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n","\"use client\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { type RefObject, useEffect, useRef, useState } from \"react\";\nimport { buildAssistantMessage } from \"./build-assistant-message\";\nimport { type ChatStorage, createBrowserChatStorage } from \"./chat-storage\";\nimport type {\n ChatTransport,\n CheckpointSummary,\n ForkCheckpointResult,\n ForkPendingRequest,\n OutgoingChatMessage,\n RollbackCheckpointResult,\n} from \"./chat-transport\";\nimport type { ChatMsg, ContentPiece, HumanInputPiece } from \"./chat-types\";\nimport { createLiveChatPieces } from \"./create-live-chat-pieces\";\nimport {\n toHumanInputPiece as defaultToHumanInputPiece,\n type ToHumanInputPiece,\n} from \"./to-human-input-piece\";\nimport { useChatStreamDebug } from \"./use-chat-stream-debug\";\nimport { useStructuredStreams } from \"./use-structured-streams\";\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\ntype DefaultChatContext = Record<string, unknown>;\n\ntype ChatTraceMetadata = {\n traceId: string;\n spanId: string;\n runId: string;\n};\n\ntype ReplayResult = {\n userMessage: ChatMsg;\n assistantMessage?: ChatMsg;\n messages: ChatMsg[];\n};\n\ntype ResumeOverride = {\n resumeToken: string;\n requestId: string;\n};\n\nexport type PrepareContextMessagesArgs<TContext = DefaultChatContext> = {\n messages: ChatMsg[];\n sessionId: string;\n workflowId: string;\n reason: \"send\" | \"resume\";\n context: TContext;\n};\n\nexport type PrepareContextMessages<TContext = DefaultChatContext> = (\n args: PrepareContextMessagesArgs<TContext>,\n) => OutgoingChatMessage[] | Promise<OutgoingChatMessage[]>;\n\nexport type UseChatValue = {\n messages: ChatMsg[];\n isStreaming: boolean;\n canAbort: boolean;\n error: Error | null;\n streamContentPieces: ContentPiece[];\n streamDebug: StreamChunk[];\n lastAssistantId: string | null;\n checkpoints: CheckpointSummary[];\n activeSessionId: string | null;\n branches: Record<string, ChatBranch>;\n responseVariants: ChatResponseVariantGroup[];\n workflowId: string;\n setWorkflowId: React.Dispatch<React.SetStateAction<string>>;\n send: (text: string) => Promise<void> | void;\n respondToHumanInput: (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n }) => Promise<void> | void;\n respondToInterrupt: (\n piece: HumanInputPiece,\n response?: { selected?: string[] | undefined; text?: string | undefined },\n ) => Promise<void> | void;\n setMessages: React.Dispatch<React.SetStateAction<ChatMsg[]>>;\n checkpointForMessage: (messageId: string) => string | null;\n rollbackTo: (id: string) => Promise<RollbackCheckpointResult>;\n fork: (\n id: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n regenerate: (assistantMessageId: string) => Promise<void>;\n regenerateVariant: (\n assistantMessageId: string,\n ) => Promise<ChatResponseVariantGroup>;\n selectVariant: (\n assistantMessageId: string,\n variantId: string,\n ) => Promise<void>;\n variantForMessage: (messageId: string) => ChatResponseVariantGroup | null;\n regenerateFromCheckpoint: (checkpointId: string) => Promise<void>;\n retryWithEdit: (\n assistantMessageId: string,\n newUserContent: string,\n ) => Promise<void>;\n clearMessages: () => void;\n resetSession: () => void;\n resetChat: () => void;\n clearChat: () => void;\n abort: () => void;\n clearError: () => void;\n includeHistory: boolean;\n setIncludeHistory: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type ChatBranch<TMessage = ChatMsg> = {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints: CheckpointSummary[];\n};\n\nexport type ChatResponseVariant = {\n id: string;\n sessionId: string;\n assistantMessageId: string;\n createdAt: number;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n checkpointId?: string;\n checkpointTurnIndex?: number;\n label?: string;\n};\n\nexport type ChatResponseVariantGroup = {\n id: string;\n sourceAssistantMessageId: string;\n checkpointId: string;\n checkpointTurnIndex: number;\n selectedVariantId: string;\n variants: ChatResponseVariant[];\n};\n\nexport type UseChatOptions<TContext = DefaultChatContext> = {\n transport: ChatTransport<TContext>;\n storage?: ChatStorage<ChatMsg> | undefined;\n createId?: (() => string) | undefined;\n context?: TContext | undefined;\n prepareContextMessages?: PrepareContextMessages<TContext> | undefined;\n toHumanInputPiece?: ToHumanInputPiece | undefined;\n};\n\nconst defaultStorage = createBrowserChatStorage<ChatMsg>();\n\nfunction useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n\nfunction findActiveTextInterrupt(args: {\n messages: ChatMsg[];\n streamContentPieces: ContentPiece[];\n}): HumanInputPiece | undefined {\n const liveInterrupt = [...args.streamContentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n if (liveInterrupt) return liveInterrupt;\n\n const latestMessage = args.messages.at(-1);\n if (latestMessage?.role !== \"assistant\" || !latestMessage.contentPieces) {\n return undefined;\n }\n\n return [...latestMessage.contentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n}\n\nfunction trimMessagesToCheckpoint(args: {\n messages: ChatMsg[];\n turnIndex: number;\n}): ChatMsg[] {\n const hasCheckpointMetadata = args.messages.some(\n (message) => typeof message.checkpointTurnIndex === \"number\",\n );\n if (!hasCheckpointMetadata && args.turnIndex > 0) return args.messages;\n\n const keepThroughIndex = args.messages.reduce((lastIndex, message, index) => {\n return typeof message.checkpointTurnIndex === \"number\" &&\n message.checkpointTurnIndex <= args.turnIndex\n ? index\n : lastIndex;\n }, -1);\n\n return keepThroughIndex >= 0\n ? args.messages.slice(0, keepThroughIndex + 1)\n : [];\n}\n\nfunction applyForkedPendingRequests(args: {\n messages: ChatMsg[];\n pendingRequests: ForkPendingRequest[];\n}): ChatMsg[] {\n if (args.pendingRequests.length === 0) return args.messages;\n\n const interruptPositions = args.messages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex }] : [],\n ),\n );\n const positionsToPatch = interruptPositions.slice(\n -args.pendingRequests.length,\n );\n if (positionsToPatch.length === 0) return args.messages;\n\n return args.messages.map((message, messageIndex) => {\n if (!message.contentPieces) return message;\n\n let changed = false;\n const contentPieces = message.contentPieces.map((piece, pieceIndex) => {\n if (piece.type !== \"interrupt\") return piece;\n const patchIndex = positionsToPatch.findIndex(\n (position) =>\n position.messageIndex === messageIndex &&\n position.pieceIndex === pieceIndex,\n );\n const pending = args.pendingRequests[patchIndex];\n if (!pending) return piece;\n\n changed = true;\n return {\n ...piece,\n resumeToken: pending.token,\n requestId: pending.requestId,\n ...(pending.schema?.kind ? { kind: pending.schema.kind } : {}),\n ...(typeof pending.schema?.multiple === \"boolean\"\n ? { multiple: pending.schema.multiple }\n : {}),\n ...(typeof pending.schema?.question === \"string\"\n ? { question: pending.schema.question }\n : {}),\n ...(typeof pending.schema?.schemaId === \"string\"\n ? { schemaId: pending.schema.schemaId }\n : {}),\n ...(typeof pending.schema?.schemaVersion === \"string\"\n ? { schemaVersion: pending.schema.schemaVersion }\n : {}),\n ...(typeof pending.schema?.id === \"string\"\n ? { interruptId: pending.schema.id }\n : {}),\n ...(pending.schema?.meta ? { meta: pending.schema.meta } : {}),\n ...(pending.options ? { options: pending.options } : {}),\n };\n });\n\n return changed ? { ...message, contentPieces } : message;\n });\n}\n\nfunction latestAssistantMessageId(messages: ChatMsg[]): string | null {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role === \"assistant\") return message.id;\n }\n return null;\n}\n\nexport function useChat<TContext = DefaultChatContext>(\n options: UseChatOptions<TContext>,\n): UseChatValue {\n const resolvedStorage = options.storage ?? defaultStorage;\n const transportRef = useLatestRef(options.transport);\n const storageRef = useLatestRef(resolvedStorage);\n const toHumanInputPieceRef = useLatestRef(\n options.toHumanInputPiece ?? defaultToHumanInputPiece,\n );\n const requestContext =\n options.context ?? ({} as unknown as NonNullable<TContext>);\n const createId = useRef(options.createId ?? defaultCreateId).current;\n\n const [messages, setMessages] = useState<ChatMsg[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [streamContentPieces, setStreamContentPieces] = useState<\n ContentPiece[]\n >([]);\n const [lastAssistantId, setLastAssistantId] = useState<string | null>(null);\n const [checkpoints, setCheckpoints] = useState<CheckpointSummary[]>([]);\n const [includeHistory, setIncludeHistory] = useState(true);\n const [workflowId, setWorkflowId] = useState(\"\");\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [branches, setBranches] = useState<Record<string, ChatBranch>>({});\n const [responseVariants, setResponseVariants] = useState<\n ChatResponseVariantGroup[]\n >([]);\n const [didHydrateStorage, setDidHydrateStorage] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const { streamDebug, clearStreamDebug, createRecorder } =\n useChatStreamDebug();\n const {\n applyStreamChunk,\n clear: clearStructuredStreams,\n delete: deleteStructuredStream,\n } = useStructuredStreams<Record<string, unknown>>({\n createId,\n });\n\n useEffect(() => {\n let cancelled = false;\n const storage = resolvedStorage;\n\n void Promise.resolve(storage.load()).then((storedState) => {\n if (cancelled) return;\n\n if (typeof storedState.sessionId === \"string\") {\n setSessionId(storedState.sessionId);\n }\n if (typeof storedState.workflowId === \"string\") {\n setWorkflowId(storedState.workflowId);\n }\n if (typeof storedState.includeHistory === \"boolean\") {\n setIncludeHistory(storedState.includeHistory);\n }\n if (\n Array.isArray(storedState.messages) &&\n storedState.messages.length > 0\n ) {\n setMessages(storedState.messages);\n }\n if (storedState.branches && typeof storedState.branches === \"object\") {\n setBranches(\n storedState.branches as unknown as Record<string, ChatBranch>,\n );\n }\n if (Array.isArray(storedState.responseVariants)) {\n setResponseVariants(\n storedState.responseVariants as ChatResponseVariantGroup[],\n );\n }\n\n setDidHydrateStorage(true);\n });\n\n return () => {\n cancelled = true;\n };\n }, [resolvedStorage]);\n\n useEffect(() => {\n const nextLastAssistantId = latestAssistantMessageId(messages);\n if (lastAssistantId !== nextLastAssistantId) {\n setLastAssistantId(nextLastAssistantId);\n }\n }, [lastAssistantId, messages]);\n\n useEffect(() => {\n if (!didHydrateStorage) return;\n const storage = storageRef.current;\n\n void storage.save({\n sessionId,\n workflowId,\n includeHistory,\n messages,\n branches,\n responseVariants,\n });\n }, [\n branches,\n didHydrateStorage,\n includeHistory,\n messages,\n responseVariants,\n sessionId,\n storageRef,\n workflowId,\n ]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setBranches((current) => ({\n ...current,\n [sessionId]: {\n ...(current[sessionId] ?? {}),\n sessionId,\n messages,\n checkpoints,\n },\n }));\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setResponseVariants((current) =>\n current.map((group) => {\n const selectedVariant = group.variants.find(\n (variant) =>\n variant.id === group.selectedVariantId &&\n variant.sessionId === sessionId,\n );\n if (!selectedVariant) return group;\n if (\n selectedVariant.messages === messages &&\n selectedVariant.checkpoints === checkpoints\n ) {\n return group;\n }\n\n return {\n ...group,\n variants: group.variants.map((variant) =>\n variant.id === selectedVariant.id\n ? {\n ...variant,\n messages,\n checkpoints,\n }\n : variant,\n ),\n };\n }),\n );\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n const clearActiveStream = () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages([]);\n setCheckpoints([]);\n setBranches({});\n setResponseVariants([]);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n setLastAssistantId(null);\n };\n\n const clearMessages = () => {\n clearActiveStream();\n void storageRef.current.clearMessages();\n };\n\n const resetSession = () => {\n setSessionId(null);\n setCheckpoints([]);\n };\n\n const resetChat = () => {\n clearActiveStream();\n resetSession();\n setError(null);\n void storageRef.current.clearMessages();\n };\n\n const clearChat = resetChat;\n\n const clearError = () => {\n setError(null);\n };\n\n const abort = () => {\n abortControllerRef.current?.abort();\n };\n\n const persistSessionId = (sid: string) => {\n setSessionId(sid);\n };\n\n const resolveSessionId = (preferredSessionId?: string | undefined) => {\n if (preferredSessionId) {\n if (sessionId !== preferredSessionId)\n persistSessionId(preferredSessionId);\n return preferredSessionId;\n }\n const sid = sessionId ?? createId();\n if (!sessionId) persistSessionId(sid);\n return sid;\n };\n\n const toOutgoingHistoryMessage = (message: ChatMsg): OutgoingChatMessage => ({\n role: message.role,\n content: message.content,\n });\n\n const prepareMessagesToSend = async (args: {\n sid: string;\n outgoingMessage: OutgoingChatMessage;\n reason: \"send\" | \"resume\";\n baseMessages?: ChatMsg[] | undefined;\n }): Promise<OutgoingChatMessage[]> => {\n const baseMessages = args.baseMessages ?? messages;\n const prepared = options.prepareContextMessages\n ? await options.prepareContextMessages({\n messages: baseMessages,\n sessionId: args.sid,\n workflowId,\n reason: args.reason,\n context: requestContext,\n })\n : includeHistory\n ? baseMessages.map(toOutgoingHistoryMessage)\n : [];\n\n return [...prepared, args.outgoingMessage];\n };\n\n const streamAssistantResponse = async (args: {\n sid: string;\n messagesToSend: OutgoingChatMessage[];\n messagesBeforeAssistant?: ChatMsg[] | undefined;\n debugLabel: string;\n openDebugOnInterrupt?: boolean;\n signal: AbortSignal;\n }): Promise<ChatMsg | undefined> => {\n clearStructuredStreams();\n setStreamContentPieces([]);\n\n const debug = createRecorder(`${args.debugLabel} sessionId=${args.sid}`);\n let currentTrace: ChatTraceMetadata | undefined;\n let completedTrace: ChatTraceMetadata | undefined;\n let currentCheckpoint:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n const pieces = createLiveChatPieces({\n createId,\n onChange: setStreamContentPieces,\n structuredStreams: {\n applyStreamChunk,\n },\n toHumanInputPiece: (chunk) =>\n toHumanInputPieceRef.current({\n chunk,\n createId,\n }),\n });\n\n await transportRef.current.stream({\n sessionId: args.sid,\n workflowId,\n messages: args.messagesToSend,\n context: requestContext,\n signal: args.signal,\n onChunk: (chunk: StreamChunk) => {\n debug.push(chunk);\n\n if (chunk.type === \"session\") {\n if (typeof chunk.sessionId === \"string\") {\n persistSessionId(chunk.sessionId);\n }\n return;\n }\n\n if (chunk.type === \"trace\") {\n if (\n typeof chunk.traceId === \"string\" &&\n typeof chunk.spanId === \"string\" &&\n typeof chunk.runId === \"string\"\n ) {\n currentTrace = {\n traceId: chunk.traceId,\n spanId: chunk.spanId,\n runId: chunk.runId,\n };\n }\n return;\n }\n\n if (chunk.type === \"checkpoint\") {\n currentCheckpoint = {\n id: chunk.id,\n turnIndex: chunk.turnIndex,\n };\n setCheckpoints((prev) => {\n const next = {\n id: chunk.id,\n sessionId: chunk.sessionId,\n turnIndex: chunk.turnIndex,\n createdAt: Date.now(),\n nodes: [],\n workflow: workflowId,\n ...(chunk.label ? { label: chunk.label } : {}),\n } satisfies CheckpointSummary;\n return [...prev.filter((item) => item.id !== chunk.id), next].sort(\n (a, b) => a.turnIndex - b.turnIndex,\n );\n });\n return;\n }\n\n if (chunk.type === \"structured-data-invalidated\") {\n deleteStructuredStream(chunk.streamId);\n return;\n }\n\n if (chunk.type === \"error\") {\n setError(new Error(chunk.message));\n }\n\n if (chunk.type === \"done\") {\n completedTrace = currentTrace;\n currentTrace = undefined;\n }\n\n return pieces.processChunk(chunk, {\n openDebugOnInterrupt: args.openDebugOnInterrupt,\n });\n },\n });\n\n if (args.signal.aborted) return undefined;\n\n const assistant = buildAssistantMessage({\n createId,\n pieces: pieces.getPieces(),\n debug: debug.getAll(),\n trace: completedTrace ?? currentTrace,\n checkpoint: currentCheckpoint,\n });\n setMessages((prev) =>\n args.messagesBeforeAssistant\n ? [...args.messagesBeforeAssistant, assistant]\n : [...prev, assistant],\n );\n setLastAssistantId(assistant.id);\n clearStructuredStreams();\n setStreamContentPieces([]);\n clearStreamDebug();\n return assistant;\n };\n\n const isAbortError = (value: unknown, signal: AbortSignal): boolean => {\n if (signal.aborted) return true;\n if (!(value instanceof Error)) return false;\n return value.name === \"AbortError\";\n };\n\n const respondToHumanInputFromBase = async ({\n resumeToken,\n requestId,\n selected,\n text,\n baseMessages,\n sid,\n }: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n baseMessages?: ChatMsg[] | undefined;\n sid?: string | undefined;\n }): Promise<ReplayResult | undefined> => {\n if (isStreaming) return undefined;\n setError(null);\n const label: string =\n typeof text === \"string\" && text.length > 0\n ? text\n : selected.length > 0\n ? selected.length === 1\n ? (selected[0] as string)\n : selected.join(\", \")\n : \"(selection)\";\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content: label,\n source: {\n type: \"interrupt-response\",\n resumeToken,\n requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n },\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resumePayload: Record<string, unknown> = {\n resume: { token: resumeToken, requestId, selected },\n };\n const outgoing = {\n role: \"user\" as const,\n content: label,\n metadata: resumePayload,\n };\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: outgoing,\n reason: \"resume\",\n baseMessages,\n });\n\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (resume)\",\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const respondToHumanInput = async (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n }): Promise<void> => {\n await respondToHumanInputFromBase(args);\n };\n\n const respondToInterrupt = async (\n piece: HumanInputPiece,\n response?: { selected?: string[] | undefined; text?: string | undefined },\n ) => {\n const text = response?.text;\n const selected =\n response?.selected ??\n (typeof text === \"string\" && text.length > 0 ? [text] : []);\n\n await respondToHumanInput({\n resumeToken: piece.resumeToken,\n requestId: piece.requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n });\n };\n\n const sendFromBase = async (\n text: string,\n baseMessages?: ChatMsg[] | undefined,\n sid?: string | undefined,\n ): Promise<ReplayResult | undefined> => {\n const content = text.trim();\n if (!content || isStreaming) return undefined;\n setError(null);\n\n const activeTextInterrupt = findActiveTextInterrupt({\n messages: baseMessages ?? messages,\n streamContentPieces,\n });\n\n if (activeTextInterrupt) {\n return respondToHumanInputFromBase({\n resumeToken: activeTextInterrupt.resumeToken,\n requestId: activeTextInterrupt.requestId,\n selected: [content],\n text: content,\n baseMessages,\n sid,\n });\n }\n\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content,\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: { role: \"user\" as const, content },\n reason: \"send\",\n baseMessages,\n });\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (send)\",\n openDebugOnInterrupt: true,\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const send = async (text: string): Promise<void> => {\n await sendFromBase(text);\n };\n\n const requireCheckpointTransport = (): ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n } => {\n const transport = transportRef.current;\n if (\n !transport.listCheckpoints ||\n !transport.rollbackTo ||\n !transport.fork\n ) {\n throw new Error(\n \"Checkpoint helpers require a transport with checkpoint methods.\",\n );\n }\n return transport as ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n };\n };\n\n const refreshCheckpoints = async (sid: string) => {\n const transport = requireCheckpointTransport();\n const next = await transport.listCheckpoints(sid);\n setCheckpoints(next);\n return next;\n };\n\n const applyStructuredInvalidations = (streamIds: string[]) => {\n for (const streamId of streamIds) {\n deleteStructuredStream(streamId);\n }\n };\n\n const rollbackTo = async (id: string): Promise<RollbackCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot rollback while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const result = await transport.rollbackTo(id);\n applyStructuredInvalidations(result.invalidatedStructuredStreamIds);\n const refreshedCheckpoints = await refreshCheckpoints(result.sessionId);\n const target = refreshedCheckpoints.find(\n (checkpoint) => checkpoint.id === result.head,\n );\n\n if (target) {\n setMessages((current) => {\n return trimMessagesToCheckpoint({\n messages: current,\n turnIndex: target.turnIndex,\n });\n });\n }\n\n return result;\n };\n\n const fork = async (\n id: string,\n options?: { newSessionId?: string },\n ): Promise<ForkCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot fork while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === id,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find((checkpoint) => checkpoint.id === id);\n }\n\n const result = await transport.fork(id, options);\n setSessionId(result.sessionId);\n const childCheckpoints = await refreshCheckpoints(result.sessionId);\n const childHead = childCheckpoints.at(-1);\n const forkTurnIndex = target?.turnIndex ?? childHead?.turnIndex;\n if (typeof forkTurnIndex === \"number\") {\n setMessages((current) =>\n applyForkedPendingRequests({\n messages: trimMessagesToCheckpoint({\n messages: current,\n turnIndex: forkTurnIndex,\n }),\n pendingRequests: result.checkpoint?.activePendingRequests ?? [],\n }),\n );\n }\n setStreamContentPieces([]);\n clearStructuredStreams();\n return result;\n };\n\n const checkpointForMessage = (messageId: string): string | null => {\n return (\n messages.find((message) => message.id === messageId)?.checkpointId ?? null\n );\n };\n\n const variantForMessage = (\n messageId: string,\n ): ChatResponseVariantGroup | null => {\n return (\n responseVariants.find(\n (group) =>\n group.sourceAssistantMessageId === messageId ||\n group.variants.some(\n (variant) => variant.assistantMessageId === messageId,\n ),\n ) ?? null\n );\n };\n\n const findResumeOverrideForFork = (\n baseMessages: ChatMsg[],\n forkedBaseMessages: ChatMsg[],\n userMessage: ChatMsg,\n ): ResumeOverride | undefined => {\n if (userMessage.source?.type !== \"interrupt-response\") return undefined;\n const userSource = userMessage.source;\n\n const interruptPositions = baseMessages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex, piece }] : [],\n ),\n );\n const matchedPosition = [...interruptPositions]\n .reverse()\n .find(\n ({ piece }) =>\n piece.resumeToken === userSource.resumeToken ||\n piece.requestId === userSource.requestId,\n );\n\n const forkedPiece =\n typeof matchedPosition?.messageIndex === \"number\"\n ? forkedBaseMessages[matchedPosition.messageIndex]?.contentPieces?.[\n matchedPosition.pieceIndex\n ]\n : undefined;\n\n if (forkedPiece?.type === \"interrupt\") {\n return {\n resumeToken: forkedPiece.resumeToken,\n requestId: forkedPiece.requestId,\n };\n }\n\n const latestForkedInterrupt = forkedBaseMessages\n .flatMap((message) => message.contentPieces ?? [])\n .filter((piece): piece is HumanInputPiece => piece.type === \"interrupt\")\n .at(-1);\n\n return latestForkedInterrupt\n ? {\n resumeToken: latestForkedInterrupt.resumeToken,\n requestId: latestForkedInterrupt.requestId,\n }\n : undefined;\n };\n\n const resolveRegenerateTarget = async (assistantMessageId: string) => {\n const assistantIndex = messages.findIndex(\n (message) => message.id === assistantMessageId,\n );\n if (assistantIndex < 0) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n const assistant = messages[assistantIndex];\n if (!assistant) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n if (assistant.role !== \"assistant\") {\n throw new Error(\"Regenerate expects an assistant message id.\");\n }\n\n let userIndex = -1;\n for (let index = assistantIndex - 1; index >= 0; index--) {\n if (messages[index]?.role === \"user\") {\n userIndex = index;\n break;\n }\n }\n if (userIndex < 0) {\n throw new Error(\"No preceding user message found for regenerate.\");\n }\n const previousUser = messages[userIndex] as ChatMsg;\n\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n const assistantTurn = assistant.checkpointTurnIndex;\n const targetTurn =\n typeof assistantTurn === \"number\" ? assistantTurn - 1 : undefined;\n let target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n }\n\n if (!target) {\n throw new Error(\"No rollback checkpoint found for regenerate.\");\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n\n return { target, assistant, previousUser, baseMessages };\n };\n\n const replayUserMessage = async (\n userMessage: ChatMsg,\n baseMessages: ChatMsg[],\n editedContent?: string,\n options?: {\n sid?: string | undefined;\n resumeOverride?: ResumeOverride | undefined;\n },\n ): Promise<ReplayResult | undefined> => {\n const content = editedContent ?? userMessage.content;\n if (userMessage.source?.type === \"interrupt-response\") {\n return respondToHumanInputFromBase({\n resumeToken:\n options?.resumeOverride?.resumeToken ??\n userMessage.source.resumeToken,\n requestId:\n options?.resumeOverride?.requestId ?? userMessage.source.requestId,\n selected:\n editedContent !== undefined\n ? [editedContent]\n : userMessage.source.selected,\n baseMessages,\n sid: options?.sid,\n ...(editedContent !== undefined\n ? { text: editedContent }\n : userMessage.source.text !== undefined\n ? { text: userMessage.source.text }\n : {}),\n });\n }\n return sendFromBase(content, baseMessages, options?.sid);\n };\n\n const buildVariant = (args: {\n id: string;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n label?: string;\n }): ChatResponseVariant => ({\n id: args.id,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n createdAt: Date.now(),\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n ...(args.label ? { label: args.label } : {}),\n });\n\n const updateVariantSnapshot = (args: {\n variant: ChatResponseVariant;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n }): ChatResponseVariant => ({\n ...args.variant,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n });\n\n const replaceResponseVariantGroup = (nextGroup: ChatResponseVariantGroup) => {\n setResponseVariants((current) => [\n ...current.filter((group) => group.id !== nextGroup.id),\n nextGroup,\n ]);\n };\n\n const regenerateVariant = async (\n assistantMessageId: string,\n ): Promise<ChatResponseVariantGroup> => {\n if (isStreaming) {\n throw new Error(\"Cannot regenerate a variant while a stream is active.\");\n }\n const { target, assistant, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n const transport = requireCheckpointTransport();\n const parentSessionId = resolveSessionId();\n const existingGroup = variantForMessage(assistantMessageId);\n const sourceAssistantMessageId =\n existingGroup?.sourceAssistantMessageId ?? assistantMessageId;\n const existingVariants = existingGroup\n ? existingGroup.variants.map((variant) =>\n variant.id === existingGroup.selectedVariantId ||\n variant.assistantMessageId === assistantMessageId\n ? updateVariantSnapshot({\n variant,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n })\n : variant,\n )\n : undefined;\n\n const originalVariant =\n existingVariants?.[0] ??\n buildVariant({\n id: `${sourceAssistantMessageId}:original`,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n label: \"Original\",\n });\n\n const forkResult = await transport.fork(target.id);\n const forkedSessionId = forkResult.sessionId;\n setSessionId(forkedSessionId);\n\n const childCheckpointsBeforeReplay =\n await refreshCheckpoints(forkedSessionId);\n const forkedBaseMessages = applyForkedPendingRequests({\n messages: baseMessages,\n pendingRequests: forkResult.checkpoint?.activePendingRequests ?? [],\n });\n const resumeOverride = findResumeOverrideForFork(\n baseMessages,\n forkedBaseMessages,\n previousUser,\n );\n setMessages(forkedBaseMessages);\n setStreamContentPieces([]);\n clearStructuredStreams();\n\n const replay = await replayUserMessage(\n previousUser,\n forkedBaseMessages,\n undefined,\n {\n sid: forkedSessionId,\n resumeOverride,\n },\n );\n const childCheckpointsAfterReplay =\n await refreshCheckpoints(forkedSessionId);\n const variantMessages = replay?.messages ?? forkedBaseMessages;\n const variantAssistant = replay?.assistantMessage;\n if (!variantAssistant) {\n throw new Error(\"Regenerate variant did not produce an assistant reply.\");\n }\n\n const nextVariant = buildVariant({\n id: createId(),\n sessionId: forkedSessionId,\n assistantMessage: variantAssistant,\n messages: variantMessages,\n checkpoints:\n childCheckpointsAfterReplay.length > 0\n ? childCheckpointsAfterReplay\n : childCheckpointsBeforeReplay,\n label: `Variant ${(existingGroup?.variants.length ?? 1) + 1}`,\n });\n const nextVariants = existingVariants\n ? [...existingVariants, nextVariant]\n : [originalVariant, nextVariant];\n const nextGroup: ChatResponseVariantGroup = {\n id: existingGroup?.id ?? createId(),\n sourceAssistantMessageId,\n checkpointId: existingGroup?.checkpointId ?? target.id,\n checkpointTurnIndex:\n existingGroup?.checkpointTurnIndex ?? target.turnIndex,\n selectedVariantId: nextVariant.id,\n variants: nextVariants,\n };\n\n replaceResponseVariantGroup(nextGroup);\n setBranches((current) => ({\n ...current,\n [parentSessionId]: {\n ...(current[parentSessionId] ?? {}),\n sessionId: parentSessionId,\n messages,\n checkpoints,\n },\n [forkedSessionId]: {\n ...(current[forkedSessionId] ?? {}),\n sessionId: forkedSessionId,\n parentSessionId: forkResult.parentSessionId,\n forkedFrom: forkResult.forkedFrom,\n messages: variantMessages,\n checkpoints: nextVariant.checkpoints,\n },\n }));\n\n return nextGroup;\n };\n\n const selectVariant = async (\n assistantMessageId: string,\n variantId: string,\n ): Promise<void> => {\n const group = variantForMessage(assistantMessageId);\n if (!group) {\n throw new Error(\n `No response variants found for \"${assistantMessageId}\".`,\n );\n }\n const selectedVariant = group.variants.find(\n (variant) => variant.id === variantId,\n );\n if (!selectedVariant) {\n throw new Error(`Response variant \"${variantId}\" not found.`);\n }\n\n setSessionId(selectedVariant.sessionId);\n setMessages(selectedVariant.messages);\n setCheckpoints(selectedVariant.checkpoints);\n setStreamContentPieces([]);\n clearStructuredStreams();\n setBranches((current) => ({\n ...current,\n [selectedVariant.sessionId]: {\n ...(current[selectedVariant.sessionId] ?? {}),\n sessionId: selectedVariant.sessionId,\n messages: selectedVariant.messages,\n checkpoints: selectedVariant.checkpoints,\n },\n }));\n const nextGroup = {\n ...group,\n selectedVariantId: selectedVariant.id,\n };\n replaceResponseVariantGroup(nextGroup);\n };\n\n const regenerate = async (assistantMessageId: string): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const regenerateFromCheckpoint = async (\n checkpointId: string,\n ): Promise<void> => {\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n }\n if (!target) {\n throw new Error(`Checkpoint \"${checkpointId}\" not found.`);\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n const previousUser = messages\n .slice(baseMessages.length)\n .find((message) => message.role === \"user\");\n if (!previousUser) {\n throw new Error(\"No user message found after checkpoint for regenerate.\");\n }\n\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const retryWithEdit = async (\n assistantMessageId: string,\n newUserContent: string,\n ): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages, newUserContent);\n };\n\n return {\n messages,\n isStreaming,\n canAbort: isStreaming,\n error,\n streamContentPieces,\n streamDebug,\n lastAssistantId,\n checkpoints,\n activeSessionId: sessionId,\n branches,\n responseVariants,\n workflowId,\n setWorkflowId,\n send,\n respondToHumanInput,\n respondToInterrupt,\n setMessages,\n checkpointForMessage,\n rollbackTo,\n fork,\n regenerate,\n regenerateVariant,\n selectVariant,\n variantForMessage,\n regenerateFromCheckpoint,\n retryWithEdit,\n clearMessages,\n resetSession,\n resetChat,\n clearChat,\n abort,\n clearError,\n includeHistory,\n setIncludeHistory,\n };\n}\n","\"use client\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { useCallback, useState } from \"react\";\n\ntype DebugChunk = StreamChunk & {\n _ts: number;\n _dt: number;\n _seq: number;\n};\n\nexport function useChatStreamDebug() {\n const [streamDebug, setStreamDebug] = useState<StreamChunk[]>([]);\n\n const clearStreamDebug = useCallback(() => {\n setStreamDebug([]);\n }, []);\n\n const createRecorder = useCallback((initialMessage: string) => {\n let seq = 0;\n let lastTs = 0;\n const accDebug: StreamChunk[] = [];\n\n const push = (chunk: StreamChunk) => {\n const ts = Date.now();\n const withMeta: DebugChunk = {\n ...(chunk as StreamChunk),\n _ts: ts,\n _dt: lastTs ? ts - lastTs : 0,\n _seq: seq++,\n };\n lastTs = ts;\n accDebug.push(withMeta);\n setStreamDebug((current) =>\n current.length > 1000\n ? [...current.slice(-1000), withMeta]\n : [...current, withMeta],\n );\n };\n\n push({\n type: \"status\",\n message: initialMessage,\n } as StreamChunk);\n\n return {\n push,\n getAll: () => accDebug,\n };\n }, []);\n\n return {\n streamDebug,\n clearStreamDebug,\n createRecorder,\n };\n}\n","import {\n createStructuredStreamAccumulator,\n type StreamChunk,\n type StructuredDataChunk,\n type StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nexport type StructuredStreamItem<TData = unknown> = {\n id: string;\n streamId: string;\n state: StructuredStreamState<TData>;\n};\n\nexport type UseStructuredStreamsOptions<_TData = unknown> = {\n createId?: (() => string) | undefined;\n initialChunks?: Iterable<StructuredDataChunk> | undefined;\n};\n\nexport type UseStructuredStreamsResult<TData = unknown> = {\n items: StructuredStreamItem<TData>[];\n byStreamId: Record<string, StructuredStreamState<TData>>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TData> | undefined;\n clear: () => void;\n get: (streamId: string) => StructuredStreamItem<TData> | undefined;\n delete: (streamId: string) => boolean;\n};\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport function useStructuredStreams<TData = unknown>(\n options?: UseStructuredStreamsOptions<TData> | undefined,\n): UseStructuredStreamsResult<TData> {\n const createId = useRef(options?.createId ?? defaultCreateId).current;\n const initialChunks = useRef(options?.initialChunks ?? []).current;\n const accumulatorRef = useRef(\n createStructuredStreamAccumulator<TData>(initialChunks),\n );\n const initialItemsRef = useRef<StructuredStreamItem<TData>[] | undefined>(\n undefined,\n );\n\n if (initialItemsRef.current === undefined) {\n initialItemsRef.current = accumulatorRef.current\n .entries()\n .map(([streamId, state]) => ({\n id: createId(),\n streamId,\n state,\n }));\n }\n\n const itemsRef = useRef(initialItemsRef.current);\n const [items, setItems] = useState(initialItemsRef.current);\n\n const setNextItems = useCallback(\n (nextItems: StructuredStreamItem<TData>[]) => {\n itemsRef.current = nextItems;\n setItems(nextItems);\n },\n [],\n );\n\n const applyStreamChunk = useCallback(\n (chunk: StreamChunk): StructuredStreamItem<TData> | undefined => {\n const nextState = accumulatorRef.current.applyStreamChunk(chunk);\n if (!nextState) return undefined;\n\n const currentItems = itemsRef.current;\n const existingIndex = currentItems.findIndex(\n (item) => item.streamId === nextState.streamId,\n );\n const existingItem =\n existingIndex >= 0 ? currentItems[existingIndex] : undefined;\n\n const nextItem: StructuredStreamItem<TData> = existingItem\n ? {\n ...existingItem,\n state: nextState,\n }\n : {\n id: createId(),\n streamId: nextState.streamId,\n state: nextState,\n };\n\n const nextItems =\n existingIndex >= 0\n ? currentItems.map((item, index) =>\n index === existingIndex ? nextItem : item,\n )\n : [...currentItems, nextItem];\n\n setNextItems(nextItems);\n return nextItem;\n },\n [createId, setNextItems],\n );\n\n const clear = useCallback(() => {\n accumulatorRef.current = createStructuredStreamAccumulator<TData>();\n setNextItems([]);\n }, [setNextItems]);\n\n const get = useCallback((streamId: string) => {\n return itemsRef.current.find((item) => item.streamId === streamId);\n }, []);\n\n const deleteStream = useCallback(\n (streamId: string): boolean => {\n const deleted = accumulatorRef.current.delete(streamId);\n if (!deleted) return false;\n setNextItems(\n itemsRef.current.filter((item) => item.streamId !== streamId),\n );\n return true;\n },\n [setNextItems],\n );\n\n const byStreamId = useMemo(\n () =>\n Object.fromEntries(\n items.map((item) => [item.streamId, item.state]),\n ) as Record<string, StructuredStreamState<TData>>,\n [items],\n );\n\n return {\n items,\n byStreamId,\n applyStreamChunk,\n clear,\n get,\n delete: deleteStream,\n };\n}\n"],"mappings":"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","names":["sessionId","import_react","import_browser","import_react","defaultCreateId","options"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/build-assistant-message.ts","../src/chat-storage.ts","../src/chat-transport.ts","../src/create-live-chat-pieces.ts","../src/to-human-input-piece.ts","../src/use-chat.ts","../src/use-chat-stream-debug.ts","../src/use-structured-streams.ts"],"sourcesContent":["export * from \"./build-assistant-message\";\nexport * from \"./chat-storage\";\nexport * from \"./chat-transport\";\nexport * from \"./chat-types\";\nexport * from \"./create-live-chat-pieces\";\nexport * from \"./to-human-input-piece\";\nexport * from \"./use-chat\";\nexport * from \"./use-chat-stream-debug\";\nexport * from \"./use-structured-streams\";\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { ChatMsg, ContentPiece } from \"./chat-types\";\n\nexport function buildAssistantMessage(args: {\n createId: () => string;\n pieces: ContentPiece[];\n debug: StreamChunk[];\n trace?:\n | {\n traceId: string;\n spanId: string;\n runId: string;\n }\n | undefined;\n checkpoint?:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n}): ChatMsg {\n const plainTextContent = args.pieces\n .filter(\n (piece): piece is Extract<ContentPiece, { type: \"text\" }> =>\n piece.type === \"text\",\n )\n .map((piece) => piece.content)\n .join(\"\");\n\n const base = {\n id: args.createId(),\n role: \"assistant\" as const,\n content: plainTextContent,\n debug: args.debug,\n ...(args.trace ? args.trace : {}),\n ...(args.checkpoint\n ? {\n checkpointId: args.checkpoint.id,\n checkpointTurnIndex: args.checkpoint.turnIndex,\n }\n : {}),\n };\n\n return args.pieces.length > 0\n ? { ...base, contentPieces: args.pieces }\n : base;\n}\n","type MaybePromise<T> = T | Promise<T>;\ntype StorageLike = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\nexport type PersistedChatState<TMessage> = {\n sessionId: string | null;\n workflowId: string;\n includeHistory: boolean;\n messages: TMessage[];\n branches?: Record<\n string,\n {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints?: unknown[];\n }\n >;\n responseVariants?: unknown[];\n};\n\nexport type ChatStorage<TMessage> = {\n load: () => MaybePromise<Partial<PersistedChatState<TMessage>>>;\n save: (state: PersistedChatState<TMessage>) => MaybePromise<void>;\n clearMessages: () => MaybePromise<void>;\n};\n\nexport type BrowserChatStorageKeys = {\n messages: string;\n includeHistory: string;\n sessionId: string;\n workflowId: string;\n branches: string;\n responseVariants: string;\n};\n\nexport type BrowserChatStorageOptions<TMessage> = {\n parseMessage?: ((value: unknown) => TMessage | null) | undefined;\n serializeMessage?: ((message: TMessage) => unknown) | undefined;\n maxMessages?: number | undefined;\n keys?: Partial<BrowserChatStorageKeys> | undefined;\n};\n\nconst DEFAULT_STORAGE_KEYS: BrowserChatStorageKeys = {\n messages: \"chat.messages.v1\",\n includeHistory: \"chat.includeHistory.v1\",\n sessionId: \"chat.sessionId\",\n workflowId: \"chat.workflowId\",\n branches: \"chat.branches.v1\",\n responseVariants: \"chat.responseVariants.v1\",\n};\n\nconst getLocalStorage = (): StorageLike | undefined => {\n const candidate = globalThis as { localStorage?: StorageLike };\n return candidate.localStorage;\n};\n\nconst defaultParseMessage = <TMessage>(value: unknown): TMessage | null =>\n value as TMessage;\n\nconst defaultSerializeMessage = <TMessage>(message: TMessage): unknown =>\n message;\n\n// TODO: Make remote/custom persistence more robust before freezing this API:\n// - add debouncing so repeated message updates do not trigger a full save each time\n// - surface save error handling/retry hooks instead of silently ignoring failures\n// - define a conflict/version strategy for multi-tab and server-synced storage\n// - support partial saves instead of rewriting the full persisted state on each change\nexport function createBrowserChatStorage<TMessage = unknown>(\n options?: BrowserChatStorageOptions<TMessage>,\n): ChatStorage<TMessage> {\n const keys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(options?.keys ?? {}),\n };\n const maxMessages = options?.maxMessages ?? 60;\n const parseMessage = options?.parseMessage ?? defaultParseMessage<TMessage>;\n const serializeMessage =\n options?.serializeMessage ?? defaultSerializeMessage<TMessage>;\n\n return {\n load() {\n try {\n const storage = getLocalStorage();\n if (!storage) {\n return {};\n }\n\n const sessionId = storage.getItem(keys.sessionId);\n const workflowId = storage.getItem(keys.workflowId) ?? \"\";\n const includeHistoryRaw = storage.getItem(keys.includeHistory);\n const rawMessages = storage.getItem(keys.messages);\n const rawBranches = storage.getItem(keys.branches);\n const rawResponseVariants = storage.getItem(keys.responseVariants);\n const parsedMessages = rawMessages\n ? (JSON.parse(rawMessages) as unknown)\n : [];\n const messages = Array.isArray(parsedMessages)\n ? parsedMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n : [];\n const parsedBranches = rawBranches\n ? (JSON.parse(rawBranches) as unknown)\n : undefined;\n const branches =\n parsedBranches && typeof parsedBranches === \"object\"\n ? Object.fromEntries(\n Object.entries(\n parsedBranches as Record<\n string,\n {\n sessionId?: unknown;\n parentSessionId?: unknown;\n forkedFrom?: unknown;\n messages?: unknown;\n checkpoints?: unknown;\n }\n >,\n ).flatMap(([sessionId, branch]) => {\n if (typeof branch.sessionId !== \"string\") return [];\n const rawBranchMessages = Array.isArray(branch.messages)\n ? branch.messages\n : [];\n const branchMessages = rawBranchMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n .slice(-maxMessages);\n return [\n [\n sessionId,\n {\n sessionId: branch.sessionId,\n ...(typeof branch.parentSessionId === \"string\"\n ? { parentSessionId: branch.parentSessionId }\n : {}),\n ...(typeof branch.forkedFrom === \"string\"\n ? { forkedFrom: branch.forkedFrom }\n : {}),\n messages: branchMessages,\n ...(Array.isArray(branch.checkpoints)\n ? { checkpoints: branch.checkpoints }\n : {}),\n },\n ],\n ];\n }),\n )\n : undefined;\n const parsedResponseVariants = rawResponseVariants\n ? (JSON.parse(rawResponseVariants) as unknown)\n : undefined;\n\n return {\n sessionId,\n workflowId,\n includeHistory: includeHistoryRaw !== \"0\",\n messages,\n ...(branches ? { branches } : {}),\n ...(Array.isArray(parsedResponseVariants)\n ? { responseVariants: parsedResponseVariants }\n : {}),\n };\n } catch {\n return {};\n }\n },\n\n save(state) {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n\n if (state.sessionId) {\n storage.setItem(keys.sessionId, state.sessionId);\n } else {\n storage.removeItem(keys.sessionId);\n }\n\n storage.setItem(keys.workflowId, state.workflowId);\n storage.setItem(keys.includeHistory, state.includeHistory ? \"1\" : \"0\");\n\n const trimmedMessages = state.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message));\n\n storage.setItem(keys.messages, JSON.stringify(trimmedMessages));\n if (state.branches) {\n const serializedBranches = Object.fromEntries(\n Object.entries(state.branches).map(([sessionId, branch]) => [\n sessionId,\n {\n ...branch,\n messages: branch.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message)),\n },\n ]),\n );\n storage.setItem(keys.branches, JSON.stringify(serializedBranches));\n } else {\n storage.removeItem(keys.branches);\n }\n\n if (state.responseVariants) {\n storage.setItem(\n keys.responseVariants,\n JSON.stringify(state.responseVariants),\n );\n } else {\n storage.removeItem(keys.responseVariants);\n }\n } catch {}\n },\n\n clearMessages() {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n storage.removeItem(keys.messages);\n storage.removeItem(keys.branches);\n storage.removeItem(keys.responseVariants);\n } catch {}\n },\n };\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport type { StreamChunk, StreamFromRouteArgs } from \"@kortyx/stream/browser\";\nimport { streamFromRoute } from \"@kortyx/stream/browser\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype DefaultChatContext = Record<string, unknown>;\n\nexport type OutgoingChatMessage = {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type ChatTransportContext<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n signal?: AbortSignal | undefined;\n};\n\nexport type ChatTransportChunkHandler = (\n chunk: StreamChunk,\n) => undefined | boolean | Promise<boolean | undefined>;\n\nexport type CheckpointSummary = {\n id: string;\n sessionId: string;\n turnIndex: number;\n createdAt: number;\n nodes: string[];\n workflow: string;\n label?: string;\n};\n\nexport type RollbackCheckpointResult = {\n sessionId: string;\n head: string;\n invalidatedStructuredStreamIds: string[];\n invalidatedInterruptTokens: string[];\n};\n\nexport type ForkPendingRequest = {\n token: string;\n requestId: string;\n schema?: {\n kind?: \"choice\" | \"multi-choice\" | \"text\";\n multiple?: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n };\n options?: Array<{ id: string; label: string; description?: string }>;\n};\n\nexport type ForkCheckpointResult = {\n sessionId: string;\n parentSessionId: string;\n forkedFrom: string;\n checkpoint?: {\n id: string;\n sessionId: string;\n turnIndex: number;\n activePendingRequests?: ForkPendingRequest[];\n };\n};\n\nexport type ChatTransport<TContext = DefaultChatContext> = {\n stream(\n args: ChatTransportContext<TContext> & {\n onChunk: ChatTransportChunkHandler;\n },\n ): Promise<void>;\n listCheckpoints?: (sessionId: string) => Promise<CheckpointSummary[]>;\n rollbackTo?: (checkpointId: string) => Promise<RollbackCheckpointResult>;\n fork?: (\n checkpointId: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n};\n\nexport type ChatTransportChunkSource =\n | Iterable<StreamChunk>\n | AsyncIterable<StreamChunk>;\n\nexport function createChatTransport<TContext = DefaultChatContext>(args: {\n stream: (\n context: ChatTransportContext<TContext>,\n ) => MaybePromise<ChatTransportChunkSource>;\n}): ChatTransport<TContext> {\n return {\n async stream({ onChunk, ...context }) {\n for await (const chunk of await args.stream(context)) {\n const shouldContinue = await onChunk(chunk);\n if (chunk.type === \"done\" || shouldContinue === false) {\n break;\n }\n }\n },\n };\n}\n\nexport type RouteChatRequestBody<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n};\n\nexport type CreateRouteChatTransportArgs<TBody, TContext> = Omit<\n StreamFromRouteArgs<TBody>,\n \"body\"\n> & {\n createBody?: ((context: ChatTransportContext<TContext>) => TBody) | undefined;\n checkpointEndpoint?: string | undefined;\n};\n\nexport function createRouteChatTransport<\n TContext = DefaultChatContext,\n TBody = RouteChatRequestBody<TContext>,\n>(\n args: CreateRouteChatTransportArgs<TBody, TContext>,\n): ChatTransport<TContext> {\n const transport = createChatTransport<TContext>({\n stream: (context) => {\n const body =\n args.createBody?.(context) ??\n ({\n sessionId: context.sessionId,\n workflowId: context.workflowId,\n messages: context.messages,\n context: context.context,\n } as TBody);\n const routeArgs: StreamFromRouteArgs<TBody> = {\n endpoint: args.endpoint,\n body,\n ...(args.method ? { method: args.method } : {}),\n ...(args.headers ? { headers: args.headers } : {}),\n ...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),\n ...(context.signal ? { signal: context.signal } : {}),\n };\n\n return streamFromRoute({\n ...routeArgs,\n });\n },\n });\n\n if (!args.checkpointEndpoint) return transport;\n\n const fetchJson = async <TResult>(\n body: Record<string, unknown>,\n ): Promise<TResult> => {\n const fetchImpl = args.fetchImpl ?? fetch;\n const response = await fetchImpl(args.checkpointEndpoint as string, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n let failure: unknown;\n let message = `Checkpoint request failed with status ${response.status}`;\n try {\n const parsed = (await response.json()) as {\n error?: unknown;\n failure?: unknown;\n };\n failure = parsed.failure;\n if (typeof parsed.error === \"string\") message = parsed.error;\n } catch {}\n throw isFailureDescriptor(failure)\n ? errorFromFailure(failure)\n : new KortyxError(\"CHECKPOINT_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\n }\n return (await response.json()) as TResult;\n };\n\n return {\n ...transport,\n listCheckpoints: (sessionId) =>\n fetchJson<CheckpointSummary[]>({ action: \"list\", sessionId }),\n rollbackTo: (checkpointId) =>\n fetchJson<RollbackCheckpointResult>({\n action: \"rollback\",\n checkpointId,\n }),\n fork: (checkpointId, options) =>\n fetchJson<ForkCheckpointResult>({\n action: \"fork\",\n checkpointId,\n ...(options?.newSessionId\n ? { newSessionId: options.newSessionId }\n : {}),\n }),\n };\n}\n","import type { FailureDescriptor } from \"@kortyx/core/errors\";\nimport type {\n StreamChunk,\n StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport type { StructuredStreamItem } from \"./use-structured-streams\";\n\nexport type LiveChatTextPiece = {\n id: string;\n type: \"text\";\n content: string;\n};\n\nexport type LiveChatStructuredPiece<TStructuredData = unknown> = {\n id: string;\n type: \"structured\";\n data: StructuredStreamState<TStructuredData>;\n};\n\nexport type LiveChatErrorPiece = {\n id: string;\n type: \"error\";\n failure?: FailureDescriptor;\n content: string;\n};\n\ntype LiveChatCustomPiece = {\n id: string;\n type: string;\n};\n\nexport type LiveChatPiece<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n> =\n | LiveChatTextPiece\n | LiveChatStructuredPiece<TStructuredData>\n | LiveChatErrorPiece\n | TCustomPiece;\n\ntype StructuredStreamsController<TStructuredData> = {\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TStructuredData> | undefined;\n};\n\nconst isNonEmptyTextPiece = <\n TStructuredData,\n TCustomPiece extends LiveChatCustomPiece,\n>(\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n) =>\n piece.type !== \"text\" ||\n (\"content\" in piece &&\n typeof piece.content === \"string\" &&\n piece.content.length > 0);\n\nexport function createLiveChatPieces<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n>(args: {\n createId: () => string;\n onChange: (pieces: LiveChatPiece<TStructuredData, TCustomPiece>[]) => void;\n structuredStreams: StructuredStreamsController<TStructuredData>;\n toHumanInputPiece: (chunk: StreamChunk) => TCustomPiece;\n}) {\n const keyedPieces: Array<{\n key: string;\n piece: LiveChatPiece<TStructuredData, TCustomPiece>;\n }> = [];\n let sawTextDelta = false;\n\n const emit = () => {\n args.onChange(\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n );\n };\n\n const findPieceIndex = (key: string) =>\n keyedPieces.findIndex((entry) => entry.key === key);\n\n const upsertPiece = (\n key: string,\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n ) => {\n const existingIndex = findPieceIndex(key);\n if (existingIndex >= 0) {\n keyedPieces[existingIndex] = { key, piece };\n } else {\n keyedPieces.push({ key, piece });\n }\n emit();\n };\n\n const pushPiece = (piece: LiveChatPiece<TStructuredData, TCustomPiece>) => {\n keyedPieces.push({\n key: `${piece.type}:${piece.id}`,\n piece,\n });\n emit();\n };\n\n const resolveTextStreamKey = (\n chunk: StreamChunk,\n fallbackNode?: string,\n ): string => {\n if (\"segmentId\" in chunk && typeof chunk.segmentId === \"string\") {\n const seg = chunk.segmentId.trim();\n if (seg.length > 0) {\n const op =\n \"opId\" in chunk && typeof chunk.opId === \"string\"\n ? chunk.opId.trim()\n : \"\";\n return op.length > 0 ? `${op}:${seg}` : seg;\n }\n }\n\n if (\"opId\" in chunk && typeof chunk.opId === \"string\") {\n const op = chunk.opId.trim();\n if (op.length > 0) {\n const node =\n (\"node\" in chunk && typeof chunk.node === \"string\"\n ? chunk.node\n : fallbackNode) ?? \"__unknown__\";\n return `${op}:${node}`;\n }\n }\n\n return fallbackNode && fallbackNode.length > 0\n ? fallbackNode\n : \"__unknown__\";\n };\n\n const ensureTextPiece = (key: string): LiveChatTextPiece => {\n const pieceKey = `text:${key}`;\n const existingIndex = findPieceIndex(pieceKey);\n if (existingIndex >= 0) {\n return keyedPieces[existingIndex]?.piece as LiveChatTextPiece;\n }\n\n const nextPiece: LiveChatTextPiece = {\n id: args.createId(),\n type: \"text\",\n content: \"\",\n };\n keyedPieces.push({ key: pieceKey, piece: nextPiece });\n return nextPiece;\n };\n\n const processChunk = (\n chunk: StreamChunk,\n _options?: { openDebugOnInterrupt?: boolean | undefined },\n ): boolean => {\n if (chunk.type === \"text-start\") {\n ensureTextPiece(resolveTextStreamKey(chunk, chunk.node));\n emit();\n return true;\n }\n\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n const streamKey = resolveTextStreamKey(chunk, chunk.node);\n const current = ensureTextPiece(streamKey);\n upsertPiece(`text:${streamKey}`, {\n ...current,\n content: current.content + chunk.delta,\n });\n return true;\n }\n\n if (chunk.type === \"text-end\") {\n emit();\n return true;\n }\n\n if (chunk.type === \"structured-data\") {\n const nextItem = args.structuredStreams.applyStreamChunk(chunk);\n if (nextItem) {\n upsertPiece(`structured:${nextItem.streamId}`, {\n id: nextItem.id,\n type: \"structured\",\n data: nextItem.state,\n });\n }\n return true;\n }\n\n if (chunk.type === \"interrupt\") {\n pushPiece(args.toHumanInputPiece(chunk));\n return true;\n }\n\n if (chunk.type === \"message\") {\n if (!sawTextDelta) {\n pushPiece({\n id: args.createId(),\n type: \"text\",\n content: chunk.content ?? \"\",\n });\n }\n return true;\n }\n\n if (chunk.type === \"error\") {\n pushPiece({\n id: args.createId(),\n type: \"error\",\n content: chunk.message ?? \"An error occurred\",\n ...(chunk.failure ? { failure: chunk.failure } : {}),\n });\n return true;\n }\n\n if (chunk.type === \"done\") {\n return false;\n }\n\n return true;\n };\n\n return {\n processChunk,\n getPieces: () =>\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n };\n}\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { HumanInputPiece } from \"./chat-types\";\n\ninterface HumanInputStreamChunk {\n type: \"interrupt\";\n requestId: string | undefined;\n resumeToken: string | undefined;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n input?: {\n kind?: \"text\" | \"choice\" | \"multi-choice\" | \"custom\";\n question?: string;\n multiple?: boolean;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n contract?: string;\n request?: unknown;\n options?: Array<{\n id?: string | number;\n label?: string;\n description?: string;\n }>;\n };\n}\n\nexport type ToHumanInputPiece = (args: {\n chunk: StreamChunk;\n createId: () => string;\n}) => HumanInputPiece;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst nonEmptyString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst firstNonEmptyString = (...values: unknown[]): string | undefined => {\n for (const value of values) {\n const result = nonEmptyString(value);\n if (result) return result;\n }\n return undefined;\n};\n\nexport function toHumanInputPiece(args: {\n chunk: StreamChunk;\n createId: () => string;\n}): HumanInputPiece {\n const hi = args.chunk as unknown as HumanInputStreamChunk;\n const input = hi.input ?? {};\n const kind = input.kind || (input.multiple ? \"multi-choice\" : \"choice\");\n const isText = kind === \"text\";\n const schemaId = firstNonEmptyString(hi.schemaId, input.schemaId);\n const schemaVersion = firstNonEmptyString(\n hi.schemaVersion,\n input.schemaVersion,\n );\n const interruptId = firstNonEmptyString(hi.id, input.id);\n const contract = nonEmptyString(input.contract);\n const inputMeta = isRecord(input.meta) ? input.meta : undefined;\n const chunkMeta = isRecord(hi.meta) ? hi.meta : undefined;\n const meta =\n inputMeta || chunkMeta\n ? { ...(inputMeta ?? {}), ...(chunkMeta ?? {}) }\n : undefined;\n\n const question = isText\n ? input.question\n : typeof input.question === \"string\"\n ? input.question\n : \"Please choose\";\n\n const optionsSrc = Array.isArray(input.options) ? input.options : [];\n const optionsArr: Array<{\n id: string;\n label: string;\n description?: string;\n }> = optionsSrc\n .map((option) => ({\n id: String(option.id ?? \"\"),\n label: String(option.label ?? \"\"),\n ...(typeof option.description === \"string\" && option.description\n ? { description: option.description }\n : {}),\n }))\n .filter((option) => option.id && option.label);\n\n return {\n id: args.createId(),\n type: \"interrupt\",\n resumeToken: String(hi.resumeToken ?? \"\"),\n requestId: String(hi.requestId ?? \"\"),\n kind,\n ...(question !== undefined ? { question } : {}),\n multiple: Boolean(input.multiple),\n options: optionsArr,\n ...(schemaId ? { schemaId } : {}),\n ...(schemaVersion ? { schemaVersion } : {}),\n ...(interruptId ? { interruptId } : {}),\n ...(contract ? { contract } : {}),\n ...(Object.hasOwn(input, \"request\") ? { request: input.request } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n","\"use client\";\n\nimport { errorFromFailure, isFailureDescriptor } from \"@kortyx/core/errors\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { type RefObject, useEffect, useRef, useState } from \"react\";\nimport { buildAssistantMessage } from \"./build-assistant-message\";\nimport { type ChatStorage, createBrowserChatStorage } from \"./chat-storage\";\nimport type {\n ChatTransport,\n CheckpointSummary,\n ForkCheckpointResult,\n ForkPendingRequest,\n OutgoingChatMessage,\n RollbackCheckpointResult,\n} from \"./chat-transport\";\nimport type { ChatMsg, ContentPiece, HumanInputPiece } from \"./chat-types\";\nimport { createLiveChatPieces } from \"./create-live-chat-pieces\";\nimport {\n toHumanInputPiece as defaultToHumanInputPiece,\n type ToHumanInputPiece,\n} from \"./to-human-input-piece\";\nimport { useChatStreamDebug } from \"./use-chat-stream-debug\";\nimport { useStructuredStreams } from \"./use-structured-streams\";\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\ntype DefaultChatContext = Record<string, unknown>;\n\ntype ChatTraceMetadata = {\n traceId: string;\n spanId: string;\n runId: string;\n};\n\ntype ReplayResult = {\n userMessage: ChatMsg;\n assistantMessage?: ChatMsg;\n messages: ChatMsg[];\n};\n\ntype ResumeOverride = {\n resumeToken: string;\n requestId: string;\n};\n\nexport type PrepareContextMessagesArgs<TContext = DefaultChatContext> = {\n messages: ChatMsg[];\n sessionId: string;\n workflowId: string;\n reason: \"send\" | \"resume\";\n context: TContext;\n};\n\nexport type PrepareContextMessages<TContext = DefaultChatContext> = (\n args: PrepareContextMessagesArgs<TContext>,\n) => OutgoingChatMessage[] | Promise<OutgoingChatMessage[]>;\n\nexport type UseChatValue = {\n messages: ChatMsg[];\n isStreaming: boolean;\n canAbort: boolean;\n error: Error | null;\n streamContentPieces: ContentPiece[];\n streamDebug: StreamChunk[];\n lastAssistantId: string | null;\n checkpoints: CheckpointSummary[];\n activeSessionId: string | null;\n branches: Record<string, ChatBranch>;\n responseVariants: ChatResponseVariantGroup[];\n workflowId: string;\n setWorkflowId: React.Dispatch<React.SetStateAction<string>>;\n send: (text: string) => Promise<void> | void;\n respondToHumanInput: (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n value?: unknown;\n hasValue?: boolean;\n }) => Promise<void> | void;\n respondToInterrupt: (\n piece: HumanInputPiece,\n response?: {\n selected?: string[] | undefined;\n text?: string | undefined;\n value?: unknown;\n },\n ) => Promise<void> | void;\n setMessages: React.Dispatch<React.SetStateAction<ChatMsg[]>>;\n checkpointForMessage: (messageId: string) => string | null;\n rollbackTo: (id: string) => Promise<RollbackCheckpointResult>;\n fork: (\n id: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n regenerate: (assistantMessageId: string) => Promise<void>;\n regenerateVariant: (\n assistantMessageId: string,\n ) => Promise<ChatResponseVariantGroup>;\n selectVariant: (\n assistantMessageId: string,\n variantId: string,\n ) => Promise<void>;\n variantForMessage: (messageId: string) => ChatResponseVariantGroup | null;\n regenerateFromCheckpoint: (checkpointId: string) => Promise<void>;\n retryWithEdit: (\n assistantMessageId: string,\n newUserContent: string,\n ) => Promise<void>;\n clearMessages: () => void;\n resetSession: () => void;\n resetChat: () => void;\n clearChat: () => void;\n abort: () => void;\n clearError: () => void;\n includeHistory: boolean;\n setIncludeHistory: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type ChatBranch<TMessage = ChatMsg> = {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints: CheckpointSummary[];\n};\n\nexport type ChatResponseVariant = {\n id: string;\n sessionId: string;\n assistantMessageId: string;\n createdAt: number;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n checkpointId?: string;\n checkpointTurnIndex?: number;\n label?: string;\n};\n\nexport type ChatResponseVariantGroup = {\n id: string;\n sourceAssistantMessageId: string;\n checkpointId: string;\n checkpointTurnIndex: number;\n selectedVariantId: string;\n variants: ChatResponseVariant[];\n};\n\nexport type UseChatOptions<TContext = DefaultChatContext> = {\n transport: ChatTransport<TContext>;\n storage?: ChatStorage<ChatMsg> | undefined;\n createId?: (() => string) | undefined;\n context?: TContext | undefined;\n prepareContextMessages?: PrepareContextMessages<TContext> | undefined;\n toHumanInputPiece?: ToHumanInputPiece | undefined;\n};\n\nconst defaultStorage = createBrowserChatStorage<ChatMsg>();\n\nfunction useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n\nfunction findActiveTextInterrupt(args: {\n messages: ChatMsg[];\n streamContentPieces: ContentPiece[];\n}): HumanInputPiece | undefined {\n const liveInterrupt = [...args.streamContentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n if (liveInterrupt) return liveInterrupt;\n\n const latestMessage = args.messages.at(-1);\n if (latestMessage?.role !== \"assistant\" || !latestMessage.contentPieces) {\n return undefined;\n }\n\n return [...latestMessage.contentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n}\n\nfunction trimMessagesToCheckpoint(args: {\n messages: ChatMsg[];\n turnIndex: number;\n}): ChatMsg[] {\n const hasCheckpointMetadata = args.messages.some(\n (message) => typeof message.checkpointTurnIndex === \"number\",\n );\n if (!hasCheckpointMetadata && args.turnIndex > 0) return args.messages;\n\n const keepThroughIndex = args.messages.reduce((lastIndex, message, index) => {\n return typeof message.checkpointTurnIndex === \"number\" &&\n message.checkpointTurnIndex <= args.turnIndex\n ? index\n : lastIndex;\n }, -1);\n\n return keepThroughIndex >= 0\n ? args.messages.slice(0, keepThroughIndex + 1)\n : [];\n}\n\nfunction applyForkedPendingRequests(args: {\n messages: ChatMsg[];\n pendingRequests: ForkPendingRequest[];\n}): ChatMsg[] {\n if (args.pendingRequests.length === 0) return args.messages;\n\n const interruptPositions = args.messages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex }] : [],\n ),\n );\n const positionsToPatch = interruptPositions.slice(\n -args.pendingRequests.length,\n );\n if (positionsToPatch.length === 0) return args.messages;\n\n return args.messages.map((message, messageIndex) => {\n if (!message.contentPieces) return message;\n\n let changed = false;\n const contentPieces = message.contentPieces.map((piece, pieceIndex) => {\n if (piece.type !== \"interrupt\") return piece;\n const patchIndex = positionsToPatch.findIndex(\n (position) =>\n position.messageIndex === messageIndex &&\n position.pieceIndex === pieceIndex,\n );\n const pending = args.pendingRequests[patchIndex];\n if (!pending) return piece;\n\n changed = true;\n return {\n ...piece,\n resumeToken: pending.token,\n requestId: pending.requestId,\n ...(pending.schema?.kind ? { kind: pending.schema.kind } : {}),\n ...(typeof pending.schema?.multiple === \"boolean\"\n ? { multiple: pending.schema.multiple }\n : {}),\n ...(typeof pending.schema?.question === \"string\"\n ? { question: pending.schema.question }\n : {}),\n ...(typeof pending.schema?.schemaId === \"string\"\n ? { schemaId: pending.schema.schemaId }\n : {}),\n ...(typeof pending.schema?.schemaVersion === \"string\"\n ? { schemaVersion: pending.schema.schemaVersion }\n : {}),\n ...(typeof pending.schema?.id === \"string\"\n ? { interruptId: pending.schema.id }\n : {}),\n ...(pending.schema?.meta ? { meta: pending.schema.meta } : {}),\n ...(pending.options ? { options: pending.options } : {}),\n };\n });\n\n return changed ? { ...message, contentPieces } : message;\n });\n}\n\nfunction latestAssistantMessageId(messages: ChatMsg[]): string | null {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role === \"assistant\") return message.id;\n }\n return null;\n}\n\nexport function useChat<TContext = DefaultChatContext>(\n options: UseChatOptions<TContext>,\n): UseChatValue {\n const resolvedStorage = options.storage ?? defaultStorage;\n const transportRef = useLatestRef(options.transport);\n const storageRef = useLatestRef(resolvedStorage);\n const toHumanInputPieceRef = useLatestRef(\n options.toHumanInputPiece ?? defaultToHumanInputPiece,\n );\n const requestContext =\n options.context ?? ({} as unknown as NonNullable<TContext>);\n const createId = useRef(options.createId ?? defaultCreateId).current;\n\n const [messages, setMessages] = useState<ChatMsg[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [streamContentPieces, setStreamContentPieces] = useState<\n ContentPiece[]\n >([]);\n const [lastAssistantId, setLastAssistantId] = useState<string | null>(null);\n const [checkpoints, setCheckpoints] = useState<CheckpointSummary[]>([]);\n const [includeHistory, setIncludeHistory] = useState(true);\n const [workflowId, setWorkflowId] = useState(\"\");\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [branches, setBranches] = useState<Record<string, ChatBranch>>({});\n const [responseVariants, setResponseVariants] = useState<\n ChatResponseVariantGroup[]\n >([]);\n const [didHydrateStorage, setDidHydrateStorage] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const { streamDebug, clearStreamDebug, createRecorder } =\n useChatStreamDebug();\n const {\n applyStreamChunk,\n clear: clearStructuredStreams,\n delete: deleteStructuredStream,\n } = useStructuredStreams<Record<string, unknown>>({\n createId,\n });\n\n useEffect(() => {\n let cancelled = false;\n const storage = resolvedStorage;\n\n void Promise.resolve(storage.load()).then((storedState) => {\n if (cancelled) return;\n\n if (typeof storedState.sessionId === \"string\") {\n setSessionId(storedState.sessionId);\n }\n if (typeof storedState.workflowId === \"string\") {\n setWorkflowId(storedState.workflowId);\n }\n if (typeof storedState.includeHistory === \"boolean\") {\n setIncludeHistory(storedState.includeHistory);\n }\n if (\n Array.isArray(storedState.messages) &&\n storedState.messages.length > 0\n ) {\n setMessages(storedState.messages);\n }\n if (storedState.branches && typeof storedState.branches === \"object\") {\n setBranches(\n storedState.branches as unknown as Record<string, ChatBranch>,\n );\n }\n if (Array.isArray(storedState.responseVariants)) {\n setResponseVariants(\n storedState.responseVariants as ChatResponseVariantGroup[],\n );\n }\n\n setDidHydrateStorage(true);\n });\n\n return () => {\n cancelled = true;\n };\n }, [resolvedStorage]);\n\n useEffect(() => {\n const nextLastAssistantId = latestAssistantMessageId(messages);\n if (lastAssistantId !== nextLastAssistantId) {\n setLastAssistantId(nextLastAssistantId);\n }\n }, [lastAssistantId, messages]);\n\n useEffect(() => {\n if (!didHydrateStorage) return;\n const storage = storageRef.current;\n\n void storage.save({\n sessionId,\n workflowId,\n includeHistory,\n messages,\n branches,\n responseVariants,\n });\n }, [\n branches,\n didHydrateStorage,\n includeHistory,\n messages,\n responseVariants,\n sessionId,\n storageRef,\n workflowId,\n ]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setBranches((current) => ({\n ...current,\n [sessionId]: {\n ...(current[sessionId] ?? {}),\n sessionId,\n messages,\n checkpoints,\n },\n }));\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setResponseVariants((current) =>\n current.map((group) => {\n const selectedVariant = group.variants.find(\n (variant) =>\n variant.id === group.selectedVariantId &&\n variant.sessionId === sessionId,\n );\n if (!selectedVariant) return group;\n if (\n selectedVariant.messages === messages &&\n selectedVariant.checkpoints === checkpoints\n ) {\n return group;\n }\n\n return {\n ...group,\n variants: group.variants.map((variant) =>\n variant.id === selectedVariant.id\n ? {\n ...variant,\n messages,\n checkpoints,\n }\n : variant,\n ),\n };\n }),\n );\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n const clearActiveStream = () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages([]);\n setCheckpoints([]);\n setBranches({});\n setResponseVariants([]);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n setLastAssistantId(null);\n };\n\n const clearMessages = () => {\n clearActiveStream();\n void storageRef.current.clearMessages();\n };\n\n const resetSession = () => {\n setSessionId(null);\n setCheckpoints([]);\n };\n\n const resetChat = () => {\n clearActiveStream();\n resetSession();\n setError(null);\n void storageRef.current.clearMessages();\n };\n\n const clearChat = resetChat;\n\n const clearError = () => {\n setError(null);\n };\n\n const abort = () => {\n abortControllerRef.current?.abort();\n };\n\n const persistSessionId = (sid: string) => {\n setSessionId(sid);\n };\n\n const resolveSessionId = (preferredSessionId?: string | undefined) => {\n if (preferredSessionId) {\n if (sessionId !== preferredSessionId)\n persistSessionId(preferredSessionId);\n return preferredSessionId;\n }\n const sid = sessionId ?? createId();\n if (!sessionId) persistSessionId(sid);\n return sid;\n };\n\n const toOutgoingHistoryMessage = (message: ChatMsg): OutgoingChatMessage => ({\n role: message.role,\n content: message.content,\n });\n\n const prepareMessagesToSend = async (args: {\n sid: string;\n outgoingMessage: OutgoingChatMessage;\n reason: \"send\" | \"resume\";\n baseMessages?: ChatMsg[] | undefined;\n }): Promise<OutgoingChatMessage[]> => {\n const baseMessages = args.baseMessages ?? messages;\n const prepared = options.prepareContextMessages\n ? await options.prepareContextMessages({\n messages: baseMessages,\n sessionId: args.sid,\n workflowId,\n reason: args.reason,\n context: requestContext,\n })\n : includeHistory\n ? baseMessages.map(toOutgoingHistoryMessage)\n : [];\n\n return [...prepared, args.outgoingMessage];\n };\n\n const streamAssistantResponse = async (args: {\n sid: string;\n messagesToSend: OutgoingChatMessage[];\n messagesBeforeAssistant?: ChatMsg[] | undefined;\n debugLabel: string;\n openDebugOnInterrupt?: boolean;\n signal: AbortSignal;\n }): Promise<ChatMsg | undefined> => {\n clearStructuredStreams();\n setStreamContentPieces([]);\n\n const debug = createRecorder(`${args.debugLabel} sessionId=${args.sid}`);\n let currentTrace: ChatTraceMetadata | undefined;\n let completedTrace: ChatTraceMetadata | undefined;\n let currentCheckpoint:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n const pieces = createLiveChatPieces({\n createId,\n onChange: setStreamContentPieces,\n structuredStreams: {\n applyStreamChunk,\n },\n toHumanInputPiece: (chunk) =>\n toHumanInputPieceRef.current({\n chunk,\n createId,\n }),\n });\n\n await transportRef.current.stream({\n sessionId: args.sid,\n workflowId,\n messages: args.messagesToSend,\n context: requestContext,\n signal: args.signal,\n onChunk: (chunk: StreamChunk) => {\n debug.push(chunk);\n\n if (chunk.type === \"session\") {\n if (typeof chunk.sessionId === \"string\") {\n persistSessionId(chunk.sessionId);\n }\n return;\n }\n\n if (chunk.type === \"trace\") {\n if (\n typeof chunk.traceId === \"string\" &&\n typeof chunk.spanId === \"string\" &&\n typeof chunk.runId === \"string\"\n ) {\n currentTrace = {\n traceId: chunk.traceId,\n spanId: chunk.spanId,\n runId: chunk.runId,\n };\n }\n return;\n }\n\n if (chunk.type === \"checkpoint\") {\n currentCheckpoint = {\n id: chunk.id,\n turnIndex: chunk.turnIndex,\n };\n setCheckpoints((prev) => {\n const next = {\n id: chunk.id,\n sessionId: chunk.sessionId,\n turnIndex: chunk.turnIndex,\n createdAt: Date.now(),\n nodes: [],\n workflow: workflowId,\n ...(chunk.label ? { label: chunk.label } : {}),\n } satisfies CheckpointSummary;\n return [...prev.filter((item) => item.id !== chunk.id), next].sort(\n (a, b) => a.turnIndex - b.turnIndex,\n );\n });\n return;\n }\n\n if (chunk.type === \"structured-data-invalidated\") {\n deleteStructuredStream(chunk.streamId);\n return;\n }\n\n if (chunk.type === \"error\") {\n setError(\n isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message),\n );\n }\n\n if (chunk.type === \"done\") {\n completedTrace = currentTrace;\n currentTrace = undefined;\n }\n\n return pieces.processChunk(chunk, {\n openDebugOnInterrupt: args.openDebugOnInterrupt,\n });\n },\n });\n\n if (args.signal.aborted) return undefined;\n\n const assistant = buildAssistantMessage({\n createId,\n pieces: pieces.getPieces(),\n debug: debug.getAll(),\n trace: completedTrace ?? currentTrace,\n checkpoint: currentCheckpoint,\n });\n setMessages((prev) =>\n args.messagesBeforeAssistant\n ? [...args.messagesBeforeAssistant, assistant]\n : [...prev, assistant],\n );\n setLastAssistantId(assistant.id);\n clearStructuredStreams();\n setStreamContentPieces([]);\n clearStreamDebug();\n return assistant;\n };\n\n const isAbortError = (value: unknown, signal: AbortSignal): boolean => {\n if (signal.aborted) return true;\n if (!(value instanceof Error)) return false;\n return value.name === \"AbortError\";\n };\n\n const respondToHumanInputFromBase = async ({\n resumeToken,\n requestId,\n selected,\n text,\n value,\n hasValue,\n baseMessages,\n sid,\n }: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n value?: unknown;\n hasValue?: boolean;\n baseMessages?: ChatMsg[] | undefined;\n sid?: string | undefined;\n }): Promise<ReplayResult | undefined> => {\n if (isStreaming) return undefined;\n setError(null);\n const label: string =\n typeof text === \"string\" && text.length > 0\n ? text\n : selected.length > 0\n ? selected.length === 1\n ? (selected[0] as string)\n : selected.join(\", \")\n : hasValue\n ? \"(response)\"\n : \"(selection)\";\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content: label,\n source: {\n type: \"interrupt-response\",\n resumeToken,\n requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n ...(hasValue ? { value } : {}),\n },\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resumePayload: Record<string, unknown> = {\n resume: {\n token: resumeToken,\n requestId,\n selected,\n ...(hasValue ? { value } : {}),\n },\n };\n const outgoing = {\n role: \"user\" as const,\n content: label,\n metadata: resumePayload,\n };\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: outgoing,\n reason: \"resume\",\n baseMessages,\n });\n\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (resume)\",\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const respondToHumanInput = async (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n value?: unknown;\n hasValue?: boolean;\n }): Promise<void> => {\n await respondToHumanInputFromBase(args);\n };\n\n const respondToInterrupt = async (\n piece: HumanInputPiece,\n response?: {\n selected?: string[] | undefined;\n text?: string | undefined;\n value?: unknown;\n },\n ) => {\n const text = response?.text;\n const hasValue = Boolean(response && Object.hasOwn(response, \"value\"));\n const selected =\n response?.selected ??\n (typeof text === \"string\" && text.length > 0 ? [text] : []);\n\n await respondToHumanInput({\n resumeToken: piece.resumeToken,\n requestId: piece.requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n ...(hasValue ? { value: response?.value, hasValue: true } : {}),\n });\n };\n\n const sendFromBase = async (\n text: string,\n baseMessages?: ChatMsg[] | undefined,\n sid?: string | undefined,\n ): Promise<ReplayResult | undefined> => {\n const content = text.trim();\n if (!content || isStreaming) return undefined;\n setError(null);\n\n const activeTextInterrupt = findActiveTextInterrupt({\n messages: baseMessages ?? messages,\n streamContentPieces,\n });\n\n if (activeTextInterrupt) {\n return respondToHumanInputFromBase({\n resumeToken: activeTextInterrupt.resumeToken,\n requestId: activeTextInterrupt.requestId,\n selected: [content],\n text: content,\n baseMessages,\n sid,\n });\n }\n\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content,\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: { role: \"user\" as const, content },\n reason: \"send\",\n baseMessages,\n });\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (send)\",\n openDebugOnInterrupt: true,\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const send = async (text: string): Promise<void> => {\n await sendFromBase(text);\n };\n\n const requireCheckpointTransport = (): ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n } => {\n const transport = transportRef.current;\n if (\n !transport.listCheckpoints ||\n !transport.rollbackTo ||\n !transport.fork\n ) {\n throw new Error(\n \"Checkpoint helpers require a transport with checkpoint methods.\",\n );\n }\n return transport as ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n };\n };\n\n const refreshCheckpoints = async (sid: string) => {\n const transport = requireCheckpointTransport();\n const next = await transport.listCheckpoints(sid);\n setCheckpoints(next);\n return next;\n };\n\n const applyStructuredInvalidations = (streamIds: string[]) => {\n for (const streamId of streamIds) {\n deleteStructuredStream(streamId);\n }\n };\n\n const rollbackTo = async (id: string): Promise<RollbackCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot rollback while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const result = await transport.rollbackTo(id);\n applyStructuredInvalidations(result.invalidatedStructuredStreamIds);\n const refreshedCheckpoints = await refreshCheckpoints(result.sessionId);\n const target = refreshedCheckpoints.find(\n (checkpoint) => checkpoint.id === result.head,\n );\n\n if (target) {\n setMessages((current) => {\n return trimMessagesToCheckpoint({\n messages: current,\n turnIndex: target.turnIndex,\n });\n });\n }\n\n return result;\n };\n\n const fork = async (\n id: string,\n options?: { newSessionId?: string },\n ): Promise<ForkCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot fork while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === id,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find((checkpoint) => checkpoint.id === id);\n }\n\n const result = await transport.fork(id, options);\n setSessionId(result.sessionId);\n const childCheckpoints = await refreshCheckpoints(result.sessionId);\n const childHead = childCheckpoints.at(-1);\n const forkTurnIndex = target?.turnIndex ?? childHead?.turnIndex;\n if (typeof forkTurnIndex === \"number\") {\n setMessages((current) =>\n applyForkedPendingRequests({\n messages: trimMessagesToCheckpoint({\n messages: current,\n turnIndex: forkTurnIndex,\n }),\n pendingRequests: result.checkpoint?.activePendingRequests ?? [],\n }),\n );\n }\n setStreamContentPieces([]);\n clearStructuredStreams();\n return result;\n };\n\n const checkpointForMessage = (messageId: string): string | null => {\n return (\n messages.find((message) => message.id === messageId)?.checkpointId ?? null\n );\n };\n\n const variantForMessage = (\n messageId: string,\n ): ChatResponseVariantGroup | null => {\n return (\n responseVariants.find(\n (group) =>\n group.sourceAssistantMessageId === messageId ||\n group.variants.some(\n (variant) => variant.assistantMessageId === messageId,\n ),\n ) ?? null\n );\n };\n\n const findResumeOverrideForFork = (\n baseMessages: ChatMsg[],\n forkedBaseMessages: ChatMsg[],\n userMessage: ChatMsg,\n ): ResumeOverride | undefined => {\n if (userMessage.source?.type !== \"interrupt-response\") return undefined;\n const userSource = userMessage.source;\n\n const interruptPositions = baseMessages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex, piece }] : [],\n ),\n );\n const matchedPosition = [...interruptPositions]\n .reverse()\n .find(\n ({ piece }) =>\n piece.resumeToken === userSource.resumeToken ||\n piece.requestId === userSource.requestId,\n );\n\n const forkedPiece =\n typeof matchedPosition?.messageIndex === \"number\"\n ? forkedBaseMessages[matchedPosition.messageIndex]?.contentPieces?.[\n matchedPosition.pieceIndex\n ]\n : undefined;\n\n if (forkedPiece?.type === \"interrupt\") {\n return {\n resumeToken: forkedPiece.resumeToken,\n requestId: forkedPiece.requestId,\n };\n }\n\n const latestForkedInterrupt = forkedBaseMessages\n .flatMap((message) => message.contentPieces ?? [])\n .filter((piece): piece is HumanInputPiece => piece.type === \"interrupt\")\n .at(-1);\n\n return latestForkedInterrupt\n ? {\n resumeToken: latestForkedInterrupt.resumeToken,\n requestId: latestForkedInterrupt.requestId,\n }\n : undefined;\n };\n\n const resolveRegenerateTarget = async (assistantMessageId: string) => {\n const assistantIndex = messages.findIndex(\n (message) => message.id === assistantMessageId,\n );\n if (assistantIndex < 0) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n const assistant = messages[assistantIndex];\n if (!assistant) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n if (assistant.role !== \"assistant\") {\n throw new Error(\"Regenerate expects an assistant message id.\");\n }\n\n let userIndex = -1;\n for (let index = assistantIndex - 1; index >= 0; index--) {\n if (messages[index]?.role === \"user\") {\n userIndex = index;\n break;\n }\n }\n if (userIndex < 0) {\n throw new Error(\"No preceding user message found for regenerate.\");\n }\n const previousUser = messages[userIndex] as ChatMsg;\n\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n const assistantTurn = assistant.checkpointTurnIndex;\n const targetTurn =\n typeof assistantTurn === \"number\" ? assistantTurn - 1 : undefined;\n let target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n }\n\n if (!target) {\n throw new Error(\"No rollback checkpoint found for regenerate.\");\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n\n return { target, assistant, previousUser, baseMessages };\n };\n\n const replayUserMessage = async (\n userMessage: ChatMsg,\n baseMessages: ChatMsg[],\n editedContent?: string,\n options?: {\n sid?: string | undefined;\n resumeOverride?: ResumeOverride | undefined;\n },\n ): Promise<ReplayResult | undefined> => {\n const content = editedContent ?? userMessage.content;\n if (userMessage.source?.type === \"interrupt-response\") {\n return respondToHumanInputFromBase({\n resumeToken:\n options?.resumeOverride?.resumeToken ??\n userMessage.source.resumeToken,\n requestId:\n options?.resumeOverride?.requestId ?? userMessage.source.requestId,\n selected:\n editedContent !== undefined\n ? [editedContent]\n : userMessage.source.selected,\n baseMessages,\n sid: options?.sid,\n ...(editedContent !== undefined\n ? { text: editedContent }\n : userMessage.source.text !== undefined\n ? { text: userMessage.source.text }\n : {}),\n ...(editedContent === undefined &&\n Object.hasOwn(userMessage.source, \"value\")\n ? { value: userMessage.source.value, hasValue: true }\n : {}),\n });\n }\n return sendFromBase(content, baseMessages, options?.sid);\n };\n\n const buildVariant = (args: {\n id: string;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n label?: string;\n }): ChatResponseVariant => ({\n id: args.id,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n createdAt: Date.now(),\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n ...(args.label ? { label: args.label } : {}),\n });\n\n const updateVariantSnapshot = (args: {\n variant: ChatResponseVariant;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n }): ChatResponseVariant => ({\n ...args.variant,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n });\n\n const replaceResponseVariantGroup = (nextGroup: ChatResponseVariantGroup) => {\n setResponseVariants((current) => [\n ...current.filter((group) => group.id !== nextGroup.id),\n nextGroup,\n ]);\n };\n\n const regenerateVariant = async (\n assistantMessageId: string,\n ): Promise<ChatResponseVariantGroup> => {\n if (isStreaming) {\n throw new Error(\"Cannot regenerate a variant while a stream is active.\");\n }\n const { target, assistant, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n const transport = requireCheckpointTransport();\n const parentSessionId = resolveSessionId();\n const existingGroup = variantForMessage(assistantMessageId);\n const sourceAssistantMessageId =\n existingGroup?.sourceAssistantMessageId ?? assistantMessageId;\n const existingVariants = existingGroup\n ? existingGroup.variants.map((variant) =>\n variant.id === existingGroup.selectedVariantId ||\n variant.assistantMessageId === assistantMessageId\n ? updateVariantSnapshot({\n variant,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n })\n : variant,\n )\n : undefined;\n\n const originalVariant =\n existingVariants?.[0] ??\n buildVariant({\n id: `${sourceAssistantMessageId}:original`,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n label: \"Original\",\n });\n\n const forkResult = await transport.fork(target.id);\n const forkedSessionId = forkResult.sessionId;\n setSessionId(forkedSessionId);\n\n const childCheckpointsBeforeReplay =\n await refreshCheckpoints(forkedSessionId);\n const forkedBaseMessages = applyForkedPendingRequests({\n messages: baseMessages,\n pendingRequests: forkResult.checkpoint?.activePendingRequests ?? [],\n });\n const resumeOverride = findResumeOverrideForFork(\n baseMessages,\n forkedBaseMessages,\n previousUser,\n );\n setMessages(forkedBaseMessages);\n setStreamContentPieces([]);\n clearStructuredStreams();\n\n const replay = await replayUserMessage(\n previousUser,\n forkedBaseMessages,\n undefined,\n {\n sid: forkedSessionId,\n resumeOverride,\n },\n );\n const childCheckpointsAfterReplay =\n await refreshCheckpoints(forkedSessionId);\n const variantMessages = replay?.messages ?? forkedBaseMessages;\n const variantAssistant = replay?.assistantMessage;\n if (!variantAssistant) {\n throw new Error(\"Regenerate variant did not produce an assistant reply.\");\n }\n\n const nextVariant = buildVariant({\n id: createId(),\n sessionId: forkedSessionId,\n assistantMessage: variantAssistant,\n messages: variantMessages,\n checkpoints:\n childCheckpointsAfterReplay.length > 0\n ? childCheckpointsAfterReplay\n : childCheckpointsBeforeReplay,\n label: `Variant ${(existingGroup?.variants.length ?? 1) + 1}`,\n });\n const nextVariants = existingVariants\n ? [...existingVariants, nextVariant]\n : [originalVariant, nextVariant];\n const nextGroup: ChatResponseVariantGroup = {\n id: existingGroup?.id ?? createId(),\n sourceAssistantMessageId,\n checkpointId: existingGroup?.checkpointId ?? target.id,\n checkpointTurnIndex:\n existingGroup?.checkpointTurnIndex ?? target.turnIndex,\n selectedVariantId: nextVariant.id,\n variants: nextVariants,\n };\n\n replaceResponseVariantGroup(nextGroup);\n setBranches((current) => ({\n ...current,\n [parentSessionId]: {\n ...(current[parentSessionId] ?? {}),\n sessionId: parentSessionId,\n messages,\n checkpoints,\n },\n [forkedSessionId]: {\n ...(current[forkedSessionId] ?? {}),\n sessionId: forkedSessionId,\n parentSessionId: forkResult.parentSessionId,\n forkedFrom: forkResult.forkedFrom,\n messages: variantMessages,\n checkpoints: nextVariant.checkpoints,\n },\n }));\n\n return nextGroup;\n };\n\n const selectVariant = async (\n assistantMessageId: string,\n variantId: string,\n ): Promise<void> => {\n const group = variantForMessage(assistantMessageId);\n if (!group) {\n throw new Error(\n `No response variants found for \"${assistantMessageId}\".`,\n );\n }\n const selectedVariant = group.variants.find(\n (variant) => variant.id === variantId,\n );\n if (!selectedVariant) {\n throw new Error(`Response variant \"${variantId}\" not found.`);\n }\n\n setSessionId(selectedVariant.sessionId);\n setMessages(selectedVariant.messages);\n setCheckpoints(selectedVariant.checkpoints);\n setStreamContentPieces([]);\n clearStructuredStreams();\n setBranches((current) => ({\n ...current,\n [selectedVariant.sessionId]: {\n ...(current[selectedVariant.sessionId] ?? {}),\n sessionId: selectedVariant.sessionId,\n messages: selectedVariant.messages,\n checkpoints: selectedVariant.checkpoints,\n },\n }));\n const nextGroup = {\n ...group,\n selectedVariantId: selectedVariant.id,\n };\n replaceResponseVariantGroup(nextGroup);\n };\n\n const regenerate = async (assistantMessageId: string): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const regenerateFromCheckpoint = async (\n checkpointId: string,\n ): Promise<void> => {\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n }\n if (!target) {\n throw new Error(`Checkpoint \"${checkpointId}\" not found.`);\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n const previousUser = messages\n .slice(baseMessages.length)\n .find((message) => message.role === \"user\");\n if (!previousUser) {\n throw new Error(\"No user message found after checkpoint for regenerate.\");\n }\n\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const retryWithEdit = async (\n assistantMessageId: string,\n newUserContent: string,\n ): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages, newUserContent);\n };\n\n return {\n messages,\n isStreaming,\n canAbort: isStreaming,\n error,\n streamContentPieces,\n streamDebug,\n lastAssistantId,\n checkpoints,\n activeSessionId: sessionId,\n branches,\n responseVariants,\n workflowId,\n setWorkflowId,\n send,\n respondToHumanInput,\n respondToInterrupt,\n setMessages,\n checkpointForMessage,\n rollbackTo,\n fork,\n regenerate,\n regenerateVariant,\n selectVariant,\n variantForMessage,\n regenerateFromCheckpoint,\n retryWithEdit,\n clearMessages,\n resetSession,\n resetChat,\n clearChat,\n abort,\n clearError,\n includeHistory,\n setIncludeHistory,\n };\n}\n","\"use client\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { useCallback, useState } from \"react\";\n\ntype DebugChunk = StreamChunk & {\n _ts: number;\n _dt: number;\n _seq: number;\n};\n\nexport function useChatStreamDebug() {\n const [streamDebug, setStreamDebug] = useState<StreamChunk[]>([]);\n\n const clearStreamDebug = useCallback(() => {\n setStreamDebug([]);\n }, []);\n\n const createRecorder = useCallback((initialMessage: string) => {\n let seq = 0;\n let lastTs = 0;\n const accDebug: StreamChunk[] = [];\n\n const push = (chunk: StreamChunk) => {\n const ts = Date.now();\n const withMeta: DebugChunk = {\n ...(chunk as StreamChunk),\n _ts: ts,\n _dt: lastTs ? ts - lastTs : 0,\n _seq: seq++,\n };\n lastTs = ts;\n accDebug.push(withMeta);\n setStreamDebug((current) =>\n current.length > 1000\n ? [...current.slice(-1000), withMeta]\n : [...current, withMeta],\n );\n };\n\n push({\n type: \"status\",\n message: initialMessage,\n } as StreamChunk);\n\n return {\n push,\n getAll: () => accDebug,\n };\n }, []);\n\n return {\n streamDebug,\n clearStreamDebug,\n createRecorder,\n };\n}\n","import {\n createStructuredStreamAccumulator,\n type StreamChunk,\n type StructuredDataChunk,\n type StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nexport type StructuredStreamItem<TData = unknown> = {\n id: string;\n streamId: string;\n state: StructuredStreamState<TData>;\n};\n\nexport type UseStructuredStreamsOptions<_TData = unknown> = {\n createId?: (() => string) | undefined;\n initialChunks?: Iterable<StructuredDataChunk> | undefined;\n};\n\nexport type UseStructuredStreamsResult<TData = unknown> = {\n items: StructuredStreamItem<TData>[];\n byStreamId: Record<string, StructuredStreamState<TData>>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TData> | undefined;\n clear: () => void;\n get: (streamId: string) => StructuredStreamItem<TData> | undefined;\n delete: (streamId: string) => boolean;\n};\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport function useStructuredStreams<TData = unknown>(\n options?: UseStructuredStreamsOptions<TData> | undefined,\n): UseStructuredStreamsResult<TData> {\n const createId = useRef(options?.createId ?? defaultCreateId).current;\n const initialChunks = useRef(options?.initialChunks ?? []).current;\n const accumulatorRef = useRef(\n createStructuredStreamAccumulator<TData>(initialChunks),\n );\n const initialItemsRef = useRef<StructuredStreamItem<TData>[] | undefined>(\n undefined,\n );\n\n if (initialItemsRef.current === undefined) {\n initialItemsRef.current = accumulatorRef.current\n .entries()\n .map(([streamId, state]) => ({\n id: createId(),\n streamId,\n state,\n }));\n }\n\n const itemsRef = useRef(initialItemsRef.current);\n const [items, setItems] = useState(initialItemsRef.current);\n\n const setNextItems = useCallback(\n (nextItems: StructuredStreamItem<TData>[]) => {\n itemsRef.current = nextItems;\n setItems(nextItems);\n },\n [],\n );\n\n const applyStreamChunk = useCallback(\n (chunk: StreamChunk): StructuredStreamItem<TData> | undefined => {\n const nextState = accumulatorRef.current.applyStreamChunk(chunk);\n if (!nextState) return undefined;\n\n const currentItems = itemsRef.current;\n const existingIndex = currentItems.findIndex(\n (item) => item.streamId === nextState.streamId,\n );\n const existingItem =\n existingIndex >= 0 ? currentItems[existingIndex] : undefined;\n\n const nextItem: StructuredStreamItem<TData> = existingItem\n ? {\n ...existingItem,\n state: nextState,\n }\n : {\n id: createId(),\n streamId: nextState.streamId,\n state: nextState,\n };\n\n const nextItems =\n existingIndex >= 0\n ? currentItems.map((item, index) =>\n index === existingIndex ? nextItem : item,\n )\n : [...currentItems, nextItem];\n\n setNextItems(nextItems);\n return nextItem;\n },\n [createId, setNextItems],\n );\n\n const clear = useCallback(() => {\n accumulatorRef.current = createStructuredStreamAccumulator<TData>();\n setNextItems([]);\n }, [setNextItems]);\n\n const get = useCallback((streamId: string) => {\n return itemsRef.current.find((item) => item.streamId === streamId);\n }, []);\n\n const deleteStream = useCallback(\n (streamId: string): boolean => {\n const deleted = accumulatorRef.current.delete(streamId);\n if (!deleted) return false;\n setNextItems(\n itemsRef.current.filter((item) => item.streamId !== streamId),\n );\n return true;\n },\n [setNextItems],\n );\n\n const byStreamId = useMemo(\n () =>\n Object.fromEntries(\n items.map((item) => [item.streamId, item.state]),\n ) as Record<string, StructuredStreamState<TData>>,\n [items],\n );\n\n return {\n items,\n byStreamId,\n applyStreamChunk,\n clear,\n get,\n delete: deleteStream,\n };\n}\n"],"mappings":"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","names":["sessionId","import_errors","import_react","import_browser","import_react","defaultCreateId","options"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/react",
3
- "version": "0.4.3",
3
+ "version": "0.6.0",
4
4
  "private": false,
5
5
  "description": "React hooks for Kortyx client streaming experiences.",
6
6
  "keywords": [
@@ -32,7 +32,8 @@
32
32
  "CHANGELOG.md"
33
33
  ],
34
34
  "dependencies": {
35
- "@kortyx/stream": "0.11.0"
35
+ "@kortyx/stream": "0.13.0",
36
+ "@kortyx/core": "0.10.0"
36
37
  },
37
38
  "peerDependencies": {
38
39
  "react": ">=19"