@kortyx/react 0.4.1 → 0.4.3

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/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}): 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 };\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};\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};\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};\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 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\n return {\n sessionId,\n workflowId,\n includeHistory: includeHistoryRaw !== \"0\",\n messages,\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 } catch {}\n },\n\n clearMessages() {\n try {\n const storage = getLocalStorage();\n if (!storage) return;\n storage.removeItem(keys.messages);\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 ChatTransport<TContext = DefaultChatContext> = {\n stream(\n args: ChatTransportContext<TContext> & {\n onChunk: ChatTransportChunkHandler;\n },\n ): Promise<void>;\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};\n\nexport function createRouteChatTransport<\n TContext = DefaultChatContext,\n TBody = RouteChatRequestBody<TContext>,\n>(\n args: CreateRouteChatTransportArgs<TBody, TContext>,\n): ChatTransport<TContext> {\n return 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","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 { ChatTransport, OutgoingChatMessage } 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\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 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 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 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\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 [includeHistory, setIncludeHistory] = useState(true);\n const [workflowId, setWorkflowId] = useState(\"\");\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [didHydrateStorage, setDidHydrateStorage] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const { streamDebug, clearStreamDebug, createRecorder } =\n useChatStreamDebug();\n const { applyStreamChunk, clear: clearStructuredStreams } =\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\n setDidHydrateStorage(true);\n });\n\n return () => {\n cancelled = true;\n };\n }, [resolvedStorage]);\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 });\n }, [\n didHydrateStorage,\n includeHistory,\n messages,\n sessionId,\n storageRef,\n workflowId,\n ]);\n\n const clearActiveStream = () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages([]);\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 };\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 = () => {\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 }): Promise<OutgoingChatMessage[]> => {\n const prepared = options.prepareContextMessages\n ? await options.prepareContextMessages({\n messages,\n sessionId: args.sid,\n workflowId,\n reason: args.reason,\n context: requestContext,\n })\n : includeHistory\n ? messages.map(toOutgoingHistoryMessage)\n : [];\n\n return [...prepared, args.outgoingMessage];\n };\n\n const streamAssistantResponse = async (args: {\n sid: string;\n messagesToSend: OutgoingChatMessage[];\n debugLabel: string;\n openDebugOnInterrupt?: boolean;\n signal: AbortSignal;\n }) => {\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 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 === \"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;\n\n const assistant = buildAssistantMessage({\n createId,\n pieces: pieces.getPieces(),\n debug: debug.getAll(),\n trace: completedTrace ?? currentTrace,\n });\n setMessages((prev) => [...prev, assistant]);\n setLastAssistantId(assistant.id);\n clearStructuredStreams();\n setStreamContentPieces([]);\n clearStreamDebug();\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 respondToHumanInput = async ({\n resumeToken,\n requestId,\n selected,\n text,\n }: {\n resumeToken: string;\n requestId: string;\n selected: string[];\n text?: string;\n }) => {\n if (isStreaming) return;\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 = { id: userId, role: \"user\", content: label };\n setMessages((prev) => [...prev, userMsg]);\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 sid = resolveSessionId();\n const messagesToSend = await prepareMessagesToSend({\n sid,\n outgoingMessage: outgoing,\n reason: \"resume\",\n });\n\n await streamAssistantResponse({\n sid,\n messagesToSend,\n debugLabel: \"runChat (resume)\",\n signal: abortController.signal,\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 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 return respondToHumanInput({\n resumeToken: piece.resumeToken,\n requestId: piece.requestId,\n selected,\n ...(text !== undefined ? { text } : {}),\n });\n };\n\n const send = async (text: string) => {\n const content = text.trim();\n if (!content || isStreaming) return;\n setError(null);\n\n const activeTextInterrupt = findActiveTextInterrupt({\n messages,\n streamContentPieces,\n });\n\n if (activeTextInterrupt) {\n await respondToHumanInput({\n resumeToken: activeTextInterrupt.resumeToken,\n requestId: activeTextInterrupt.requestId,\n selected: [content],\n text: content,\n });\n return;\n }\n\n const userId = createId();\n const userMsg: ChatMsg = { id: userId, role: \"user\", content };\n setMessages((prev) => [...prev, userMsg]);\n\n setIsStreaming(true);\n setStreamContentPieces([]);\n clearStreamDebug();\n clearStructuredStreams();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const sid = resolveSessionId();\n const messagesToSend = await prepareMessagesToSend({\n sid,\n outgoingMessage: { role: \"user\" as const, content },\n reason: \"send\",\n });\n await streamAssistantResponse({\n sid,\n messagesToSend,\n debugLabel: \"runChat (send)\",\n openDebugOnInterrupt: true,\n signal: abortController.signal,\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 return {\n messages,\n isStreaming,\n canAbort: isStreaming,\n error,\n streamContentPieces,\n streamDebug,\n lastAssistantId,\n workflowId,\n setWorkflowId,\n send,\n respondToHumanInput,\n respondToInterrupt,\n setMessages,\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};\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 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 };\n}\n"],"mappings":"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","names":["import_react","import_browser","import_react","defaultCreateId"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/react",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "private": false,
5
5
  "description": "React hooks for Kortyx client streaming experiences.",
6
6
  "keywords": [
@@ -32,7 +32,7 @@
32
32
  "CHANGELOG.md"
33
33
  ],
34
34
  "dependencies": {
35
- "@kortyx/stream": "0.9.0"
35
+ "@kortyx/stream": "0.11.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": ">=19"