@kortyx/react 0.4.3 → 0.5.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 +19 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @kortyx/react
|
|
2
2
|
|
|
3
|
+
## [0.5.0](https://github.com/kortyx-io/kortyx/compare/react-v0.4.3...react-v0.5.0) (2026-09-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* **errors:** public failure messages and default HTTP statuses change; malformed streams fail explicitly, provider error classes are shared, and retry helpers exclude control flow. Existing calls and legacy records remain supported. See the error-contract migration and release notes.
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* **errors:** harden failure contracts across execution and recovery ([#175](https://github.com/kortyx-io/kortyx/issues/175)) ([d231e36](https://github.com/kortyx-io/kortyx/commit/d231e364259a4f23fc3675d8783fde5ba338416e))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Dependencies
|
|
16
|
+
|
|
17
|
+
* The following workspace dependencies were updated
|
|
18
|
+
* dependencies
|
|
19
|
+
* @kortyx/stream bumped to 0.12.0
|
|
20
|
+
* @kortyx/core bumped to 0.9.0
|
|
21
|
+
|
|
3
22
|
## [0.4.3](https://github.com/kortyx-io/kortyx/compare/react-v0.4.2...react-v0.4.3) (2026-09-10)
|
|
4
23
|
|
|
5
24
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { StructuredStreamState, StreamChunk, StreamFromRouteArgs, StructuredDataChunk } from '@kortyx/stream/browser';
|
|
2
|
+
import * as _kortyx_core_errors from '@kortyx/core/errors';
|
|
3
|
+
import { FailureDescriptor } from '@kortyx/core/errors';
|
|
2
4
|
|
|
3
5
|
type StructuredData = StructuredStreamState<Record<string, unknown>>;
|
|
4
6
|
type HumanInputPiece = {
|
|
@@ -31,6 +33,7 @@ type ContentPiece = {
|
|
|
31
33
|
id: string;
|
|
32
34
|
type: "error";
|
|
33
35
|
content: string;
|
|
36
|
+
failure?: FailureDescriptor;
|
|
34
37
|
} | HumanInputPiece;
|
|
35
38
|
type ChatMsg = {
|
|
36
39
|
id: string;
|
|
@@ -222,6 +225,7 @@ type LiveChatStructuredPiece<TStructuredData = unknown> = {
|
|
|
222
225
|
type LiveChatErrorPiece = {
|
|
223
226
|
id: string;
|
|
224
227
|
type: "error";
|
|
228
|
+
failure?: FailureDescriptor;
|
|
225
229
|
content: string;
|
|
226
230
|
};
|
|
227
231
|
type LiveChatCustomPiece = {
|
|
@@ -419,6 +423,7 @@ declare function useChatStreamDebug(): {
|
|
|
419
423
|
tool: string;
|
|
420
424
|
toolCallId: string;
|
|
421
425
|
message: string;
|
|
426
|
+
failure?: _kortyx_core_errors.FailureDescriptor;
|
|
422
427
|
node?: string;
|
|
423
428
|
id?: string;
|
|
424
429
|
opId?: string;
|
|
@@ -519,6 +524,7 @@ declare function useChatStreamDebug(): {
|
|
|
519
524
|
} | {
|
|
520
525
|
type: "error";
|
|
521
526
|
message: string;
|
|
527
|
+
failure?: _kortyx_core_errors.FailureDescriptor;
|
|
522
528
|
})[];
|
|
523
529
|
clearStreamDebug: () => void;
|
|
524
530
|
createRecorder: (initialMessage: string) => {
|
|
@@ -597,6 +603,7 @@ declare function useChatStreamDebug(): {
|
|
|
597
603
|
tool: string;
|
|
598
604
|
toolCallId: string;
|
|
599
605
|
message: string;
|
|
606
|
+
failure?: _kortyx_core_errors.FailureDescriptor;
|
|
600
607
|
node?: string;
|
|
601
608
|
id?: string;
|
|
602
609
|
opId?: string;
|
|
@@ -697,6 +704,7 @@ declare function useChatStreamDebug(): {
|
|
|
697
704
|
} | {
|
|
698
705
|
type: "error";
|
|
699
706
|
message: string;
|
|
707
|
+
failure?: _kortyx_core_errors.FailureDescriptor;
|
|
700
708
|
})[];
|
|
701
709
|
};
|
|
702
710
|
};
|
package/dist/index.js
CHANGED
|
@@ -175,6 +175,7 @@ function createBrowserChatStorage(options) {
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
// src/chat-transport.ts
|
|
178
|
+
var import_errors = require("@kortyx/core/errors");
|
|
178
179
|
var import_browser = require("@kortyx/stream/browser");
|
|
179
180
|
function createChatTransport(args) {
|
|
180
181
|
return {
|
|
@@ -222,13 +223,19 @@ function createRouteChatTransport(args) {
|
|
|
222
223
|
body: JSON.stringify(body)
|
|
223
224
|
});
|
|
224
225
|
if (!response.ok) {
|
|
226
|
+
let failure;
|
|
225
227
|
let message = `Checkpoint request failed with status ${response.status}`;
|
|
226
228
|
try {
|
|
227
229
|
const parsed = await response.json();
|
|
230
|
+
failure = parsed.failure;
|
|
228
231
|
if (typeof parsed.error === "string") message = parsed.error;
|
|
229
232
|
} catch {
|
|
230
233
|
}
|
|
231
|
-
throw new
|
|
234
|
+
throw (0, import_errors.isFailureDescriptor)(failure) ? (0, import_errors.errorFromFailure)(failure) : new import_errors.KortyxError("CHECKPOINT_REQUEST_FAILED", message, {
|
|
235
|
+
category: "transport",
|
|
236
|
+
status: response.status,
|
|
237
|
+
safeMessage: message
|
|
238
|
+
});
|
|
232
239
|
}
|
|
233
240
|
return await response.json();
|
|
234
241
|
};
|
|
@@ -354,7 +361,8 @@ function createLiveChatPieces(args) {
|
|
|
354
361
|
pushPiece({
|
|
355
362
|
id: args.createId(),
|
|
356
363
|
type: "error",
|
|
357
|
-
content: chunk.message ?? "An error occurred"
|
|
364
|
+
content: chunk.message ?? "An error occurred",
|
|
365
|
+
...chunk.failure ? { failure: chunk.failure } : {}
|
|
358
366
|
});
|
|
359
367
|
return true;
|
|
360
368
|
}
|
|
@@ -417,6 +425,7 @@ function toHumanInputPiece(args) {
|
|
|
417
425
|
}
|
|
418
426
|
|
|
419
427
|
// src/use-chat.ts
|
|
428
|
+
var import_errors2 = require("@kortyx/core/errors");
|
|
420
429
|
var import_react3 = require("react");
|
|
421
430
|
|
|
422
431
|
// src/use-chat-stream-debug.ts
|
|
@@ -897,7 +906,9 @@ function useChat(options) {
|
|
|
897
906
|
return;
|
|
898
907
|
}
|
|
899
908
|
if (chunk.type === "error") {
|
|
900
|
-
setError(
|
|
909
|
+
setError(
|
|
910
|
+
(0, import_errors2.isFailureDescriptor)(chunk.failure) ? (0, import_errors2.errorFromFailure)(chunk.failure) : new Error(chunk.message)
|
|
911
|
+
);
|
|
901
912
|
}
|
|
902
913
|
if (chunk.type === "done") {
|
|
903
914
|
completedTrace = currentTrace;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/build-assistant-message.ts","../src/chat-storage.ts","../src/chat-transport.ts","../src/create-live-chat-pieces.ts","../src/to-human-input-piece.ts","../src/use-chat.ts","../src/use-chat-stream-debug.ts","../src/use-structured-streams.ts"],"sourcesContent":["export * from \"./build-assistant-message\";\nexport * from \"./chat-storage\";\nexport * from \"./chat-transport\";\nexport * from \"./chat-types\";\nexport * from \"./create-live-chat-pieces\";\nexport * from \"./to-human-input-piece\";\nexport * from \"./use-chat\";\nexport * from \"./use-chat-stream-debug\";\nexport * from \"./use-structured-streams\";\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { ChatMsg, ContentPiece } from \"./chat-types\";\n\nexport function buildAssistantMessage(args: {\n createId: () => string;\n pieces: ContentPiece[];\n debug: StreamChunk[];\n trace?:\n | {\n traceId: string;\n spanId: string;\n runId: string;\n }\n | undefined;\n checkpoint?:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n}): ChatMsg {\n const plainTextContent = args.pieces\n .filter(\n (piece): piece is Extract<ContentPiece, { type: \"text\" }> =>\n piece.type === \"text\",\n )\n .map((piece) => piece.content)\n .join(\"\");\n\n const base = {\n id: args.createId(),\n role: \"assistant\" as const,\n content: plainTextContent,\n debug: args.debug,\n ...(args.trace ? args.trace : {}),\n ...(args.checkpoint\n ? {\n checkpointId: args.checkpoint.id,\n checkpointTurnIndex: args.checkpoint.turnIndex,\n }\n : {}),\n };\n\n return args.pieces.length > 0\n ? { ...base, contentPieces: args.pieces }\n : base;\n}\n","type MaybePromise<T> = T | Promise<T>;\ntype StorageLike = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\nexport type PersistedChatState<TMessage> = {\n sessionId: string | null;\n workflowId: string;\n includeHistory: boolean;\n messages: TMessage[];\n branches?: Record<\n string,\n {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints?: unknown[];\n }\n >;\n responseVariants?: unknown[];\n};\n\nexport type ChatStorage<TMessage> = {\n load: () => MaybePromise<Partial<PersistedChatState<TMessage>>>;\n save: (state: PersistedChatState<TMessage>) => MaybePromise<void>;\n clearMessages: () => MaybePromise<void>;\n};\n\nexport type BrowserChatStorageKeys = {\n messages: string;\n includeHistory: string;\n sessionId: string;\n workflowId: string;\n branches: string;\n responseVariants: string;\n};\n\nexport type BrowserChatStorageOptions<TMessage> = {\n parseMessage?: ((value: unknown) => TMessage | null) | undefined;\n serializeMessage?: ((message: TMessage) => unknown) | undefined;\n maxMessages?: number | undefined;\n keys?: Partial<BrowserChatStorageKeys> | undefined;\n};\n\nconst DEFAULT_STORAGE_KEYS: BrowserChatStorageKeys = {\n messages: \"chat.messages.v1\",\n includeHistory: \"chat.includeHistory.v1\",\n sessionId: \"chat.sessionId\",\n workflowId: \"chat.workflowId\",\n branches: \"chat.branches.v1\",\n responseVariants: \"chat.responseVariants.v1\",\n};\n\nconst getLocalStorage = (): StorageLike | undefined => {\n const candidate = globalThis as { localStorage?: StorageLike };\n return candidate.localStorage;\n};\n\nconst defaultParseMessage = <TMessage>(value: unknown): TMessage | null =>\n value as TMessage;\n\nconst defaultSerializeMessage = <TMessage>(message: TMessage): unknown =>\n message;\n\n// TODO: Make remote/custom persistence more robust before freezing this API:\n// - add debouncing so repeated message updates do not trigger a full save each time\n// - surface save error handling/retry hooks instead of silently ignoring failures\n// - define a conflict/version strategy for multi-tab and server-synced storage\n// - support partial saves instead of rewriting the full persisted state on each change\nexport function createBrowserChatStorage<TMessage = unknown>(\n options?: BrowserChatStorageOptions<TMessage>,\n): ChatStorage<TMessage> {\n const keys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(options?.keys ?? {}),\n };\n const maxMessages = options?.maxMessages ?? 60;\n const parseMessage = options?.parseMessage ?? defaultParseMessage<TMessage>;\n const serializeMessage =\n options?.serializeMessage ?? defaultSerializeMessage<TMessage>;\n\n return {\n load() {\n try {\n const storage = getLocalStorage();\n if (!storage) {\n return {};\n }\n\n const sessionId = storage.getItem(keys.sessionId);\n const workflowId = storage.getItem(keys.workflowId) ?? \"\";\n const includeHistoryRaw = storage.getItem(keys.includeHistory);\n const rawMessages = storage.getItem(keys.messages);\n const rawBranches = storage.getItem(keys.branches);\n const rawResponseVariants = storage.getItem(keys.responseVariants);\n const parsedMessages = rawMessages\n ? (JSON.parse(rawMessages) as unknown)\n : [];\n const messages = Array.isArray(parsedMessages)\n ? parsedMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n : [];\n const parsedBranches = rawBranches\n ? (JSON.parse(rawBranches) as unknown)\n : undefined;\n const branches =\n parsedBranches && typeof parsedBranches === \"object\"\n ? Object.fromEntries(\n Object.entries(\n parsedBranches as Record<\n string,\n {\n sessionId?: unknown;\n parentSessionId?: unknown;\n forkedFrom?: unknown;\n messages?: unknown;\n checkpoints?: unknown;\n }\n >,\n ).flatMap(([sessionId, branch]) => {\n if (typeof branch.sessionId !== \"string\") return [];\n const rawBranchMessages = Array.isArray(branch.messages)\n ? branch.messages\n : [];\n const branchMessages = rawBranchMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n .slice(-maxMessages);\n return [\n [\n sessionId,\n {\n sessionId: branch.sessionId,\n ...(typeof branch.parentSessionId === \"string\"\n ? { parentSessionId: branch.parentSessionId }\n : {}),\n ...(typeof branch.forkedFrom === \"string\"\n ? { forkedFrom: branch.forkedFrom }\n : {}),\n messages: branchMessages,\n ...(Array.isArray(branch.checkpoints)\n ? { checkpoints: branch.checkpoints }\n : {}),\n },\n ],\n ];\n }),\n )\n : undefined;\n const parsedResponseVariants = rawResponseVariants\n ? (JSON.parse(rawResponseVariants) as unknown)\n : undefined;\n\n return {\n sessionId,\n workflowId,\n includeHistory: includeHistoryRaw !== \"0\",\n messages,\n ...(branches ? { branches } : {}),\n ...(Array.isArray(parsedResponseVariants)\n ? { responseVariants: parsedResponseVariants }\n : {}),\n };\n } catch {\n return {};\n }\n },\n\n save(state) {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n\n if (state.sessionId) {\n storage.setItem(keys.sessionId, state.sessionId);\n } else {\n storage.removeItem(keys.sessionId);\n }\n\n storage.setItem(keys.workflowId, state.workflowId);\n storage.setItem(keys.includeHistory, state.includeHistory ? \"1\" : \"0\");\n\n const trimmedMessages = state.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message));\n\n storage.setItem(keys.messages, JSON.stringify(trimmedMessages));\n if (state.branches) {\n const serializedBranches = Object.fromEntries(\n Object.entries(state.branches).map(([sessionId, branch]) => [\n sessionId,\n {\n ...branch,\n messages: branch.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message)),\n },\n ]),\n );\n storage.setItem(keys.branches, JSON.stringify(serializedBranches));\n } else {\n storage.removeItem(keys.branches);\n }\n\n if (state.responseVariants) {\n storage.setItem(\n keys.responseVariants,\n JSON.stringify(state.responseVariants),\n );\n } else {\n storage.removeItem(keys.responseVariants);\n }\n } catch {}\n },\n\n clearMessages() {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n storage.removeItem(keys.messages);\n storage.removeItem(keys.branches);\n storage.removeItem(keys.responseVariants);\n } catch {}\n },\n };\n}\n","import type { StreamChunk, StreamFromRouteArgs } from \"@kortyx/stream/browser\";\nimport { streamFromRoute } from \"@kortyx/stream/browser\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype DefaultChatContext = Record<string, unknown>;\n\nexport type OutgoingChatMessage = {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type ChatTransportContext<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n signal?: AbortSignal | undefined;\n};\n\nexport type ChatTransportChunkHandler = (\n chunk: StreamChunk,\n) => undefined | boolean | Promise<boolean | undefined>;\n\nexport type CheckpointSummary = {\n id: string;\n sessionId: string;\n turnIndex: number;\n createdAt: number;\n nodes: string[];\n workflow: string;\n label?: string;\n};\n\nexport type RollbackCheckpointResult = {\n sessionId: string;\n head: string;\n invalidatedStructuredStreamIds: string[];\n invalidatedInterruptTokens: string[];\n};\n\nexport type ForkPendingRequest = {\n token: string;\n requestId: string;\n schema?: {\n kind?: \"choice\" | \"multi-choice\" | \"text\";\n multiple?: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n };\n options?: Array<{ id: string; label: string; description?: string }>;\n};\n\nexport type ForkCheckpointResult = {\n sessionId: string;\n parentSessionId: string;\n forkedFrom: string;\n checkpoint?: {\n id: string;\n sessionId: string;\n turnIndex: number;\n activePendingRequests?: ForkPendingRequest[];\n };\n};\n\nexport type ChatTransport<TContext = DefaultChatContext> = {\n stream(\n args: ChatTransportContext<TContext> & {\n onChunk: ChatTransportChunkHandler;\n },\n ): Promise<void>;\n listCheckpoints?: (sessionId: string) => Promise<CheckpointSummary[]>;\n rollbackTo?: (checkpointId: string) => Promise<RollbackCheckpointResult>;\n fork?: (\n checkpointId: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n};\n\nexport type ChatTransportChunkSource =\n | Iterable<StreamChunk>\n | AsyncIterable<StreamChunk>;\n\nexport function createChatTransport<TContext = DefaultChatContext>(args: {\n stream: (\n context: ChatTransportContext<TContext>,\n ) => MaybePromise<ChatTransportChunkSource>;\n}): ChatTransport<TContext> {\n return {\n async stream({ onChunk, ...context }) {\n for await (const chunk of await args.stream(context)) {\n const shouldContinue = await onChunk(chunk);\n if (chunk.type === \"done\" || shouldContinue === false) {\n break;\n }\n }\n },\n };\n}\n\nexport type RouteChatRequestBody<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n};\n\nexport type CreateRouteChatTransportArgs<TBody, TContext> = Omit<\n StreamFromRouteArgs<TBody>,\n \"body\"\n> & {\n createBody?: ((context: ChatTransportContext<TContext>) => TBody) | undefined;\n checkpointEndpoint?: string | undefined;\n};\n\nexport function createRouteChatTransport<\n TContext = DefaultChatContext,\n TBody = RouteChatRequestBody<TContext>,\n>(\n args: CreateRouteChatTransportArgs<TBody, TContext>,\n): ChatTransport<TContext> {\n const transport = createChatTransport<TContext>({\n stream: (context) => {\n const body =\n args.createBody?.(context) ??\n ({\n sessionId: context.sessionId,\n workflowId: context.workflowId,\n messages: context.messages,\n context: context.context,\n } as TBody);\n const routeArgs: StreamFromRouteArgs<TBody> = {\n endpoint: args.endpoint,\n body,\n ...(args.method ? { method: args.method } : {}),\n ...(args.headers ? { headers: args.headers } : {}),\n ...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),\n ...(context.signal ? { signal: context.signal } : {}),\n };\n\n return streamFromRoute({\n ...routeArgs,\n });\n },\n });\n\n if (!args.checkpointEndpoint) return transport;\n\n const fetchJson = async <TResult>(\n body: Record<string, unknown>,\n ): Promise<TResult> => {\n const fetchImpl = args.fetchImpl ?? fetch;\n const response = await fetchImpl(args.checkpointEndpoint as string, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n let message = `Checkpoint request failed with status ${response.status}`;\n try {\n const parsed = (await response.json()) as { error?: unknown };\n if (typeof parsed.error === \"string\") message = parsed.error;\n } catch {}\n throw new Error(message);\n }\n return (await response.json()) as TResult;\n };\n\n return {\n ...transport,\n listCheckpoints: (sessionId) =>\n fetchJson<CheckpointSummary[]>({ action: \"list\", sessionId }),\n rollbackTo: (checkpointId) =>\n fetchJson<RollbackCheckpointResult>({\n action: \"rollback\",\n checkpointId,\n }),\n fork: (checkpointId, options) =>\n fetchJson<ForkCheckpointResult>({\n action: \"fork\",\n checkpointId,\n ...(options?.newSessionId\n ? { newSessionId: options.newSessionId }\n : {}),\n }),\n };\n}\n","import type {\n StreamChunk,\n StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport type { StructuredStreamItem } from \"./use-structured-streams\";\n\nexport type LiveChatTextPiece = {\n id: string;\n type: \"text\";\n content: string;\n};\n\nexport type LiveChatStructuredPiece<TStructuredData = unknown> = {\n id: string;\n type: \"structured\";\n data: StructuredStreamState<TStructuredData>;\n};\n\nexport type LiveChatErrorPiece = {\n id: string;\n type: \"error\";\n content: string;\n};\n\ntype LiveChatCustomPiece = {\n id: string;\n type: string;\n};\n\nexport type LiveChatPiece<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n> =\n | LiveChatTextPiece\n | LiveChatStructuredPiece<TStructuredData>\n | LiveChatErrorPiece\n | TCustomPiece;\n\ntype StructuredStreamsController<TStructuredData> = {\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TStructuredData> | undefined;\n};\n\nconst isNonEmptyTextPiece = <\n TStructuredData,\n TCustomPiece extends LiveChatCustomPiece,\n>(\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n) =>\n piece.type !== \"text\" ||\n (\"content\" in piece &&\n typeof piece.content === \"string\" &&\n piece.content.length > 0);\n\nexport function createLiveChatPieces<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n>(args: {\n createId: () => string;\n onChange: (pieces: LiveChatPiece<TStructuredData, TCustomPiece>[]) => void;\n structuredStreams: StructuredStreamsController<TStructuredData>;\n toHumanInputPiece: (chunk: StreamChunk) => TCustomPiece;\n}) {\n const keyedPieces: Array<{\n key: string;\n piece: LiveChatPiece<TStructuredData, TCustomPiece>;\n }> = [];\n let sawTextDelta = false;\n\n const emit = () => {\n args.onChange(\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n );\n };\n\n const findPieceIndex = (key: string) =>\n keyedPieces.findIndex((entry) => entry.key === key);\n\n const upsertPiece = (\n key: string,\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n ) => {\n const existingIndex = findPieceIndex(key);\n if (existingIndex >= 0) {\n keyedPieces[existingIndex] = { key, piece };\n } else {\n keyedPieces.push({ key, piece });\n }\n emit();\n };\n\n const pushPiece = (piece: LiveChatPiece<TStructuredData, TCustomPiece>) => {\n keyedPieces.push({\n key: `${piece.type}:${piece.id}`,\n piece,\n });\n emit();\n };\n\n const resolveTextStreamKey = (\n chunk: StreamChunk,\n fallbackNode?: string,\n ): string => {\n if (\"segmentId\" in chunk && typeof chunk.segmentId === \"string\") {\n const seg = chunk.segmentId.trim();\n if (seg.length > 0) {\n const op =\n \"opId\" in chunk && typeof chunk.opId === \"string\"\n ? chunk.opId.trim()\n : \"\";\n return op.length > 0 ? `${op}:${seg}` : seg;\n }\n }\n\n if (\"opId\" in chunk && typeof chunk.opId === \"string\") {\n const op = chunk.opId.trim();\n if (op.length > 0) {\n const node =\n (\"node\" in chunk && typeof chunk.node === \"string\"\n ? chunk.node\n : fallbackNode) ?? \"__unknown__\";\n return `${op}:${node}`;\n }\n }\n\n return fallbackNode && fallbackNode.length > 0\n ? fallbackNode\n : \"__unknown__\";\n };\n\n const ensureTextPiece = (key: string): LiveChatTextPiece => {\n const pieceKey = `text:${key}`;\n const existingIndex = findPieceIndex(pieceKey);\n if (existingIndex >= 0) {\n return keyedPieces[existingIndex]?.piece as LiveChatTextPiece;\n }\n\n const nextPiece: LiveChatTextPiece = {\n id: args.createId(),\n type: \"text\",\n content: \"\",\n };\n keyedPieces.push({ key: pieceKey, piece: nextPiece });\n return nextPiece;\n };\n\n const processChunk = (\n chunk: StreamChunk,\n _options?: { openDebugOnInterrupt?: boolean | undefined },\n ): boolean => {\n if (chunk.type === \"text-start\") {\n ensureTextPiece(resolveTextStreamKey(chunk, chunk.node));\n emit();\n return true;\n }\n\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n const streamKey = resolveTextStreamKey(chunk, chunk.node);\n const current = ensureTextPiece(streamKey);\n upsertPiece(`text:${streamKey}`, {\n ...current,\n content: current.content + chunk.delta,\n });\n return true;\n }\n\n if (chunk.type === \"text-end\") {\n emit();\n return true;\n }\n\n if (chunk.type === \"structured-data\") {\n const nextItem = args.structuredStreams.applyStreamChunk(chunk);\n if (nextItem) {\n upsertPiece(`structured:${nextItem.streamId}`, {\n id: nextItem.id,\n type: \"structured\",\n data: nextItem.state,\n });\n }\n return true;\n }\n\n if (chunk.type === \"interrupt\") {\n pushPiece(args.toHumanInputPiece(chunk));\n return true;\n }\n\n if (chunk.type === \"message\") {\n if (!sawTextDelta) {\n pushPiece({\n id: args.createId(),\n type: \"text\",\n content: chunk.content ?? \"\",\n });\n }\n return true;\n }\n\n if (chunk.type === \"error\") {\n pushPiece({\n id: args.createId(),\n type: \"error\",\n content: chunk.message ?? \"An error occurred\",\n });\n return true;\n }\n\n if (chunk.type === \"done\") {\n return false;\n }\n\n return true;\n };\n\n return {\n processChunk,\n getPieces: () =>\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n };\n}\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { HumanInputPiece } from \"./chat-types\";\n\ninterface HumanInputStreamChunk {\n type: \"interrupt\";\n requestId: string | undefined;\n resumeToken: string | undefined;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n input?: {\n kind?: \"text\" | \"choice\" | \"multi-choice\";\n question?: string;\n multiple?: boolean;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n options?: Array<{\n id?: string | number;\n label?: string;\n description?: string;\n }>;\n };\n}\n\nexport type ToHumanInputPiece = (args: {\n chunk: StreamChunk;\n createId: () => string;\n}) => HumanInputPiece;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst nonEmptyString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst firstNonEmptyString = (...values: unknown[]): string | undefined => {\n for (const value of values) {\n const result = nonEmptyString(value);\n if (result) return result;\n }\n return undefined;\n};\n\nexport function toHumanInputPiece(args: {\n chunk: StreamChunk;\n createId: () => string;\n}): HumanInputPiece {\n const hi = args.chunk as unknown as HumanInputStreamChunk;\n const input = hi.input ?? {};\n const kind = input.kind || (input.multiple ? \"multi-choice\" : \"choice\");\n const isText = kind === \"text\";\n const schemaId = firstNonEmptyString(hi.schemaId, input.schemaId);\n const schemaVersion = firstNonEmptyString(\n hi.schemaVersion,\n input.schemaVersion,\n );\n const interruptId = firstNonEmptyString(hi.id, input.id);\n const inputMeta = isRecord(input.meta) ? input.meta : undefined;\n const chunkMeta = isRecord(hi.meta) ? hi.meta : undefined;\n const meta =\n inputMeta || chunkMeta\n ? { ...(inputMeta ?? {}), ...(chunkMeta ?? {}) }\n : undefined;\n\n const question = isText\n ? input.question\n : typeof input.question === \"string\"\n ? input.question\n : \"Please choose\";\n\n const optionsSrc = Array.isArray(input.options) ? input.options : [];\n const optionsArr: Array<{\n id: string;\n label: string;\n description?: string;\n }> = optionsSrc\n .map((option) => ({\n id: String(option.id ?? \"\"),\n label: String(option.label ?? \"\"),\n ...(typeof option.description === \"string\" && option.description\n ? { description: option.description }\n : {}),\n }))\n .filter((option) => option.id && option.label);\n\n return {\n id: args.createId(),\n type: \"interrupt\",\n resumeToken: String(hi.resumeToken ?? \"\"),\n requestId: String(hi.requestId ?? \"\"),\n kind,\n ...(question !== undefined ? { question } : {}),\n multiple: Boolean(input.multiple),\n options: optionsArr,\n ...(schemaId ? { schemaId } : {}),\n ...(schemaVersion ? { schemaVersion } : {}),\n ...(interruptId ? { interruptId } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n","\"use client\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { type RefObject, useEffect, useRef, useState } from \"react\";\nimport { buildAssistantMessage } from \"./build-assistant-message\";\nimport { type ChatStorage, createBrowserChatStorage } from \"./chat-storage\";\nimport type {\n ChatTransport,\n CheckpointSummary,\n ForkCheckpointResult,\n ForkPendingRequest,\n OutgoingChatMessage,\n RollbackCheckpointResult,\n} from \"./chat-transport\";\nimport type { ChatMsg, ContentPiece, HumanInputPiece } from \"./chat-types\";\nimport { createLiveChatPieces } from \"./create-live-chat-pieces\";\nimport {\n toHumanInputPiece as defaultToHumanInputPiece,\n type ToHumanInputPiece,\n} from \"./to-human-input-piece\";\nimport { useChatStreamDebug } from \"./use-chat-stream-debug\";\nimport { useStructuredStreams } from \"./use-structured-streams\";\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\ntype DefaultChatContext = Record<string, unknown>;\n\ntype ChatTraceMetadata = {\n traceId: string;\n spanId: string;\n runId: string;\n};\n\ntype ReplayResult = {\n userMessage: ChatMsg;\n assistantMessage?: ChatMsg;\n messages: ChatMsg[];\n};\n\ntype ResumeOverride = {\n resumeToken: string;\n requestId: string;\n};\n\nexport type PrepareContextMessagesArgs<TContext = DefaultChatContext> = {\n messages: ChatMsg[];\n sessionId: string;\n workflowId: string;\n reason: \"send\" | \"resume\";\n context: TContext;\n};\n\nexport type PrepareContextMessages<TContext = DefaultChatContext> = (\n args: PrepareContextMessagesArgs<TContext>,\n) => OutgoingChatMessage[] | Promise<OutgoingChatMessage[]>;\n\nexport type UseChatValue = {\n messages: ChatMsg[];\n isStreaming: boolean;\n canAbort: boolean;\n error: Error | null;\n streamContentPieces: ContentPiece[];\n streamDebug: StreamChunk[];\n lastAssistantId: string | null;\n checkpoints: CheckpointSummary[];\n activeSessionId: string | null;\n branches: Record<string, ChatBranch>;\n responseVariants: ChatResponseVariantGroup[];\n workflowId: string;\n setWorkflowId: React.Dispatch<React.SetStateAction<string>>;\n send: (text: string) => Promise<void> | void;\n respondToHumanInput: (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n }) => Promise<void> | void;\n respondToInterrupt: (\n piece: HumanInputPiece,\n response?: { selected?: string[] | undefined; text?: string | undefined },\n ) => Promise<void> | void;\n setMessages: React.Dispatch<React.SetStateAction<ChatMsg[]>>;\n checkpointForMessage: (messageId: string) => string | null;\n rollbackTo: (id: string) => Promise<RollbackCheckpointResult>;\n fork: (\n id: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n regenerate: (assistantMessageId: string) => Promise<void>;\n regenerateVariant: (\n assistantMessageId: string,\n ) => Promise<ChatResponseVariantGroup>;\n selectVariant: (\n assistantMessageId: string,\n variantId: string,\n ) => Promise<void>;\n variantForMessage: (messageId: string) => ChatResponseVariantGroup | null;\n regenerateFromCheckpoint: (checkpointId: string) => Promise<void>;\n retryWithEdit: (\n assistantMessageId: string,\n newUserContent: string,\n ) => Promise<void>;\n clearMessages: () => void;\n resetSession: () => void;\n resetChat: () => void;\n clearChat: () => void;\n abort: () => void;\n clearError: () => void;\n includeHistory: boolean;\n setIncludeHistory: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type ChatBranch<TMessage = ChatMsg> = {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints: CheckpointSummary[];\n};\n\nexport type ChatResponseVariant = {\n id: string;\n sessionId: string;\n assistantMessageId: string;\n createdAt: number;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n checkpointId?: string;\n checkpointTurnIndex?: number;\n label?: string;\n};\n\nexport type ChatResponseVariantGroup = {\n id: string;\n sourceAssistantMessageId: string;\n checkpointId: string;\n checkpointTurnIndex: number;\n selectedVariantId: string;\n variants: ChatResponseVariant[];\n};\n\nexport type UseChatOptions<TContext = DefaultChatContext> = {\n transport: ChatTransport<TContext>;\n storage?: ChatStorage<ChatMsg> | undefined;\n createId?: (() => string) | undefined;\n context?: TContext | undefined;\n prepareContextMessages?: PrepareContextMessages<TContext> | undefined;\n toHumanInputPiece?: ToHumanInputPiece | undefined;\n};\n\nconst defaultStorage = createBrowserChatStorage<ChatMsg>();\n\nfunction useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n\nfunction findActiveTextInterrupt(args: {\n messages: ChatMsg[];\n streamContentPieces: ContentPiece[];\n}): HumanInputPiece | undefined {\n const liveInterrupt = [...args.streamContentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n if (liveInterrupt) return liveInterrupt;\n\n const latestMessage = args.messages.at(-1);\n if (latestMessage?.role !== \"assistant\" || !latestMessage.contentPieces) {\n return undefined;\n }\n\n return [...latestMessage.contentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n}\n\nfunction trimMessagesToCheckpoint(args: {\n messages: ChatMsg[];\n turnIndex: number;\n}): ChatMsg[] {\n const hasCheckpointMetadata = args.messages.some(\n (message) => typeof message.checkpointTurnIndex === \"number\",\n );\n if (!hasCheckpointMetadata && args.turnIndex > 0) return args.messages;\n\n const keepThroughIndex = args.messages.reduce((lastIndex, message, index) => {\n return typeof message.checkpointTurnIndex === \"number\" &&\n message.checkpointTurnIndex <= args.turnIndex\n ? index\n : lastIndex;\n }, -1);\n\n return keepThroughIndex >= 0\n ? args.messages.slice(0, keepThroughIndex + 1)\n : [];\n}\n\nfunction applyForkedPendingRequests(args: {\n messages: ChatMsg[];\n pendingRequests: ForkPendingRequest[];\n}): ChatMsg[] {\n if (args.pendingRequests.length === 0) return args.messages;\n\n const interruptPositions = args.messages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex }] : [],\n ),\n );\n const positionsToPatch = interruptPositions.slice(\n -args.pendingRequests.length,\n );\n if (positionsToPatch.length === 0) return args.messages;\n\n return args.messages.map((message, messageIndex) => {\n if (!message.contentPieces) return message;\n\n let changed = false;\n const contentPieces = message.contentPieces.map((piece, pieceIndex) => {\n if (piece.type !== \"interrupt\") return piece;\n const patchIndex = positionsToPatch.findIndex(\n (position) =>\n position.messageIndex === messageIndex &&\n position.pieceIndex === pieceIndex,\n );\n const pending = args.pendingRequests[patchIndex];\n if (!pending) return piece;\n\n changed = true;\n return {\n ...piece,\n resumeToken: pending.token,\n requestId: pending.requestId,\n ...(pending.schema?.kind ? { kind: pending.schema.kind } : {}),\n ...(typeof pending.schema?.multiple === \"boolean\"\n ? { multiple: pending.schema.multiple }\n : {}),\n ...(typeof pending.schema?.question === \"string\"\n ? { question: pending.schema.question }\n : {}),\n ...(typeof pending.schema?.schemaId === \"string\"\n ? { schemaId: pending.schema.schemaId }\n : {}),\n ...(typeof pending.schema?.schemaVersion === \"string\"\n ? { schemaVersion: pending.schema.schemaVersion }\n : {}),\n ...(typeof pending.schema?.id === \"string\"\n ? { interruptId: pending.schema.id }\n : {}),\n ...(pending.schema?.meta ? { meta: pending.schema.meta } : {}),\n ...(pending.options ? { options: pending.options } : {}),\n };\n });\n\n return changed ? { ...message, contentPieces } : message;\n });\n}\n\nfunction latestAssistantMessageId(messages: ChatMsg[]): string | null {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role === \"assistant\") return message.id;\n }\n return null;\n}\n\nexport function useChat<TContext = DefaultChatContext>(\n options: UseChatOptions<TContext>,\n): UseChatValue {\n const resolvedStorage = options.storage ?? defaultStorage;\n const transportRef = useLatestRef(options.transport);\n const storageRef = useLatestRef(resolvedStorage);\n const toHumanInputPieceRef = useLatestRef(\n options.toHumanInputPiece ?? defaultToHumanInputPiece,\n );\n const requestContext =\n options.context ?? ({} as unknown as NonNullable<TContext>);\n const createId = useRef(options.createId ?? defaultCreateId).current;\n\n const [messages, setMessages] = useState<ChatMsg[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [streamContentPieces, setStreamContentPieces] = useState<\n ContentPiece[]\n >([]);\n const [lastAssistantId, setLastAssistantId] = useState<string | null>(null);\n const [checkpoints, setCheckpoints] = useState<CheckpointSummary[]>([]);\n const [includeHistory, setIncludeHistory] = useState(true);\n const [workflowId, setWorkflowId] = useState(\"\");\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [branches, setBranches] = useState<Record<string, ChatBranch>>({});\n const [responseVariants, setResponseVariants] = useState<\n ChatResponseVariantGroup[]\n >([]);\n const [didHydrateStorage, setDidHydrateStorage] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const { streamDebug, clearStreamDebug, createRecorder } =\n useChatStreamDebug();\n const {\n applyStreamChunk,\n clear: clearStructuredStreams,\n delete: deleteStructuredStream,\n } = useStructuredStreams<Record<string, unknown>>({\n createId,\n });\n\n useEffect(() => {\n let cancelled = false;\n const storage = resolvedStorage;\n\n void Promise.resolve(storage.load()).then((storedState) => {\n if (cancelled) return;\n\n if (typeof storedState.sessionId === \"string\") {\n setSessionId(storedState.sessionId);\n }\n if (typeof storedState.workflowId === \"string\") {\n setWorkflowId(storedState.workflowId);\n }\n if (typeof storedState.includeHistory === \"boolean\") {\n setIncludeHistory(storedState.includeHistory);\n }\n if (\n Array.isArray(storedState.messages) &&\n storedState.messages.length > 0\n ) {\n setMessages(storedState.messages);\n }\n if (storedState.branches && typeof storedState.branches === \"object\") {\n setBranches(\n storedState.branches as unknown as Record<string, ChatBranch>,\n );\n }\n if (Array.isArray(storedState.responseVariants)) {\n setResponseVariants(\n storedState.responseVariants as ChatResponseVariantGroup[],\n );\n }\n\n setDidHydrateStorage(true);\n });\n\n return () => {\n cancelled = true;\n };\n }, [resolvedStorage]);\n\n useEffect(() => {\n const nextLastAssistantId = latestAssistantMessageId(messages);\n if (lastAssistantId !== nextLastAssistantId) {\n setLastAssistantId(nextLastAssistantId);\n }\n }, [lastAssistantId, messages]);\n\n useEffect(() => {\n if (!didHydrateStorage) return;\n const storage = storageRef.current;\n\n void storage.save({\n sessionId,\n workflowId,\n includeHistory,\n messages,\n branches,\n responseVariants,\n });\n }, [\n branches,\n didHydrateStorage,\n includeHistory,\n messages,\n responseVariants,\n sessionId,\n storageRef,\n workflowId,\n ]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setBranches((current) => ({\n ...current,\n [sessionId]: {\n ...(current[sessionId] ?? {}),\n sessionId,\n messages,\n checkpoints,\n },\n }));\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setResponseVariants((current) =>\n current.map((group) => {\n const selectedVariant = group.variants.find(\n (variant) =>\n variant.id === group.selectedVariantId &&\n variant.sessionId === sessionId,\n );\n if (!selectedVariant) return group;\n if (\n selectedVariant.messages === messages &&\n selectedVariant.checkpoints === checkpoints\n ) {\n return group;\n }\n\n return {\n ...group,\n variants: group.variants.map((variant) =>\n variant.id === selectedVariant.id\n ? {\n ...variant,\n messages,\n checkpoints,\n }\n : variant,\n ),\n };\n }),\n );\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n const clearActiveStream = () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages([]);\n setCheckpoints([]);\n setBranches({});\n setResponseVariants([]);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n setLastAssistantId(null);\n };\n\n const clearMessages = () => {\n clearActiveStream();\n void storageRef.current.clearMessages();\n };\n\n const resetSession = () => {\n setSessionId(null);\n setCheckpoints([]);\n };\n\n const resetChat = () => {\n clearActiveStream();\n resetSession();\n setError(null);\n void storageRef.current.clearMessages();\n };\n\n const clearChat = resetChat;\n\n const clearError = () => {\n setError(null);\n };\n\n const abort = () => {\n abortControllerRef.current?.abort();\n };\n\n const persistSessionId = (sid: string) => {\n setSessionId(sid);\n };\n\n const resolveSessionId = (preferredSessionId?: string | undefined) => {\n if (preferredSessionId) {\n if (sessionId !== preferredSessionId)\n persistSessionId(preferredSessionId);\n return preferredSessionId;\n }\n const sid = sessionId ?? createId();\n if (!sessionId) persistSessionId(sid);\n return sid;\n };\n\n const toOutgoingHistoryMessage = (message: ChatMsg): OutgoingChatMessage => ({\n role: message.role,\n content: message.content,\n });\n\n const prepareMessagesToSend = async (args: {\n sid: string;\n outgoingMessage: OutgoingChatMessage;\n reason: \"send\" | \"resume\";\n baseMessages?: ChatMsg[] | undefined;\n }): Promise<OutgoingChatMessage[]> => {\n const baseMessages = args.baseMessages ?? messages;\n const prepared = options.prepareContextMessages\n ? await options.prepareContextMessages({\n messages: baseMessages,\n sessionId: args.sid,\n workflowId,\n reason: args.reason,\n context: requestContext,\n })\n : includeHistory\n ? baseMessages.map(toOutgoingHistoryMessage)\n : [];\n\n return [...prepared, args.outgoingMessage];\n };\n\n const streamAssistantResponse = async (args: {\n sid: string;\n messagesToSend: OutgoingChatMessage[];\n messagesBeforeAssistant?: ChatMsg[] | undefined;\n debugLabel: string;\n openDebugOnInterrupt?: boolean;\n signal: AbortSignal;\n }): Promise<ChatMsg | undefined> => {\n clearStructuredStreams();\n setStreamContentPieces([]);\n\n const debug = createRecorder(`${args.debugLabel} sessionId=${args.sid}`);\n let currentTrace: ChatTraceMetadata | undefined;\n let completedTrace: ChatTraceMetadata | undefined;\n let currentCheckpoint:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n const pieces = createLiveChatPieces({\n createId,\n onChange: setStreamContentPieces,\n structuredStreams: {\n applyStreamChunk,\n },\n toHumanInputPiece: (chunk) =>\n toHumanInputPieceRef.current({\n chunk,\n createId,\n }),\n });\n\n await transportRef.current.stream({\n sessionId: args.sid,\n workflowId,\n messages: args.messagesToSend,\n context: requestContext,\n signal: args.signal,\n onChunk: (chunk: StreamChunk) => {\n debug.push(chunk);\n\n if (chunk.type === \"session\") {\n if (typeof chunk.sessionId === \"string\") {\n persistSessionId(chunk.sessionId);\n }\n return;\n }\n\n if (chunk.type === \"trace\") {\n if (\n typeof chunk.traceId === \"string\" &&\n typeof chunk.spanId === \"string\" &&\n typeof chunk.runId === \"string\"\n ) {\n currentTrace = {\n traceId: chunk.traceId,\n spanId: chunk.spanId,\n runId: chunk.runId,\n };\n }\n return;\n }\n\n if (chunk.type === \"checkpoint\") {\n currentCheckpoint = {\n id: chunk.id,\n turnIndex: chunk.turnIndex,\n };\n setCheckpoints((prev) => {\n const next = {\n id: chunk.id,\n sessionId: chunk.sessionId,\n turnIndex: chunk.turnIndex,\n createdAt: Date.now(),\n nodes: [],\n workflow: workflowId,\n ...(chunk.label ? { label: chunk.label } : {}),\n } satisfies CheckpointSummary;\n return [...prev.filter((item) => item.id !== chunk.id), next].sort(\n (a, b) => a.turnIndex - b.turnIndex,\n );\n });\n return;\n }\n\n if (chunk.type === \"structured-data-invalidated\") {\n deleteStructuredStream(chunk.streamId);\n return;\n }\n\n if (chunk.type === \"error\") {\n setError(new Error(chunk.message));\n }\n\n if (chunk.type === \"done\") {\n completedTrace = currentTrace;\n currentTrace = undefined;\n }\n\n return pieces.processChunk(chunk, {\n openDebugOnInterrupt: args.openDebugOnInterrupt,\n });\n },\n });\n\n if (args.signal.aborted) return undefined;\n\n const assistant = buildAssistantMessage({\n createId,\n pieces: pieces.getPieces(),\n debug: debug.getAll(),\n trace: completedTrace ?? currentTrace,\n checkpoint: currentCheckpoint,\n });\n setMessages((prev) =>\n args.messagesBeforeAssistant\n ? [...args.messagesBeforeAssistant, assistant]\n : [...prev, assistant],\n );\n setLastAssistantId(assistant.id);\n clearStructuredStreams();\n setStreamContentPieces([]);\n clearStreamDebug();\n return assistant;\n };\n\n const isAbortError = (value: unknown, signal: AbortSignal): boolean => {\n if (signal.aborted) return true;\n if (!(value instanceof Error)) return false;\n return value.name === \"AbortError\";\n };\n\n const respondToHumanInputFromBase = async ({\n resumeToken,\n requestId,\n selected,\n text,\n baseMessages,\n sid,\n }: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n baseMessages?: ChatMsg[] | undefined;\n sid?: string | undefined;\n }): Promise<ReplayResult | undefined> => {\n if (isStreaming) return undefined;\n setError(null);\n const label: string =\n typeof text === \"string\" && text.length > 0\n ? text\n : selected.length > 0\n ? selected.length === 1\n ? (selected[0] as string)\n : selected.join(\", \")\n : \"(selection)\";\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content: label,\n source: {\n type: \"interrupt-response\",\n resumeToken,\n requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n },\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resumePayload: Record<string, unknown> = {\n resume: { token: resumeToken, requestId, selected },\n };\n const outgoing = {\n role: \"user\" as const,\n content: label,\n metadata: resumePayload,\n };\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: outgoing,\n reason: \"resume\",\n baseMessages,\n });\n\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (resume)\",\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const respondToHumanInput = async (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n }): Promise<void> => {\n await respondToHumanInputFromBase(args);\n };\n\n const respondToInterrupt = async (\n piece: HumanInputPiece,\n response?: { selected?: string[] | undefined; text?: string | undefined },\n ) => {\n const text = response?.text;\n const selected =\n response?.selected ??\n (typeof text === \"string\" && text.length > 0 ? [text] : []);\n\n await respondToHumanInput({\n resumeToken: piece.resumeToken,\n requestId: piece.requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n });\n };\n\n const sendFromBase = async (\n text: string,\n baseMessages?: ChatMsg[] | undefined,\n sid?: string | undefined,\n ): Promise<ReplayResult | undefined> => {\n const content = text.trim();\n if (!content || isStreaming) return undefined;\n setError(null);\n\n const activeTextInterrupt = findActiveTextInterrupt({\n messages: baseMessages ?? messages,\n streamContentPieces,\n });\n\n if (activeTextInterrupt) {\n return respondToHumanInputFromBase({\n resumeToken: activeTextInterrupt.resumeToken,\n requestId: activeTextInterrupt.requestId,\n selected: [content],\n text: content,\n baseMessages,\n sid,\n });\n }\n\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content,\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: { role: \"user\" as const, content },\n reason: \"send\",\n baseMessages,\n });\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (send)\",\n openDebugOnInterrupt: true,\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const send = async (text: string): Promise<void> => {\n await sendFromBase(text);\n };\n\n const requireCheckpointTransport = (): ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n } => {\n const transport = transportRef.current;\n if (\n !transport.listCheckpoints ||\n !transport.rollbackTo ||\n !transport.fork\n ) {\n throw new Error(\n \"Checkpoint helpers require a transport with checkpoint methods.\",\n );\n }\n return transport as ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n };\n };\n\n const refreshCheckpoints = async (sid: string) => {\n const transport = requireCheckpointTransport();\n const next = await transport.listCheckpoints(sid);\n setCheckpoints(next);\n return next;\n };\n\n const applyStructuredInvalidations = (streamIds: string[]) => {\n for (const streamId of streamIds) {\n deleteStructuredStream(streamId);\n }\n };\n\n const rollbackTo = async (id: string): Promise<RollbackCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot rollback while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const result = await transport.rollbackTo(id);\n applyStructuredInvalidations(result.invalidatedStructuredStreamIds);\n const refreshedCheckpoints = await refreshCheckpoints(result.sessionId);\n const target = refreshedCheckpoints.find(\n (checkpoint) => checkpoint.id === result.head,\n );\n\n if (target) {\n setMessages((current) => {\n return trimMessagesToCheckpoint({\n messages: current,\n turnIndex: target.turnIndex,\n });\n });\n }\n\n return result;\n };\n\n const fork = async (\n id: string,\n options?: { newSessionId?: string },\n ): Promise<ForkCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot fork while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === id,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find((checkpoint) => checkpoint.id === id);\n }\n\n const result = await transport.fork(id, options);\n setSessionId(result.sessionId);\n const childCheckpoints = await refreshCheckpoints(result.sessionId);\n const childHead = childCheckpoints.at(-1);\n const forkTurnIndex = target?.turnIndex ?? childHead?.turnIndex;\n if (typeof forkTurnIndex === \"number\") {\n setMessages((current) =>\n applyForkedPendingRequests({\n messages: trimMessagesToCheckpoint({\n messages: current,\n turnIndex: forkTurnIndex,\n }),\n pendingRequests: result.checkpoint?.activePendingRequests ?? [],\n }),\n );\n }\n setStreamContentPieces([]);\n clearStructuredStreams();\n return result;\n };\n\n const checkpointForMessage = (messageId: string): string | null => {\n return (\n messages.find((message) => message.id === messageId)?.checkpointId ?? null\n );\n };\n\n const variantForMessage = (\n messageId: string,\n ): ChatResponseVariantGroup | null => {\n return (\n responseVariants.find(\n (group) =>\n group.sourceAssistantMessageId === messageId ||\n group.variants.some(\n (variant) => variant.assistantMessageId === messageId,\n ),\n ) ?? null\n );\n };\n\n const findResumeOverrideForFork = (\n baseMessages: ChatMsg[],\n forkedBaseMessages: ChatMsg[],\n userMessage: ChatMsg,\n ): ResumeOverride | undefined => {\n if (userMessage.source?.type !== \"interrupt-response\") return undefined;\n const userSource = userMessage.source;\n\n const interruptPositions = baseMessages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex, piece }] : [],\n ),\n );\n const matchedPosition = [...interruptPositions]\n .reverse()\n .find(\n ({ piece }) =>\n piece.resumeToken === userSource.resumeToken ||\n piece.requestId === userSource.requestId,\n );\n\n const forkedPiece =\n typeof matchedPosition?.messageIndex === \"number\"\n ? forkedBaseMessages[matchedPosition.messageIndex]?.contentPieces?.[\n matchedPosition.pieceIndex\n ]\n : undefined;\n\n if (forkedPiece?.type === \"interrupt\") {\n return {\n resumeToken: forkedPiece.resumeToken,\n requestId: forkedPiece.requestId,\n };\n }\n\n const latestForkedInterrupt = forkedBaseMessages\n .flatMap((message) => message.contentPieces ?? [])\n .filter((piece): piece is HumanInputPiece => piece.type === \"interrupt\")\n .at(-1);\n\n return latestForkedInterrupt\n ? {\n resumeToken: latestForkedInterrupt.resumeToken,\n requestId: latestForkedInterrupt.requestId,\n }\n : undefined;\n };\n\n const resolveRegenerateTarget = async (assistantMessageId: string) => {\n const assistantIndex = messages.findIndex(\n (message) => message.id === assistantMessageId,\n );\n if (assistantIndex < 0) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n const assistant = messages[assistantIndex];\n if (!assistant) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n if (assistant.role !== \"assistant\") {\n throw new Error(\"Regenerate expects an assistant message id.\");\n }\n\n let userIndex = -1;\n for (let index = assistantIndex - 1; index >= 0; index--) {\n if (messages[index]?.role === \"user\") {\n userIndex = index;\n break;\n }\n }\n if (userIndex < 0) {\n throw new Error(\"No preceding user message found for regenerate.\");\n }\n const previousUser = messages[userIndex] as ChatMsg;\n\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n const assistantTurn = assistant.checkpointTurnIndex;\n const targetTurn =\n typeof assistantTurn === \"number\" ? assistantTurn - 1 : undefined;\n let target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n }\n\n if (!target) {\n throw new Error(\"No rollback checkpoint found for regenerate.\");\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n\n return { target, assistant, previousUser, baseMessages };\n };\n\n const replayUserMessage = async (\n userMessage: ChatMsg,\n baseMessages: ChatMsg[],\n editedContent?: string,\n options?: {\n sid?: string | undefined;\n resumeOverride?: ResumeOverride | undefined;\n },\n ): Promise<ReplayResult | undefined> => {\n const content = editedContent ?? userMessage.content;\n if (userMessage.source?.type === \"interrupt-response\") {\n return respondToHumanInputFromBase({\n resumeToken:\n options?.resumeOverride?.resumeToken ??\n userMessage.source.resumeToken,\n requestId:\n options?.resumeOverride?.requestId ?? userMessage.source.requestId,\n selected:\n editedContent !== undefined\n ? [editedContent]\n : userMessage.source.selected,\n baseMessages,\n sid: options?.sid,\n ...(editedContent !== undefined\n ? { text: editedContent }\n : userMessage.source.text !== undefined\n ? { text: userMessage.source.text }\n : {}),\n });\n }\n return sendFromBase(content, baseMessages, options?.sid);\n };\n\n const buildVariant = (args: {\n id: string;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n label?: string;\n }): ChatResponseVariant => ({\n id: args.id,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n createdAt: Date.now(),\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n ...(args.label ? { label: args.label } : {}),\n });\n\n const updateVariantSnapshot = (args: {\n variant: ChatResponseVariant;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n }): ChatResponseVariant => ({\n ...args.variant,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n });\n\n const replaceResponseVariantGroup = (nextGroup: ChatResponseVariantGroup) => {\n setResponseVariants((current) => [\n ...current.filter((group) => group.id !== nextGroup.id),\n nextGroup,\n ]);\n };\n\n const regenerateVariant = async (\n assistantMessageId: string,\n ): Promise<ChatResponseVariantGroup> => {\n if (isStreaming) {\n throw new Error(\"Cannot regenerate a variant while a stream is active.\");\n }\n const { target, assistant, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n const transport = requireCheckpointTransport();\n const parentSessionId = resolveSessionId();\n const existingGroup = variantForMessage(assistantMessageId);\n const sourceAssistantMessageId =\n existingGroup?.sourceAssistantMessageId ?? assistantMessageId;\n const existingVariants = existingGroup\n ? existingGroup.variants.map((variant) =>\n variant.id === existingGroup.selectedVariantId ||\n variant.assistantMessageId === assistantMessageId\n ? updateVariantSnapshot({\n variant,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n })\n : variant,\n )\n : undefined;\n\n const originalVariant =\n existingVariants?.[0] ??\n buildVariant({\n id: `${sourceAssistantMessageId}:original`,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n label: \"Original\",\n });\n\n const forkResult = await transport.fork(target.id);\n const forkedSessionId = forkResult.sessionId;\n setSessionId(forkedSessionId);\n\n const childCheckpointsBeforeReplay =\n await refreshCheckpoints(forkedSessionId);\n const forkedBaseMessages = applyForkedPendingRequests({\n messages: baseMessages,\n pendingRequests: forkResult.checkpoint?.activePendingRequests ?? [],\n });\n const resumeOverride = findResumeOverrideForFork(\n baseMessages,\n forkedBaseMessages,\n previousUser,\n );\n setMessages(forkedBaseMessages);\n setStreamContentPieces([]);\n clearStructuredStreams();\n\n const replay = await replayUserMessage(\n previousUser,\n forkedBaseMessages,\n undefined,\n {\n sid: forkedSessionId,\n resumeOverride,\n },\n );\n const childCheckpointsAfterReplay =\n await refreshCheckpoints(forkedSessionId);\n const variantMessages = replay?.messages ?? forkedBaseMessages;\n const variantAssistant = replay?.assistantMessage;\n if (!variantAssistant) {\n throw new Error(\"Regenerate variant did not produce an assistant reply.\");\n }\n\n const nextVariant = buildVariant({\n id: createId(),\n sessionId: forkedSessionId,\n assistantMessage: variantAssistant,\n messages: variantMessages,\n checkpoints:\n childCheckpointsAfterReplay.length > 0\n ? childCheckpointsAfterReplay\n : childCheckpointsBeforeReplay,\n label: `Variant ${(existingGroup?.variants.length ?? 1) + 1}`,\n });\n const nextVariants = existingVariants\n ? [...existingVariants, nextVariant]\n : [originalVariant, nextVariant];\n const nextGroup: ChatResponseVariantGroup = {\n id: existingGroup?.id ?? createId(),\n sourceAssistantMessageId,\n checkpointId: existingGroup?.checkpointId ?? target.id,\n checkpointTurnIndex:\n existingGroup?.checkpointTurnIndex ?? target.turnIndex,\n selectedVariantId: nextVariant.id,\n variants: nextVariants,\n };\n\n replaceResponseVariantGroup(nextGroup);\n setBranches((current) => ({\n ...current,\n [parentSessionId]: {\n ...(current[parentSessionId] ?? {}),\n sessionId: parentSessionId,\n messages,\n checkpoints,\n },\n [forkedSessionId]: {\n ...(current[forkedSessionId] ?? {}),\n sessionId: forkedSessionId,\n parentSessionId: forkResult.parentSessionId,\n forkedFrom: forkResult.forkedFrom,\n messages: variantMessages,\n checkpoints: nextVariant.checkpoints,\n },\n }));\n\n return nextGroup;\n };\n\n const selectVariant = async (\n assistantMessageId: string,\n variantId: string,\n ): Promise<void> => {\n const group = variantForMessage(assistantMessageId);\n if (!group) {\n throw new Error(\n `No response variants found for \"${assistantMessageId}\".`,\n );\n }\n const selectedVariant = group.variants.find(\n (variant) => variant.id === variantId,\n );\n if (!selectedVariant) {\n throw new Error(`Response variant \"${variantId}\" not found.`);\n }\n\n setSessionId(selectedVariant.sessionId);\n setMessages(selectedVariant.messages);\n setCheckpoints(selectedVariant.checkpoints);\n setStreamContentPieces([]);\n clearStructuredStreams();\n setBranches((current) => ({\n ...current,\n [selectedVariant.sessionId]: {\n ...(current[selectedVariant.sessionId] ?? {}),\n sessionId: selectedVariant.sessionId,\n messages: selectedVariant.messages,\n checkpoints: selectedVariant.checkpoints,\n },\n }));\n const nextGroup = {\n ...group,\n selectedVariantId: selectedVariant.id,\n };\n replaceResponseVariantGroup(nextGroup);\n };\n\n const regenerate = async (assistantMessageId: string): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const regenerateFromCheckpoint = async (\n checkpointId: string,\n ): Promise<void> => {\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n }\n if (!target) {\n throw new Error(`Checkpoint \"${checkpointId}\" not found.`);\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n const previousUser = messages\n .slice(baseMessages.length)\n .find((message) => message.role === \"user\");\n if (!previousUser) {\n throw new Error(\"No user message found after checkpoint for regenerate.\");\n }\n\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const retryWithEdit = async (\n assistantMessageId: string,\n newUserContent: string,\n ): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages, newUserContent);\n };\n\n return {\n messages,\n isStreaming,\n canAbort: isStreaming,\n error,\n streamContentPieces,\n streamDebug,\n lastAssistantId,\n checkpoints,\n activeSessionId: sessionId,\n branches,\n responseVariants,\n workflowId,\n setWorkflowId,\n send,\n respondToHumanInput,\n respondToInterrupt,\n setMessages,\n checkpointForMessage,\n rollbackTo,\n fork,\n regenerate,\n regenerateVariant,\n selectVariant,\n variantForMessage,\n regenerateFromCheckpoint,\n retryWithEdit,\n clearMessages,\n resetSession,\n resetChat,\n clearChat,\n abort,\n clearError,\n includeHistory,\n setIncludeHistory,\n };\n}\n","\"use client\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { useCallback, useState } from \"react\";\n\ntype DebugChunk = StreamChunk & {\n _ts: number;\n _dt: number;\n _seq: number;\n};\n\nexport function useChatStreamDebug() {\n const [streamDebug, setStreamDebug] = useState<StreamChunk[]>([]);\n\n const clearStreamDebug = useCallback(() => {\n setStreamDebug([]);\n }, []);\n\n const createRecorder = useCallback((initialMessage: string) => {\n let seq = 0;\n let lastTs = 0;\n const accDebug: StreamChunk[] = [];\n\n const push = (chunk: StreamChunk) => {\n const ts = Date.now();\n const withMeta: DebugChunk = {\n ...(chunk as StreamChunk),\n _ts: ts,\n _dt: lastTs ? ts - lastTs : 0,\n _seq: seq++,\n };\n lastTs = ts;\n accDebug.push(withMeta);\n setStreamDebug((current) =>\n current.length > 1000\n ? [...current.slice(-1000), withMeta]\n : [...current, withMeta],\n );\n };\n\n push({\n type: \"status\",\n message: initialMessage,\n } as StreamChunk);\n\n return {\n push,\n getAll: () => accDebug,\n };\n }, []);\n\n return {\n streamDebug,\n clearStreamDebug,\n createRecorder,\n };\n}\n","import {\n createStructuredStreamAccumulator,\n type StreamChunk,\n type StructuredDataChunk,\n type StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nexport type StructuredStreamItem<TData = unknown> = {\n id: string;\n streamId: string;\n state: StructuredStreamState<TData>;\n};\n\nexport type UseStructuredStreamsOptions<_TData = unknown> = {\n createId?: (() => string) | undefined;\n initialChunks?: Iterable<StructuredDataChunk> | undefined;\n};\n\nexport type UseStructuredStreamsResult<TData = unknown> = {\n items: StructuredStreamItem<TData>[];\n byStreamId: Record<string, StructuredStreamState<TData>>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TData> | undefined;\n clear: () => void;\n get: (streamId: string) => StructuredStreamItem<TData> | undefined;\n delete: (streamId: string) => boolean;\n};\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport function useStructuredStreams<TData = unknown>(\n options?: UseStructuredStreamsOptions<TData> | undefined,\n): UseStructuredStreamsResult<TData> {\n const createId = useRef(options?.createId ?? defaultCreateId).current;\n const initialChunks = useRef(options?.initialChunks ?? []).current;\n const accumulatorRef = useRef(\n createStructuredStreamAccumulator<TData>(initialChunks),\n );\n const initialItemsRef = useRef<StructuredStreamItem<TData>[] | undefined>(\n undefined,\n );\n\n if (initialItemsRef.current === undefined) {\n initialItemsRef.current = accumulatorRef.current\n .entries()\n .map(([streamId, state]) => ({\n id: createId(),\n streamId,\n state,\n }));\n }\n\n const itemsRef = useRef(initialItemsRef.current);\n const [items, setItems] = useState(initialItemsRef.current);\n\n const setNextItems = useCallback(\n (nextItems: StructuredStreamItem<TData>[]) => {\n itemsRef.current = nextItems;\n setItems(nextItems);\n },\n [],\n );\n\n const applyStreamChunk = useCallback(\n (chunk: StreamChunk): StructuredStreamItem<TData> | undefined => {\n const nextState = accumulatorRef.current.applyStreamChunk(chunk);\n if (!nextState) return undefined;\n\n const currentItems = itemsRef.current;\n const existingIndex = currentItems.findIndex(\n (item) => item.streamId === nextState.streamId,\n );\n const existingItem =\n existingIndex >= 0 ? currentItems[existingIndex] : undefined;\n\n const nextItem: StructuredStreamItem<TData> = existingItem\n ? {\n ...existingItem,\n state: nextState,\n }\n : {\n id: createId(),\n streamId: nextState.streamId,\n state: nextState,\n };\n\n const nextItems =\n existingIndex >= 0\n ? currentItems.map((item, index) =>\n index === existingIndex ? nextItem : item,\n )\n : [...currentItems, nextItem];\n\n setNextItems(nextItems);\n return nextItem;\n },\n [createId, setNextItems],\n );\n\n const clear = useCallback(() => {\n accumulatorRef.current = createStructuredStreamAccumulator<TData>();\n setNextItems([]);\n }, [setNextItems]);\n\n const get = useCallback((streamId: string) => {\n return itemsRef.current.find((item) => item.streamId === streamId);\n }, []);\n\n const deleteStream = useCallback(\n (streamId: string): boolean => {\n const deleted = accumulatorRef.current.delete(streamId);\n if (!deleted) return false;\n setNextItems(\n itemsRef.current.filter((item) => item.streamId !== streamId),\n );\n return true;\n },\n [setNextItems],\n );\n\n const byStreamId = useMemo(\n () =>\n Object.fromEntries(\n items.map((item) => [item.streamId, item.state]),\n ) as Record<string, StructuredStreamState<TData>>,\n [items],\n );\n\n return {\n items,\n byStreamId,\n applyStreamChunk,\n clear,\n get,\n delete: deleteStream,\n };\n}\n"],"mappings":"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","names":["sessionId","import_react","import_browser","import_react","defaultCreateId","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/build-assistant-message.ts","../src/chat-storage.ts","../src/chat-transport.ts","../src/create-live-chat-pieces.ts","../src/to-human-input-piece.ts","../src/use-chat.ts","../src/use-chat-stream-debug.ts","../src/use-structured-streams.ts"],"sourcesContent":["export * from \"./build-assistant-message\";\nexport * from \"./chat-storage\";\nexport * from \"./chat-transport\";\nexport * from \"./chat-types\";\nexport * from \"./create-live-chat-pieces\";\nexport * from \"./to-human-input-piece\";\nexport * from \"./use-chat\";\nexport * from \"./use-chat-stream-debug\";\nexport * from \"./use-structured-streams\";\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { ChatMsg, ContentPiece } from \"./chat-types\";\n\nexport function buildAssistantMessage(args: {\n createId: () => string;\n pieces: ContentPiece[];\n debug: StreamChunk[];\n trace?:\n | {\n traceId: string;\n spanId: string;\n runId: string;\n }\n | undefined;\n checkpoint?:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n}): ChatMsg {\n const plainTextContent = args.pieces\n .filter(\n (piece): piece is Extract<ContentPiece, { type: \"text\" }> =>\n piece.type === \"text\",\n )\n .map((piece) => piece.content)\n .join(\"\");\n\n const base = {\n id: args.createId(),\n role: \"assistant\" as const,\n content: plainTextContent,\n debug: args.debug,\n ...(args.trace ? args.trace : {}),\n ...(args.checkpoint\n ? {\n checkpointId: args.checkpoint.id,\n checkpointTurnIndex: args.checkpoint.turnIndex,\n }\n : {}),\n };\n\n return args.pieces.length > 0\n ? { ...base, contentPieces: args.pieces }\n : base;\n}\n","type MaybePromise<T> = T | Promise<T>;\ntype StorageLike = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\nexport type PersistedChatState<TMessage> = {\n sessionId: string | null;\n workflowId: string;\n includeHistory: boolean;\n messages: TMessage[];\n branches?: Record<\n string,\n {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints?: unknown[];\n }\n >;\n responseVariants?: unknown[];\n};\n\nexport type ChatStorage<TMessage> = {\n load: () => MaybePromise<Partial<PersistedChatState<TMessage>>>;\n save: (state: PersistedChatState<TMessage>) => MaybePromise<void>;\n clearMessages: () => MaybePromise<void>;\n};\n\nexport type BrowserChatStorageKeys = {\n messages: string;\n includeHistory: string;\n sessionId: string;\n workflowId: string;\n branches: string;\n responseVariants: string;\n};\n\nexport type BrowserChatStorageOptions<TMessage> = {\n parseMessage?: ((value: unknown) => TMessage | null) | undefined;\n serializeMessage?: ((message: TMessage) => unknown) | undefined;\n maxMessages?: number | undefined;\n keys?: Partial<BrowserChatStorageKeys> | undefined;\n};\n\nconst DEFAULT_STORAGE_KEYS: BrowserChatStorageKeys = {\n messages: \"chat.messages.v1\",\n includeHistory: \"chat.includeHistory.v1\",\n sessionId: \"chat.sessionId\",\n workflowId: \"chat.workflowId\",\n branches: \"chat.branches.v1\",\n responseVariants: \"chat.responseVariants.v1\",\n};\n\nconst getLocalStorage = (): StorageLike | undefined => {\n const candidate = globalThis as { localStorage?: StorageLike };\n return candidate.localStorage;\n};\n\nconst defaultParseMessage = <TMessage>(value: unknown): TMessage | null =>\n value as TMessage;\n\nconst defaultSerializeMessage = <TMessage>(message: TMessage): unknown =>\n message;\n\n// TODO: Make remote/custom persistence more robust before freezing this API:\n// - add debouncing so repeated message updates do not trigger a full save each time\n// - surface save error handling/retry hooks instead of silently ignoring failures\n// - define a conflict/version strategy for multi-tab and server-synced storage\n// - support partial saves instead of rewriting the full persisted state on each change\nexport function createBrowserChatStorage<TMessage = unknown>(\n options?: BrowserChatStorageOptions<TMessage>,\n): ChatStorage<TMessage> {\n const keys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(options?.keys ?? {}),\n };\n const maxMessages = options?.maxMessages ?? 60;\n const parseMessage = options?.parseMessage ?? defaultParseMessage<TMessage>;\n const serializeMessage =\n options?.serializeMessage ?? defaultSerializeMessage<TMessage>;\n\n return {\n load() {\n try {\n const storage = getLocalStorage();\n if (!storage) {\n return {};\n }\n\n const sessionId = storage.getItem(keys.sessionId);\n const workflowId = storage.getItem(keys.workflowId) ?? \"\";\n const includeHistoryRaw = storage.getItem(keys.includeHistory);\n const rawMessages = storage.getItem(keys.messages);\n const rawBranches = storage.getItem(keys.branches);\n const rawResponseVariants = storage.getItem(keys.responseVariants);\n const parsedMessages = rawMessages\n ? (JSON.parse(rawMessages) as unknown)\n : [];\n const messages = Array.isArray(parsedMessages)\n ? parsedMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n : [];\n const parsedBranches = rawBranches\n ? (JSON.parse(rawBranches) as unknown)\n : undefined;\n const branches =\n parsedBranches && typeof parsedBranches === \"object\"\n ? Object.fromEntries(\n Object.entries(\n parsedBranches as Record<\n string,\n {\n sessionId?: unknown;\n parentSessionId?: unknown;\n forkedFrom?: unknown;\n messages?: unknown;\n checkpoints?: unknown;\n }\n >,\n ).flatMap(([sessionId, branch]) => {\n if (typeof branch.sessionId !== \"string\") return [];\n const rawBranchMessages = Array.isArray(branch.messages)\n ? branch.messages\n : [];\n const branchMessages = rawBranchMessages\n .map((item) => parseMessage(item))\n .filter((message): message is TMessage => message !== null)\n .slice(-maxMessages);\n return [\n [\n sessionId,\n {\n sessionId: branch.sessionId,\n ...(typeof branch.parentSessionId === \"string\"\n ? { parentSessionId: branch.parentSessionId }\n : {}),\n ...(typeof branch.forkedFrom === \"string\"\n ? { forkedFrom: branch.forkedFrom }\n : {}),\n messages: branchMessages,\n ...(Array.isArray(branch.checkpoints)\n ? { checkpoints: branch.checkpoints }\n : {}),\n },\n ],\n ];\n }),\n )\n : undefined;\n const parsedResponseVariants = rawResponseVariants\n ? (JSON.parse(rawResponseVariants) as unknown)\n : undefined;\n\n return {\n sessionId,\n workflowId,\n includeHistory: includeHistoryRaw !== \"0\",\n messages,\n ...(branches ? { branches } : {}),\n ...(Array.isArray(parsedResponseVariants)\n ? { responseVariants: parsedResponseVariants }\n : {}),\n };\n } catch {\n return {};\n }\n },\n\n save(state) {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n\n if (state.sessionId) {\n storage.setItem(keys.sessionId, state.sessionId);\n } else {\n storage.removeItem(keys.sessionId);\n }\n\n storage.setItem(keys.workflowId, state.workflowId);\n storage.setItem(keys.includeHistory, state.includeHistory ? \"1\" : \"0\");\n\n const trimmedMessages = state.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message));\n\n storage.setItem(keys.messages, JSON.stringify(trimmedMessages));\n if (state.branches) {\n const serializedBranches = Object.fromEntries(\n Object.entries(state.branches).map(([sessionId, branch]) => [\n sessionId,\n {\n ...branch,\n messages: branch.messages\n .slice(-maxMessages)\n .map((message) => serializeMessage(message)),\n },\n ]),\n );\n storage.setItem(keys.branches, JSON.stringify(serializedBranches));\n } else {\n storage.removeItem(keys.branches);\n }\n\n if (state.responseVariants) {\n storage.setItem(\n keys.responseVariants,\n JSON.stringify(state.responseVariants),\n );\n } else {\n storage.removeItem(keys.responseVariants);\n }\n } catch {}\n },\n\n clearMessages() {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n storage.removeItem(keys.messages);\n storage.removeItem(keys.branches);\n storage.removeItem(keys.responseVariants);\n } catch {}\n },\n };\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport type { StreamChunk, StreamFromRouteArgs } from \"@kortyx/stream/browser\";\nimport { streamFromRoute } from \"@kortyx/stream/browser\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype DefaultChatContext = Record<string, unknown>;\n\nexport type OutgoingChatMessage = {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type ChatTransportContext<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n signal?: AbortSignal | undefined;\n};\n\nexport type ChatTransportChunkHandler = (\n chunk: StreamChunk,\n) => undefined | boolean | Promise<boolean | undefined>;\n\nexport type CheckpointSummary = {\n id: string;\n sessionId: string;\n turnIndex: number;\n createdAt: number;\n nodes: string[];\n workflow: string;\n label?: string;\n};\n\nexport type RollbackCheckpointResult = {\n sessionId: string;\n head: string;\n invalidatedStructuredStreamIds: string[];\n invalidatedInterruptTokens: string[];\n};\n\nexport type ForkPendingRequest = {\n token: string;\n requestId: string;\n schema?: {\n kind?: \"choice\" | \"multi-choice\" | \"text\";\n multiple?: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n };\n options?: Array<{ id: string; label: string; description?: string }>;\n};\n\nexport type ForkCheckpointResult = {\n sessionId: string;\n parentSessionId: string;\n forkedFrom: string;\n checkpoint?: {\n id: string;\n sessionId: string;\n turnIndex: number;\n activePendingRequests?: ForkPendingRequest[];\n };\n};\n\nexport type ChatTransport<TContext = DefaultChatContext> = {\n stream(\n args: ChatTransportContext<TContext> & {\n onChunk: ChatTransportChunkHandler;\n },\n ): Promise<void>;\n listCheckpoints?: (sessionId: string) => Promise<CheckpointSummary[]>;\n rollbackTo?: (checkpointId: string) => Promise<RollbackCheckpointResult>;\n fork?: (\n checkpointId: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n};\n\nexport type ChatTransportChunkSource =\n | Iterable<StreamChunk>\n | AsyncIterable<StreamChunk>;\n\nexport function createChatTransport<TContext = DefaultChatContext>(args: {\n stream: (\n context: ChatTransportContext<TContext>,\n ) => MaybePromise<ChatTransportChunkSource>;\n}): ChatTransport<TContext> {\n return {\n async stream({ onChunk, ...context }) {\n for await (const chunk of await args.stream(context)) {\n const shouldContinue = await onChunk(chunk);\n if (chunk.type === \"done\" || shouldContinue === false) {\n break;\n }\n }\n },\n };\n}\n\nexport type RouteChatRequestBody<TContext = DefaultChatContext> = {\n sessionId: string;\n workflowId: string;\n messages: OutgoingChatMessage[];\n context: TContext;\n};\n\nexport type CreateRouteChatTransportArgs<TBody, TContext> = Omit<\n StreamFromRouteArgs<TBody>,\n \"body\"\n> & {\n createBody?: ((context: ChatTransportContext<TContext>) => TBody) | undefined;\n checkpointEndpoint?: string | undefined;\n};\n\nexport function createRouteChatTransport<\n TContext = DefaultChatContext,\n TBody = RouteChatRequestBody<TContext>,\n>(\n args: CreateRouteChatTransportArgs<TBody, TContext>,\n): ChatTransport<TContext> {\n const transport = createChatTransport<TContext>({\n stream: (context) => {\n const body =\n args.createBody?.(context) ??\n ({\n sessionId: context.sessionId,\n workflowId: context.workflowId,\n messages: context.messages,\n context: context.context,\n } as TBody);\n const routeArgs: StreamFromRouteArgs<TBody> = {\n endpoint: args.endpoint,\n body,\n ...(args.method ? { method: args.method } : {}),\n ...(args.headers ? { headers: args.headers } : {}),\n ...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),\n ...(context.signal ? { signal: context.signal } : {}),\n };\n\n return streamFromRoute({\n ...routeArgs,\n });\n },\n });\n\n if (!args.checkpointEndpoint) return transport;\n\n const fetchJson = async <TResult>(\n body: Record<string, unknown>,\n ): Promise<TResult> => {\n const fetchImpl = args.fetchImpl ?? fetch;\n const response = await fetchImpl(args.checkpointEndpoint as string, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n let failure: unknown;\n let message = `Checkpoint request failed with status ${response.status}`;\n try {\n const parsed = (await response.json()) as {\n error?: unknown;\n failure?: unknown;\n };\n failure = parsed.failure;\n if (typeof parsed.error === \"string\") message = parsed.error;\n } catch {}\n throw isFailureDescriptor(failure)\n ? errorFromFailure(failure)\n : new KortyxError(\"CHECKPOINT_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\n }\n return (await response.json()) as TResult;\n };\n\n return {\n ...transport,\n listCheckpoints: (sessionId) =>\n fetchJson<CheckpointSummary[]>({ action: \"list\", sessionId }),\n rollbackTo: (checkpointId) =>\n fetchJson<RollbackCheckpointResult>({\n action: \"rollback\",\n checkpointId,\n }),\n fork: (checkpointId, options) =>\n fetchJson<ForkCheckpointResult>({\n action: \"fork\",\n checkpointId,\n ...(options?.newSessionId\n ? { newSessionId: options.newSessionId }\n : {}),\n }),\n };\n}\n","import type { FailureDescriptor } from \"@kortyx/core/errors\";\nimport type {\n StreamChunk,\n StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport type { StructuredStreamItem } from \"./use-structured-streams\";\n\nexport type LiveChatTextPiece = {\n id: string;\n type: \"text\";\n content: string;\n};\n\nexport type LiveChatStructuredPiece<TStructuredData = unknown> = {\n id: string;\n type: \"structured\";\n data: StructuredStreamState<TStructuredData>;\n};\n\nexport type LiveChatErrorPiece = {\n id: string;\n type: \"error\";\n failure?: FailureDescriptor;\n content: string;\n};\n\ntype LiveChatCustomPiece = {\n id: string;\n type: string;\n};\n\nexport type LiveChatPiece<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n> =\n | LiveChatTextPiece\n | LiveChatStructuredPiece<TStructuredData>\n | LiveChatErrorPiece\n | TCustomPiece;\n\ntype StructuredStreamsController<TStructuredData> = {\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TStructuredData> | undefined;\n};\n\nconst isNonEmptyTextPiece = <\n TStructuredData,\n TCustomPiece extends LiveChatCustomPiece,\n>(\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n) =>\n piece.type !== \"text\" ||\n (\"content\" in piece &&\n typeof piece.content === \"string\" &&\n piece.content.length > 0);\n\nexport function createLiveChatPieces<\n TStructuredData = unknown,\n TCustomPiece extends LiveChatCustomPiece = never,\n>(args: {\n createId: () => string;\n onChange: (pieces: LiveChatPiece<TStructuredData, TCustomPiece>[]) => void;\n structuredStreams: StructuredStreamsController<TStructuredData>;\n toHumanInputPiece: (chunk: StreamChunk) => TCustomPiece;\n}) {\n const keyedPieces: Array<{\n key: string;\n piece: LiveChatPiece<TStructuredData, TCustomPiece>;\n }> = [];\n let sawTextDelta = false;\n\n const emit = () => {\n args.onChange(\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n );\n };\n\n const findPieceIndex = (key: string) =>\n keyedPieces.findIndex((entry) => entry.key === key);\n\n const upsertPiece = (\n key: string,\n piece: LiveChatPiece<TStructuredData, TCustomPiece>,\n ) => {\n const existingIndex = findPieceIndex(key);\n if (existingIndex >= 0) {\n keyedPieces[existingIndex] = { key, piece };\n } else {\n keyedPieces.push({ key, piece });\n }\n emit();\n };\n\n const pushPiece = (piece: LiveChatPiece<TStructuredData, TCustomPiece>) => {\n keyedPieces.push({\n key: `${piece.type}:${piece.id}`,\n piece,\n });\n emit();\n };\n\n const resolveTextStreamKey = (\n chunk: StreamChunk,\n fallbackNode?: string,\n ): string => {\n if (\"segmentId\" in chunk && typeof chunk.segmentId === \"string\") {\n const seg = chunk.segmentId.trim();\n if (seg.length > 0) {\n const op =\n \"opId\" in chunk && typeof chunk.opId === \"string\"\n ? chunk.opId.trim()\n : \"\";\n return op.length > 0 ? `${op}:${seg}` : seg;\n }\n }\n\n if (\"opId\" in chunk && typeof chunk.opId === \"string\") {\n const op = chunk.opId.trim();\n if (op.length > 0) {\n const node =\n (\"node\" in chunk && typeof chunk.node === \"string\"\n ? chunk.node\n : fallbackNode) ?? \"__unknown__\";\n return `${op}:${node}`;\n }\n }\n\n return fallbackNode && fallbackNode.length > 0\n ? fallbackNode\n : \"__unknown__\";\n };\n\n const ensureTextPiece = (key: string): LiveChatTextPiece => {\n const pieceKey = `text:${key}`;\n const existingIndex = findPieceIndex(pieceKey);\n if (existingIndex >= 0) {\n return keyedPieces[existingIndex]?.piece as LiveChatTextPiece;\n }\n\n const nextPiece: LiveChatTextPiece = {\n id: args.createId(),\n type: \"text\",\n content: \"\",\n };\n keyedPieces.push({ key: pieceKey, piece: nextPiece });\n return nextPiece;\n };\n\n const processChunk = (\n chunk: StreamChunk,\n _options?: { openDebugOnInterrupt?: boolean | undefined },\n ): boolean => {\n if (chunk.type === \"text-start\") {\n ensureTextPiece(resolveTextStreamKey(chunk, chunk.node));\n emit();\n return true;\n }\n\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n const streamKey = resolveTextStreamKey(chunk, chunk.node);\n const current = ensureTextPiece(streamKey);\n upsertPiece(`text:${streamKey}`, {\n ...current,\n content: current.content + chunk.delta,\n });\n return true;\n }\n\n if (chunk.type === \"text-end\") {\n emit();\n return true;\n }\n\n if (chunk.type === \"structured-data\") {\n const nextItem = args.structuredStreams.applyStreamChunk(chunk);\n if (nextItem) {\n upsertPiece(`structured:${nextItem.streamId}`, {\n id: nextItem.id,\n type: \"structured\",\n data: nextItem.state,\n });\n }\n return true;\n }\n\n if (chunk.type === \"interrupt\") {\n pushPiece(args.toHumanInputPiece(chunk));\n return true;\n }\n\n if (chunk.type === \"message\") {\n if (!sawTextDelta) {\n pushPiece({\n id: args.createId(),\n type: \"text\",\n content: chunk.content ?? \"\",\n });\n }\n return true;\n }\n\n if (chunk.type === \"error\") {\n pushPiece({\n id: args.createId(),\n type: \"error\",\n content: chunk.message ?? \"An error occurred\",\n ...(chunk.failure ? { failure: chunk.failure } : {}),\n });\n return true;\n }\n\n if (chunk.type === \"done\") {\n return false;\n }\n\n return true;\n };\n\n return {\n processChunk,\n getPieces: () =>\n keyedPieces\n .map((entry) => entry.piece)\n .filter((piece) => isNonEmptyTextPiece(piece)),\n };\n}\n","import type { StreamChunk } from \"@kortyx/stream/browser\";\nimport type { HumanInputPiece } from \"./chat-types\";\n\ninterface HumanInputStreamChunk {\n type: \"interrupt\";\n requestId: string | undefined;\n resumeToken: string | undefined;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n input?: {\n kind?: \"text\" | \"choice\" | \"multi-choice\";\n question?: string;\n multiple?: boolean;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n options?: Array<{\n id?: string | number;\n label?: string;\n description?: string;\n }>;\n };\n}\n\nexport type ToHumanInputPiece = (args: {\n chunk: StreamChunk;\n createId: () => string;\n}) => HumanInputPiece;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst nonEmptyString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst firstNonEmptyString = (...values: unknown[]): string | undefined => {\n for (const value of values) {\n const result = nonEmptyString(value);\n if (result) return result;\n }\n return undefined;\n};\n\nexport function toHumanInputPiece(args: {\n chunk: StreamChunk;\n createId: () => string;\n}): HumanInputPiece {\n const hi = args.chunk as unknown as HumanInputStreamChunk;\n const input = hi.input ?? {};\n const kind = input.kind || (input.multiple ? \"multi-choice\" : \"choice\");\n const isText = kind === \"text\";\n const schemaId = firstNonEmptyString(hi.schemaId, input.schemaId);\n const schemaVersion = firstNonEmptyString(\n hi.schemaVersion,\n input.schemaVersion,\n );\n const interruptId = firstNonEmptyString(hi.id, input.id);\n const inputMeta = isRecord(input.meta) ? input.meta : undefined;\n const chunkMeta = isRecord(hi.meta) ? hi.meta : undefined;\n const meta =\n inputMeta || chunkMeta\n ? { ...(inputMeta ?? {}), ...(chunkMeta ?? {}) }\n : undefined;\n\n const question = isText\n ? input.question\n : typeof input.question === \"string\"\n ? input.question\n : \"Please choose\";\n\n const optionsSrc = Array.isArray(input.options) ? input.options : [];\n const optionsArr: Array<{\n id: string;\n label: string;\n description?: string;\n }> = optionsSrc\n .map((option) => ({\n id: String(option.id ?? \"\"),\n label: String(option.label ?? \"\"),\n ...(typeof option.description === \"string\" && option.description\n ? { description: option.description }\n : {}),\n }))\n .filter((option) => option.id && option.label);\n\n return {\n id: args.createId(),\n type: \"interrupt\",\n resumeToken: String(hi.resumeToken ?? \"\"),\n requestId: String(hi.requestId ?? \"\"),\n kind,\n ...(question !== undefined ? { question } : {}),\n multiple: Boolean(input.multiple),\n options: optionsArr,\n ...(schemaId ? { schemaId } : {}),\n ...(schemaVersion ? { schemaVersion } : {}),\n ...(interruptId ? { interruptId } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n","\"use client\";\n\nimport { 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 }) => Promise<void> | void;\n respondToInterrupt: (\n piece: HumanInputPiece,\n response?: { selected?: string[] | undefined; text?: string | undefined },\n ) => Promise<void> | void;\n setMessages: React.Dispatch<React.SetStateAction<ChatMsg[]>>;\n checkpointForMessage: (messageId: string) => string | null;\n rollbackTo: (id: string) => Promise<RollbackCheckpointResult>;\n fork: (\n id: string,\n options?: { newSessionId?: string },\n ) => Promise<ForkCheckpointResult>;\n regenerate: (assistantMessageId: string) => Promise<void>;\n regenerateVariant: (\n assistantMessageId: string,\n ) => Promise<ChatResponseVariantGroup>;\n selectVariant: (\n assistantMessageId: string,\n variantId: string,\n ) => Promise<void>;\n variantForMessage: (messageId: string) => ChatResponseVariantGroup | null;\n regenerateFromCheckpoint: (checkpointId: string) => Promise<void>;\n retryWithEdit: (\n assistantMessageId: string,\n newUserContent: string,\n ) => Promise<void>;\n clearMessages: () => void;\n resetSession: () => void;\n resetChat: () => void;\n clearChat: () => void;\n abort: () => void;\n clearError: () => void;\n includeHistory: boolean;\n setIncludeHistory: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type ChatBranch<TMessage = ChatMsg> = {\n sessionId: string;\n parentSessionId?: string;\n forkedFrom?: string;\n messages: TMessage[];\n checkpoints: CheckpointSummary[];\n};\n\nexport type ChatResponseVariant = {\n id: string;\n sessionId: string;\n assistantMessageId: string;\n createdAt: number;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n checkpointId?: string;\n checkpointTurnIndex?: number;\n label?: string;\n};\n\nexport type ChatResponseVariantGroup = {\n id: string;\n sourceAssistantMessageId: string;\n checkpointId: string;\n checkpointTurnIndex: number;\n selectedVariantId: string;\n variants: ChatResponseVariant[];\n};\n\nexport type UseChatOptions<TContext = DefaultChatContext> = {\n transport: ChatTransport<TContext>;\n storage?: ChatStorage<ChatMsg> | undefined;\n createId?: (() => string) | undefined;\n context?: TContext | undefined;\n prepareContextMessages?: PrepareContextMessages<TContext> | undefined;\n toHumanInputPiece?: ToHumanInputPiece | undefined;\n};\n\nconst defaultStorage = createBrowserChatStorage<ChatMsg>();\n\nfunction useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n\nfunction findActiveTextInterrupt(args: {\n messages: ChatMsg[];\n streamContentPieces: ContentPiece[];\n}): HumanInputPiece | undefined {\n const liveInterrupt = [...args.streamContentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n if (liveInterrupt) return liveInterrupt;\n\n const latestMessage = args.messages.at(-1);\n if (latestMessage?.role !== \"assistant\" || !latestMessage.contentPieces) {\n return undefined;\n }\n\n return [...latestMessage.contentPieces]\n .reverse()\n .find(\n (piece): piece is HumanInputPiece =>\n piece.type === \"interrupt\" && piece.kind === \"text\",\n );\n}\n\nfunction trimMessagesToCheckpoint(args: {\n messages: ChatMsg[];\n turnIndex: number;\n}): ChatMsg[] {\n const hasCheckpointMetadata = args.messages.some(\n (message) => typeof message.checkpointTurnIndex === \"number\",\n );\n if (!hasCheckpointMetadata && args.turnIndex > 0) return args.messages;\n\n const keepThroughIndex = args.messages.reduce((lastIndex, message, index) => {\n return typeof message.checkpointTurnIndex === \"number\" &&\n message.checkpointTurnIndex <= args.turnIndex\n ? index\n : lastIndex;\n }, -1);\n\n return keepThroughIndex >= 0\n ? args.messages.slice(0, keepThroughIndex + 1)\n : [];\n}\n\nfunction applyForkedPendingRequests(args: {\n messages: ChatMsg[];\n pendingRequests: ForkPendingRequest[];\n}): ChatMsg[] {\n if (args.pendingRequests.length === 0) return args.messages;\n\n const interruptPositions = args.messages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex }] : [],\n ),\n );\n const positionsToPatch = interruptPositions.slice(\n -args.pendingRequests.length,\n );\n if (positionsToPatch.length === 0) return args.messages;\n\n return args.messages.map((message, messageIndex) => {\n if (!message.contentPieces) return message;\n\n let changed = false;\n const contentPieces = message.contentPieces.map((piece, pieceIndex) => {\n if (piece.type !== \"interrupt\") return piece;\n const patchIndex = positionsToPatch.findIndex(\n (position) =>\n position.messageIndex === messageIndex &&\n position.pieceIndex === pieceIndex,\n );\n const pending = args.pendingRequests[patchIndex];\n if (!pending) return piece;\n\n changed = true;\n return {\n ...piece,\n resumeToken: pending.token,\n requestId: pending.requestId,\n ...(pending.schema?.kind ? { kind: pending.schema.kind } : {}),\n ...(typeof pending.schema?.multiple === \"boolean\"\n ? { multiple: pending.schema.multiple }\n : {}),\n ...(typeof pending.schema?.question === \"string\"\n ? { question: pending.schema.question }\n : {}),\n ...(typeof pending.schema?.schemaId === \"string\"\n ? { schemaId: pending.schema.schemaId }\n : {}),\n ...(typeof pending.schema?.schemaVersion === \"string\"\n ? { schemaVersion: pending.schema.schemaVersion }\n : {}),\n ...(typeof pending.schema?.id === \"string\"\n ? { interruptId: pending.schema.id }\n : {}),\n ...(pending.schema?.meta ? { meta: pending.schema.meta } : {}),\n ...(pending.options ? { options: pending.options } : {}),\n };\n });\n\n return changed ? { ...message, contentPieces } : message;\n });\n}\n\nfunction latestAssistantMessageId(messages: ChatMsg[]): string | null {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role === \"assistant\") return message.id;\n }\n return null;\n}\n\nexport function useChat<TContext = DefaultChatContext>(\n options: UseChatOptions<TContext>,\n): UseChatValue {\n const resolvedStorage = options.storage ?? defaultStorage;\n const transportRef = useLatestRef(options.transport);\n const storageRef = useLatestRef(resolvedStorage);\n const toHumanInputPieceRef = useLatestRef(\n options.toHumanInputPiece ?? defaultToHumanInputPiece,\n );\n const requestContext =\n options.context ?? ({} as unknown as NonNullable<TContext>);\n const createId = useRef(options.createId ?? defaultCreateId).current;\n\n const [messages, setMessages] = useState<ChatMsg[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [streamContentPieces, setStreamContentPieces] = useState<\n ContentPiece[]\n >([]);\n const [lastAssistantId, setLastAssistantId] = useState<string | null>(null);\n const [checkpoints, setCheckpoints] = useState<CheckpointSummary[]>([]);\n const [includeHistory, setIncludeHistory] = useState(true);\n const [workflowId, setWorkflowId] = useState(\"\");\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [branches, setBranches] = useState<Record<string, ChatBranch>>({});\n const [responseVariants, setResponseVariants] = useState<\n ChatResponseVariantGroup[]\n >([]);\n const [didHydrateStorage, setDidHydrateStorage] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const { streamDebug, clearStreamDebug, createRecorder } =\n useChatStreamDebug();\n const {\n applyStreamChunk,\n clear: clearStructuredStreams,\n delete: deleteStructuredStream,\n } = useStructuredStreams<Record<string, unknown>>({\n createId,\n });\n\n useEffect(() => {\n let cancelled = false;\n const storage = resolvedStorage;\n\n void Promise.resolve(storage.load()).then((storedState) => {\n if (cancelled) return;\n\n if (typeof storedState.sessionId === \"string\") {\n setSessionId(storedState.sessionId);\n }\n if (typeof storedState.workflowId === \"string\") {\n setWorkflowId(storedState.workflowId);\n }\n if (typeof storedState.includeHistory === \"boolean\") {\n setIncludeHistory(storedState.includeHistory);\n }\n if (\n Array.isArray(storedState.messages) &&\n storedState.messages.length > 0\n ) {\n setMessages(storedState.messages);\n }\n if (storedState.branches && typeof storedState.branches === \"object\") {\n setBranches(\n storedState.branches as unknown as Record<string, ChatBranch>,\n );\n }\n if (Array.isArray(storedState.responseVariants)) {\n setResponseVariants(\n storedState.responseVariants as ChatResponseVariantGroup[],\n );\n }\n\n setDidHydrateStorage(true);\n });\n\n return () => {\n cancelled = true;\n };\n }, [resolvedStorage]);\n\n useEffect(() => {\n const nextLastAssistantId = latestAssistantMessageId(messages);\n if (lastAssistantId !== nextLastAssistantId) {\n setLastAssistantId(nextLastAssistantId);\n }\n }, [lastAssistantId, messages]);\n\n useEffect(() => {\n if (!didHydrateStorage) return;\n const storage = storageRef.current;\n\n void storage.save({\n sessionId,\n workflowId,\n includeHistory,\n messages,\n branches,\n responseVariants,\n });\n }, [\n branches,\n didHydrateStorage,\n includeHistory,\n messages,\n responseVariants,\n sessionId,\n storageRef,\n workflowId,\n ]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setBranches((current) => ({\n ...current,\n [sessionId]: {\n ...(current[sessionId] ?? {}),\n sessionId,\n messages,\n checkpoints,\n },\n }));\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n useEffect(() => {\n if (!didHydrateStorage || !sessionId) return;\n\n setResponseVariants((current) =>\n current.map((group) => {\n const selectedVariant = group.variants.find(\n (variant) =>\n variant.id === group.selectedVariantId &&\n variant.sessionId === sessionId,\n );\n if (!selectedVariant) return group;\n if (\n selectedVariant.messages === messages &&\n selectedVariant.checkpoints === checkpoints\n ) {\n return group;\n }\n\n return {\n ...group,\n variants: group.variants.map((variant) =>\n variant.id === selectedVariant.id\n ? {\n ...variant,\n messages,\n checkpoints,\n }\n : variant,\n ),\n };\n }),\n );\n }, [checkpoints, didHydrateStorage, messages, sessionId]);\n\n const clearActiveStream = () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages([]);\n setCheckpoints([]);\n setBranches({});\n setResponseVariants([]);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n setLastAssistantId(null);\n };\n\n const clearMessages = () => {\n clearActiveStream();\n void storageRef.current.clearMessages();\n };\n\n const resetSession = () => {\n setSessionId(null);\n setCheckpoints([]);\n };\n\n const resetChat = () => {\n clearActiveStream();\n resetSession();\n setError(null);\n void storageRef.current.clearMessages();\n };\n\n const clearChat = resetChat;\n\n const clearError = () => {\n setError(null);\n };\n\n const abort = () => {\n abortControllerRef.current?.abort();\n };\n\n const persistSessionId = (sid: string) => {\n setSessionId(sid);\n };\n\n const resolveSessionId = (preferredSessionId?: string | undefined) => {\n if (preferredSessionId) {\n if (sessionId !== preferredSessionId)\n persistSessionId(preferredSessionId);\n return preferredSessionId;\n }\n const sid = sessionId ?? createId();\n if (!sessionId) persistSessionId(sid);\n return sid;\n };\n\n const toOutgoingHistoryMessage = (message: ChatMsg): OutgoingChatMessage => ({\n role: message.role,\n content: message.content,\n });\n\n const prepareMessagesToSend = async (args: {\n sid: string;\n outgoingMessage: OutgoingChatMessage;\n reason: \"send\" | \"resume\";\n baseMessages?: ChatMsg[] | undefined;\n }): Promise<OutgoingChatMessage[]> => {\n const baseMessages = args.baseMessages ?? messages;\n const prepared = options.prepareContextMessages\n ? await options.prepareContextMessages({\n messages: baseMessages,\n sessionId: args.sid,\n workflowId,\n reason: args.reason,\n context: requestContext,\n })\n : includeHistory\n ? baseMessages.map(toOutgoingHistoryMessage)\n : [];\n\n return [...prepared, args.outgoingMessage];\n };\n\n const streamAssistantResponse = async (args: {\n sid: string;\n messagesToSend: OutgoingChatMessage[];\n messagesBeforeAssistant?: ChatMsg[] | undefined;\n debugLabel: string;\n openDebugOnInterrupt?: boolean;\n signal: AbortSignal;\n }): Promise<ChatMsg | undefined> => {\n clearStructuredStreams();\n setStreamContentPieces([]);\n\n const debug = createRecorder(`${args.debugLabel} sessionId=${args.sid}`);\n let currentTrace: ChatTraceMetadata | undefined;\n let completedTrace: ChatTraceMetadata | undefined;\n let currentCheckpoint:\n | {\n id: string;\n turnIndex: number;\n }\n | undefined;\n const pieces = createLiveChatPieces({\n createId,\n onChange: setStreamContentPieces,\n structuredStreams: {\n applyStreamChunk,\n },\n toHumanInputPiece: (chunk) =>\n toHumanInputPieceRef.current({\n chunk,\n createId,\n }),\n });\n\n await transportRef.current.stream({\n sessionId: args.sid,\n workflowId,\n messages: args.messagesToSend,\n context: requestContext,\n signal: args.signal,\n onChunk: (chunk: StreamChunk) => {\n debug.push(chunk);\n\n if (chunk.type === \"session\") {\n if (typeof chunk.sessionId === \"string\") {\n persistSessionId(chunk.sessionId);\n }\n return;\n }\n\n if (chunk.type === \"trace\") {\n if (\n typeof chunk.traceId === \"string\" &&\n typeof chunk.spanId === \"string\" &&\n typeof chunk.runId === \"string\"\n ) {\n currentTrace = {\n traceId: chunk.traceId,\n spanId: chunk.spanId,\n runId: chunk.runId,\n };\n }\n return;\n }\n\n if (chunk.type === \"checkpoint\") {\n currentCheckpoint = {\n id: chunk.id,\n turnIndex: chunk.turnIndex,\n };\n setCheckpoints((prev) => {\n const next = {\n id: chunk.id,\n sessionId: chunk.sessionId,\n turnIndex: chunk.turnIndex,\n createdAt: Date.now(),\n nodes: [],\n workflow: workflowId,\n ...(chunk.label ? { label: chunk.label } : {}),\n } satisfies CheckpointSummary;\n return [...prev.filter((item) => item.id !== chunk.id), next].sort(\n (a, b) => a.turnIndex - b.turnIndex,\n );\n });\n return;\n }\n\n if (chunk.type === \"structured-data-invalidated\") {\n deleteStructuredStream(chunk.streamId);\n return;\n }\n\n if (chunk.type === \"error\") {\n setError(\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 baseMessages,\n sid,\n }: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n baseMessages?: ChatMsg[] | undefined;\n sid?: string | undefined;\n }): Promise<ReplayResult | undefined> => {\n if (isStreaming) return undefined;\n setError(null);\n const label: string =\n typeof text === \"string\" && text.length > 0\n ? text\n : selected.length > 0\n ? selected.length === 1\n ? (selected[0] as string)\n : selected.join(\", \")\n : \"(selection)\";\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content: label,\n source: {\n type: \"interrupt-response\",\n resumeToken,\n requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n },\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resumePayload: Record<string, unknown> = {\n resume: { token: resumeToken, requestId, selected },\n };\n const outgoing = {\n role: \"user\" as const,\n content: label,\n metadata: resumePayload,\n };\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: outgoing,\n reason: \"resume\",\n baseMessages,\n });\n\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (resume)\",\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const respondToHumanInput = async (args: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n }): Promise<void> => {\n await respondToHumanInputFromBase(args);\n };\n\n const respondToInterrupt = async (\n piece: HumanInputPiece,\n response?: { selected?: string[] | undefined; text?: string | undefined },\n ) => {\n const text = response?.text;\n const selected =\n response?.selected ??\n (typeof text === \"string\" && text.length > 0 ? [text] : []);\n\n await respondToHumanInput({\n resumeToken: piece.resumeToken,\n requestId: piece.requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n });\n };\n\n const sendFromBase = async (\n text: string,\n baseMessages?: ChatMsg[] | undefined,\n sid?: string | undefined,\n ): Promise<ReplayResult | undefined> => {\n const content = text.trim();\n if (!content || isStreaming) return undefined;\n setError(null);\n\n const activeTextInterrupt = findActiveTextInterrupt({\n messages: baseMessages ?? messages,\n streamContentPieces,\n });\n\n if (activeTextInterrupt) {\n return respondToHumanInputFromBase({\n resumeToken: activeTextInterrupt.resumeToken,\n requestId: activeTextInterrupt.requestId,\n selected: [content],\n text: content,\n baseMessages,\n sid,\n });\n }\n\n const userId = createId();\n const userMsg: ChatMsg = {\n id: userId,\n role: \"user\",\n content,\n };\n const nextMessages = [...(baseMessages ?? messages), userMsg];\n setMessages(nextMessages);\n\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const resolvedSessionId = resolveSessionId(sid);\n const messagesToSend = await prepareMessagesToSend({\n sid: resolvedSessionId,\n outgoingMessage: { role: \"user\" as const, content },\n reason: \"send\",\n baseMessages,\n });\n const assistantMessage = await streamAssistantResponse({\n sid: resolvedSessionId,\n messagesToSend,\n messagesBeforeAssistant: nextMessages,\n debugLabel: \"runChat (send)\",\n openDebugOnInterrupt: true,\n signal: abortController.signal,\n });\n return {\n userMessage: userMsg,\n ...(assistantMessage ? { assistantMessage } : {}),\n messages: assistantMessage\n ? [...nextMessages, assistantMessage]\n : nextMessages,\n };\n } catch (err) {\n if (isAbortError(err, abortController.signal)) return;\n const nextError = err instanceof Error ? err : new Error(String(err));\n setError(nextError);\n throw err;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }\n };\n\n const send = async (text: string): Promise<void> => {\n await sendFromBase(text);\n };\n\n const requireCheckpointTransport = (): ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n } => {\n const transport = transportRef.current;\n if (\n !transport.listCheckpoints ||\n !transport.rollbackTo ||\n !transport.fork\n ) {\n throw new Error(\n \"Checkpoint helpers require a transport with checkpoint methods.\",\n );\n }\n return transport as ChatTransport<TContext> & {\n listCheckpoints: NonNullable<ChatTransport<TContext>[\"listCheckpoints\"]>;\n rollbackTo: NonNullable<ChatTransport<TContext>[\"rollbackTo\"]>;\n fork: NonNullable<ChatTransport<TContext>[\"fork\"]>;\n };\n };\n\n const refreshCheckpoints = async (sid: string) => {\n const transport = requireCheckpointTransport();\n const next = await transport.listCheckpoints(sid);\n setCheckpoints(next);\n return next;\n };\n\n const applyStructuredInvalidations = (streamIds: string[]) => {\n for (const streamId of streamIds) {\n deleteStructuredStream(streamId);\n }\n };\n\n const rollbackTo = async (id: string): Promise<RollbackCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot rollback while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const result = await transport.rollbackTo(id);\n applyStructuredInvalidations(result.invalidatedStructuredStreamIds);\n const refreshedCheckpoints = await refreshCheckpoints(result.sessionId);\n const target = refreshedCheckpoints.find(\n (checkpoint) => checkpoint.id === result.head,\n );\n\n if (target) {\n setMessages((current) => {\n return trimMessagesToCheckpoint({\n messages: current,\n turnIndex: target.turnIndex,\n });\n });\n }\n\n return result;\n };\n\n const fork = async (\n id: string,\n options?: { newSessionId?: string },\n ): Promise<ForkCheckpointResult> => {\n if (isStreaming) {\n throw new Error(\"Cannot fork while a stream is active.\");\n }\n const transport = requireCheckpointTransport();\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === id,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find((checkpoint) => checkpoint.id === id);\n }\n\n const result = await transport.fork(id, options);\n setSessionId(result.sessionId);\n const childCheckpoints = await refreshCheckpoints(result.sessionId);\n const childHead = childCheckpoints.at(-1);\n const forkTurnIndex = target?.turnIndex ?? childHead?.turnIndex;\n if (typeof forkTurnIndex === \"number\") {\n setMessages((current) =>\n applyForkedPendingRequests({\n messages: trimMessagesToCheckpoint({\n messages: current,\n turnIndex: forkTurnIndex,\n }),\n pendingRequests: result.checkpoint?.activePendingRequests ?? [],\n }),\n );\n }\n setStreamContentPieces([]);\n clearStructuredStreams();\n return result;\n };\n\n const checkpointForMessage = (messageId: string): string | null => {\n return (\n messages.find((message) => message.id === messageId)?.checkpointId ?? null\n );\n };\n\n const variantForMessage = (\n messageId: string,\n ): ChatResponseVariantGroup | null => {\n return (\n responseVariants.find(\n (group) =>\n group.sourceAssistantMessageId === messageId ||\n group.variants.some(\n (variant) => variant.assistantMessageId === messageId,\n ),\n ) ?? null\n );\n };\n\n const findResumeOverrideForFork = (\n baseMessages: ChatMsg[],\n forkedBaseMessages: ChatMsg[],\n userMessage: ChatMsg,\n ): ResumeOverride | undefined => {\n if (userMessage.source?.type !== \"interrupt-response\") return undefined;\n const userSource = userMessage.source;\n\n const interruptPositions = baseMessages.flatMap((message, messageIndex) =>\n (message.contentPieces ?? []).flatMap((piece, pieceIndex) =>\n piece.type === \"interrupt\" ? [{ messageIndex, pieceIndex, piece }] : [],\n ),\n );\n const matchedPosition = [...interruptPositions]\n .reverse()\n .find(\n ({ piece }) =>\n piece.resumeToken === userSource.resumeToken ||\n piece.requestId === userSource.requestId,\n );\n\n const forkedPiece =\n typeof matchedPosition?.messageIndex === \"number\"\n ? forkedBaseMessages[matchedPosition.messageIndex]?.contentPieces?.[\n matchedPosition.pieceIndex\n ]\n : undefined;\n\n if (forkedPiece?.type === \"interrupt\") {\n return {\n resumeToken: forkedPiece.resumeToken,\n requestId: forkedPiece.requestId,\n };\n }\n\n const latestForkedInterrupt = forkedBaseMessages\n .flatMap((message) => message.contentPieces ?? [])\n .filter((piece): piece is HumanInputPiece => piece.type === \"interrupt\")\n .at(-1);\n\n return latestForkedInterrupt\n ? {\n resumeToken: latestForkedInterrupt.resumeToken,\n requestId: latestForkedInterrupt.requestId,\n }\n : undefined;\n };\n\n const resolveRegenerateTarget = async (assistantMessageId: string) => {\n const assistantIndex = messages.findIndex(\n (message) => message.id === assistantMessageId,\n );\n if (assistantIndex < 0) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n const assistant = messages[assistantIndex];\n if (!assistant) {\n throw new Error(`Assistant message \"${assistantMessageId}\" not found.`);\n }\n if (assistant.role !== \"assistant\") {\n throw new Error(\"Regenerate expects an assistant message id.\");\n }\n\n let userIndex = -1;\n for (let index = assistantIndex - 1; index >= 0; index--) {\n if (messages[index]?.role === \"user\") {\n userIndex = index;\n break;\n }\n }\n if (userIndex < 0) {\n throw new Error(\"No preceding user message found for regenerate.\");\n }\n const previousUser = messages[userIndex] as ChatMsg;\n\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n const assistantTurn = assistant.checkpointTurnIndex;\n const targetTurn =\n typeof assistantTurn === \"number\" ? assistantTurn - 1 : undefined;\n let target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target =\n targetTurn !== undefined\n ? availableCheckpoints.find(\n (checkpoint) => checkpoint.turnIndex === targetTurn,\n )\n : availableCheckpoints\n .filter(\n (checkpoint) => checkpoint.turnIndex < Number.MAX_SAFE_INTEGER,\n )\n .at(-2);\n }\n\n if (!target) {\n throw new Error(\"No rollback checkpoint found for regenerate.\");\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n\n return { target, assistant, previousUser, baseMessages };\n };\n\n const replayUserMessage = async (\n userMessage: ChatMsg,\n baseMessages: ChatMsg[],\n editedContent?: string,\n options?: {\n sid?: string | undefined;\n resumeOverride?: ResumeOverride | undefined;\n },\n ): Promise<ReplayResult | undefined> => {\n const content = editedContent ?? userMessage.content;\n if (userMessage.source?.type === \"interrupt-response\") {\n return respondToHumanInputFromBase({\n resumeToken:\n options?.resumeOverride?.resumeToken ??\n userMessage.source.resumeToken,\n requestId:\n options?.resumeOverride?.requestId ?? userMessage.source.requestId,\n selected:\n editedContent !== undefined\n ? [editedContent]\n : userMessage.source.selected,\n baseMessages,\n sid: options?.sid,\n ...(editedContent !== undefined\n ? { text: editedContent }\n : userMessage.source.text !== undefined\n ? { text: userMessage.source.text }\n : {}),\n });\n }\n return sendFromBase(content, baseMessages, options?.sid);\n };\n\n const buildVariant = (args: {\n id: string;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n label?: string;\n }): ChatResponseVariant => ({\n id: args.id,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n createdAt: Date.now(),\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n ...(args.label ? { label: args.label } : {}),\n });\n\n const updateVariantSnapshot = (args: {\n variant: ChatResponseVariant;\n sessionId: string;\n assistantMessage: ChatMsg;\n messages: ChatMsg[];\n checkpoints: CheckpointSummary[];\n }): ChatResponseVariant => ({\n ...args.variant,\n sessionId: args.sessionId,\n assistantMessageId: args.assistantMessage.id,\n messages: args.messages,\n checkpoints: args.checkpoints,\n ...(args.assistantMessage.checkpointId\n ? { checkpointId: args.assistantMessage.checkpointId }\n : {}),\n ...(typeof args.assistantMessage.checkpointTurnIndex === \"number\"\n ? { checkpointTurnIndex: args.assistantMessage.checkpointTurnIndex }\n : {}),\n });\n\n const replaceResponseVariantGroup = (nextGroup: ChatResponseVariantGroup) => {\n setResponseVariants((current) => [\n ...current.filter((group) => group.id !== nextGroup.id),\n nextGroup,\n ]);\n };\n\n const regenerateVariant = async (\n assistantMessageId: string,\n ): Promise<ChatResponseVariantGroup> => {\n if (isStreaming) {\n throw new Error(\"Cannot regenerate a variant while a stream is active.\");\n }\n const { target, assistant, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n const transport = requireCheckpointTransport();\n const parentSessionId = resolveSessionId();\n const existingGroup = variantForMessage(assistantMessageId);\n const sourceAssistantMessageId =\n existingGroup?.sourceAssistantMessageId ?? assistantMessageId;\n const existingVariants = existingGroup\n ? existingGroup.variants.map((variant) =>\n variant.id === existingGroup.selectedVariantId ||\n variant.assistantMessageId === assistantMessageId\n ? updateVariantSnapshot({\n variant,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n })\n : variant,\n )\n : undefined;\n\n const originalVariant =\n existingVariants?.[0] ??\n buildVariant({\n id: `${sourceAssistantMessageId}:original`,\n sessionId: parentSessionId,\n assistantMessage: assistant,\n messages,\n checkpoints,\n label: \"Original\",\n });\n\n const forkResult = await transport.fork(target.id);\n const forkedSessionId = forkResult.sessionId;\n setSessionId(forkedSessionId);\n\n const childCheckpointsBeforeReplay =\n await refreshCheckpoints(forkedSessionId);\n const forkedBaseMessages = applyForkedPendingRequests({\n messages: baseMessages,\n pendingRequests: forkResult.checkpoint?.activePendingRequests ?? [],\n });\n const resumeOverride = findResumeOverrideForFork(\n baseMessages,\n forkedBaseMessages,\n previousUser,\n );\n setMessages(forkedBaseMessages);\n setStreamContentPieces([]);\n clearStructuredStreams();\n\n const replay = await replayUserMessage(\n previousUser,\n forkedBaseMessages,\n undefined,\n {\n sid: forkedSessionId,\n resumeOverride,\n },\n );\n const childCheckpointsAfterReplay =\n await refreshCheckpoints(forkedSessionId);\n const variantMessages = replay?.messages ?? forkedBaseMessages;\n const variantAssistant = replay?.assistantMessage;\n if (!variantAssistant) {\n throw new Error(\"Regenerate variant did not produce an assistant reply.\");\n }\n\n const nextVariant = buildVariant({\n id: createId(),\n sessionId: forkedSessionId,\n assistantMessage: variantAssistant,\n messages: variantMessages,\n checkpoints:\n childCheckpointsAfterReplay.length > 0\n ? childCheckpointsAfterReplay\n : childCheckpointsBeforeReplay,\n label: `Variant ${(existingGroup?.variants.length ?? 1) + 1}`,\n });\n const nextVariants = existingVariants\n ? [...existingVariants, nextVariant]\n : [originalVariant, nextVariant];\n const nextGroup: ChatResponseVariantGroup = {\n id: existingGroup?.id ?? createId(),\n sourceAssistantMessageId,\n checkpointId: existingGroup?.checkpointId ?? target.id,\n checkpointTurnIndex:\n existingGroup?.checkpointTurnIndex ?? target.turnIndex,\n selectedVariantId: nextVariant.id,\n variants: nextVariants,\n };\n\n replaceResponseVariantGroup(nextGroup);\n setBranches((current) => ({\n ...current,\n [parentSessionId]: {\n ...(current[parentSessionId] ?? {}),\n sessionId: parentSessionId,\n messages,\n checkpoints,\n },\n [forkedSessionId]: {\n ...(current[forkedSessionId] ?? {}),\n sessionId: forkedSessionId,\n parentSessionId: forkResult.parentSessionId,\n forkedFrom: forkResult.forkedFrom,\n messages: variantMessages,\n checkpoints: nextVariant.checkpoints,\n },\n }));\n\n return nextGroup;\n };\n\n const selectVariant = async (\n assistantMessageId: string,\n variantId: string,\n ): Promise<void> => {\n const group = variantForMessage(assistantMessageId);\n if (!group) {\n throw new Error(\n `No response variants found for \"${assistantMessageId}\".`,\n );\n }\n const selectedVariant = group.variants.find(\n (variant) => variant.id === variantId,\n );\n if (!selectedVariant) {\n throw new Error(`Response variant \"${variantId}\" not found.`);\n }\n\n setSessionId(selectedVariant.sessionId);\n setMessages(selectedVariant.messages);\n setCheckpoints(selectedVariant.checkpoints);\n setStreamContentPieces([]);\n clearStructuredStreams();\n setBranches((current) => ({\n ...current,\n [selectedVariant.sessionId]: {\n ...(current[selectedVariant.sessionId] ?? {}),\n sessionId: selectedVariant.sessionId,\n messages: selectedVariant.messages,\n checkpoints: selectedVariant.checkpoints,\n },\n }));\n const nextGroup = {\n ...group,\n selectedVariantId: selectedVariant.id,\n };\n replaceResponseVariantGroup(nextGroup);\n };\n\n const regenerate = async (assistantMessageId: string): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const regenerateFromCheckpoint = async (\n checkpointId: string,\n ): Promise<void> => {\n const sid = resolveSessionId();\n let availableCheckpoints =\n checkpoints.length > 0 ? checkpoints : await refreshCheckpoints(sid);\n let target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n if (!target && checkpoints.length > 0) {\n availableCheckpoints = await refreshCheckpoints(sid);\n target = availableCheckpoints.find(\n (checkpoint) => checkpoint.id === checkpointId,\n );\n }\n if (!target) {\n throw new Error(`Checkpoint \"${checkpointId}\" not found.`);\n }\n\n const baseMessages = trimMessagesToCheckpoint({\n messages,\n turnIndex: target.turnIndex,\n });\n const previousUser = messages\n .slice(baseMessages.length)\n .find((message) => message.role === \"user\");\n if (!previousUser) {\n throw new Error(\"No user message found after checkpoint for regenerate.\");\n }\n\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages);\n };\n\n const retryWithEdit = async (\n assistantMessageId: string,\n newUserContent: string,\n ): Promise<void> => {\n const { target, previousUser, baseMessages } =\n await resolveRegenerateTarget(assistantMessageId);\n await rollbackTo(target.id);\n setMessages(baseMessages);\n await replayUserMessage(previousUser, baseMessages, newUserContent);\n };\n\n return {\n messages,\n isStreaming,\n canAbort: isStreaming,\n error,\n streamContentPieces,\n streamDebug,\n lastAssistantId,\n checkpoints,\n activeSessionId: sessionId,\n branches,\n responseVariants,\n workflowId,\n setWorkflowId,\n send,\n respondToHumanInput,\n respondToInterrupt,\n setMessages,\n checkpointForMessage,\n rollbackTo,\n fork,\n regenerate,\n regenerateVariant,\n selectVariant,\n variantForMessage,\n regenerateFromCheckpoint,\n retryWithEdit,\n clearMessages,\n resetSession,\n resetChat,\n clearChat,\n abort,\n clearError,\n includeHistory,\n setIncludeHistory,\n };\n}\n","\"use client\";\n\nimport type { StreamChunk } from \"@kortyx/stream/browser\";\nimport { useCallback, useState } from \"react\";\n\ntype DebugChunk = StreamChunk & {\n _ts: number;\n _dt: number;\n _seq: number;\n};\n\nexport function useChatStreamDebug() {\n const [streamDebug, setStreamDebug] = useState<StreamChunk[]>([]);\n\n const clearStreamDebug = useCallback(() => {\n setStreamDebug([]);\n }, []);\n\n const createRecorder = useCallback((initialMessage: string) => {\n let seq = 0;\n let lastTs = 0;\n const accDebug: StreamChunk[] = [];\n\n const push = (chunk: StreamChunk) => {\n const ts = Date.now();\n const withMeta: DebugChunk = {\n ...(chunk as StreamChunk),\n _ts: ts,\n _dt: lastTs ? ts - lastTs : 0,\n _seq: seq++,\n };\n lastTs = ts;\n accDebug.push(withMeta);\n setStreamDebug((current) =>\n current.length > 1000\n ? [...current.slice(-1000), withMeta]\n : [...current, withMeta],\n );\n };\n\n push({\n type: \"status\",\n message: initialMessage,\n } as StreamChunk);\n\n return {\n push,\n getAll: () => accDebug,\n };\n }, []);\n\n return {\n streamDebug,\n clearStreamDebug,\n createRecorder,\n };\n}\n","import {\n createStructuredStreamAccumulator,\n type StreamChunk,\n type StructuredDataChunk,\n type StructuredStreamState,\n} from \"@kortyx/stream/browser\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nexport type StructuredStreamItem<TData = unknown> = {\n id: string;\n streamId: string;\n state: StructuredStreamState<TData>;\n};\n\nexport type UseStructuredStreamsOptions<_TData = unknown> = {\n createId?: (() => string) | undefined;\n initialChunks?: Iterable<StructuredDataChunk> | undefined;\n};\n\nexport type UseStructuredStreamsResult<TData = unknown> = {\n items: StructuredStreamItem<TData>[];\n byStreamId: Record<string, StructuredStreamState<TData>>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamItem<TData> | undefined;\n clear: () => void;\n get: (streamId: string) => StructuredStreamItem<TData> | undefined;\n delete: (streamId: string) => boolean;\n};\n\nconst defaultCreateId = () => {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n } catch {}\n\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport function useStructuredStreams<TData = unknown>(\n options?: UseStructuredStreamsOptions<TData> | undefined,\n): UseStructuredStreamsResult<TData> {\n const createId = useRef(options?.createId ?? defaultCreateId).current;\n const initialChunks = useRef(options?.initialChunks ?? []).current;\n const accumulatorRef = useRef(\n createStructuredStreamAccumulator<TData>(initialChunks),\n );\n const initialItemsRef = useRef<StructuredStreamItem<TData>[] | undefined>(\n undefined,\n );\n\n if (initialItemsRef.current === undefined) {\n initialItemsRef.current = accumulatorRef.current\n .entries()\n .map(([streamId, state]) => ({\n id: createId(),\n streamId,\n state,\n }));\n }\n\n const itemsRef = useRef(initialItemsRef.current);\n const [items, setItems] = useState(initialItemsRef.current);\n\n const setNextItems = useCallback(\n (nextItems: StructuredStreamItem<TData>[]) => {\n itemsRef.current = nextItems;\n setItems(nextItems);\n },\n [],\n );\n\n const applyStreamChunk = useCallback(\n (chunk: StreamChunk): StructuredStreamItem<TData> | undefined => {\n const nextState = accumulatorRef.current.applyStreamChunk(chunk);\n if (!nextState) return undefined;\n\n const currentItems = itemsRef.current;\n const existingIndex = currentItems.findIndex(\n (item) => item.streamId === nextState.streamId,\n );\n const existingItem =\n existingIndex >= 0 ? currentItems[existingIndex] : undefined;\n\n const nextItem: StructuredStreamItem<TData> = existingItem\n ? {\n ...existingItem,\n state: nextState,\n }\n : {\n id: createId(),\n streamId: nextState.streamId,\n state: nextState,\n };\n\n const nextItems =\n existingIndex >= 0\n ? currentItems.map((item, index) =>\n index === existingIndex ? nextItem : item,\n )\n : [...currentItems, nextItem];\n\n setNextItems(nextItems);\n return nextItem;\n },\n [createId, setNextItems],\n );\n\n const clear = useCallback(() => {\n accumulatorRef.current = createStructuredStreamAccumulator<TData>();\n setNextItems([]);\n }, [setNextItems]);\n\n const get = useCallback((streamId: string) => {\n return itemsRef.current.find((item) => item.streamId === streamId);\n }, []);\n\n const deleteStream = useCallback(\n (streamId: string): boolean => {\n const deleted = accumulatorRef.current.delete(streamId);\n if (!deleted) return false;\n setNextItems(\n itemsRef.current.filter((item) => item.streamId !== streamId),\n );\n return true;\n },\n [setNextItems],\n );\n\n const byStreamId = useMemo(\n () =>\n Object.fromEntries(\n items.map((item) => [item.streamId, item.state]),\n ) as Record<string, StructuredStreamState<TData>>,\n [items],\n );\n\n return {\n items,\n byStreamId,\n applyStreamChunk,\n clear,\n get,\n delete: deleteStream,\n };\n}\n"],"mappings":"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","names":["sessionId","import_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.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "React hooks for Kortyx client streaming experiences.",
|
|
6
6
|
"keywords": [
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"CHANGELOG.md"
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@kortyx/stream": "0.
|
|
35
|
+
"@kortyx/stream": "0.12.0",
|
|
36
|
+
"@kortyx/core": "0.9.0"
|
|
36
37
|
},
|
|
37
38
|
"peerDependencies": {
|
|
38
39
|
"react": ">=19"
|