@kortyx/react 0.6.2 → 0.8.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,33 @@
1
1
  # @kortyx/react
2
2
 
3
+ ## [0.8.0](https://github.com/kortyx-io/kortyx/compare/react-v0.7.0...react-v0.8.0) (2026-09-30)
4
+
5
+
6
+ ### Features
7
+
8
+ * **hooks:** add realtime model-selected output contracts ([#249](https://github.com/kortyx-io/kortyx/issues/249)) ([ac52b47](https://github.com/kortyx-io/kortyx/commit/ac52b47151b64ce5be6ce6c7fd42d34a0fa8a76d))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @kortyx/stream bumped to 0.15.0
16
+
17
+ ## [0.7.0](https://github.com/kortyx-io/kortyx/compare/react-v0.6.2...react-v0.7.0) (2026-09-23)
18
+
19
+
20
+ ### Features
21
+
22
+ * **chat:** add server-side transcript lifecycle hooks ([#240](https://github.com/kortyx-io/kortyx/issues/240)) ([f84a674](https://github.com/kortyx-io/kortyx/commit/f84a6749819ee7bab343efb03f38eae743de0655))
23
+
24
+
25
+ ### Dependencies
26
+
27
+ * The following workspace dependencies were updated
28
+ * dependencies
29
+ * @kortyx/stream bumped to 0.14.0
30
+
3
31
  ## [0.6.2](https://github.com/kortyx-io/kortyx/compare/react-v0.6.1...react-v0.6.2) (2026-09-22)
4
32
 
5
33
 
package/dist/index.d.ts CHANGED
@@ -1,42 +1,12 @@
1
- import { StructuredStreamState, StreamChunk, StreamFromRouteArgs, StructuredDataChunk } from '@kortyx/stream/browser';
1
+ import { FinalizedChatContentPiece, StreamChunk, StructuredStreamState, StreamFromRouteArgs, StructuredDataChunk } from '@kortyx/stream/browser';
2
2
  import * as _kortyx_core_errors from '@kortyx/core/errors';
3
3
  import { FailureDescriptor } from '@kortyx/core/errors';
4
4
 
5
5
  type StructuredData = StructuredStreamState<Record<string, unknown>>;
6
- type HumanInputPiece = {
7
- id: string;
6
+ type ContentPiece = FinalizedChatContentPiece;
7
+ type HumanInputPiece = Extract<ContentPiece, {
8
8
  type: "interrupt";
9
- resumeToken: string;
10
- requestId: string;
11
- kind: "text" | "choice" | "multi-choice" | "custom";
12
- question?: string;
13
- multiple: boolean;
14
- options: Array<{
15
- id: string;
16
- label: string;
17
- description?: string;
18
- }>;
19
- schemaId?: string;
20
- schemaVersion?: string;
21
- contract?: string;
22
- request?: unknown;
23
- interruptId?: string;
24
- meta?: Record<string, unknown>;
25
- };
26
- type ContentPiece = {
27
- id: string;
28
- type: "text";
29
- content: string;
30
- } | {
31
- id: string;
32
- type: "structured";
33
- data: StructuredData;
34
- } | {
35
- id: string;
36
- type: "error";
37
- content: string;
38
- failure?: FailureDescriptor;
39
- } | HumanInputPiece;
9
+ }>;
40
10
  type ChatMsg = {
41
11
  id: string;
42
12
  role: "user" | "assistant";
@@ -120,6 +90,7 @@ type OutgoingChatMessage = {
120
90
  };
121
91
  type ChatTransportContext<TContext = DefaultChatContext$1> = {
122
92
  sessionId: string;
93
+ clientTurnId?: string | undefined;
123
94
  workflowId: string;
124
95
  messages: OutgoingChatMessage[];
125
96
  context: TContext;
@@ -186,6 +157,7 @@ declare function createChatTransport<TContext = DefaultChatContext$1>(args: {
186
157
  }): ChatTransport<TContext>;
187
158
  type RouteChatRequestBody<TContext = DefaultChatContext$1> = {
188
159
  sessionId: string;
160
+ clientTurnId?: string | undefined;
189
161
  workflowId: string;
190
162
  messages: OutgoingChatMessage[];
191
163
  context: TContext;
@@ -241,6 +213,7 @@ type StructuredStreamsController<TStructuredData> = {
241
213
  };
242
214
  declare function createLiveChatPieces<TStructuredData = unknown, TCustomPiece extends LiveChatCustomPiece = never>(args: {
243
215
  createId: () => string;
216
+ turnId?: string | undefined;
244
217
  onChange: (pieces: LiveChatPiece<TStructuredData, TCustomPiece>[]) => void;
245
218
  structuredStreams: StructuredStreamsController<TStructuredData>;
246
219
  toHumanInputPiece: (chunk: StreamChunk) => TCustomPiece;
@@ -367,7 +340,7 @@ declare function useChatStreamDebug(): {
367
340
  } | {
368
341
  type: "structured-data-invalidated";
369
342
  streamId: string;
370
- checkpointId: string;
343
+ checkpointId?: string;
371
344
  } | {
372
345
  type: "trace";
373
346
  traceId: string;
@@ -558,7 +531,7 @@ declare function useChatStreamDebug(): {
558
531
  } | {
559
532
  type: "structured-data-invalidated";
560
533
  streamId: string;
561
- checkpointId: string;
534
+ checkpointId?: string;
562
535
  } | {
563
536
  type: "trace";
564
537
  traceId: string;
package/dist/index.js CHANGED
@@ -194,6 +194,7 @@ function createRouteChatTransport(args) {
194
194
  stream: (context) => {
195
195
  const body = args.createBody?.(context) ?? {
196
196
  sessionId: context.sessionId,
197
+ ...context.clientTurnId ? { clientTurnId: context.clientTurnId } : {},
197
198
  workflowId: context.workflowId,
198
199
  messages: context.messages,
199
200
  context: context.context
@@ -305,7 +306,7 @@ function createLiveChatPieces(args) {
305
306
  return keyedPieces[existingIndex]?.piece;
306
307
  }
307
308
  const nextPiece = {
308
- id: args.createId(),
309
+ id: args.turnId ? `${args.turnId}:text:${key}` : args.createId(),
309
310
  type: "text",
310
311
  content: ""
311
312
  };
@@ -336,13 +337,22 @@ function createLiveChatPieces(args) {
336
337
  const nextItem = args.structuredStreams.applyStreamChunk(chunk);
337
338
  if (nextItem) {
338
339
  upsertPiece(`structured:${nextItem.streamId}`, {
339
- id: nextItem.id,
340
+ id: args.turnId ? `${args.turnId}:structured:${nextItem.streamId}` : nextItem.id,
340
341
  type: "structured",
341
342
  data: nextItem.state
342
343
  });
343
344
  }
344
345
  return true;
345
346
  }
347
+ if (chunk.type === "structured-data-invalidated") {
348
+ args.structuredStreams.applyStreamChunk(chunk);
349
+ const index = findPieceIndex(`structured:${chunk.streamId}`);
350
+ if (index >= 0) {
351
+ keyedPieces.splice(index, 1);
352
+ emit();
353
+ }
354
+ return true;
355
+ }
346
356
  if (chunk.type === "interrupt") {
347
357
  pushPiece(args.toHumanInputPiece(chunk));
348
358
  return true;
@@ -350,7 +360,7 @@ function createLiveChatPieces(args) {
350
360
  if (chunk.type === "message") {
351
361
  if (!sawTextDelta) {
352
362
  pushPiece({
353
- id: args.createId(),
363
+ id: args.turnId ? `${args.turnId}:message:${keyedPieces.length}` : args.createId(),
354
364
  type: "text",
355
365
  content: chunk.content ?? ""
356
366
  });
@@ -359,7 +369,7 @@ function createLiveChatPieces(args) {
359
369
  }
360
370
  if (chunk.type === "error") {
361
371
  pushPiece({
362
- id: args.createId(),
372
+ id: args.turnId ? `${args.turnId}:error:${keyedPieces.length}` : args.createId(),
363
373
  type: "error",
364
374
  content: chunk.message ?? "An error occurred",
365
375
  ...chunk.failure ? { failure: chunk.failure } : {}
@@ -509,8 +519,23 @@ function useStructuredStreams(options) {
509
519
  },
510
520
  []
511
521
  );
522
+ const deleteStream = (0, import_react2.useCallback)(
523
+ (streamId) => {
524
+ const deleted = accumulatorRef.current.delete(streamId);
525
+ if (!deleted) return false;
526
+ setNextItems(
527
+ itemsRef.current.filter((item) => item.streamId !== streamId)
528
+ );
529
+ return true;
530
+ },
531
+ [setNextItems]
532
+ );
512
533
  const applyStreamChunk = (0, import_react2.useCallback)(
513
534
  (chunk) => {
535
+ if (chunk.type === "structured-data-invalidated") {
536
+ deleteStream(chunk.streamId);
537
+ return void 0;
538
+ }
514
539
  const nextState = accumulatorRef.current.applyStreamChunk(chunk);
515
540
  if (!nextState) return void 0;
516
541
  const currentItems = itemsRef.current;
@@ -532,7 +557,7 @@ function useStructuredStreams(options) {
532
557
  setNextItems(nextItems);
533
558
  return nextItem;
534
559
  },
535
- [createId, setNextItems]
560
+ [createId, deleteStream, setNextItems]
536
561
  );
537
562
  const clear = (0, import_react2.useCallback)(() => {
538
563
  accumulatorRef.current = (0, import_browser2.createStructuredStreamAccumulator)();
@@ -541,17 +566,6 @@ function useStructuredStreams(options) {
541
566
  const get = (0, import_react2.useCallback)((streamId) => {
542
567
  return itemsRef.current.find((item) => item.streamId === streamId);
543
568
  }, []);
544
- const deleteStream = (0, import_react2.useCallback)(
545
- (streamId) => {
546
- const deleted = accumulatorRef.current.delete(streamId);
547
- if (!deleted) return false;
548
- setNextItems(
549
- itemsRef.current.filter((item) => item.streamId !== streamId)
550
- );
551
- return true;
552
- },
553
- [setNextItems]
554
- );
555
569
  const byStreamId = (0, import_react2.useMemo)(
556
570
  () => Object.fromEntries(
557
571
  items.map((item) => [item.streamId, item.state])
@@ -850,17 +864,19 @@ function useChat(options) {
850
864
  let currentCheckpoint;
851
865
  const pieces = createLiveChatPieces({
852
866
  createId,
867
+ turnId: args.clientTurnId,
853
868
  onChange: setStreamContentPieces,
854
869
  structuredStreams: {
855
870
  applyStreamChunk
856
871
  },
857
872
  toHumanInputPiece: (chunk) => toHumanInputPieceRef.current({
858
873
  chunk,
859
- createId
874
+ createId: () => !options.toHumanInputPiece && chunk.type === "interrupt" ? `${args.clientTurnId}:interrupt:${chunk.requestId}` : createId()
860
875
  })
861
876
  });
862
877
  await transportRef.current.stream({
863
878
  sessionId: args.sid,
879
+ clientTurnId: args.clientTurnId,
864
880
  workflowId,
865
881
  messages: args.messagesToSend,
866
882
  context: requestContext,
@@ -905,7 +921,7 @@ function useChat(options) {
905
921
  return;
906
922
  }
907
923
  if (chunk.type === "structured-data-invalidated") {
908
- deleteStructuredStream(chunk.streamId);
924
+ pieces.processChunk(chunk);
909
925
  return;
910
926
  }
911
927
  if (chunk.type === "error") {
@@ -924,7 +940,7 @@ function useChat(options) {
924
940
  });
925
941
  if (args.signal.aborted) return void 0;
926
942
  const assistant = buildAssistantMessage({
927
- createId,
943
+ createId: () => `${args.clientTurnId}:assistant`,
928
944
  pieces: pieces.getPieces(),
929
945
  debug: debug.getAll(),
930
946
  trace: completedTrace ?? currentTrace,
@@ -1002,6 +1018,7 @@ function useChat(options) {
1002
1018
  });
1003
1019
  const assistantMessage = await streamAssistantResponse({
1004
1020
  sid: resolvedSessionId,
1021
+ clientTurnId: userId,
1005
1022
  messagesToSend,
1006
1023
  messagesBeforeAssistant: nextMessages,
1007
1024
  debugLabel: "runChat (resume)",
@@ -1081,6 +1098,7 @@ function useChat(options) {
1081
1098
  });
1082
1099
  const assistantMessage = await streamAssistantResponse({
1083
1100
  sid: resolvedSessionId,
1101
+ clientTurnId: userId,
1084
1102
  messagesToSend,
1085
1103
  messagesBeforeAssistant: nextMessages,
1086
1104
  debugLabel: "runChat (send)",
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 {\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"]}
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 clientTurnId?: string | undefined;\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 clientTurnId?: string | undefined;\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 ...(context.clientTurnId\n ? { clientTurnId: context.clientTurnId }\n : {}),\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 turnId?: string | undefined;\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.turnId ? `${args.turnId}:text:${key}` : 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: args.turnId\n ? `${args.turnId}:structured:${nextItem.streamId}`\n : nextItem.id,\n type: \"structured\",\n data: nextItem.state,\n });\n }\n return true;\n }\n\n if (chunk.type === \"structured-data-invalidated\") {\n args.structuredStreams.applyStreamChunk(chunk);\n const index = findPieceIndex(`structured:${chunk.streamId}`);\n if (index >= 0) {\n keyedPieces.splice(index, 1);\n emit();\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.turnId\n ? `${args.turnId}:message:${keyedPieces.length}`\n : 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.turnId\n ? `${args.turnId}:error:${keyedPieces.length}`\n : 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 clientTurnId: 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 turnId: args.clientTurnId,\n onChange: setStreamContentPieces,\n structuredStreams: {\n applyStreamChunk,\n },\n toHumanInputPiece: (chunk) =>\n toHumanInputPieceRef.current({\n chunk,\n createId: () =>\n !options.toHumanInputPiece && chunk.type === \"interrupt\"\n ? `${args.clientTurnId}:interrupt:${chunk.requestId}`\n : createId(),\n }),\n });\n\n await transportRef.current.stream({\n sessionId: args.sid,\n clientTurnId: args.clientTurnId,\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 pieces.processChunk(chunk);\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: () => `${args.clientTurnId}:assistant`,\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 clientTurnId: userId,\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 clientTurnId: userId,\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 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 applyStreamChunk = useCallback(\n (chunk: StreamChunk): StructuredStreamItem<TData> | undefined => {\n if (chunk.type === \"structured-data-invalidated\") {\n deleteStream(chunk.streamId);\n return undefined;\n }\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, deleteStream, 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 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.6.2",
3
+ "version": "0.8.0",
4
4
  "private": false,
5
5
  "description": "React hooks for Kortyx client streaming experiences.",
6
6
  "keywords": [
@@ -32,7 +32,7 @@
32
32
  "CHANGELOG.md"
33
33
  ],
34
34
  "dependencies": {
35
- "@kortyx/stream": "0.13.2",
35
+ "@kortyx/stream": "0.15.0",
36
36
  "@kortyx/core": "0.11.0"
37
37
  },
38
38
  "peerDependencies": {