@deuz-sdk/react 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -33,6 +33,8 @@ function useChat(options) {
33
33
  );
34
34
  const [dataParts, setDataParts] = react.useState([]);
35
35
  const [citations, setCitations] = react.useState([]);
36
+ const [plan, setPlan] = react.useState(void 0);
37
+ const [activity, setActivity] = react.useState([]);
36
38
  const uiRef = react.useRef(messages);
37
39
  const canonicalRef = react.useRef(
38
40
  options.initialMessages ? [...options.initialMessages] : []
@@ -58,6 +60,8 @@ function useChat(options) {
58
60
  setBudgetExceeded(turn.budgetExceeded);
59
61
  setDataParts(turn.dataParts);
60
62
  setCitations(turn.citations);
63
+ setPlan(turn.plan);
64
+ setActivity(turn.activity);
61
65
  }, []);
62
66
  const stop = react.useCallback(() => {
63
67
  abortRef.current?.abort();
@@ -284,6 +288,8 @@ function useChat(options) {
284
288
  ...budgetExceeded !== void 0 ? { budgetExceeded } : {},
285
289
  dataParts,
286
290
  citations,
291
+ ...plan !== void 0 ? { plan } : {},
292
+ activity,
287
293
  sendMessage,
288
294
  stop,
289
295
  regenerate,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/use-chat.ts","../src/use-object.ts","../src/components.tsx"],"names":["applyUIPart","useState","uiFromMessages","useRef","useCallback","createAssistantTurn","readDeuzStream","assistantMessageFromTurn","clientToolResultMessage","dropTrailingAssistant","branchBeforeUserMessage","connectDeuzStream","jsx","Fragment","jsxs"],"mappings":"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","file":"index.cjs","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. Trivial glue on top: core 1.7.0's\n * `applyUIPart` drops the `token` field of a `tool-approval-request` when it\n * builds the approval entry — re-attach it so verdicts can echo it (D4).\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 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\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 }, []);\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 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":["applyUIPart","useState","uiFromMessages","useRef","useCallback","createAssistantTurn","readDeuzStream","assistantMessageFromTurn","clientToolResultMessage","dropTrailingAssistant","branchBeforeUserMessage","connectDeuzStream","jsx","Fragment","jsxs"],"mappings":"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","file":"index.cjs","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"]}
package/dist/index.d.cts CHANGED
@@ -74,6 +74,10 @@ interface UseChatResult {
74
74
  }>;
75
75
  /** This turn's RAG citations. */
76
76
  citations: AssistantTurnState['citations'];
77
+ /** Latest live plan snapshot for this turn (autonomous runs, 1.8). */
78
+ plan?: AssistantTurnState['plan'];
79
+ /** This turn's live activity feed ("Computer" view, 1.8). */
80
+ activity: AssistantTurnState['activity'];
77
81
  sendMessage: (text: string) => Promise<void>;
78
82
  /** Abort the in-flight stream (not an error). */
79
83
  stop: () => void;
package/dist/index.d.ts CHANGED
@@ -74,6 +74,10 @@ interface UseChatResult {
74
74
  }>;
75
75
  /** This turn's RAG citations. */
76
76
  citations: AssistantTurnState['citations'];
77
+ /** Latest live plan snapshot for this turn (autonomous runs, 1.8). */
78
+ plan?: AssistantTurnState['plan'];
79
+ /** This turn's live activity feed ("Computer" view, 1.8). */
80
+ activity: AssistantTurnState['activity'];
77
81
  sendMessage: (text: string) => Promise<void>;
78
82
  /** Abort the in-flight stream (not an error). */
79
83
  stop: () => void;
package/dist/index.js CHANGED
@@ -31,6 +31,8 @@ function useChat(options) {
31
31
  );
32
32
  const [dataParts, setDataParts] = useState([]);
33
33
  const [citations, setCitations] = useState([]);
34
+ const [plan, setPlan] = useState(void 0);
35
+ const [activity, setActivity] = useState([]);
34
36
  const uiRef = useRef(messages);
35
37
  const canonicalRef = useRef(
36
38
  options.initialMessages ? [...options.initialMessages] : []
@@ -56,6 +58,8 @@ function useChat(options) {
56
58
  setBudgetExceeded(turn.budgetExceeded);
57
59
  setDataParts(turn.dataParts);
58
60
  setCitations(turn.citations);
61
+ setPlan(turn.plan);
62
+ setActivity(turn.activity);
59
63
  }, []);
60
64
  const stop = useCallback(() => {
61
65
  abortRef.current?.abort();
@@ -282,6 +286,8 @@ function useChat(options) {
282
286
  ...budgetExceeded !== void 0 ? { budgetExceeded } : {},
283
287
  dataParts,
284
288
  citations,
289
+ ...plan !== void 0 ? { plan } : {},
290
+ activity,
285
291
  sendMessage,
286
292
  stop,
287
293
  regenerate,
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. Trivial glue on top: core 1.7.0's\n * `applyUIPart` drops the `token` field of a `tool-approval-request` when it\n * builds the approval entry — re-attach it so verdicts can echo it (D4).\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 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\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 }, []);\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 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","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deuz-sdk/react",
3
- "version": "1.7.0",
3
+ "version": "1.8.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": "^1.7.0",
59
+ "@deuz-sdk/core": "^1.8.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": "^1.7.0",
64
+ "@deuz-sdk/core": "^1.8.0",
65
65
  "@testing-library/react": "^16.3.2",
66
66
  "@types/react": "^19.2.17",
67
67
  "eslint": "^9.18.0",