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