@deuz-sdk/react 1.8.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +420 -135
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +197 -10
- package/dist/index.d.ts +197 -10
- package/dist/index.js +422 -138
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/use-chat.ts","../src/use-object.ts","../src/components.tsx"],"names":["useState","useRef","useCallback","readDeuzStream"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * useChat — the React binding over `@deuz-sdk/core/chat` + the Deuz UI wire.\n *\n * THIN by contract: every chat-state transformation is a core call\n * (`createAssistantTurn`/`applyUIPart`/`assistantMessageFromTurn`/\n * `clientToolResultMessage`/`uiFromMessages`/`dropTrailingAssistant`/\n * `branchBeforeUserMessage`). This hook only owns React state, the fetch\n * round-trips, and abort wiring. Supersedes the frozen `@deuz-sdk/core/react`.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport type { Message, ToolApprovalRequest, ToolApprovalResponse } from '@deuz-sdk/core';\nimport {\n applyUIPart,\n assistantMessageFromTurn,\n branchBeforeUserMessage,\n clientToolResultMessage,\n createAssistantTurn,\n dropTrailingAssistant,\n uiFromMessages,\n} from '@deuz-sdk/core/chat';\nimport type { AssistantTurnState, UIMessage } from '@deuz-sdk/core/chat';\nimport { connectDeuzStream, readDeuzStream } from '@deuz-sdk/core/ui';\n\n/**\n * Fold one wire part via the core reducer. Current core versions preserve the\n * approval token; the defensive re-attach keeps the adapter compatible with\n * early 1.7.0 builds that dropped it while constructing the approval entry.\n */\nfunction foldPart(\n turn: AssistantTurnState,\n part: Parameters<typeof applyUIPart>[1],\n): AssistantTurnState {\n const next = applyUIPart(turn, part);\n if (part.type === 'tool-approval-request' && part.token !== undefined) {\n return {\n ...next,\n approvals: next.approvals.map((a) =>\n a.approvalId === part.approvalId && a.token === undefined ? { ...a, token: part.token } : a,\n ),\n };\n }\n return next;\n}\n\n/** Local id fallback — this package is not edge-lint-constrained. */\nconst defaultGenerateId = (): string =>\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `deuz-ui-${Math.random().toString(36).slice(2)}`;\n\n/** Live cumulative USD cost, from the wire's `cost` parts (last one wins). */\nexport interface UseChatCost {\n costUsd: number;\n cacheSavingsUsd?: number;\n}\n\n/** The server's budget guardrail tripped (`budget-exceeded` part). */\nexport interface UseChatBudgetExceeded {\n kind: 'usd' | 'tokens';\n limit: number;\n value: number;\n}\n\nexport interface UseChatResumeOptions {\n /**\n * Resume endpoint (see core's `resumeDeuzStreamResponse`): a GET URL or a\n * factory returning the `Response` for a given cursor. Do NOT point it at\n * the generating POST route — that would re-run the model.\n */\n endpoint: string | ((ctx: { lastEventId?: string }) => Response | Promise<Response>);\n /** Cursor to resume from (e.g. persisted across a page reload). */\n lastEventId?: string;\n}\n\nexport interface UseChatOptions {\n /** Endpoint serving `toDeuzStreamResponse` output. */\n api: string;\n /** Seed canonical history (e.g. restored from a ChatStore) — rendered via `uiFromMessages`. */\n initialMessages?: Message[];\n headers?: Record<string, string>;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Chat identity — merged into every request body (server-side ChatStore persistence). */\n chatId?: string;\n /** Enables `reconnect()` against a resume endpoint (wire v2, `connectDeuzStream`). */\n resume?: UseChatResumeOptions;\n /** Id source for UI messages/turns. Default: `crypto.randomUUID` (with a fallback). */\n generateId?: () => string;\n /**\n * Client-tool executor: called for every streamed tool call the SERVER did\n * not execute. The return value is appended as its tool_result and the chat\n * auto-continues; a throw self-heals as an is_error result.\n */\n onToolCall?: (call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n }) => Promise<unknown> | unknown;\n onError?: (error: Error) => void;\n /** Injectable for tests / custom transports. Defaults to global fetch. */\n fetch?: typeof fetch;\n}\n\nexport interface UseChatResult {\n messages: UIMessage[];\n status: 'idle' | 'streaming' | 'error';\n error: Error | undefined;\n /** Gated tool calls awaiting verdicts — the chat is PAUSED while non-empty. */\n pendingApprovals: ToolApprovalRequest[];\n /** Live cumulative cost from the wire's `cost` parts (last one wins). */\n cost?: UseChatCost;\n /** Set when the server's budget guardrail tripped this turn. */\n budgetExceeded?: UseChatBudgetExceeded;\n /** This turn's app-defined `data-{name}` parts, in arrival order. */\n dataParts: Array<{ name: string; payload: unknown }>;\n /** This turn's RAG citations. */\n citations: AssistantTurnState['citations'];\n /** Latest live plan snapshot for this turn (autonomous runs, 1.8). */\n plan?: AssistantTurnState['plan'];\n /** This turn's live activity feed (\"Computer\" view, 1.8). */\n activity: AssistantTurnState['activity'];\n sendMessage: (text: string) => Promise<void>;\n /** Abort the in-flight stream (not an error). */\n stop: () => void;\n /** Drop the trailing assistant/tool turns (core `dropTrailingAssistant`) and re-run. */\n regenerate: () => Promise<void>;\n /** Cut history before `messageId` (core `branchBeforeUserMessage`) and send `text`. */\n editAndResend: (messageId: string, text: string) => Promise<void>;\n /**\n * Record one verdict (the request's signed `token` is auto-preserved). Once\n * EVERY pending approval has a verdict, the chat auto-resumes with\n * `approvalResponses` in the request body.\n */\n addToolApprovalResponse: (response: ToolApprovalResponse) => Promise<void>;\n /**\n * Re-read the stream from `resume.endpoint` via `connectDeuzStream` and fold\n * the parts into the current turn. No-op unless `options.resume` is set.\n */\n reconnect: () => Promise<void>;\n}\n\nexport function useChat(options: UseChatOptions): UseChatResult {\n const genId = options.generateId ?? defaultGenerateId;\n const [messages, setMessages] = useState<UIMessage[]>(() =>\n uiFromMessages(options.initialMessages ?? [], genId),\n );\n const [status, setStatus] = useState<'idle' | 'streaming' | 'error'>('idle');\n const [error, setError] = useState<Error | undefined>(undefined);\n const [pendingApprovals, setPendingApprovals] = useState<ToolApprovalRequest[]>([]);\n const [cost, setCost] = useState<UseChatCost | undefined>(undefined);\n const [budgetExceeded, setBudgetExceeded] = useState<UseChatBudgetExceeded | undefined>(\n undefined,\n );\n const [dataParts, setDataParts] = useState<Array<{ name: string; payload: unknown }>>([]);\n const [citations, setCitations] = useState<AssistantTurnState['citations']>([]);\n const [plan, setPlan] = useState<AssistantTurnState['plan']>(undefined);\n const [activity, setActivity] = useState<AssistantTurnState['activity']>([]);\n\n const uiRef = useRef<UIMessage[]>(messages);\n const canonicalRef = useRef<Message[]>(\n options.initialMessages ? [...options.initialMessages] : [],\n );\n /** The in-flight turn — kept across a drop so `reconnect()` can continue it. */\n const turnRef = useRef<AssistantTurnState | undefined>(undefined);\n const approvalsRef = useRef<ToolApprovalRequest[]>([]);\n const verdictsRef = useRef<ToolApprovalResponse[]>([]);\n const abortRef = useRef<AbortController | null>(null);\n const lastEventIdRef = useRef<string | undefined>(options.resume?.lastEventId);\n\n const pushMessage = useCallback((message: UIMessage): void => {\n uiRef.current = [...uiRef.current, message];\n setMessages(uiRef.current);\n }, []);\n\n /** Sync ALL turn-derived React state (the turn's message is the trailing UI element). */\n const syncTurn = useCallback((turn: AssistantTurnState): void => {\n uiRef.current = [...uiRef.current.slice(0, -1), turn.message];\n setMessages(uiRef.current);\n if (turn.costUsd !== undefined) {\n setCost({\n costUsd: turn.costUsd,\n ...(turn.cacheSavingsUsd !== undefined ? { cacheSavingsUsd: turn.cacheSavingsUsd } : {}),\n });\n }\n setBudgetExceeded(turn.budgetExceeded);\n setDataParts(turn.dataParts);\n setCitations(turn.citations);\n setPlan(turn.plan);\n setActivity(turn.activity);\n }, []);\n\n const stop = useCallback((): void => {\n abortRef.current?.abort();\n }, []);\n\n const run = useCallback(\n async (approvalResponses?: ToolApprovalResponse[]): Promise<void> => {\n const controller = new AbortController();\n abortRef.current = controller;\n setStatus('streaming');\n setError(undefined);\n try {\n // One iteration per model round; client-tool results loop back in.\n for (;;) {\n const doFetch = options.fetch ?? fetch;\n const res = await doFetch(options.api, {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...options.headers },\n body: JSON.stringify({\n messages: canonicalRef.current,\n ...(options.chatId !== undefined ? { chatId: options.chatId } : {}),\n ...(approvalResponses?.length ? { approvalResponses } : {}),\n ...options.body,\n }),\n signal: controller.signal,\n });\n approvalResponses = undefined; // consumed by the first round only\n\n let turn = createAssistantTurn(genId());\n turnRef.current = turn;\n pushMessage(turn.message);\n syncTurn(turn); // resets this-turn state (dataParts/citations/budget)\n\n for await (const part of readDeuzStream(res)) {\n turn = foldPart(turn, part);\n turnRef.current = turn;\n syncTurn(turn);\n }\n if (turn.error !== undefined) throw new Error(turn.error);\n\n // Append the canonical assistant turn (client-tools reconstruction).\n canonicalRef.current = [...canonicalRef.current, assistantMessageFromTurn(turn)];\n turnRef.current = undefined;\n\n // Approval pause: verdicts arrive via addToolApprovalResponse.\n if (turn.approvals.length > 0) {\n approvalsRef.current = turn.approvals;\n verdictsRef.current = [];\n setPendingApprovals(turn.approvals);\n return;\n }\n\n // Client-tool auto-round-trip: everything the server didn't execute.\n const toolCalls = turn.message.toolCalls ?? [];\n const serverResults = new Set(turn.serverResults);\n const clientPending = toolCalls.filter((t) => !serverResults.has(t.toolCallId));\n if (clientPending.length === 0 || !options.onToolCall) return;\n const results: Array<{ toolCallId: string; result: unknown; isError?: boolean }> = [];\n for (const call of clientPending) {\n try {\n const out = await options.onToolCall({\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n });\n results.push({ toolCallId: call.toolCallId, result: out });\n turn = applyUIPart(turn, {\n type: 'tool-result',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n output: out,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n results.push({ toolCallId: call.toolCallId, result: message, isError: true });\n turn = applyUIPart(turn, {\n type: 'tool-result',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n output: message,\n isError: true,\n });\n }\n syncTurn(turn);\n }\n canonicalRef.current = [...canonicalRef.current, clientToolResultMessage(results)];\n // loop → next round POSTs the extended history\n }\n } catch (err) {\n if (controller.signal.aborted) return; // user abort — not an error\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus('error');\n options.onError?.(e);\n return;\n } finally {\n setStatus((s) => (s === 'error' ? s : 'idle'));\n }\n },\n [\n options.api,\n options.fetch,\n options.headers,\n options.body,\n options.chatId,\n options.generateId,\n options.onToolCall,\n options.onError,\n pushMessage,\n syncTurn,\n ],\n );\n\n const sendMessage = useCallback(\n async (text: string): Promise<void> => {\n canonicalRef.current = [...canonicalRef.current, { role: 'user', content: text }];\n pushMessage({ id: genId(), role: 'user', content: text });\n approvalsRef.current = [];\n verdictsRef.current = [];\n setPendingApprovals([]);\n await run();\n },\n [run, pushMessage, options.generateId],\n );\n\n const regenerate = useCallback(async (): Promise<void> => {\n const cut = dropTrailingAssistant({ ui: uiRef.current, canonical: canonicalRef.current });\n uiRef.current = cut.ui;\n canonicalRef.current = cut.canonical;\n setMessages(cut.ui);\n approvalsRef.current = [];\n verdictsRef.current = [];\n setPendingApprovals([]);\n await run();\n }, [run]);\n\n const editAndResend = useCallback(\n async (messageId: string, text: string): Promise<void> => {\n const cut = branchBeforeUserMessage(\n { ui: uiRef.current, canonical: canonicalRef.current },\n messageId,\n );\n if (!cut) return; // not a user message — nothing to branch\n uiRef.current = cut.ui;\n canonicalRef.current = cut.canonical;\n setMessages(cut.ui);\n approvalsRef.current = [];\n verdictsRef.current = [];\n setPendingApprovals([]);\n await sendMessage(text);\n },\n [sendMessage],\n );\n\n const addToolApprovalResponse = useCallback(\n async (response: ToolApprovalResponse): Promise<void> => {\n // Preserve the request's signed token unless the caller set one.\n const request = approvalsRef.current.find((p) => p.approvalId === response.approvalId);\n const verdict =\n response.token === undefined && request?.token !== undefined\n ? { ...response, token: request.token }\n : response;\n verdictsRef.current = [\n ...verdictsRef.current.filter((v) => v.approvalId !== verdict.approvalId),\n verdict,\n ];\n const verdicts = verdictsRef.current;\n const allSettled = approvalsRef.current.every((p) =>\n verdicts.some((v) => v.approvalId === p.approvalId),\n );\n if (!allSettled) return;\n approvalsRef.current = [];\n verdictsRef.current = [];\n setPendingApprovals([]);\n await run(verdicts);\n },\n [run],\n );\n\n const reconnect = useCallback(async (): Promise<void> => {\n const resume = options.resume;\n if (!resume) return;\n const controller = new AbortController();\n abortRef.current = controller;\n setStatus('streaming');\n setError(undefined);\n try {\n const cursor = lastEventIdRef.current;\n let turn: AssistantTurnState;\n if (turnRef.current && cursor !== undefined) {\n turn = turnRef.current; // continue in place — replay dedupes by seq upstream\n } else {\n // No cursor → full replay rebuilds the turn from the start; it lands in\n // the trailing slot (replacing a partial turn if one is on screen).\n turn = createAssistantTurn(genId());\n if (!turnRef.current) pushMessage(turn.message);\n }\n turnRef.current = turn;\n const parts = connectDeuzStream(resume.endpoint, {\n ...(cursor !== undefined ? { lastEventId: cursor } : {}),\n onCursor: (id) => {\n lastEventIdRef.current = id;\n },\n signal: controller.signal,\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.headers ? { headers: options.headers } : {}),\n });\n for await (const part of parts) {\n turn = foldPart(turn, part);\n turnRef.current = turn;\n syncTurn(turn);\n }\n if (turn.error !== undefined) throw new Error(turn.error);\n canonicalRef.current = [...canonicalRef.current, assistantMessageFromTurn(turn)];\n turnRef.current = undefined;\n if (turn.approvals.length > 0) {\n approvalsRef.current = turn.approvals;\n verdictsRef.current = [];\n setPendingApprovals(turn.approvals);\n }\n } catch (err) {\n if (controller.signal.aborted) return; // user abort — not an error\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus('error');\n options.onError?.(e);\n return;\n } finally {\n setStatus((s) => (s === 'error' ? s : 'idle'));\n }\n }, [\n options.resume,\n options.fetch,\n options.headers,\n options.generateId,\n options.onError,\n pushMessage,\n syncTurn,\n ]);\n\n return {\n messages,\n status,\n error,\n pendingApprovals,\n ...(cost !== undefined ? { cost } : {}),\n ...(budgetExceeded !== undefined ? { budgetExceeded } : {}),\n dataParts,\n citations,\n ...(plan !== undefined ? { plan } : {}),\n activity,\n sendMessage,\n stop,\n regenerate,\n editAndResend,\n addToolApprovalResponse,\n reconnect,\n };\n}\n","/**\n * useObject — streams `toDeuzObjectStreamResponse` output (`object-delta`\n * parts) into React state. Ported from the frozen `@deuz-sdk/core/react` hook.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport type { DeepPartial } from '@deuz-sdk/core';\nimport { readDeuzStream } from '@deuz-sdk/core/ui';\n\nexport interface UseObjectOptions {\n /** Endpoint serving `toDeuzObjectStreamResponse` output. */\n api: string;\n headers?: Record<string, string>;\n /** Injectable for tests / custom transports. Defaults to global fetch. */\n fetch?: typeof fetch;\n}\n\nexport interface UseObjectResult<T> {\n /** Latest partial (each `object-delta` replaces it wholesale). */\n object: DeepPartial<T> | undefined;\n isLoading: boolean;\n error: Error | undefined;\n /** POSTs `{ input }` to `api` and streams partials into `object`. */\n submit: (input: unknown) => Promise<void>;\n /** Abort the in-flight stream (not an error). */\n stop: () => void;\n}\n\nexport function useObject<T = unknown>(options: UseObjectOptions): UseObjectResult<T> {\n const [object, setObject] = useState<DeepPartial<T> | undefined>(undefined);\n const [isLoading, setLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const abortRef = useRef<AbortController | null>(null);\n\n const stop = useCallback((): void => {\n abortRef.current?.abort();\n }, []);\n\n const submit = useCallback(\n async (input: unknown): Promise<void> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n setLoading(true);\n setError(undefined);\n setObject(undefined);\n try {\n const doFetch = options.fetch ?? fetch;\n const res = await doFetch(options.api, {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...options.headers },\n body: JSON.stringify({ input }),\n signal: controller.signal,\n });\n for await (const part of readDeuzStream(res)) {\n if (part.type === 'object-delta') {\n setObject(part.object as DeepPartial<T>);\n } else if (part.type === 'error') {\n setError(new Error(part.message));\n break;\n }\n }\n } catch (err) {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n setLoading(false);\n }\n },\n [options.api, options.fetch, options.headers],\n );\n\n return { object, isLoading, error, submit, stop };\n}\n","/**\n * Headless chat components — zero styling, zero business logic. They only\n * wire core types (`ToolApprovalRequest`/`ToolApprovalResponse`, the useChat\n * cost state) to DOM events; presentation is overridable via render props.\n */\nimport type { ReactNode } from 'react';\nimport type { ToolApprovalRequest, ToolApprovalResponse } from '@deuz-sdk/core';\nimport type { UseChatCost } from './use-chat';\n\nexport interface ToolApprovalCardProps {\n approval: ToolApprovalRequest;\n /** Feed this straight into `useChat().addToolApprovalResponse`. */\n onRespond: (response: ToolApprovalResponse) => void;\n /** Override presentation; the component supplies the wired callbacks. */\n render?: (ctx: {\n approval: ToolApprovalRequest;\n approve: () => void;\n deny: (reason?: string) => void;\n }) => ReactNode;\n}\n\n/**\n * One pending tool approval. The verdict always carries the request's signed\n * `token` (D4) — callers never have to thread it themselves.\n */\nexport function ToolApprovalCard({ approval, onRespond, render }: ToolApprovalCardProps) {\n const respond = (approved: boolean, reason?: string): void =>\n onRespond({\n approvalId: approval.approvalId,\n approved,\n ...(reason !== undefined ? { reason } : {}),\n ...(approval.token !== undefined ? { token: approval.token } : {}),\n });\n const approve = (): void => respond(true);\n const deny = (reason?: string): void => respond(false, reason);\n\n if (render) return <>{render({ approval, approve, deny })}</>;\n return (\n <div data-deuz=\"tool-approval\">\n <span data-deuz=\"tool-approval-name\">{approval.toolName}</span>\n <pre data-deuz=\"tool-approval-input\">{JSON.stringify(approval.input, null, 2)}</pre>\n <button type=\"button\" onClick={approve}>\n Approve\n </button>\n <button type=\"button\" onClick={() => deny()}>\n Deny\n </button>\n </div>\n );\n}\n\nexport interface CostBadgeProps {\n /** The `useChat` cost state (undefined until the first `cost` part arrives). */\n cost: UseChatCost | undefined;\n /** Override presentation. */\n format?: (cost: UseChatCost) => ReactNode;\n}\n\n/** Live cost readout: `$X.XXXX`, plus ` (saved $Y.YYYY)` when caching saved money. */\nexport function CostBadge({ cost, format }: CostBadgeProps) {\n if (cost === undefined) return null;\n if (format) return <>{format(cost)}</>;\n const saved =\n cost.cacheSavingsUsd !== undefined && cost.cacheSavingsUsd > 0\n ? ` (saved $${cost.cacheSavingsUsd.toFixed(4)})`\n : '';\n return <span data-deuz=\"cost-badge\">{`$${cost.costUsd.toFixed(4)}${saved}`}</span>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/use-chat.ts","../src/use-object.ts","../src/components.tsx"],"names":["useState","useRef","useCallback","useEffect","readDeuzStream"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * useChat — the React binding over `@deuz-sdk/core/chat` + the Deuz UI wire.\n *\n * THIN by contract: every chat-state transformation is a core call\n * (`createAssistantTurn`/`applyUIPart`/`sealAssistantTurn`/\n * `assistantMessageFromTurn`/`clientToolResultMessage`/`uiFromMessages`/\n * `canonicalFromUI`/`userMessageFromInput`/`dropTrailingAssistant`/\n * `branchBeforeUserMessage`). This hook only owns React state, the fetch\n * round-trips, and abort wiring. Supersedes the frozen `@deuz-sdk/core/react`.\n *\n * 1.9 (Sprint 3) adds five things, all ADDITIVE:\n * - WRITABLE state — `setHistory`/`setMessages`/`addToolResult`/`clearError`.\n * Deleting a rendered message, switching chats after mount, resolving a\n * client tool from OUTSIDE the hook, and dismissing an error were all\n * impossible before: the transcript had no setter, and a tool needing user\n * interaction (an approve/deny UI, a wallet signature, a file picker) could\n * only be answered from inside `onToolCall`, which DEADLOCKED the round-trip.\n * - multimodal input — `sendMessage(input: ChatInput)`, so \"attach a screenshot\n * and ask about it\" works. `partsFromFiles` feeds it from a file picker.\n * - ONE React commit per fold instead of seven `setState` calls, plus optional\n * `throttleMs` coalescing (a fast model emits hundreds of text deltas per\n * second; each one used to re-render the whole transcript seven times).\n * - `resume.auto` — the resume machinery had no TRIGGER, so surviving a refresh\n * mid-generation still required the app to call `reconnect()` itself.\n * - the newer wire fields reach the consumer: ordered `parts` per message,\n * `steps`, `verifications`, reconciled `dataParts`, tool `denied`, plus the\n * three channels the wiring pass gave producers — `warnings`, `falseFinishes`\n * and `subAgents` (a delegated `agentTool` run used to be invisible here).\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n FinishReason,\n ImagePart,\n Message,\n ToolApprovalRequest,\n ToolApprovalResponse,\n Usage,\n} from '@deuz-sdk/core';\nimport {\n applyUIPart,\n assistantMessageFromTurn,\n branchBeforeUserMessage,\n canonicalFromUI,\n clientToolResultMessage,\n createAssistantTurn,\n dropTrailingAssistant,\n filesToImageParts,\n sealAssistantTurn,\n uiFromMessages,\n userMessageFromInput,\n} from '@deuz-sdk/core/chat';\nimport type {\n AssistantTurnState,\n ChatHistory,\n ChatInput,\n UIMessage,\n UIToolCall,\n} from '@deuz-sdk/core/chat';\nimport type { DeuzUIPart } from '@deuz-sdk/core/ui';\nimport { connectDeuzStream, readDeuzStream } from '@deuz-sdk/core/ui';\n\n/**\n * Fold one wire part via the core reducer. Current core versions preserve the\n * approval token; the defensive re-attach keeps the adapter compatible with\n * early 1.7.0 builds that dropped it while constructing the approval entry.\n */\nfunction foldPart(\n turn: AssistantTurnState,\n part: Parameters<typeof applyUIPart>[1],\n): AssistantTurnState {\n const next = applyUIPart(turn, part);\n if (part.type === 'tool-approval-request' && part.token !== undefined) {\n return {\n ...next,\n approvals: next.approvals.map((a) =>\n a.approvalId === part.approvalId && a.token === undefined ? { ...a, token: part.token } : a,\n ),\n };\n }\n return next;\n}\n\n/** Local id fallback — this package is not edge-lint-constrained. */\nconst defaultGenerateId = (): string =>\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `deuz-ui-${Math.random().toString(36).slice(2)}`;\n\n/**\n * Picked files → canonical parts for a {@link ChatInput}. A thin, null-tolerant\n * wrapper over core's `filesToImageParts`: the bytes work (Web APIs only, no\n * `FileReader`, no `Buffer`) lives THERE and is deliberately not reimplemented\n * here. `ImagePart` is the single carrier for all binary media, so images and\n * PDFs both ride this call.\n *\n * ```tsx\n * <input type=\"file\" multiple onChange={async (e) => {\n * const parts = await partsFromFiles(e.target.files);\n * await sendMessage({ text: 'what is in these?', parts });\n * }} />\n * ```\n */\nexport async function partsFromFiles(\n files: FileList | Iterable<Blob & { type?: string }> | null | undefined,\n): Promise<ImagePart[]> {\n if (!files) return [];\n // `FileList` is iterable (lib.dom), so one cast covers both shapes.\n const list: Array<Blob & { type?: string }> = Array.from(\n files as Iterable<Blob & { type?: string }>,\n );\n return list.length === 0 ? [] : filesToImageParts(list);\n}\n\n/** Live cumulative USD cost, from the wire's `cost` parts (last one wins). */\nexport interface UseChatCost {\n costUsd: number;\n cacheSavingsUsd?: number;\n}\n\n/** The server's budget guardrail tripped (`budget-exceeded` part). */\nexport interface UseChatBudgetExceeded {\n kind: 'usd' | 'tokens';\n limit: number;\n value: number;\n}\n\n/**\n * Where the resume cursor lives ACROSS a page reload.\n *\n * An adapter rather than a hardcoded `localStorage`: core's own\n * `connectDeuzStream` frames the cursor as the caller's choice, and hardcoding\n * web storage would break SSR (no `window`), React Native (no `localStorage`)\n * and privacy modes that throw on write. Both methods may throw — the hook\n * swallows it, because losing a cursor must never kill a live stream.\n */\nexport interface UseChatCursorStore {\n /** The persisted cursor, or `undefined` when there is nothing to resume. */\n load(): string | undefined;\n /** Persist the cursor. Called on every advance. */\n save(id: string): void;\n}\n\nexport interface UseChatResumeOptions {\n /**\n * Resume endpoint (see core's `resumeDeuzStreamResponse`): a GET URL or a\n * factory returning the `Response` for a given cursor. Do NOT point it at\n * the generating POST route — that would re-run the model.\n */\n endpoint: string | ((ctx: { lastEventId?: string }) => Response | Promise<Response>);\n /** Cursor to resume from (e.g. persisted across a page reload). */\n lastEventId?: string;\n /**\n * Attempt `reconnect()` ONCE per mounted hook — the canonical scenario\n * resumability exists for (the user refreshes mid-generation) with zero app\n * wiring. Fires exactly once under React 18/19 StrictMode's deliberate\n * mount → unmount → mount double-invoke.\n *\n * An AUTOMATIC attempt that fails is NOT an error state and does NOT reach\n * `onError`: the user did not ask for it, and every cold load of a chat app\n * whose resume endpoint answers 404 (nothing in flight) would otherwise paint\n * a permanent error. A caught-up endpoint (immediate `[DONE]`) is a silent\n * no-op — no bubble, no state change. Call `reconnect()` yourself when you\n * want the failure surfaced.\n */\n auto?: boolean;\n /** Cursor persistence adapter (see {@link UseChatCursorStore}). */\n cursor?: UseChatCursorStore;\n}\n\nexport interface UseChatOptions {\n /** Endpoint serving `toDeuzStreamResponse` output. */\n api: string;\n /**\n * Seed canonical history (e.g. restored from a ChatStore) — rendered via\n * `uiFromMessages`.\n *\n * READ ONCE, at mount, like any `useState` initial value. It is deliberately\n * NOT re-adopted when the prop changes: apps pass an inline array literal, so\n * a new identity arrives on EVERY render and adopting it would reset the\n * transcript continuously — and mid-stream it would clobber the turn being\n * folded. Switching chats or hydrating later is an explicit action: call\n * `setHistory` (both views) or `setMessages` (re-derives canonical).\n */\n initialMessages?: Message[];\n headers?: Record<string, string>;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Chat identity — merged into every request body (server-side ChatStore persistence). */\n chatId?: string;\n /** Enables `reconnect()` / `resume.auto` against a resume endpoint (wire v2). */\n resume?: UseChatResumeOptions;\n /** Id source for UI messages/turns. Default: `crypto.randomUUID` (with a fallback). */\n generateId?: () => string;\n /**\n * Coalesce React commits to at most one per `throttleMs` (trailing edge).\n * Default `0` — commit on every wire part, exactly as 1.8 did.\n *\n * A fast model emits hundreds of text deltas per second; with markdown\n * rendering over a long transcript that visibly janks. The terminal frame is\n * ALWAYS flushed (stream end, error, abort, an external tool result), so the\n * final text can never be lost to coalescing. A plain `setTimeout` is fine\n * here: unlike core's `src/**`, this package is not edge-lint-constrained and\n * has no `deps.clock` seam.\n */\n throttleMs?: number;\n /**\n * Client-tool executor: called for every streamed tool call the SERVER did\n * not execute. The return value is appended as its tool_result and the chat\n * auto-continues; a throw self-heals as an is_error result.\n *\n * OMIT it to drive client tools from outside the hook instead: the\n * round-trip PARKS, the calls appear in `pendingToolCalls`, and\n * `addToolResult` answers them.\n */\n onToolCall?: (call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n }) => Promise<unknown> | unknown;\n /**\n * Fired for every `data-{name}` part as it arrives, BEFORE reconciliation —\n * so a caller sees each intermediate write of an addressable `(name, id)`\n * entry, which `dataParts` collapses to the last one. A throw is swallowed\n * (G2: a consumer callback is not a transport error).\n */\n onData?: (data: { name: string; id?: string; payload: unknown }) => void;\n onError?: (error: Error) => void;\n /**\n * How a NON-2xx response from `api` is reported (default `'error-part'`: the\n * failure becomes `status: 'error'` instead of an empty assistant bubble).\n * Forwarded verbatim to core's `readDeuzStream`.\n */\n onHttpError?: 'error-part' | 'ignore';\n /** Injectable for tests / custom transports. Defaults to global fetch. */\n fetch?: typeof fetch;\n}\n\nexport interface UseChatResult {\n /** The render view. Each message carries its ordered `parts` (1.9) when it has any. */\n messages: UIMessage[];\n /**\n * BOTH views in one object (`{ ui, canonical }`). Only the canonical one is\n * POSTable and only it survives a round-trip through a provider, so an app\n * that persists a chat should persist `history.canonical`. Identity is stable\n * until either view changes.\n */\n history: ChatHistory;\n status: 'idle' | 'streaming' | 'error';\n error: Error | undefined;\n /** Gated tool calls awaiting verdicts — the chat is PAUSED while non-empty. */\n pendingApprovals: ToolApprovalRequest[];\n /**\n * Client tool calls the round-trip is PARKED on (no `onToolCall` executor).\n * Answer each with `addToolResult`; the chat continues once all are answered.\n */\n pendingToolCalls: UIToolCall[];\n /** Live cumulative cost from the wire's `cost` parts (last one wins). */\n cost?: UseChatCost;\n /** Set when the server's budget guardrail tripped this turn. */\n budgetExceeded?: UseChatBudgetExceeded;\n /**\n * This turn's app-defined `data-{name}` parts. Entries written with an `id`\n * are RECONCILED by `(name, id)` — one live status widget stays one entry, at\n * its original position — while id-less entries stay append-only (1.7/1.8).\n */\n dataParts: Array<{ name: string; id?: string; payload: unknown }>;\n /** This turn's RAG citations. */\n citations: AssistantTurnState['citations'];\n /** Latest live plan snapshot for this turn (autonomous runs, 1.8). */\n plan?: AssistantTurnState['plan'];\n /** This turn's live activity feed (\"Computer\" view, 1.8). */\n activity: AssistantTurnState['activity'];\n /** This turn's `verifyStep` verdicts, in arrival order (1.9). */\n verifications?: AssistantTurnState['verifications'];\n /**\n * Non-fatal execution notices for this turn, in arrival order (1.9): a\n * sampling param the wire could not carry, a clamped ceiling, an unknown model\n * slug served from the conservative fallback row. Render them as a dismissible\n * banner — the run itself succeeded.\n */\n warnings?: AssistantTurnState['warnings'];\n /**\n * `false-finish` rejections for this turn (1.9): the server's guard decided\n * the work was not actually done. A trailing entry with `willRetry: false`\n * means the guard's budget ran out, so the answer on screen is the one it\n * stopped on rather than one it was happy with.\n */\n falseFinishes?: AssistantTurnState['falseFinishes'];\n /**\n * Live sub-agent (`agentTool`) frames for this turn, one per `agentPath`\n * (1.9). Each holds the child's OWN turn — its text, ordered `parts` and tool\n * cards — so a delegated run is renderable instead of invisible, and\n * `afterPart` says where in the parent's `parts` it belongs. Nothing here is\n * mixed into the parent's `content`: a sub-agent's words are its own.\n */\n subAgents?: AssistantTurnState['subAgents'];\n /** Per-step usage/finish from `step-finish` parts, in arrival order (1.9). */\n steps?: AssistantTurnState['steps'];\n /** Terminal token usage for this turn, from the wire's `finish` part (1.9). */\n usage?: Usage;\n /** Terminal finish reason (1.9) — `'length'` means the answer was truncated. */\n finishReason?: FinishReason;\n /**\n * Send one user turn: plain text (1.8-identical, including the canonical\n * `content` string) or text plus canonical parts — images/PDFs from\n * {@link partsFromFiles}, `imagePart`/`filePart`, anything the wires accept.\n */\n sendMessage: (input: ChatInput) => Promise<void>;\n /** Abort the in-flight stream (not an error). */\n stop: () => void;\n /** Drop the trailing assistant/tool turns (core `dropTrailingAssistant`) and re-run. */\n regenerate: () => Promise<void>;\n /** Cut history before `messageId` (core `branchBeforeUserMessage`) and send `input`. */\n editAndResend: (messageId: string, input: ChatInput) => Promise<void>;\n /**\n * Replace BOTH views in one commit — the honest primitive, because Deuz keeps\n * two of them and only the canonical one is POSTable. Use it to switch chats,\n * hydrate after mount, or delete/edit a rendered message while keeping a\n * system prompt and provider round-trip data that the UI view cannot carry.\n *\n * Pending gates (approvals, parked client tool calls) are DROPPED: they were\n * anchored to the transcript you just replaced.\n */\n setHistory: (update: ChatHistory | ((prev: ChatHistory) => ChatHistory)) => void;\n /**\n * Sugar over `setHistory`: re-derives the canonical view with core's\n * `canonicalFromUI`. That inverse projection is LOSSY — system messages,\n * `Message.providerMetadata` and UI-only state do not survive it, and a\n * message without ordered `parts` loses its attachments entirely — so drive\n * `setHistory` directly when your history has any of those.\n */\n setMessages: (update: UIMessage[] | ((prev: UIMessage[]) => UIMessage[])) => void;\n /**\n * Answer ONE parked client tool call from outside the hook. Feeds the exact\n * path `onToolCall`'s return value takes (core `clientToolResultMessage`), so\n * the chat auto-continues once every call in `pendingToolCalls` is answered.\n * A result for an id that is not parked is ignored — an orphan `tool_result`\n * would 400 the next request.\n */\n addToolResult: (result: {\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n }) => Promise<void>;\n /** Dismiss the error: `status: 'error'` → `'idle'`. Leaves a live stream alone. */\n clearError: () => void;\n /**\n * Record one verdict (the request's signed `token` is auto-preserved). Once\n * EVERY pending approval has a verdict, the chat auto-resumes with\n * `approvalResponses` in the request body.\n */\n addToolApprovalResponse: (response: ToolApprovalResponse) => Promise<void>;\n /**\n * Re-read the stream from `resume.endpoint` via `connectDeuzStream` and fold\n * the parts into the current turn. No-op unless `options.resume` is set.\n */\n reconnect: () => Promise<void>;\n}\n\n/**\n * ONE React state cell (3.4a). 1.8 held eight — `messages` plus a `useState`\n * per readout — and `syncTurn` set seven of them on EVERY wire part, so a fast\n * model re-rendered the whole transcript several times per token. Collapsing\n * them costs nothing and makes the two history views structurally inseparable:\n * `ui` and `canonical` are published in the SAME commit, so no render can ever\n * see one of them a frame behind the other.\n */\ninterface ChatSnapshot {\n history: ChatHistory;\n cost?: UseChatCost;\n budgetExceeded?: UseChatBudgetExceeded;\n dataParts: Array<{ name: string; id?: string; payload: unknown }>;\n citations: AssistantTurnState['citations'];\n plan?: AssistantTurnState['plan'];\n activity: AssistantTurnState['activity'];\n verifications?: AssistantTurnState['verifications'];\n warnings?: AssistantTurnState['warnings'];\n falseFinishes?: AssistantTurnState['falseFinishes'];\n subAgents?: AssistantTurnState['subAgents'];\n steps?: AssistantTurnState['steps'];\n usage?: Usage;\n finishReason?: FinishReason;\n}\n\n/**\n * Cursor persistence is the CALLER's: a throwing adapter (a quota-exceeded\n * private-mode write, storage disabled) must never kill a live stream.\n */\nfunction loadCursor(resume: UseChatResumeOptions): string | undefined {\n try {\n return resume.cursor?.load();\n } catch {\n return undefined;\n }\n}\n\nfunction saveCursor(resume: UseChatResumeOptions, id: string): void {\n try {\n resume.cursor?.save(id);\n } catch {\n /* a persistence failure is not a transport failure */\n }\n}\n\nexport function useChat(options: UseChatOptions): UseChatResult {\n const genId = options.generateId ?? defaultGenerateId;\n const [snapshot, setSnapshot] = useState<ChatSnapshot>(() => ({\n history: {\n ui: uiFromMessages(options.initialMessages ?? [], genId),\n canonical: options.initialMessages ? [...options.initialMessages] : [],\n },\n dataParts: [],\n citations: [],\n activity: [],\n }));\n const [status, setStatus] = useState<'idle' | 'streaming' | 'error'>('idle');\n const [error, setError] = useState<Error | undefined>(undefined);\n const [pendingApprovals, setPendingApprovals] = useState<ToolApprovalRequest[]>([]);\n const [pendingToolCalls, setPendingToolCalls] = useState<UIToolCall[]>([]);\n\n /** Authoritative snapshot: replaced (never mutated) by `commit`, published to React by `publish`. */\n const snapshotRef = useRef<ChatSnapshot>(snapshot);\n /** The in-flight turn — kept across a drop so `reconnect()` can continue it. */\n const turnRef = useRef<AssistantTurnState | undefined>(undefined);\n /** The turn PARKED on client tool results, so `addToolResult` folds into the same one. */\n const parkedTurnRef = useRef<AssistantTurnState | undefined>(undefined);\n const clientToolsRef = useRef<UIToolCall[]>([]);\n const toolResultsRef = useRef<Array<{ toolCallId: string; result: unknown; isError?: boolean }>>(\n [],\n );\n const approvalsRef = useRef<ToolApprovalRequest[]>([]);\n const verdictsRef = useRef<ToolApprovalResponse[]>([]);\n const abortRef = useRef<AbortController | null>(null);\n const lastEventIdRef = useRef<string | undefined>(options.resume?.lastEventId);\n /**\n * Id of the turn's message AS IT SITS in `ui`. The wire's `start` part\n * RENAMES the message (`applyUIPart`), so the id is not stable across a turn\n * — tracking the last published one lets `syncTurn` address the turn by\n * identity instead of by position. That is what makes `setMessages` safe\n * mid-stream: 1.8 spliced the LAST element blindly, so replacing the\n * transcript under a live stream clobbered whatever the app had put there.\n */\n const placedIdRef = useRef<string | undefined>(undefined);\n\n // --- Commit plumbing: one React update per fold, optionally coalesced ---\n\n const throttleMs = options.throttleMs ?? 0;\n const flushTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const dirtyRef = useRef(false);\n\n const publish = useCallback((): void => {\n flushTimerRef.current = undefined;\n dirtyRef.current = false;\n setSnapshot(snapshotRef.current);\n }, []);\n\n /** Record a new snapshot; publish it now, or on the trailing edge of `throttleMs`. */\n const commit = useCallback(\n (next: ChatSnapshot): void => {\n snapshotRef.current = next;\n if (throttleMs <= 0) {\n publish();\n return;\n }\n dirtyRef.current = true;\n if (flushTimerRef.current === undefined) {\n flushTimerRef.current = setTimeout(publish, throttleMs);\n }\n },\n [throttleMs, publish],\n );\n\n /** Force the pending frame out. Every terminal boundary calls this. */\n const flush = useCallback((): void => {\n if (flushTimerRef.current !== undefined) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = undefined;\n }\n if (dirtyRef.current) publish();\n }, [publish]);\n\n /** A coalesced frame must not fire into an unmounted tree. */\n useEffect(\n () => () => {\n if (flushTimerRef.current !== undefined) clearTimeout(flushTimerRef.current);\n },\n [],\n );\n\n /** Sync ALL turn-derived state in ONE commit. */\n const syncTurn = useCallback(\n (turn: AssistantTurnState): void => {\n const previous = snapshotRef.current;\n const placed = placedIdRef.current;\n const ui = previous.history.ui;\n const index = placed === undefined ? -1 : ui.findIndex((m) => m.id === placed);\n placedIdRef.current = turn.message.id;\n commit({\n ...previous,\n history: {\n // NEW array either way — the turn's message is never spliced in place.\n ui:\n index === -1\n ? [...ui, turn.message]\n : [...ui.slice(0, index), turn.message, ...ui.slice(index + 1)],\n canonical: previous.history.canonical,\n },\n // `cost` is CUMULATIVE for the chat, so an absent reading keeps the\n // previous one (1.7 behaviour, verbatim); every other readout is\n // turn-scoped and resets when the turn does.\n cost:\n turn.costUsd !== undefined\n ? {\n costUsd: turn.costUsd,\n ...(turn.cacheSavingsUsd !== undefined\n ? { cacheSavingsUsd: turn.cacheSavingsUsd }\n : {}),\n }\n : previous.cost,\n budgetExceeded: turn.budgetExceeded,\n dataParts: turn.dataParts,\n citations: turn.citations,\n plan: turn.plan,\n activity: turn.activity,\n verifications: turn.verifications,\n warnings: turn.warnings,\n falseFinishes: turn.falseFinishes,\n subAgents: turn.subAgents,\n steps: turn.steps,\n usage: turn.usage,\n finishReason: turn.finishReason,\n });\n },\n [commit],\n );\n\n /** Append to the canonical view. NEW array — never a splice (immutable history). */\n const appendCanonical = useCallback(\n (message: Message): void => {\n const previous = snapshotRef.current;\n commit({\n ...previous,\n history: {\n ui: previous.history.ui,\n canonical: [...previous.history.canonical, message],\n },\n });\n },\n [commit],\n );\n\n /** Drop every parked gate — the turn they belonged to is no longer current. */\n const clearGates = useCallback((): void => {\n approvalsRef.current = [];\n verdictsRef.current = [];\n clientToolsRef.current = [];\n toolResultsRef.current = [];\n parkedTurnRef.current = undefined;\n setPendingApprovals([]);\n setPendingToolCalls([]);\n }, []);\n\n /** Core reducer + the `onData` notification (the only side channel the fold has). */\n const fold = useCallback(\n (turn: AssistantTurnState, part: DeuzUIPart): AssistantTurnState => {\n const next = foldPart(turn, part);\n const onData = options.onData;\n if (onData && typeof part.type === 'string' && part.type.startsWith('data-')) {\n const data = part as Extract<DeuzUIPart, { payload: unknown }>;\n try {\n onData({\n name: data.type.slice('data-'.length),\n ...(typeof data.id === 'string' ? { id: data.id } : {}),\n payload: data.payload,\n });\n } catch {\n /* G2: a consumer callback is not a transport error */\n }\n }\n return next;\n },\n [options.onData],\n );\n\n const stop = useCallback((): void => {\n abortRef.current?.abort();\n }, []);\n\n const run = useCallback(\n async (approvalResponses?: ToolApprovalResponse[]): Promise<void> => {\n const controller = new AbortController();\n abortRef.current = controller;\n setStatus('streaming');\n setError(undefined);\n try {\n // One iteration per model round; client-tool results loop back in.\n for (;;) {\n const doFetch = options.fetch ?? fetch;\n const res = await doFetch(options.api, {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...options.headers },\n body: JSON.stringify({\n messages: snapshotRef.current.history.canonical,\n ...(options.chatId !== undefined ? { chatId: options.chatId } : {}),\n ...(approvalResponses?.length ? { approvalResponses } : {}),\n ...options.body,\n }),\n signal: controller.signal,\n });\n approvalResponses = undefined; // consumed by the first round only\n\n let turn = createAssistantTurn(genId());\n turnRef.current = turn;\n placedIdRef.current = undefined; // a fresh turn owns no slot yet\n syncTurn(turn); // appends the bubble AND resets this-turn state\n flush(); // \"thinking\" feedback must never wait on a throttle window\n\n // A non-2xx route (500 + an HTML error page, 401, 429) yields a\n // single `error` part → turn.error → the throw below → status 'error'.\n // Before 1.9 it streamed nothing and rendered an empty bubble.\n for await (const part of readDeuzStream(res, {\n ...(options.onHttpError ? { onHttpError: options.onHttpError } : {}),\n })) {\n turn = fold(turn, part);\n turnRef.current = turn;\n syncTurn(turn);\n }\n // A stream that ended WITHOUT `finish`/`error` (a dropped connection)\n // leaves the tail text/reasoning part 'streaming' by design — that\n // boundary belongs to the binding, so close it here. Returns the SAME\n // object when there is nothing to seal, hence no wasted render.\n const sealed = sealAssistantTurn(turn);\n if (sealed !== turn) {\n turn = sealed;\n turnRef.current = turn;\n syncTurn(turn);\n }\n flush(); // terminal frame — never coalesced away\n if (turn.error !== undefined) throw new Error(turn.error);\n\n // Append the canonical assistant turn (client-tools reconstruction).\n appendCanonical(assistantMessageFromTurn(turn));\n turnRef.current = undefined;\n\n // Approval pause: verdicts arrive via addToolApprovalResponse.\n if (turn.approvals.length > 0) {\n approvalsRef.current = turn.approvals;\n verdictsRef.current = [];\n setPendingApprovals(turn.approvals);\n return;\n }\n\n // Client tools: everything the server didn't execute.\n const toolCalls = turn.message.toolCalls ?? [];\n const serverResults = new Set(turn.serverResults);\n const clientPending = toolCalls.filter((t) => !serverResults.has(t.toolCallId));\n if (clientPending.length === 0) return;\n if (!options.onToolCall) {\n // No in-hook executor: PARK the round-trip instead of abandoning\n // it. 1.8 returned here and the `tool_use` never got its\n // `tool_result`, so a tool that needs user interaction was\n // unanswerable. `addToolResult` folds the verdicts into THIS turn.\n parkedTurnRef.current = turn;\n clientToolsRef.current = clientPending;\n toolResultsRef.current = [];\n setPendingToolCalls(clientPending);\n return;\n }\n const results: Array<{ toolCallId: string; result: unknown; isError?: boolean }> = [];\n for (const call of clientPending) {\n try {\n const out = await options.onToolCall({\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n });\n results.push({ toolCallId: call.toolCallId, result: out });\n turn = applyUIPart(turn, {\n type: 'tool-result',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n output: out,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n results.push({ toolCallId: call.toolCallId, result: message, isError: true });\n turn = applyUIPart(turn, {\n type: 'tool-result',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n output: message,\n isError: true,\n });\n }\n syncTurn(turn);\n }\n appendCanonical(clientToolResultMessage(results));\n // loop → next round POSTs the extended history\n }\n } catch (err) {\n if (controller.signal.aborted) {\n // User abort — not an error. No `finish` arrived, so the tail part is\n // still 'streaming'; sealing it is the binding's job (see core's\n // `sealAssistantTurn` docstring).\n const open = turnRef.current;\n if (open) {\n const sealed = sealAssistantTurn(open);\n turnRef.current = sealed;\n if (sealed !== open) syncTurn(sealed);\n }\n return;\n }\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus('error');\n options.onError?.(e);\n return;\n } finally {\n setStatus((s) => (s === 'error' ? s : 'idle'));\n flush(); // every exit path publishes the last frame\n }\n },\n [\n options.api,\n options.fetch,\n options.headers,\n options.body,\n options.chatId,\n options.generateId,\n options.onToolCall,\n options.onError,\n options.onHttpError,\n appendCanonical,\n fold,\n flush,\n syncTurn,\n ],\n );\n\n const sendMessage = useCallback(\n async (input: ChatInput): Promise<void> => {\n // ONE core projection feeds both views, so the user bubble carries its\n // ordered `parts` (incl. `file` elements for attachments) with no\n // React-side message building. A bare string is byte-identical to 1.8:\n // `userMessageFromInput` keeps `content` a plain STRING, so a prompt-cache\n // prefix does not move when a caller upgrades.\n const message = userMessageFromInput(input);\n const bubble = uiFromMessages([message], genId)[0];\n const previous = snapshotRef.current;\n commit({\n ...previous,\n history: {\n ui: bubble ? [...previous.history.ui, bubble] : previous.history.ui,\n canonical: [...previous.history.canonical, message],\n },\n });\n clearGates();\n flush();\n await run();\n },\n [run, commit, clearGates, flush, options.generateId],\n );\n\n const regenerate = useCallback(async (): Promise<void> => {\n const previous = snapshotRef.current;\n commit({ ...previous, history: dropTrailingAssistant(previous.history) });\n clearGates();\n flush();\n await run();\n }, [run, commit, clearGates, flush]);\n\n const editAndResend = useCallback(\n async (messageId: string, input: ChatInput): Promise<void> => {\n const previous = snapshotRef.current;\n const cut = branchBeforeUserMessage(previous.history, messageId);\n if (!cut) return; // not a user message — nothing to branch\n commit({ ...previous, history: cut });\n clearGates();\n flush();\n await sendMessage(input);\n },\n [sendMessage, commit, clearGates, flush],\n );\n\n const setHistory = useCallback(\n (update: ChatHistory | ((prev: ChatHistory) => ChatHistory)): void => {\n const previous = snapshotRef.current;\n const next = typeof update === 'function' ? update(previous.history) : update;\n // Replace BOTH views WHOLESALE, in ONE commit. Never splice the canonical\n // array in place: the loops and prompt caching depend on prior arrays\n // staying stable (immutable history). `placedIdRef` is left alone — it is\n // only a lookup key, and `syncTurn` appends when the id is gone, so a\n // live turn survives a replacement that keeps it and re-appends when not.\n commit({\n ...previous,\n history: { ui: [...next.ui], canonical: [...next.canonical] },\n });\n clearGates();\n flush();\n },\n [commit, clearGates, flush],\n );\n\n const setMessages = useCallback(\n (update: UIMessage[] | ((prev: UIMessage[]) => UIMessage[])): void => {\n setHistory((prev) => {\n const ui = typeof update === 'function' ? update(prev.ui) : update;\n return { ui, canonical: canonicalFromUI(ui) };\n });\n },\n [setHistory],\n );\n\n const clearError = useCallback((): void => {\n setError(undefined);\n // Only the terminal error state is dismissible — a live stream is not.\n setStatus((s) => (s === 'error' ? 'idle' : s));\n }, []);\n\n const addToolResult = useCallback(\n async (result: { toolCallId: string; output: unknown; isError?: boolean }): Promise<void> => {\n const parked = clientToolsRef.current;\n const call = parked.find((c) => c.toolCallId === result.toolCallId);\n // Nothing parked under that id: ignore. An orphan `tool_result` (one with\n // no matching `tool_use`) 400s the next request, so it must never be\n // POSTed — same invariant the core tool loop enforces server-side.\n if (!call) return;\n toolResultsRef.current = [\n ...toolResultsRef.current.filter((r) => r.toolCallId !== result.toolCallId),\n {\n toolCallId: result.toolCallId,\n result: result.output,\n ...(result.isError ? { isError: true } : {}),\n },\n ];\n const turn = parkedTurnRef.current;\n if (turn) {\n // Same reducer path the in-hook executor takes, so the card renders\n // 'result' identically whichever side answered it.\n const next = applyUIPart(turn, {\n type: 'tool-result',\n toolCallId: result.toolCallId,\n toolName: call.toolName,\n output: result.output,\n ...(result.isError ? { isError: true } : {}),\n });\n parkedTurnRef.current = next;\n syncTurn(next);\n flush(); // a user action, not a stream delta — show it now\n }\n const answered = toolResultsRef.current;\n if (!parked.every((c) => answered.some((r) => r.toolCallId === c.toolCallId))) return;\n clientToolsRef.current = [];\n toolResultsRef.current = [];\n parkedTurnRef.current = undefined;\n setPendingToolCalls([]);\n appendCanonical(clientToolResultMessage(answered));\n await run();\n },\n [run, appendCanonical, syncTurn, flush],\n );\n\n const addToolApprovalResponse = useCallback(\n async (response: ToolApprovalResponse): Promise<void> => {\n // Preserve the request's signed token unless the caller set one.\n const request = approvalsRef.current.find((p) => p.approvalId === response.approvalId);\n const verdict =\n response.token === undefined && request?.token !== undefined\n ? { ...response, token: request.token }\n : response;\n verdictsRef.current = [\n ...verdictsRef.current.filter((v) => v.approvalId !== verdict.approvalId),\n verdict,\n ];\n const verdicts = verdictsRef.current;\n const allSettled = approvalsRef.current.every((p) =>\n verdicts.some((v) => v.approvalId === p.approvalId),\n );\n if (!allSettled) return;\n approvalsRef.current = [];\n verdictsRef.current = [];\n setPendingApprovals([]);\n await run(verdicts);\n },\n [run],\n );\n\n /**\n * The resume read. `silent` marks the AUTOMATIC on-mount attempt: a failure\n * there is invisible (see `resume.auto`), because nothing the user did failed\n * and a dead endpoint would otherwise paint an error on every cold load.\n */\n const runResume = useCallback(\n async (silent: boolean): Promise<void> => {\n const resume = options.resume;\n if (!resume) return;\n const controller = new AbortController();\n abortRef.current = controller;\n setStatus('streaming');\n setError(undefined);\n let folded = 0;\n try {\n // In-memory cursor (this session's stream, or `resume.lastEventId`)\n // beats the persisted one — it is strictly the more recent of the two.\n const cursor = lastEventIdRef.current ?? loadCursor(resume);\n const inFlight = turnRef.current;\n let turn = inFlight;\n if (turn === undefined || cursor === undefined) {\n // No cursor → full replay rebuilds the turn from the start. It takes\n // the place of a partial turn already on screen (`placedIdRef` keeps\n // pointing at it); with nothing on screen the turn stays UNPLACED\n // until the first part arrives, so a caught-up endpoint answering\n // `[DONE]` immediately is a silent no-op rather than an empty bubble.\n if (inFlight === undefined) placedIdRef.current = undefined;\n turn = createAssistantTurn(genId());\n }\n turnRef.current = turn;\n const parts = connectDeuzStream(resume.endpoint, {\n ...(cursor !== undefined ? { lastEventId: cursor } : {}),\n onCursor: (id) => {\n lastEventIdRef.current = id;\n saveCursor(resume, id);\n },\n signal: controller.signal,\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.headers ? { headers: options.headers } : {}),\n });\n for await (const part of parts) {\n folded++;\n turn = fold(turn, part);\n turnRef.current = turn;\n syncTurn(turn);\n }\n if (folded === 0) {\n // Already caught up: nothing arrived, so nothing changed and nothing\n // may be appended to the canonical history (an empty assistant\n // message would poison the next request). Not an error. The turn we\n // speculatively created is discarded; a real in-flight one is kept\n // (sealed — no `finish` is coming for it now).\n turnRef.current = inFlight === undefined ? undefined : sealAssistantTurn(inFlight);\n return;\n }\n const sealed = sealAssistantTurn(turn);\n if (sealed !== turn) {\n turn = sealed;\n syncTurn(turn);\n }\n turnRef.current = turn;\n if (turn.error !== undefined) throw new Error(turn.error);\n appendCanonical(assistantMessageFromTurn(turn));\n turnRef.current = undefined;\n if (turn.approvals.length > 0) {\n approvalsRef.current = turn.approvals;\n verdictsRef.current = [];\n setPendingApprovals(turn.approvals);\n }\n } catch (err) {\n if (controller.signal.aborted) return; // user abort — not an error\n if (silent) return; // best-effort auto attempt — invisible by contract\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus('error');\n options.onError?.(e);\n return;\n } finally {\n setStatus((s) => (s === 'error' ? s : 'idle'));\n flush();\n }\n },\n [\n options.resume,\n options.fetch,\n options.headers,\n options.generateId,\n options.onError,\n appendCanonical,\n fold,\n flush,\n syncTurn,\n ],\n );\n\n const reconnect = useCallback((): Promise<void> => runResume(false), [runResume]);\n\n /**\n * `resume.auto`: ONE attempt per mounted hook. The ref guard is what makes\n * React 18/19 StrictMode's deliberate mount → unmount → mount effect\n * double-invoke fire a single request — refs survive it, an effect body does\n * not. Deliberately not undone on cleanup for exactly that reason.\n */\n const autoResumedRef = useRef(false);\n useEffect(() => {\n if (options.resume?.auto !== true || autoResumedRef.current) return;\n autoResumedRef.current = true;\n void runResume(true);\n }, [options.resume?.auto, runResume]);\n\n return {\n messages: snapshot.history.ui,\n history: snapshot.history,\n status,\n error,\n pendingApprovals,\n pendingToolCalls,\n ...(snapshot.cost !== undefined ? { cost: snapshot.cost } : {}),\n ...(snapshot.budgetExceeded !== undefined ? { budgetExceeded: snapshot.budgetExceeded } : {}),\n dataParts: snapshot.dataParts,\n citations: snapshot.citations,\n ...(snapshot.plan !== undefined ? { plan: snapshot.plan } : {}),\n activity: snapshot.activity,\n ...(snapshot.verifications !== undefined ? { verifications: snapshot.verifications } : {}),\n ...(snapshot.warnings !== undefined ? { warnings: snapshot.warnings } : {}),\n ...(snapshot.falseFinishes !== undefined ? { falseFinishes: snapshot.falseFinishes } : {}),\n ...(snapshot.subAgents !== undefined ? { subAgents: snapshot.subAgents } : {}),\n ...(snapshot.steps !== undefined ? { steps: snapshot.steps } : {}),\n ...(snapshot.usage !== undefined ? { usage: snapshot.usage } : {}),\n ...(snapshot.finishReason !== undefined ? { finishReason: snapshot.finishReason } : {}),\n sendMessage,\n stop,\n regenerate,\n editAndResend,\n setHistory,\n setMessages,\n addToolResult,\n clearError,\n addToolApprovalResponse,\n reconnect,\n };\n}\n","/**\n * useObject — streams `toDeuzObjectStreamResponse` output (`object-delta`\n * parts) into React state. Ported from the frozen `@deuz-sdk/core/react` hook.\n *\n * 1.9 adds the two options `useChat` grew for the same reasons: `onHttpError`\n * (forwarded verbatim to core's `readDeuzStream`) and `throttleMs` — a\n * structured-output stream emits one partial per token, and each partial\n * REPLACES the object wholesale, so an unthrottled render tree rebuilds on\n * every token.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { DeepPartial } from '@deuz-sdk/core';\nimport { readDeuzStream } from '@deuz-sdk/core/ui';\n\nexport interface UseObjectOptions {\n /** Endpoint serving `toDeuzObjectStreamResponse` output. */\n api: string;\n headers?: Record<string, string>;\n /**\n * How a NON-2xx response from `api` is reported (default `'error-part'`,\n * which lands in `error`). Forwarded verbatim to core's `readDeuzStream`.\n */\n onHttpError?: 'error-part' | 'ignore';\n /**\n * Coalesce partials to at most one React commit per `throttleMs` (trailing\n * edge). Default `0` — commit every partial, exactly as 1.8 did. The final\n * partial is ALWAYS flushed, so the completed object is never lost.\n */\n throttleMs?: number;\n /** Injectable for tests / custom transports. Defaults to global fetch. */\n fetch?: typeof fetch;\n}\n\nexport interface UseObjectResult<T> {\n /** Latest partial (each `object-delta` replaces it wholesale). */\n object: DeepPartial<T> | undefined;\n isLoading: boolean;\n error: Error | undefined;\n /** POSTs `{ input }` to `api` and streams partials into `object`. */\n submit: (input: unknown) => Promise<void>;\n /** Abort the in-flight stream (not an error). */\n stop: () => void;\n}\n\nexport function useObject<T = unknown>(options: UseObjectOptions): UseObjectResult<T> {\n const [object, setObject] = useState<DeepPartial<T> | undefined>(undefined);\n const [isLoading, setLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const abortRef = useRef<AbortController | null>(null);\n\n // Coalescing plumbing (same trailing-edge shape as `useChat`, one value wide).\n const throttleMs = options.throttleMs ?? 0;\n const latestRef = useRef<DeepPartial<T> | undefined>(undefined);\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const dirtyRef = useRef(false);\n\n const publish = useCallback((): void => {\n timerRef.current = undefined;\n dirtyRef.current = false;\n setObject(latestRef.current);\n }, []);\n\n const commit = useCallback(\n (next: DeepPartial<T> | undefined): void => {\n latestRef.current = next;\n if (throttleMs <= 0) {\n publish();\n return;\n }\n dirtyRef.current = true;\n if (timerRef.current === undefined) timerRef.current = setTimeout(publish, throttleMs);\n },\n [throttleMs, publish],\n );\n\n const flush = useCallback((): void => {\n if (timerRef.current !== undefined) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n if (dirtyRef.current) publish();\n }, [publish]);\n\n /** A coalesced frame must not fire into an unmounted tree. */\n useEffect(\n () => () => {\n if (timerRef.current !== undefined) clearTimeout(timerRef.current);\n },\n [],\n );\n\n const stop = useCallback((): void => {\n abortRef.current?.abort();\n }, []);\n\n const submit = useCallback(\n async (input: unknown): Promise<void> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n setLoading(true);\n setError(undefined);\n commit(undefined);\n flush(); // clearing the previous object is immediate, never coalesced\n try {\n const doFetch = options.fetch ?? fetch;\n const res = await doFetch(options.api, {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...options.headers },\n body: JSON.stringify({ input }),\n signal: controller.signal,\n });\n for await (const part of readDeuzStream(res, {\n ...(options.onHttpError ? { onHttpError: options.onHttpError } : {}),\n })) {\n if (part.type === 'object-delta') {\n commit(part.object as DeepPartial<T>);\n } else if (part.type === 'error') {\n setError(new Error(part.message));\n break;\n }\n }\n } catch (err) {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n setLoading(false);\n flush(); // the completed object is never lost to a throttle window\n }\n },\n [options.api, options.fetch, options.headers, options.onHttpError, commit, flush],\n );\n\n return { object, isLoading, error, submit, stop };\n}\n","/**\n * Headless chat components — zero styling, zero business logic. They only\n * wire core types (`ToolApprovalRequest`/`ToolApprovalResponse`, the useChat\n * cost state) to DOM events; presentation is overridable via render props.\n */\nimport type { ReactNode } from 'react';\nimport type { ToolApprovalRequest, ToolApprovalResponse } from '@deuz-sdk/core';\nimport type { UseChatCost } from './use-chat';\n\nexport interface ToolApprovalCardProps {\n approval: ToolApprovalRequest;\n /** Feed this straight into `useChat().addToolApprovalResponse`. */\n onRespond: (response: ToolApprovalResponse) => void;\n /** Override presentation; the component supplies the wired callbacks. */\n render?: (ctx: {\n approval: ToolApprovalRequest;\n approve: () => void;\n deny: (reason?: string) => void;\n }) => ReactNode;\n}\n\n/**\n * One pending tool approval. The verdict always carries the request's signed\n * `token` (D4) — callers never have to thread it themselves.\n */\nexport function ToolApprovalCard({ approval, onRespond, render }: ToolApprovalCardProps) {\n const respond = (approved: boolean, reason?: string): void =>\n onRespond({\n approvalId: approval.approvalId,\n approved,\n ...(reason !== undefined ? { reason } : {}),\n ...(approval.token !== undefined ? { token: approval.token } : {}),\n });\n const approve = (): void => respond(true);\n const deny = (reason?: string): void => respond(false, reason);\n\n if (render) return <>{render({ approval, approve, deny })}</>;\n return (\n <div data-deuz=\"tool-approval\">\n <span data-deuz=\"tool-approval-name\">{approval.toolName}</span>\n <pre data-deuz=\"tool-approval-input\">{JSON.stringify(approval.input, null, 2)}</pre>\n <button type=\"button\" onClick={approve}>\n Approve\n </button>\n <button type=\"button\" onClick={() => deny()}>\n Deny\n </button>\n </div>\n );\n}\n\nexport interface CostBadgeProps {\n /** The `useChat` cost state (undefined until the first `cost` part arrives). */\n cost: UseChatCost | undefined;\n /** Override presentation. */\n format?: (cost: UseChatCost) => ReactNode;\n}\n\n/** Live cost readout: `$X.XXXX`, plus ` (saved $Y.YYYY)` when caching saved money. */\nexport function CostBadge({ cost, format }: CostBadgeProps) {\n if (cost === undefined) return null;\n if (format) return <>{format(cost)}</>;\n const saved =\n cost.cacheSavingsUsd !== undefined && cost.cacheSavingsUsd > 0\n ? ` (saved $${cost.cacheSavingsUsd.toFixed(4)})`\n : '';\n return <span data-deuz=\"cost-badge\">{`$${cost.costUsd.toFixed(4)}${saved}`}</span>;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deuz-sdk/react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "React bindings for the Deuz SDK — useChat/useObject hooks and headless chat components.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Umutcan Edizaslan (U-C4N)",
|
|
@@ -56,12 +56,12 @@
|
|
|
56
56
|
"deuz"
|
|
57
57
|
],
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@deuz-sdk/core": "^
|
|
59
|
+
"@deuz-sdk/core": "^2.0.0",
|
|
60
60
|
"react": "^18.0.0 || ^19.0.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@arethetypeswrong/cli": "^0.18.0",
|
|
64
|
-
"@deuz-sdk/core": "^
|
|
64
|
+
"@deuz-sdk/core": "^2.0.0",
|
|
65
65
|
"@testing-library/react": "^16.3.2",
|
|
66
66
|
"@types/react": "^19.2.17",
|
|
67
67
|
"eslint": "^9.18.0",
|