@agents24/react 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/state.ts","../src/use-agent-chat.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n HitlAction,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState = \"idle\" | \"streaming\" | \"reconnecting\" | \"paused\" | \"completed\" | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatTextPart = { id: string; type: \"text\"; kind: \"text\"; text: string; raw?: Record<string, unknown> };\nexport type ChatToolPart = {\n id: string;\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolCallId?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n errorText?: string | null;\n presentation?: Record<string, unknown> | null;\n raw: Record<string, unknown>;\n};\nexport type ChatReasoningPart = { id: string; type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null; raw: Record<string, unknown> };\nexport type ChatUiBlocksPart = { id: string; type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null; raw: Record<string, unknown> };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlPart = {\n id: string;\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n resolution?: Record<string, unknown> | null;\n raw: Record<string, unknown>;\n};\nexport type ChatErrorPart = { id: string; type: \"error\"; kind: \"error\"; errorText: string; raw: Record<string, unknown> };\nexport type ChatDataPart = { id: string; type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown>; raw: Record<string, unknown> };\nexport type ChatSourcePart = { id: string; type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null; raw: Record<string, unknown> };\nexport type ChatCitationPart = { id: string; type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null; raw: Record<string, unknown> };\nexport type ChatAttachmentPart = { id: string; type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment; raw: Record<string, unknown> };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n liked?: boolean;\n disliked?: boolean;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n};\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n};\n\nexport function partsFromResponseBlocks(blocks: unknown, fallbackText = \"\"): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ id, type: \"text\", kind: \"text\", text: value, raw: block }] : [];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.action || tool.title || \"tool\");\n return [{\n id,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolCallId: text(tool.toolCallId),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n errorText: text(tool.error || block.error),\n presentation: record(tool.presentation),\n raw: block,\n }];\n }\n if (kind === \"reasoning_note\") return [{ id, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status), raw: block }];\n if (kind === \"ui_blocks\") return [{ id, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error), raw: block }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n id,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n resolution: record(block.resolution),\n raw: block,\n }];\n }\n if (kind === \"error\") return [{ id, type: \"error\", kind: \"error\", errorText: String(record(block.error)?.message || block.text || \"The run failed.\"), raw: block }];\n if (kind === \"source\") return [{ id, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description), raw: block }];\n if (kind === \"citation\") return [{ id, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url), raw: block }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ id, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined }, raw: block }];\n }\n return [{ id, type: \"data\", kind: \"data\", name: kind, data: block, raw: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: \"assistant-text\", type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(payload.response_blocks, content);\n if (fromBlocks.length) return { content, parts: fromBlocks };\n if (event.event === \"reasoning.update\") return {\n content,\n parts: [{ id: `reasoning-${event.seq}`, type: \"reasoning\", kind: \"reasoning\", label: text(payload.label), text: text(payload.description), status: text(payload.status), raw: payload }],\n };\n if (event.event === \"ui_blocks.updated\") return {\n content,\n parts: [{ id: `ui-blocks-${event.seq}`, type: \"ui-blocks\", kind: \"ui-blocks\", state: \"input-available\", bundle: record(payload.bundle), raw: payload }],\n };\n if (event.event === \"runtime.error\") return {\n content,\n parts: [{ id: `error-${event.seq}`, type: \"error\", kind: \"error\", errorText: String(record(payload.error)?.message || \"The run failed.\"), raw: payload }],\n };\n if ((event.event === \"source.added\" || event.event === \"citation.added\") && record(payload.source)) {\n return { content, parts: partsFromResponseBlocks([payload.source]) };\n }\n if (event.event === \"tool.started\") {\n const toolName = String(payload.display_name || \"Tool\");\n return {\n content,\n parts: [{ id: String(payload.tool_call_id || `tool-${event.seq}`), type: `tool-${toolName}`, kind: \"tool\", toolName, toolCallId: text(payload.tool_call_id), state: \"input-available\", presentation: { title: toolName }, raw: payload }],\n };\n }\n if (event.event === \"hitl.requested\") {\n const hitl = record(payload.hitl) || {};\n const kind = String(hitl.kind || \"\") as ChatHitlKind;\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n if (kind in allowedActions && actions.length === allowedActions[kind].length && actions.every((action, index) => action === allowedActions[kind][index])) {\n return {\n content,\n parts: [{ id: `hitl-${event.seq}`, type: \"hitl\", kind: \"hitl\", interruptId: String(hitl.interrupt_id || \"\"), hitlKind: kind, message: String(hitl.message || \"\"), allowedActions: actions, status: \"pending\", presentation: record(hitl.presentation) || hitl, raw: payload }],\n };\n }\n }\n return { content, parts: [] };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => record(attachment) ? [record(attachment) as ChatAttachment] : [])\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n isFinal: ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n parts: partsFromResponseBlocks(turn.response_blocks, assistantText),\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n return output;\n });\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return { ...result, id: result.id, filename: result.filename, mediaType: result.mime_type, status: result.status };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport type { ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent } from \"./model\";\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n runState: \"idle\" | \"streaming\" | \"reconnecting\" | \"paused\" | \"completed\" | \"failed\";\n error: unknown;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n runState: \"idle\",\n error: null,\n};\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const index = next.findIndex((message) => message.role === \"assistant\" && (\n Boolean(input.messageId && message.id === input.messageId)\n || Boolean(input.runId && message.runId === input.runId)\n ));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = event.run_id || state.activeRunId;\n const messageId = state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const existing = state.messages.find((message) => message.id === messageId || Boolean(runId && message.runId === runId));\n const payload = event.payload || {};\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const content = delta ? `${existing?.content || \"\"}${delta}` : projection.content || existing?.content || \"\";\n const deltaParts = delta\n ? [{ id: `${runId || \"run\"}-assistant-text`, type: \"text\" as const, kind: \"text\" as const, text: content }]\n : [];\n const incomingParts = projection.parts.length ? projection.parts : deltaParts;\n const parts = incomingParts.length\n ? [...(existing?.parts || []).filter((part) => !incomingParts.some((incoming) => incoming.id === part.id || (incoming.kind === \"text\" && part.kind === \"text\"))), ...incomingParts]\n : existing?.parts || [];\n return {\n ...state,\n activeRunId: terminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages: upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\n }),\n runState: paused ? \"paused\" : terminal ? (eventName === \"run.completed\" ? \"completed\" : \"failed\") : \"streaming\",\n streamingMessageId: terminal || paused ? null : messageId,\n };\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = { ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated };\n return next;\n}\n","import type { AgentClient, HitlAction, PortableUpload, RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { threadDetailToMessages } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport {\n appendStableStreamingTurn,\n applyRuntimeEvent,\n applyThreadSummaryEvent,\n initialAgentChatState,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n requestedModelId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n resumeHitl(part: ChatHitlPart, action: HitlAction, comment?: string): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const active = thread.active_run as Record<string, unknown> | null | undefined;\n const status = String(active?.status || thread.last_run_status || \"\").toLowerCase();\n if (![\"queued\", \"running\", \"cancelling\"].includes(status)) return null;\n return String(active?.run_id || thread.last_run_id || \"\") || null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: options.activeThreadId ?? runtime.storage?.loadActiveThreadId?.() ?? null,\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\n\n const detach = React.useCallback(() => {\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [update]);\n\n React.useEffect(() => () => streamControllerRef.current?.abort(), []);\n\n const refreshThreads = React.useCallback(async () => {\n setIsLoadingThreads(true);\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const nextThreads = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return { ...current, threads: nextThreads };\n });\n } finally {\n setIsLoadingThreads(false);\n }\n }, [client, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, {\n ...existing,\n ...summaryToStored(item),\n messages: existing?.messages || [],\n isHydrated: existing?.isHydrated,\n });\n }\n return { ...current, threads: [...byId.values()] };\n });\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [client, isLoadingMoreThreads, threadPageSize, threadTotal, update]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n detach();\n update((current) => ({ ...current, activeThreadId: threadId, error: null, messages: current.threads.find((thread) => thread.id === threadId)?.messages || [] }));\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({ threadId, limit: pageSize, includeRunEvents: true });\n const messages = threadDetailToMessages(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n };\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n messages,\n activeRunId: activeRunIdFromThread(stored),\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n }));\n const activeRunId = activeRunIdFromThread(stored);\n if (activeRunId) await attachRunRef.current(activeRunId);\n } finally {\n setIsLoadingHistory(false);\n }\n }, [client, detach, pageSize, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n update((current) => {\n const next = applyRuntimeEvent(current, event);\n if (!next.activeThreadId) return next;\n return {\n ...next,\n threads: next.threads.map((thread) => thread.id === next.activeThreadId\n ? { ...thread, messages: next.messages, isHydrated: true, last_run_id: next.activeRunId }\n : thread),\n };\n });\n }, [update]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n } catch (error) {\n if (!isAbortLike(error)) update((current) => ({ ...current, error, runState: \"failed\", streamingMessageId: null }));\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [client, consumeEvent, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length) return;\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: input.attachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n update((current) => ({ ...current, messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage), streamingMessageId: assistantId, runState: \"streaming\", error: null }));\n setIsSubmitting(true);\n try {\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds: input.attachmentIds, requestedModelId: input.requestedModelId, idempotencyKey, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeThreadId: result.threadId || current.activeThreadId, activeRunId: result.detached ? result.runId : current.activeRunId, cursor: result.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (result.threadId) await refreshThreads();\n } catch (error) {\n if (!isAbortLike(error)) update((current) => ({ ...current, error, runState: \"failed\", streamingMessageId: null }));\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [client, consumeEvent, detach, refreshThreads, runtime, update]);\n\n const startNewThread = React.useCallback(() => {\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({ ...current, activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId, messages: current.activeThreadId === threadId ? [] : current.messages, threads: current.threads.filter((thread) => thread.id !== threadId) }));\n }, [client, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId) return;\n await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n detach();\n update((current) => ({ ...current, activeRunId: null, runState: \"completed\", streamingMessageId: null }));\n }, [client, detach, runtime, update]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, action: HitlAction, comment?: string) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n if (!runId) throw new Error(\"No paused run is available to resume.\");\n const result = await client.hitl.resume({ runId, interruptId: part.interruptId, action, comment, idempotencyKey: runtime.createId() });\n await attachRun(result.run_id || runId);\n }, [attachRun, client, runtime]);\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex, includeRunEvents: true });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } finally { setIsLoadingOlder(false); }\n }, [client, pageSize, update]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({ text: user.content, attachments: user.attachments });\n }, [submit]);\n\n React.useEffect(() => { void refreshThreads(); }, [refreshThreads]);\n React.useEffect(() => {\n const controller = runtime.createAbortController();\n void client.threads.events({ signal: controller.signal }, async (event: ThreadSummaryEvent) => {\n if (event.event === \"snapshot_required\") { await refreshThreads(); return; }\n update((current) => ({ ...current, threads: applyThreadSummaryEvent(current.threads, event) }));\n }).catch((error) => { if (!isAbortLike(error)) update((current) => ({ ...current, error })); });\n return () => controller.abort();\n }, [client, refreshThreads, runtime, update]);\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n if (threadId && threadId !== stateRef.current.activeThreadId) void openThread(threadId);\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n activeThread,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n resumeHitl,\n startNewThread,\n submit,\n };\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number; includeRunEvents?: boolean } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.includeRunEvents, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const upload = React.useCallback(async (input: { data: BinaryUploadData; name: string; mediaType: string; threadId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const result = await client.attachments.upload({ upload: input as PortableUpload, threadId: input.threadId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => ({ ...current, [result.id]: result }));\n return attachmentResultToChatAttachment(result);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n return { isUploading, upload, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":"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","names":["React","React"]}
@@ -0,0 +1,8 @@
1
+ import type { AbortSignalLike } from "@agents24/client";
2
+ export type AbortControllerLike = {
3
+ readonly signal: AbortSignalLike;
4
+ abort(reason?: unknown): void;
5
+ };
6
+ export type AbortControllerFactory = () => AbortControllerLike;
7
+ export declare function createPortableId(): string;
8
+ export declare function isAbortLike(error: unknown): boolean;
@@ -0,0 +1,152 @@
1
+ import type { AttachmentResult, HitlAction, RuntimeEvent, ThreadDetail, ThreadSummary } from "@agents24/client";
2
+ export type AgentChatMessageRole = "user" | "assistant";
3
+ export type AgentChatRunState = "idle" | "streaming" | "reconnecting" | "paused" | "completed" | "failed";
4
+ export type ChatCitation = {
5
+ title: string;
6
+ url: string;
7
+ description?: string;
8
+ sourceRef?: string;
9
+ [key: string]: unknown;
10
+ };
11
+ export type ChatAttachment = {
12
+ id?: string;
13
+ url?: string;
14
+ filename?: string;
15
+ mediaType?: string;
16
+ contentType?: string;
17
+ status?: string;
18
+ [key: string]: unknown;
19
+ };
20
+ export type ChatToolState = "input-streaming" | "input-available" | "output-available" | "output-error" | "cancelled";
21
+ export type ChatTextPart = {
22
+ id: string;
23
+ type: "text";
24
+ kind: "text";
25
+ text: string;
26
+ raw?: Record<string, unknown>;
27
+ };
28
+ export type ChatToolPart = {
29
+ id: string;
30
+ type: `tool-${string}`;
31
+ kind: "tool";
32
+ toolName: string;
33
+ toolCallId?: string | null;
34
+ state: ChatToolState;
35
+ input?: unknown;
36
+ output?: unknown;
37
+ errorText?: string | null;
38
+ presentation?: Record<string, unknown> | null;
39
+ raw: Record<string, unknown>;
40
+ };
41
+ export type ChatReasoningPart = {
42
+ id: string;
43
+ type: "reasoning";
44
+ kind: "reasoning";
45
+ label?: string | null;
46
+ text?: string | null;
47
+ status?: string | null;
48
+ raw: Record<string, unknown>;
49
+ };
50
+ export type ChatUiBlocksPart = {
51
+ id: string;
52
+ type: "ui-blocks";
53
+ kind: "ui-blocks";
54
+ state: ChatToolState;
55
+ toolCallId?: string | null;
56
+ contractVersion?: string | null;
57
+ bundle?: Record<string, unknown> | null;
58
+ errorText?: string | null;
59
+ raw: Record<string, unknown>;
60
+ };
61
+ export type ChatHitlKind = "tool_review" | "mcp_auth" | "user_approval" | "app_data_permission";
62
+ export type ChatHitlStatus = "pending" | "resolved" | "expired" | "cancelled" | "invalidated";
63
+ export type ChatHitlPart = {
64
+ id: string;
65
+ type: "hitl";
66
+ kind: "hitl";
67
+ interruptId: string;
68
+ hitlKind: ChatHitlKind;
69
+ message: string;
70
+ allowedActions: HitlAction[];
71
+ status: ChatHitlStatus;
72
+ presentation: Record<string, unknown>;
73
+ resolution?: Record<string, unknown> | null;
74
+ raw: Record<string, unknown>;
75
+ };
76
+ export type ChatErrorPart = {
77
+ id: string;
78
+ type: "error";
79
+ kind: "error";
80
+ errorText: string;
81
+ raw: Record<string, unknown>;
82
+ };
83
+ export type ChatDataPart = {
84
+ id: string;
85
+ type: "data";
86
+ kind: "data";
87
+ name: string;
88
+ data: Record<string, unknown>;
89
+ raw: Record<string, unknown>;
90
+ };
91
+ export type ChatSourcePart = {
92
+ id: string;
93
+ type: "source";
94
+ kind: "source";
95
+ title: string;
96
+ url?: string | null;
97
+ description?: string | null;
98
+ raw: Record<string, unknown>;
99
+ };
100
+ export type ChatCitationPart = {
101
+ id: string;
102
+ type: "citation";
103
+ kind: "citation";
104
+ sourceId?: string | null;
105
+ label?: string | null;
106
+ url?: string | null;
107
+ raw: Record<string, unknown>;
108
+ };
109
+ export type ChatAttachmentPart = {
110
+ id: string;
111
+ type: "attachment";
112
+ kind: "attachment";
113
+ attachment: ChatAttachment;
114
+ raw: Record<string, unknown>;
115
+ };
116
+ export type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;
117
+ export type ChatMessage = {
118
+ id: string;
119
+ role: AgentChatMessageRole;
120
+ runId?: string | null;
121
+ content: string;
122
+ createdAt: Date | string;
123
+ isFinal?: boolean;
124
+ parts: ChatPart[];
125
+ attachments?: ChatAttachment[];
126
+ citations?: ChatCitation[];
127
+ liked?: boolean;
128
+ disliked?: boolean;
129
+ messageIndex?: number;
130
+ reasoningSteps?: Array<Record<string, unknown>>;
131
+ thinkingDurationMs?: number;
132
+ tokenUsage?: {
133
+ inputTokens?: number | null;
134
+ outputTokens?: number | null;
135
+ totalTokens?: number | null;
136
+ usageSource?: string | null;
137
+ };
138
+ isVoice?: boolean;
139
+ };
140
+ export type StoredChatThread = ThreadSummary & {
141
+ messages: ChatMessage[];
142
+ isHydrated?: boolean;
143
+ hasOlderTurns?: boolean;
144
+ nextBeforeTurnIndex?: number | null;
145
+ };
146
+ export declare function partsFromResponseBlocks(blocks: unknown, fallbackText?: string): ChatPart[];
147
+ export declare function assistantProjectionFromEvent(event: RuntimeEvent): {
148
+ content: string;
149
+ parts: ChatPart[];
150
+ };
151
+ export declare function threadDetailToMessages(detail: ThreadDetail): ChatMessage[];
152
+ export declare function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment;
@@ -0,0 +1,26 @@
1
+ import type { AgentClient } from "@agents24/client";
2
+ import * as React from "react";
3
+ import type { AbortControllerFactory } from "./lifecycle";
4
+ import type { StoredChatThread } from "./model";
5
+ export type AgentChatStorage = {
6
+ loadThreads(): StoredChatThread[];
7
+ saveThreads(threads: readonly StoredChatThread[]): void;
8
+ loadActiveThreadId?(): string | null;
9
+ saveActiveThreadId?(threadId: string | null): void;
10
+ };
11
+ export type Agents24ReactRuntime = {
12
+ client: AgentClient;
13
+ createAbortController: AbortControllerFactory;
14
+ createId: () => string;
15
+ storage?: AgentChatStorage;
16
+ };
17
+ export type Agents24ProviderProps = {
18
+ children: React.ReactNode;
19
+ client: AgentClient;
20
+ createAbortController: AbortControllerFactory;
21
+ createId?: () => string;
22
+ storage?: AgentChatStorage;
23
+ };
24
+ export declare function Agents24Provider({ children, client, createAbortController, createId, storage, }: Agents24ProviderProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function useAgents24Runtime(): Agents24ReactRuntime;
26
+ export declare function useAgentClient(): AgentClient;
@@ -0,0 +1,29 @@
1
+ import type { RuntimeEvent, ThreadSummaryEvent } from "@agents24/client";
2
+ import type { ChatMessage, StoredChatThread } from "./model";
3
+ export type AgentChatState = {
4
+ threads: StoredChatThread[];
5
+ activeThreadId: string | null;
6
+ messages: ChatMessage[];
7
+ activeRunId: string | null;
8
+ cursor: number | null;
9
+ streamingMessageId: string | null;
10
+ runState: "idle" | "streaming" | "reconnecting" | "paused" | "completed" | "failed";
11
+ error: unknown;
12
+ };
13
+ export declare const initialAgentChatState: AgentChatState;
14
+ export type StableChatMessageBase = {
15
+ id: string;
16
+ role: "user" | "assistant";
17
+ runId?: string | null;
18
+ };
19
+ export type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {
20
+ baseMessages?: TMessage[];
21
+ create: () => TMessage;
22
+ messageId?: string | null;
23
+ runId?: string | null;
24
+ update: (message: TMessage) => TMessage;
25
+ };
26
+ export declare function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(messages: TMessage[], userMessage: TMessage, assistantMessage: TMessage): TMessage[];
27
+ export declare function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(messages: TMessage[], input: StableAssistantUpsertInput<TMessage>): TMessage[];
28
+ export declare function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState;
29
+ export declare function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[];
@@ -0,0 +1,38 @@
1
+ import type { AgentClient, HitlAction } from "@agents24/client";
2
+ import type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from "./model";
3
+ import { type AgentChatState } from "./state";
4
+ export type AgentChatSubmitInput = {
5
+ text: string;
6
+ attachmentIds?: readonly string[];
7
+ attachments?: ChatAttachment[];
8
+ requestedModelId?: string;
9
+ };
10
+ export type UseAgentChatOptions = {
11
+ activeThreadId?: string | null;
12
+ client?: AgentClient;
13
+ pageSize?: number;
14
+ threadPageSize?: number;
15
+ };
16
+ export type AgentChatController = AgentChatState & {
17
+ activeThread: StoredChatThread | null;
18
+ hasOlderTurns: boolean;
19
+ hasMoreThreads: boolean;
20
+ isLoadingHistory: boolean;
21
+ isLoadingMoreThreads: boolean;
22
+ isLoadingOlder: boolean;
23
+ isLoadingThreads: boolean;
24
+ isSubmitting: boolean;
25
+ attachRun(runId: string, cursor?: number): Promise<void>;
26
+ cancelRun(): Promise<void>;
27
+ deleteThread(threadId: string): Promise<void>;
28
+ detach(): void;
29
+ loadOlder(): Promise<void>;
30
+ loadMoreThreads(): Promise<void>;
31
+ openThread(threadId: string): Promise<void>;
32
+ refreshThreads(): Promise<void>;
33
+ regenerate(message: ChatMessage): Promise<void>;
34
+ resumeHitl(part: ChatHitlPart, action: HitlAction, comment?: string): Promise<void>;
35
+ startNewThread(): void;
36
+ submit(input: AgentChatSubmitInput): Promise<void>;
37
+ };
38
+ export declare function useAgentChat(options?: UseAgentChatOptions): AgentChatController;
@@ -0,0 +1,67 @@
1
+ import type { AbortSignalLike, AttachmentResult, BinaryUploadData, HitlAction, HitlResumeResult, McpAuthorizationResult, McpCallbackResult, RuntimeEvent, ThreadDetail, ThreadSummary } from "@agents24/client";
2
+ export declare function useAgentThreads(options?: {
3
+ limit?: number;
4
+ skip?: number;
5
+ }): {
6
+ error: unknown;
7
+ isLoading: boolean;
8
+ refresh: () => Promise<void>;
9
+ threads: ThreadSummary[];
10
+ total: number | undefined;
11
+ };
12
+ export declare function useAgentThread(threadId: string | null, options?: {
13
+ limit?: number;
14
+ beforeTurnIndex?: number;
15
+ includeRunEvents?: boolean;
16
+ }): {
17
+ error: unknown;
18
+ isLoading: boolean;
19
+ refresh: () => Promise<ThreadDetail | null>;
20
+ thread: ThreadDetail | null;
21
+ };
22
+ export declare function useAgentRun(): {
23
+ attach: (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => Promise<import("@agents24/client").StreamResult>;
24
+ cancel: (runId: string) => Promise<Record<string, unknown>>;
25
+ detach: () => void;
26
+ error: unknown;
27
+ isAttached: boolean;
28
+ };
29
+ export declare function useAgentAttachments(): {
30
+ isUploading: boolean;
31
+ upload: (input: {
32
+ data: BinaryUploadData;
33
+ name: string;
34
+ mediaType: string;
35
+ threadId?: string;
36
+ signal?: AbortSignalLike;
37
+ }) => Promise<import("./model").ChatAttachment>;
38
+ uploads: Record<string, AttachmentResult>;
39
+ };
40
+ export declare function useAgentHitl(): {
41
+ isResolving: boolean;
42
+ lastResult: HitlResumeResult | null;
43
+ resume: (input: {
44
+ runId: string;
45
+ interruptId: string;
46
+ action: HitlAction;
47
+ comment?: string;
48
+ signal?: AbortSignalLike;
49
+ }) => Promise<HitlResumeResult>;
50
+ };
51
+ export declare function useAgentMcp(): {
52
+ isAuthorizing: boolean;
53
+ redeemCallback: (input: {
54
+ code: string;
55
+ codeVerifier: string;
56
+ signal?: AbortSignalLike;
57
+ }) => Promise<McpCallbackResult>;
58
+ startAuthorization: (input: {
59
+ runId: string;
60
+ serverId: string;
61
+ interruptId: string;
62
+ redirectUri: string;
63
+ popupNonce: string;
64
+ codeChallenge: string;
65
+ signal?: AbortSignalLike;
66
+ }) => Promise<McpAuthorizationResult>;
67
+ };
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@agents24/react",
3
+ "version": "0.1.0",
4
+ "description": "DOM-free React state and hooks for Agents24 client applications.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/daniel5426/talmudpedia.git",
9
+ "directory": "packages/agents24-react"
10
+ },
11
+ "type": "module",
12
+ "main": "./dist/index.js",
13
+ "module": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "./compatibility.json": "./compatibility.json"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "compatibility.json",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "sideEffects": false,
29
+ "publishConfig": {
30
+ "access": "public",
31
+ "provenance": false
32
+ },
33
+ "scripts": {
34
+ "sync:contract": "node scripts/sync-contract.mjs",
35
+ "check:contract": "node scripts/sync-contract.mjs --check",
36
+ "build": "pnpm run sync:contract && tsup && tsc -p tsconfig.build.json",
37
+ "typecheck": "tsc -p tsconfig.json --noEmit",
38
+ "test": "tsx --test tests/*.test.ts",
39
+ "check:boundaries": "node tests/check-boundaries.mjs",
40
+ "prepack": "pnpm run build && pnpm run check:boundaries"
41
+ },
42
+ "dependencies": {
43
+ "@agents24/client": "0.1.0"
44
+ },
45
+ "peerDependencies": {
46
+ "react": ">=19.0.0 <20.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/react": "^19.2.3",
50
+ "react": "^19.2.3",
51
+ "tsup": "^8.5.1",
52
+ "tsx": "^4.20.6",
53
+ "typescript": "^5.9.3"
54
+ }
55
+ }