@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.
- package/LICENSE +19 -0
- package/README.md +31 -0
- package/compatibility.json +54 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +707 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +8 -0
- package/dist/model.d.ts +152 -0
- package/dist/provider.d.ts +26 -0
- package/dist/state.d.ts +29 -0
- package/dist/use-agent-chat.d.ts +38 -0
- package/dist/use-agent-resources.d.ts +67 -0
- package/package.json +55 -0
|
@@ -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;
|
package/dist/model.d.ts
ADDED
|
@@ -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;
|
package/dist/state.d.ts
ADDED
|
@@ -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
|
+
}
|