@agents24/chat-react 0.5.32 → 0.5.34

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/use-agent-chat-runtime.ts","../../src/runtime/use-delegation-tasks.ts"],"sourcesContent":["import type {\n AgentClient,\n Agents24ClientError,\n ClientBootstrap,\n EffectiveResourcePolicy,\n HitlResponse,\n PortableUpload,\n} from \"@agents24/client\";\nimport type { ContextCompression, ContextWindow } from \"@agents24/client/protocol\";\nimport {\n type AgentChatController,\n type ChatAttachment,\n type ChatHitlPart,\n useAgentAttachments,\n useAgentChat,\n useAgentMcp,\n} from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport {\n browserChatCrypto,\n createMcpPkceProof,\n validateMcpCallbackResult,\n waitForMcpOauthComplete,\n} from \"../mcp-oauth\";\nimport type { ChatMcpOauthCompletion } from \"../types\";\nimport { validateAgentChatSubmission } from \"./input-contract\";\n\nexport type AgentChatRuntimeAgent = {\n name: string;\n description?: string | null;\n handle?: string | null;\n avatarUrl?: string | null;\n};\n\nexport type AgentChatRuntimeModel = {\n id: string;\n label: string;\n};\n\nexport type AgentChatRuntimeAgentOption = { id: string; label: string };\n\nexport type AgentChatRuntimeViewState =\n | \"ready\"\n | \"loading\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"cancelling\"\n | \"cancelled\"\n | \"offline\"\n | \"denied\"\n | \"quota\"\n | \"failed\"\n | \"expired\";\n\nexport type AgentChatRuntimeConnectionState =\n | \"connected\"\n | \"connecting\"\n | \"reconnecting\"\n | \"offline\"\n | \"expired\";\n\nexport type AgentChatThreadChangeReason = \"created\" | \"opened\" | \"new\" | \"deleted\";\n\nexport type AgentChatActiveThreadChange = {\n threadId: string | null;\n reason: AgentChatThreadChangeReason;\n};\n\nexport type AgentChatActiveThreadChangeHandler = (\n change: AgentChatActiveThreadChange,\n) => void;\n\nexport type AgentChatMcpAuthorizationCompletion = (input: {\n completion: ChatMcpOauthCompletion;\n codeVerifier: string;\n serverId: string;\n}) => Promise<void>;\n\nexport type AgentChatRuntimeSubmit = {\n text: string;\n files?: readonly PortableUpload[];\n attachments?: ChatAttachment[];\n attachmentIds?: readonly string[];\n};\n\nexport type AgentChatRuntimeHitlActionState = {\n action: string;\n error?: string | null;\n status: \"connecting\" | \"resuming\" | \"error\";\n};\n\nexport type UseAgentChatRuntimeOptions = {\n activeThreadId?: string | null;\n agent?: AgentChatRuntimeAgent;\n client: AgentClient;\n completeMcpAuthorization?: AgentChatMcpAuthorizationCompletion;\n mcpRedirectUri?: string;\n modelId?: string | null;\n onActiveThreadIdChange?: AgentChatActiveThreadChangeHandler;\n onModelChange?: (modelId: string) => void;\n};\n\nexport type AgentChatRuntime = {\n agent: AgentChatRuntimeAgent;\n inputContract: ClientBootstrap[\"features\"][\"inputs\"] | null;\n allowFeedback: boolean;\n backgroundError: unknown;\n bootstrap: ClientBootstrap | null;\n capabilities: readonly string[];\n agentId: string | null;\n agents: AgentChatRuntimeAgentOption[];\n changeAgent(agentId: string): Promise<void>;\n changeModel(modelId: string): void;\n clearOperationError(): void;\n connectionState: AgentChatRuntimeConnectionState;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n controller: AgentChatController;\n deleteThread(threadId: string): Promise<void>;\n errorMessage: string | null;\n fatalError: unknown;\n getHitlActionState(part: ChatHitlPart): AgentChatRuntimeHitlActionState | undefined;\n isBootstrapping: boolean;\n isChangingAgent: boolean;\n isSubmitting: boolean;\n isUploading: boolean;\n modelId: string | null;\n models: AgentChatRuntimeModel[];\n newThread(): void;\n onHitlAction(part: ChatHitlPart, response: HitlResponse): Promise<void>;\n openThread(threadId: string): Promise<void>;\n operationError: unknown;\n retryBootstrap(): Promise<void>;\n resolveAttachmentContent(\n attachment: ChatAttachment,\n signal: AbortSignal,\n ): Promise<{ url: string; validUntil: string | null }>;\n state: AgentChatRuntimeViewState;\n submit(input: AgentChatRuntimeSubmit): Promise<void>;\n};\n\ntype PendingThreadTransition = {\n reason: \"opened\" | \"deleted\";\n value: string | null;\n};\n\nexport function agentChatRuntimeStateFromError(error: unknown): AgentChatRuntimeViewState {\n const typed = error as Partial<Agents24ClientError> | null;\n if (typed?.kind === \"authentication\") return \"expired\";\n if (typed?.kind === \"authorization\") return \"denied\";\n if (typed?.kind === \"quota\" || typed?.kind === \"rate_limit\") return \"quota\";\n if (typed?.kind === \"network\") return \"offline\";\n return \"failed\";\n}\n\nexport function agentChatRuntimeErrorMessage(error: unknown): string | null {\n if (!error) return null;\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function canChangeAgentRuntime(\n runState: AgentChatController[\"runState\"],\n activeRunId: string | null,\n): boolean {\n return !activeRunId && ![\"uploading\", \"streaming\", \"reconnecting\", \"paused\", \"cancelling\"].includes(runState);\n}\n\nexport function agentIdFromBootstrap(\n bootstrap: ClientBootstrap,\n requestedAgentId: string | null,\n): string | null {\n const feature = bootstrap.features.agents;\n if (!feature) return null;\n return feature.options.some((item) => item.id === requestedAgentId)\n ? requestedAgentId\n : feature.default_id || null;\n}\n\nexport function modelsFromAgentChatBootstrap(bootstrap: ClientBootstrap): {\n defaultModelId: string | null;\n models: AgentChatRuntimeModel[];\n} {\n const modelFeatures = bootstrap.features.models;\n const selectable = bootstrap.capabilities.includes(\"models.select\") && modelFeatures?.selectable === true;\n if (!selectable) return { defaultModelId: null, models: [] };\n const models = Array.isArray(modelFeatures.options)\n ? modelFeatures.options.flatMap((option) => (\n typeof option?.id === \"string\" && option.id.trim()\n ? [{ id: option.id, label: typeof option.label === \"string\" && option.label.trim() ? option.label : option.id }]\n : []\n ))\n : [];\n const configuredDefault = models.some((model) => model.id === modelFeatures.default_id)\n ? modelFeatures.default_id\n : null;\n return {\n defaultModelId: configuredDefault,\n models,\n };\n}\n\nfunction modelsFromEffectivePolicy(policy: EffectiveResourcePolicy): {\n defaultModelId: string | null;\n models: AgentChatRuntimeModel[];\n} {\n const models = policy.model_selection.selectable\n ? policy.model_selection.options.map((option) => ({ id: option.id, label: option.label }))\n : [];\n return {\n defaultModelId: models.some((model) => model.id === policy.model_selection.default_id)\n ? policy.model_selection.default_id\n : null,\n models,\n };\n}\n\nfunction hitlKey(part: ChatHitlPart): string {\n return part.interruptId || part.id;\n}\n\nexport function useAgentChatRuntime(options: UseAgentChatRuntimeOptions): AgentChatRuntime {\n const {\n activeThreadId,\n agent: agentOverride,\n client,\n completeMcpAuthorization,\n mcpRedirectUri,\n modelId,\n onActiveThreadIdChange,\n onModelChange,\n } = options;\n const controller = useAgentChat(\n activeThreadId === undefined ? { client } : { activeThreadId, client },\n );\n const attachments = useAgentAttachments();\n const mcp = useAgentMcp();\n const [bootstrap, setBootstrap] = React.useState<ClientBootstrap | null>(null);\n const bootstrapRef = React.useRef<ClientBootstrap | null>(bootstrap);\n bootstrapRef.current = bootstrap;\n const [effectivePolicy, setEffectivePolicy] = React.useState<EffectiveResourcePolicy | null>(null);\n const [isBootstrapping, setIsBootstrapping] = React.useState(true);\n const [bootstrapError, setBootstrapError] = React.useState<unknown>(null);\n const [localOperationError, setLocalOperationError] = React.useState<unknown>(null);\n const [selectedModelId, setSelectedModelId] = React.useState<string | null>(modelId ?? null);\n const selectedModelIdRef = React.useRef<string | null>(selectedModelId);\n selectedModelIdRef.current = selectedModelId;\n const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null);\n const selectedAgentIdRef = React.useRef<string | null>(null);\n selectedAgentIdRef.current = selectedAgentId;\n const [isChangingAgent, setIsChangingAgent] = React.useState(false);\n const agentChangePromiseRef = React.useRef<Promise<void> | null>(null);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const submitPromiseRef = React.useRef<Promise<void> | null>(null);\n const [hitlStates, setHitlStates] = React.useState<Record<string, AgentChatRuntimeHitlActionState>>({});\n const hitlStatesRef = React.useRef(hitlStates);\n hitlStatesRef.current = hitlStates;\n\n const mountedRef = React.useRef(true);\n const clientRef = React.useRef(client);\n clientRef.current = client;\n const bootstrapPromiseRef = React.useRef<{ client: AgentClient; promise: Promise<void> } | null>(null);\n React.useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const previousControlledThreadRef = React.useRef(activeThreadId);\n const threadSelectionGenerationRef = React.useRef(0);\n const controlledSyncTargetRef = React.useRef<{ value: string | null } | null>(null);\n const previousControllerThreadRef = React.useRef(controller.activeThreadId);\n const pendingThreadTransitionRef = React.useRef<PendingThreadTransition | null>(null);\n const lastReportedThreadRef = React.useRef<string | null>(activeThreadId ?? controller.activeThreadId);\n if (activeThreadId !== previousControlledThreadRef.current) {\n threadSelectionGenerationRef.current += 1;\n previousControlledThreadRef.current = activeThreadId;\n if (activeThreadId !== undefined) {\n controlledSyncTargetRef.current = { value: activeThreadId };\n lastReportedThreadRef.current = activeThreadId;\n }\n }\n\n const reportActiveThread = React.useCallback((\n threadId: string | null,\n reason: AgentChatThreadChangeReason,\n ) => {\n if (lastReportedThreadRef.current === threadId) return;\n lastReportedThreadRef.current = threadId;\n onActiveThreadIdChange?.({ threadId, reason });\n }, [onActiveThreadIdChange]);\n\n const retryBootstrap = React.useCallback((): Promise<void> => {\n if (bootstrapPromiseRef.current?.client === client) return bootstrapPromiseRef.current.promise;\n const requestClient = client;\n const request = (async () => {\n if (mountedRef.current) {\n setIsBootstrapping(true);\n setBootstrapError(null);\n setBootstrap(null);\n setEffectivePolicy(null);\n }\n try {\n const requestedAgentId = selectedAgentIdRef.current;\n const result = await requestClient.bootstrap({ agentId: requestedAgentId || undefined });\n if (!mountedRef.current || clientRef.current !== requestClient) return;\n setBootstrap(result);\n const agentFeature = result.features.agents;\n const resolvedAgentId = agentIdFromBootstrap(result, requestedAgentId);\n setSelectedAgentId(resolvedAgentId);\n const entitlement = agentFeature ? null : await requestClient.resourcePolicies.getEffective();\n if (!mountedRef.current || clientRef.current !== requestClient) return;\n setEffectivePolicy(entitlement);\n const availableModels = entitlement ? modelsFromEffectivePolicy(entitlement) : modelsFromAgentChatBootstrap(result);\n if (modelId === undefined) {\n setSelectedModelId((current) => availableModels.models.some((item) => item.id === current)\n ? current\n : availableModels.defaultModelId);\n }\n await controller.refreshThreads().catch(() => undefined);\n } catch (error) {\n if (mountedRef.current && clientRef.current === requestClient) setBootstrapError(error);\n } finally {\n if (mountedRef.current && clientRef.current === requestClient) setIsBootstrapping(false);\n }\n })();\n bootstrapPromiseRef.current = { client: requestClient, promise: request };\n void request.finally(() => {\n if (bootstrapPromiseRef.current?.promise === request) bootstrapPromiseRef.current = null;\n });\n return request;\n }, [client, controller.refreshThreads, modelId]);\n\n const refreshEffectivePolicy = React.useCallback(async () => {\n if (bootstrap?.features.agents) {\n const refreshed = await client.bootstrap({ agentId: selectedAgentIdRef.current || undefined });\n if (!mountedRef.current || clientRef.current !== client) return;\n setBootstrap(refreshed);\n const available = modelsFromAgentChatBootstrap(refreshed);\n setSelectedModelId((current) => available.models.some((item) => item.id === current)\n ? current\n : available.defaultModelId);\n return;\n }\n const entitlement = await client.resourcePolicies.getEffective();\n if (!mountedRef.current || clientRef.current !== client) return;\n setEffectivePolicy(entitlement);\n if (modelId === undefined) {\n const available = modelsFromEffectivePolicy(entitlement);\n setSelectedModelId((current) => available.models.some((item) => item.id === current)\n ? current\n : available.defaultModelId);\n }\n }, [bootstrap, client, modelId]);\n\n React.useEffect(() => {\n void retryBootstrap();\n }, [retryBootstrap]);\n\n React.useEffect(() => {\n if (modelId !== undefined) setSelectedModelId(modelId);\n }, [modelId]);\n\n React.useEffect(() => {\n hitlStatesRef.current = {};\n setHitlStates({});\n }, [client, controller.activeThreadId]);\n\n React.useEffect(() => {\n if (controlledSyncTargetRef.current?.value === null && controller.activeThreadId) {\n controller.startNewThread();\n }\n }, [activeThreadId, controller.activeThreadId, controller.startNewThread]);\n\n React.useEffect(() => {\n const previous = previousControllerThreadRef.current;\n const current = controller.activeThreadId;\n previousControllerThreadRef.current = current;\n const controlledTarget = controlledSyncTargetRef.current;\n if (controlledTarget) {\n if (current === controlledTarget.value) controlledSyncTargetRef.current = null;\n return;\n }\n const pendingTransition = pendingThreadTransitionRef.current;\n if (pendingTransition && current === pendingTransition.value) return;\n if (previous === null && current !== null) reportActiveThread(current, \"created\");\n }, [activeThreadId, controller.activeThreadId, reportActiveThread]);\n\n const clearOperationError = React.useCallback(() => {\n setLocalOperationError(null);\n controller.clearOperationError();\n }, [controller.clearOperationError]);\n\n const submit = React.useCallback((input: AgentChatRuntimeSubmit): Promise<void> => {\n if (submitPromiseRef.current) return submitPromiseRef.current;\n clearOperationError();\n setIsSubmitting(true);\n const request = (async () => {\n try {\n await agentChangePromiseRef.current;\n const activeBootstrap = bootstrapRef.current;\n if (!activeBootstrap) throw new Error(\"The agent input contract is unavailable.\");\n const retained = (input.attachments || []).filter((attachment) => input.attachmentIds?.includes(attachment.id || \"\"));\n const inputError = validateAgentChatSubmission(activeBootstrap.features.inputs, input.text, [\n ...(input.files || []),\n ...retained.map((attachment) => ({ data: new Uint8Array(), mediaType: attachment.mediaType || \"application/octet-stream\" })),\n ]);\n if (inputError) throw new Error(inputError);\n await controller.submit({\n text: input.text,\n attachments: input.attachments,\n uploads: input.files,\n attachmentIds: input.attachmentIds,\n requestedModelId: selectedModelIdRef.current || undefined,\n requestedAgentId: selectedAgentIdRef.current || undefined,\n });\n } catch (error) {\n setLocalOperationError(error);\n const typed = error as Partial<Agents24ClientError>;\n if (typed.kind === \"quota\" || typed.kind === \"authorization\") {\n await refreshEffectivePolicy().catch(() => undefined);\n }\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n })();\n submitPromiseRef.current = request;\n const clearRequest = () => {\n if (submitPromiseRef.current === request) submitPromiseRef.current = null;\n };\n void request.then(clearRequest, clearRequest);\n return request;\n }, [bootstrap, clearOperationError, controller.activeThreadId, controller.submit, refreshEffectivePolicy]);\n\n const completeMcp = React.useCallback(async (part: ChatHitlPart) => {\n if (!mcpRedirectUri) throw new Error(\"mcpRedirectUri is required for MCP Connect.\");\n const serverId = String(part.presentation.server_id || \"\").trim();\n if (!serverId) throw new Error(\"MCP authorization is missing its server identity.\");\n const runId = controller.activeRunId || controller.messages.find((message) => message.parts.includes(part))?.runId;\n if (!runId) throw new Error(\"MCP authorization is missing its paused run.\");\n const popupNonce = browserChatCrypto().randomUUID();\n const proof = await createMcpPkceProof();\n const popup = window.open(\"about:blank\", \"agents24-mcp\", \"popup,width=560,height=720\");\n if (!popup) throw new Error(\"Allow popups to connect this MCP account.\");\n popup.document.title = \"Connecting to MCP\";\n popup.document.body.textContent = \"Opening secure connection…\";\n try {\n const started = await mcp.startAuthorization({\n runId,\n serverId,\n interruptId: part.interruptId,\n redirectUri: mcpRedirectUri,\n popupNonce,\n codeChallenge: proof.challenge,\n });\n if (!started.callback_origin) throw new Error(\"MCP authorization did not return a callback origin.\");\n popup.location.replace(started.authorization_url);\n const completion = await waitForMcpOauthComplete({\n popup,\n callbackOrigin: started.callback_origin,\n popupNonce,\n requireConnectionId: Boolean(completeMcpAuthorization),\n serverId,\n });\n if (completeMcpAuthorization) {\n await completeMcpAuthorization({ completion, codeVerifier: proof.verifier, serverId });\n } else {\n const redeemed = await mcp.redeemCallback({ code: completion.code, codeVerifier: proof.verifier });\n validateMcpCallbackResult(redeemed, serverId);\n }\n } finally {\n popup.close();\n }\n }, [completeMcpAuthorization, controller.activeRunId, controller.messages, mcp, mcpRedirectUri]);\n\n const onHitlAction = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const action = response.action;\n const key = hitlKey(part);\n const current = hitlStatesRef.current[key];\n if (current?.status === \"connecting\" || current?.status === \"resuming\") return;\n clearOperationError();\n const pending: AgentChatRuntimeHitlActionState = {\n action,\n status: part.hitlKind === \"mcp_auth\" && action === \"connect\" ? \"connecting\" : \"resuming\",\n };\n hitlStatesRef.current = { ...hitlStatesRef.current, [key]: pending };\n setHitlStates(hitlStatesRef.current);\n try {\n if (part.hitlKind === \"mcp_auth\" && action === \"connect\") await completeMcp(part);\n await controller.resumeHitl(part, response);\n setHitlStates((states) => {\n const next = { ...states };\n delete next[key];\n hitlStatesRef.current = next;\n return next;\n });\n } catch (error) {\n setLocalOperationError(error);\n const failedState = {\n ...hitlStatesRef.current,\n [key]: { action, error: agentChatRuntimeErrorMessage(error), status: \"error\" },\n } satisfies Record<string, AgentChatRuntimeHitlActionState>;\n hitlStatesRef.current = failedState;\n setHitlStates(failedState);\n throw error;\n }\n }, [clearOperationError, completeMcp, controller.resumeHitl]);\n\n const newThread = React.useCallback(() => {\n threadSelectionGenerationRef.current += 1;\n clearOperationError();\n pendingThreadTransitionRef.current = null;\n reportActiveThread(null, \"new\");\n controller.startNewThread();\n }, [clearOperationError, controller.startNewThread, reportActiveThread]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const requestGeneration = ++threadSelectionGenerationRef.current;\n clearOperationError();\n pendingThreadTransitionRef.current = { reason: \"opened\", value: threadId };\n try {\n const detail = await client.threads.get({ threadId });\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n const preferredAgentId = detail.runtime_selection?.agent_alias || detail.runtime_selection?.agent_id || null;\n if (preferredAgentId) {\n const result = await client.bootstrap({ agentId: preferredAgentId });\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n const resolvedAgentId = agentIdFromBootstrap(result, preferredAgentId);\n setBootstrap(result);\n setEffectivePolicy(null);\n setSelectedAgentId(resolvedAgentId);\n const available = modelsFromAgentChatBootstrap(result);\n const preferredModelId = detail.runtime_selection?.model_id || null;\n setSelectedModelId(available.models.some((item) => item.id === preferredModelId)\n ? preferredModelId\n : available.defaultModelId);\n }\n await controller.openThread(threadId);\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n reportActiveThread(threadId, \"opened\");\n } catch (error) {\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n setLocalOperationError(error);\n throw error;\n } finally {\n if (requestGeneration === threadSelectionGenerationRef.current) pendingThreadTransitionRef.current = null;\n }\n }, [clearOperationError, client, controller.openThread, reportActiveThread]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n clearOperationError();\n const wasActive = controller.activeThreadId === threadId;\n if (wasActive) threadSelectionGenerationRef.current += 1;\n if (wasActive) pendingThreadTransitionRef.current = { reason: \"deleted\", value: null };\n try {\n await controller.deleteThread(threadId);\n if (wasActive) reportActiveThread(null, \"deleted\");\n } catch (error) {\n setLocalOperationError(error);\n throw error;\n } finally {\n if (wasActive && pendingThreadTransitionRef.current?.reason === \"deleted\") {\n pendingThreadTransitionRef.current = null;\n }\n }\n }, [clearOperationError, controller.activeThreadId, controller.deleteThread, reportActiveThread]);\n\n const changeModel = React.useCallback((nextModelId: string) => {\n if (modelId === undefined) setSelectedModelId(nextModelId);\n onModelChange?.(nextModelId);\n if (controller.activeThreadId && selectedAgentId && client.threads.setRuntimeSelection) {\n void client.threads.setRuntimeSelection({\n threadId: controller.activeThreadId,\n preferredAgentId: selectedAgentId,\n preferredModelId: nextModelId,\n }).catch(setLocalOperationError);\n }\n }, [client.threads, controller.activeThreadId, modelId, onModelChange, selectedAgentId]);\n\n const resolveAttachmentContent = React.useCallback(async (\n attachment: ChatAttachment,\n signal: AbortSignal,\n ) => {\n const attachmentId = typeof attachment.id === \"string\" ? attachment.id.trim() : \"\";\n if (!attachmentId) throw new Error(\"Attachment content identity is unavailable.\");\n const access = await attachments.createContentAccess({\n attachmentId,\n disposition: \"inline\",\n signal,\n });\n return { url: access.url, validUntil: access.valid_until || null };\n }, [attachments.createContentAccess]);\n\n const changeAgent = React.useCallback((nextAgentId: string): Promise<void> => {\n if (agentChangePromiseRef.current) return agentChangePromiseRef.current;\n if (\n nextAgentId === selectedAgentIdRef.current\n || !canChangeAgentRuntime(controller.runState, controller.activeRunId)\n ) return Promise.resolve();\n clearOperationError();\n setIsChangingAgent(true);\n const request = (async () => {\n try {\n const result = await client.bootstrap({ agentId: nextAgentId });\n const resolvedAgentId = agentIdFromBootstrap(result, nextAgentId);\n if (!resolvedAgentId) throw new Error(\"The requested Agent is no longer available.\");\n const available = modelsFromAgentChatBootstrap(result);\n const currentModelId = selectedModelIdRef.current;\n const nextModelId = available.models.some((item) => item.id === currentModelId)\n ? currentModelId\n : available.defaultModelId;\n if (controller.activeThreadId && client.threads.setRuntimeSelection) {\n const persisted = await client.threads.setRuntimeSelection({\n threadId: controller.activeThreadId,\n preferredAgentId: resolvedAgentId,\n preferredModelId: nextModelId,\n });\n selectedModelIdRef.current = persisted.runtime_selection.model_id;\n setSelectedModelId(persisted.runtime_selection.model_id);\n } else {\n selectedModelIdRef.current = nextModelId;\n setSelectedModelId(nextModelId);\n }\n selectedAgentIdRef.current = resolvedAgentId;\n bootstrapRef.current = result;\n setSelectedAgentId(resolvedAgentId);\n setBootstrap(result);\n setEffectivePolicy(null);\n } catch (error) {\n setLocalOperationError(error);\n throw error;\n }\n })();\n agentChangePromiseRef.current = request;\n const clearRequest = () => {\n if (agentChangePromiseRef.current === request) agentChangePromiseRef.current = null;\n if (mountedRef.current) setIsChangingAgent(false);\n };\n void request.then(clearRequest, clearRequest);\n return request;\n }, [clearOperationError, client, controller.activeRunId, controller.activeThreadId, controller.runState]);\n\n const modelOptions = effectivePolicy\n ? modelsFromEffectivePolicy(effectivePolicy).models\n : bootstrap\n ? modelsFromAgentChatBootstrap(bootstrap).models\n : [];\n const fatalError = bootstrapError || controller.error;\n const operationError = localOperationError || controller.operationError?.cause;\n const state: AgentChatRuntimeViewState = isBootstrapping\n ? \"loading\"\n : fatalError\n ? agentChatRuntimeStateFromError(fatalError)\n : controller.runState === \"uploading\"\n ? \"uploading\"\n : controller.runState === \"streaming\"\n ? \"streaming\"\n : controller.runState === \"reconnecting\"\n ? \"reconnecting\"\n : controller.runState === \"paused\"\n ? \"paused\"\n : controller.runState === \"cancelling\"\n ? \"cancelling\"\n : controller.runState === \"cancelled\"\n ? \"cancelled\"\n : \"ready\";\n const connectionState: AgentChatRuntimeConnectionState = state === \"offline\"\n ? \"offline\"\n : state === \"expired\"\n ? \"expired\"\n : state === \"reconnecting\"\n ? \"reconnecting\"\n : isBootstrapping\n ? \"connecting\"\n : \"connected\";\n return {\n agent: agentOverride || { name: bootstrap?.deployment.name || \"Agent\" },\n inputContract: bootstrap?.features.inputs || null,\n allowFeedback: Boolean(bootstrap?.capabilities.includes(\"feedback.write\")),\n backgroundError: controller.backgroundError?.cause || null,\n bootstrap,\n capabilities: bootstrap?.capabilities || [],\n agentId: selectedAgentId,\n agents: bootstrap?.features.agents?.options.map((item) => ({ id: item.id, label: item.label })) || [],\n changeAgent,\n changeModel,\n clearOperationError,\n connectionState,\n contextWindow: controller.contextWindow,\n contextCompression: controller.contextCompression,\n controller,\n deleteThread,\n errorMessage: agentChatRuntimeErrorMessage(fatalError || operationError),\n fatalError,\n getHitlActionState: (part) => hitlStates[hitlKey(part)],\n isBootstrapping,\n isChangingAgent,\n isSubmitting: isSubmitting || controller.isSubmitting,\n isUploading: attachments.isUploading || controller.runState === \"uploading\",\n modelId: selectedModelId,\n models: modelOptions,\n newThread,\n onHitlAction,\n openThread,\n operationError,\n retryBootstrap,\n resolveAttachmentContent,\n state,\n submit,\n };\n}\n","import * as React from \"react\";\nimport type { DelegationEvents, DelegationTask } from \"../generated/delegation-types\";\n\nexport type DelegationTaskSource = {\n events(input: { threadId: string; after: number; signal: AbortSignal }): Promise<DelegationEvents>;\n};\n\n/** Authoritative snapshots keep task discovery alive after the run stream ends. */\nexport function useDelegationTasks({ threadId, source, pollIntervalMs = 2000 }: {\n threadId: string | null;\n source: DelegationTaskSource;\n pollIntervalMs?: number;\n}) {\n const [state, setState] = React.useState<{\n threadId: string | null; tasks: DelegationTask[]; error: unknown; loading: boolean;\n }>({ threadId: null, tasks: [], error: null, loading: false });\n const [revision, refresh] = React.useReducer((value: number) => value + 1, 0);\n React.useEffect(() => {\n if (!threadId) {\n setState({ threadId: null, tasks: [], error: null, loading: false });\n return;\n }\n const controller = new AbortController();\n let cursor = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let failures = 0;\n setState((previous) => ({ threadId, tasks: previous.threadId === threadId ? previous.tasks : [],\n error: null, loading: true }));\n const poll = async () => {\n try {\n const result = await source.events({ threadId, after: cursor, signal: controller.signal });\n if (controller.signal.aborted) return;\n cursor = result.cursor;\n failures = 0;\n setState({ threadId, tasks: result.snapshot, error: null, loading: false });\n } catch (error) {\n if (controller.signal.aborted) return;\n failures += 1;\n setState((previous) => ({ ...previous, error, loading: false }));\n }\n if (!controller.signal.aborted) {\n timer = setTimeout(poll, Math.min(30000, Math.max(250, pollIntervalMs) * 2 ** Math.min(failures, 4)));\n }\n };\n void poll();\n return () => {\n controller.abort();\n if (timer) clearTimeout(timer);\n };\n }, [threadId, source, pollIntervalMs, revision]);\n return { tasks: state.threadId === threadId ? state.tasks : [],\n error: state.threadId === threadId ? state.error : null,\n loading: Boolean(threadId) && (state.threadId !== threadId || state.loading), refresh };\n}\n"],"mappings":"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","names":["React"]}
1
+ {"version":3,"sources":["../../src/runtime/use-agent-chat-runtime.ts","../../src/runtime/use-agent-chat-hitl.ts","../../src/runtime/use-delegation-tasks.ts"],"sourcesContent":["import type {\n AgentClient,\n Agents24ClientError,\n ClientBootstrap,\n EffectiveResourcePolicy,\n HitlResponse,\n PortableUpload,\n} from \"@agents24/client\";\nimport type { ContextCompression, ContextWindow } from \"@agents24/client/protocol\";\nimport {\n type AgentChatController,\n type ChatAttachment,\n type ChatHitlPart,\n useAgentAttachments,\n useAgentChat,\n} from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport { useAgentChatHitl } from \"./use-agent-chat-hitl\";\nimport type { ChatMcpOauthCompletion } from \"../types\";\nimport { validateAgentChatSubmission } from \"./input-contract\";\n\nexport type AgentChatRuntimeAgent = {\n name: string;\n description?: string | null;\n handle?: string | null;\n avatarUrl?: string | null;\n};\n\nexport type AgentChatRuntimeModel = {\n id: string;\n label: string;\n};\n\nexport type AgentChatRuntimeAgentOption = { id: string; label: string };\n\nexport type AgentChatRuntimeViewState =\n | \"ready\"\n | \"loading\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"cancelling\"\n | \"cancelled\"\n | \"offline\"\n | \"denied\"\n | \"quota\"\n | \"failed\"\n | \"expired\";\n\nexport type AgentChatRuntimeConnectionState =\n | \"connected\"\n | \"connecting\"\n | \"reconnecting\"\n | \"offline\"\n | \"expired\";\n\nexport type AgentChatThreadChangeReason = \"created\" | \"opened\" | \"new\" | \"deleted\";\n\nexport type AgentChatActiveThreadChange = {\n threadId: string | null;\n reason: AgentChatThreadChangeReason;\n};\n\nexport type AgentChatActiveThreadChangeHandler = (\n change: AgentChatActiveThreadChange,\n) => void;\n\nexport type AgentChatMcpAuthorizationCompletion = (input: {\n completion: ChatMcpOauthCompletion;\n codeVerifier: string;\n serverId: string;\n}) => Promise<void>;\n\nexport type AgentChatRuntimeSubmit = {\n text: string;\n files?: readonly PortableUpload[];\n attachments?: ChatAttachment[];\n attachmentIds?: readonly string[];\n};\n\nexport type AgentChatRuntimeHitlActionState = {\n action: string;\n error?: string | null;\n status: \"connecting\" | \"resuming\" | \"error\";\n};\n\nexport type UseAgentChatRuntimeOptions = {\n activeThreadId?: string | null;\n agent?: AgentChatRuntimeAgent;\n client: AgentClient;\n completeMcpAuthorization?: AgentChatMcpAuthorizationCompletion;\n mcpRedirectUri?: string;\n modelId?: string | null;\n onActiveThreadIdChange?: AgentChatActiveThreadChangeHandler;\n onModelChange?: (modelId: string) => void;\n};\n\nexport type AgentChatRuntime = {\n agent: AgentChatRuntimeAgent;\n inputContract: ClientBootstrap[\"features\"][\"inputs\"] | null;\n allowFeedback: boolean;\n backgroundError: unknown;\n bootstrap: ClientBootstrap | null;\n capabilities: readonly string[];\n agentId: string | null;\n agents: AgentChatRuntimeAgentOption[];\n changeAgent(agentId: string): Promise<void>;\n changeModel(modelId: string): void;\n clearOperationError(): void;\n connectionState: AgentChatRuntimeConnectionState;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n controller: AgentChatController;\n deleteThread(threadId: string): Promise<void>;\n errorMessage: string | null;\n fatalError: unknown;\n getHitlActionState(part: ChatHitlPart): AgentChatRuntimeHitlActionState | undefined;\n isBootstrapping: boolean;\n isChangingAgent: boolean;\n isSubmitting: boolean;\n isUploading: boolean;\n modelId: string | null;\n models: AgentChatRuntimeModel[];\n newThread(): void;\n onHitlAction(part: ChatHitlPart, response: HitlResponse): Promise<void>;\n openThread(threadId: string): Promise<void>;\n operationError: unknown;\n retryBootstrap(): Promise<void>;\n resolveAttachmentContent(\n attachment: ChatAttachment,\n signal: AbortSignal,\n ): Promise<{ url: string; validUntil: string | null }>;\n state: AgentChatRuntimeViewState;\n submit(input: AgentChatRuntimeSubmit): Promise<void>;\n};\n\ntype PendingThreadTransition = {\n reason: \"opened\" | \"deleted\";\n value: string | null;\n};\n\nexport function agentChatRuntimeStateFromError(error: unknown): AgentChatRuntimeViewState {\n const typed = error as Partial<Agents24ClientError> | null;\n if (typed?.kind === \"authentication\") return \"expired\";\n if (typed?.kind === \"authorization\") return \"denied\";\n if (typed?.kind === \"quota\" || typed?.kind === \"rate_limit\") return \"quota\";\n if (typed?.kind === \"network\") return \"offline\";\n return \"failed\";\n}\n\nexport function agentChatRuntimeErrorMessage(error: unknown): string | null {\n if (!error) return null;\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function canChangeAgentRuntime(\n runState: AgentChatController[\"runState\"],\n activeRunId: string | null,\n): boolean {\n return !activeRunId && ![\"uploading\", \"streaming\", \"reconnecting\", \"paused\", \"cancelling\"].includes(runState);\n}\n\nexport function agentIdFromBootstrap(\n bootstrap: ClientBootstrap,\n requestedAgentId: string | null,\n): string | null {\n const feature = bootstrap.features.agents;\n if (!feature) return null;\n return feature.options.some((item) => item.id === requestedAgentId)\n ? requestedAgentId\n : feature.default_id || null;\n}\n\nexport function modelsFromAgentChatBootstrap(bootstrap: ClientBootstrap): {\n defaultModelId: string | null;\n models: AgentChatRuntimeModel[];\n} {\n const modelFeatures = bootstrap.features.models;\n const selectable = bootstrap.capabilities.includes(\"models.select\") && modelFeatures?.selectable === true;\n if (!selectable) return { defaultModelId: null, models: [] };\n const models = Array.isArray(modelFeatures.options)\n ? modelFeatures.options.flatMap((option) => (\n typeof option?.id === \"string\" && option.id.trim()\n ? [{ id: option.id, label: typeof option.label === \"string\" && option.label.trim() ? option.label : option.id }]\n : []\n ))\n : [];\n const configuredDefault = models.some((model) => model.id === modelFeatures.default_id)\n ? modelFeatures.default_id\n : null;\n return {\n defaultModelId: configuredDefault,\n models,\n };\n}\n\nfunction modelsFromEffectivePolicy(policy: EffectiveResourcePolicy): {\n defaultModelId: string | null;\n models: AgentChatRuntimeModel[];\n} {\n const models = policy.model_selection.selectable\n ? policy.model_selection.options.map((option) => ({ id: option.id, label: option.label }))\n : [];\n return {\n defaultModelId: models.some((model) => model.id === policy.model_selection.default_id)\n ? policy.model_selection.default_id\n : null,\n models,\n };\n}\n\nexport function useAgentChatRuntime(options: UseAgentChatRuntimeOptions): AgentChatRuntime {\n const {\n activeThreadId,\n agent: agentOverride,\n client,\n completeMcpAuthorization,\n mcpRedirectUri,\n modelId,\n onActiveThreadIdChange,\n onModelChange,\n } = options;\n const controller = useAgentChat(\n activeThreadId === undefined ? { client } : { activeThreadId, client },\n );\n const attachments = useAgentAttachments();\n const [bootstrap, setBootstrap] = React.useState<ClientBootstrap | null>(null);\n const bootstrapRef = React.useRef<ClientBootstrap | null>(bootstrap);\n bootstrapRef.current = bootstrap;\n const [effectivePolicy, setEffectivePolicy] = React.useState<EffectiveResourcePolicy | null>(null);\n const [isBootstrapping, setIsBootstrapping] = React.useState(true);\n const [bootstrapError, setBootstrapError] = React.useState<unknown>(null);\n const [localOperationError, setLocalOperationError] = React.useState<unknown>(null);\n const [selectedModelId, setSelectedModelId] = React.useState<string | null>(modelId ?? null);\n const selectedModelIdRef = React.useRef<string | null>(selectedModelId);\n selectedModelIdRef.current = selectedModelId;\n const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null);\n const selectedAgentIdRef = React.useRef<string | null>(null);\n selectedAgentIdRef.current = selectedAgentId;\n const [isChangingAgent, setIsChangingAgent] = React.useState(false);\n const agentChangePromiseRef = React.useRef<Promise<void> | null>(null);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const submitPromiseRef = React.useRef<Promise<void> | null>(null);\n\n const mountedRef = React.useRef(true);\n const clientRef = React.useRef(client);\n clientRef.current = client;\n const bootstrapPromiseRef = React.useRef<{ client: AgentClient; promise: Promise<void> } | null>(null);\n React.useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const previousControlledThreadRef = React.useRef(activeThreadId);\n const threadSelectionGenerationRef = React.useRef(0);\n const controlledSyncTargetRef = React.useRef<{ value: string | null } | null>(null);\n const previousControllerThreadRef = React.useRef(controller.activeThreadId);\n const pendingThreadTransitionRef = React.useRef<PendingThreadTransition | null>(null);\n const lastReportedThreadRef = React.useRef<string | null>(activeThreadId ?? controller.activeThreadId);\n if (activeThreadId !== previousControlledThreadRef.current) {\n threadSelectionGenerationRef.current += 1;\n previousControlledThreadRef.current = activeThreadId;\n if (activeThreadId !== undefined) {\n controlledSyncTargetRef.current = { value: activeThreadId };\n lastReportedThreadRef.current = activeThreadId;\n }\n }\n\n const reportActiveThread = React.useCallback((\n threadId: string | null,\n reason: AgentChatThreadChangeReason,\n ) => {\n if (lastReportedThreadRef.current === threadId) return;\n lastReportedThreadRef.current = threadId;\n onActiveThreadIdChange?.({ threadId, reason });\n }, [onActiveThreadIdChange]);\n\n const retryBootstrap = React.useCallback((): Promise<void> => {\n if (bootstrapPromiseRef.current?.client === client) return bootstrapPromiseRef.current.promise;\n const requestClient = client;\n const request = (async () => {\n if (mountedRef.current) {\n setIsBootstrapping(true);\n setBootstrapError(null);\n setBootstrap(null);\n setEffectivePolicy(null);\n }\n try {\n const requestedAgentId = selectedAgentIdRef.current;\n const result = await requestClient.bootstrap({ agentId: requestedAgentId || undefined });\n if (!mountedRef.current || clientRef.current !== requestClient) return;\n setBootstrap(result);\n const agentFeature = result.features.agents;\n const resolvedAgentId = agentIdFromBootstrap(result, requestedAgentId);\n setSelectedAgentId(resolvedAgentId);\n const entitlement = agentFeature ? null : await requestClient.resourcePolicies.getEffective();\n if (!mountedRef.current || clientRef.current !== requestClient) return;\n setEffectivePolicy(entitlement);\n const availableModels = entitlement ? modelsFromEffectivePolicy(entitlement) : modelsFromAgentChatBootstrap(result);\n if (modelId === undefined) {\n setSelectedModelId((current) => availableModels.models.some((item) => item.id === current)\n ? current\n : availableModels.defaultModelId);\n }\n await controller.refreshThreads().catch(() => undefined);\n } catch (error) {\n if (mountedRef.current && clientRef.current === requestClient) setBootstrapError(error);\n } finally {\n if (mountedRef.current && clientRef.current === requestClient) setIsBootstrapping(false);\n }\n })();\n bootstrapPromiseRef.current = { client: requestClient, promise: request };\n void request.finally(() => {\n if (bootstrapPromiseRef.current?.promise === request) bootstrapPromiseRef.current = null;\n });\n return request;\n }, [client, controller.refreshThreads, modelId]);\n\n const refreshEffectivePolicy = React.useCallback(async () => {\n if (bootstrap?.features.agents) {\n const refreshed = await client.bootstrap({ agentId: selectedAgentIdRef.current || undefined });\n if (!mountedRef.current || clientRef.current !== client) return;\n setBootstrap(refreshed);\n const available = modelsFromAgentChatBootstrap(refreshed);\n setSelectedModelId((current) => available.models.some((item) => item.id === current)\n ? current\n : available.defaultModelId);\n return;\n }\n const entitlement = await client.resourcePolicies.getEffective();\n if (!mountedRef.current || clientRef.current !== client) return;\n setEffectivePolicy(entitlement);\n if (modelId === undefined) {\n const available = modelsFromEffectivePolicy(entitlement);\n setSelectedModelId((current) => available.models.some((item) => item.id === current)\n ? current\n : available.defaultModelId);\n }\n }, [bootstrap, client, modelId]);\n\n React.useEffect(() => {\n void retryBootstrap();\n }, [retryBootstrap]);\n\n React.useEffect(() => {\n if (modelId !== undefined) setSelectedModelId(modelId);\n }, [modelId]);\n\n React.useEffect(() => {\n if (controlledSyncTargetRef.current?.value === null && controller.activeThreadId) {\n controller.startNewThread();\n }\n }, [activeThreadId, controller.activeThreadId, controller.startNewThread]);\n\n React.useEffect(() => {\n const previous = previousControllerThreadRef.current;\n const current = controller.activeThreadId;\n previousControllerThreadRef.current = current;\n const controlledTarget = controlledSyncTargetRef.current;\n if (controlledTarget) {\n if (current === controlledTarget.value) controlledSyncTargetRef.current = null;\n return;\n }\n const pendingTransition = pendingThreadTransitionRef.current;\n if (pendingTransition && current === pendingTransition.value) return;\n if (previous === null && current !== null) reportActiveThread(current, \"created\");\n }, [activeThreadId, controller.activeThreadId, reportActiveThread]);\n\n const clearOperationError = React.useCallback(() => {\n setLocalOperationError(null);\n controller.clearOperationError();\n }, [controller.clearOperationError]);\n\n const submit = React.useCallback((input: AgentChatRuntimeSubmit): Promise<void> => {\n if (submitPromiseRef.current) return submitPromiseRef.current;\n clearOperationError();\n setIsSubmitting(true);\n const request = (async () => {\n try {\n await agentChangePromiseRef.current;\n const activeBootstrap = bootstrapRef.current;\n if (!activeBootstrap) throw new Error(\"The agent input contract is unavailable.\");\n const retained = (input.attachments || []).filter((attachment) => input.attachmentIds?.includes(attachment.id || \"\"));\n const inputError = validateAgentChatSubmission(activeBootstrap.features.inputs, input.text, [\n ...(input.files || []),\n ...retained.map((attachment) => ({ data: new Uint8Array(), mediaType: attachment.mediaType || \"application/octet-stream\" })),\n ]);\n if (inputError) throw new Error(inputError);\n await controller.submit({\n text: input.text,\n attachments: input.attachments,\n uploads: input.files,\n attachmentIds: input.attachmentIds,\n requestedModelId: selectedModelIdRef.current || undefined,\n requestedAgentId: selectedAgentIdRef.current || undefined,\n });\n } catch (error) {\n setLocalOperationError(error);\n const typed = error as Partial<Agents24ClientError>;\n if (typed.kind === \"quota\" || typed.kind === \"authorization\") {\n await refreshEffectivePolicy().catch(() => undefined);\n }\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n })();\n submitPromiseRef.current = request;\n const clearRequest = () => {\n if (submitPromiseRef.current === request) submitPromiseRef.current = null;\n };\n void request.then(clearRequest, clearRequest);\n return request;\n }, [bootstrap, clearOperationError, controller.activeThreadId, controller.submit, refreshEffectivePolicy]);\n\n const { onHitlAction, getHitlActionState } = useAgentChatHitl({\n client, bootstrap, controller, selectionGeneration: threadSelectionGenerationRef,\n completeMcpAuthorization, mcpRedirectUri, clearOperationError, onError: setLocalOperationError,\n });\n\n const newThread = React.useCallback(() => {\n threadSelectionGenerationRef.current += 1;\n clearOperationError();\n pendingThreadTransitionRef.current = null;\n reportActiveThread(null, \"new\");\n controller.startNewThread();\n }, [clearOperationError, controller.startNewThread, reportActiveThread]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const requestGeneration = ++threadSelectionGenerationRef.current;\n clearOperationError();\n pendingThreadTransitionRef.current = { reason: \"opened\", value: threadId };\n try {\n const detail = await client.threads.get({ threadId });\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n const preferredAgentId = detail.runtime_selection?.agent_alias || detail.runtime_selection?.agent_id || null;\n if (preferredAgentId) {\n const result = await client.bootstrap({ agentId: preferredAgentId });\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n const resolvedAgentId = agentIdFromBootstrap(result, preferredAgentId);\n setBootstrap(result);\n setEffectivePolicy(null);\n setSelectedAgentId(resolvedAgentId);\n const available = modelsFromAgentChatBootstrap(result);\n const preferredModelId = detail.runtime_selection?.model_id || null;\n setSelectedModelId(available.models.some((item) => item.id === preferredModelId)\n ? preferredModelId\n : available.defaultModelId);\n }\n await controller.openThread(threadId);\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n reportActiveThread(threadId, \"opened\");\n } catch (error) {\n if (requestGeneration !== threadSelectionGenerationRef.current) return;\n setLocalOperationError(error);\n throw error;\n } finally {\n if (requestGeneration === threadSelectionGenerationRef.current) pendingThreadTransitionRef.current = null;\n }\n }, [clearOperationError, client, controller.openThread, reportActiveThread]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n clearOperationError();\n const wasActive = controller.activeThreadId === threadId;\n if (wasActive) threadSelectionGenerationRef.current += 1;\n if (wasActive) pendingThreadTransitionRef.current = { reason: \"deleted\", value: null };\n try {\n await controller.deleteThread(threadId);\n if (wasActive) reportActiveThread(null, \"deleted\");\n } catch (error) {\n setLocalOperationError(error);\n throw error;\n } finally {\n if (wasActive && pendingThreadTransitionRef.current?.reason === \"deleted\") {\n pendingThreadTransitionRef.current = null;\n }\n }\n }, [clearOperationError, controller.activeThreadId, controller.deleteThread, reportActiveThread]);\n\n const changeModel = React.useCallback((nextModelId: string) => {\n if (modelId === undefined) setSelectedModelId(nextModelId);\n onModelChange?.(nextModelId);\n if (controller.activeThreadId && selectedAgentId && client.threads.setRuntimeSelection) {\n void client.threads.setRuntimeSelection({\n threadId: controller.activeThreadId,\n preferredAgentId: selectedAgentId,\n preferredModelId: nextModelId,\n }).catch(setLocalOperationError);\n }\n }, [client.threads, controller.activeThreadId, modelId, onModelChange, selectedAgentId]);\n\n const resolveAttachmentContent = React.useCallback(async (\n attachment: ChatAttachment,\n signal: AbortSignal,\n ) => {\n const attachmentId = typeof attachment.id === \"string\" ? attachment.id.trim() : \"\";\n if (!attachmentId) throw new Error(\"Attachment content identity is unavailable.\");\n const access = await attachments.createContentAccess({\n attachmentId,\n disposition: \"inline\",\n signal,\n });\n return { url: access.url, validUntil: access.valid_until || null };\n }, [attachments.createContentAccess]);\n\n const changeAgent = React.useCallback((nextAgentId: string): Promise<void> => {\n if (agentChangePromiseRef.current) return agentChangePromiseRef.current;\n if (\n nextAgentId === selectedAgentIdRef.current\n || !canChangeAgentRuntime(controller.runState, controller.activeRunId)\n ) return Promise.resolve();\n clearOperationError();\n setIsChangingAgent(true);\n const request = (async () => {\n try {\n const result = await client.bootstrap({ agentId: nextAgentId });\n const resolvedAgentId = agentIdFromBootstrap(result, nextAgentId);\n if (!resolvedAgentId) throw new Error(\"The requested Agent is no longer available.\");\n const available = modelsFromAgentChatBootstrap(result);\n const currentModelId = selectedModelIdRef.current;\n const nextModelId = available.models.some((item) => item.id === currentModelId)\n ? currentModelId\n : available.defaultModelId;\n if (controller.activeThreadId && client.threads.setRuntimeSelection) {\n const persisted = await client.threads.setRuntimeSelection({\n threadId: controller.activeThreadId,\n preferredAgentId: resolvedAgentId,\n preferredModelId: nextModelId,\n });\n selectedModelIdRef.current = persisted.runtime_selection.model_id;\n setSelectedModelId(persisted.runtime_selection.model_id);\n } else {\n selectedModelIdRef.current = nextModelId;\n setSelectedModelId(nextModelId);\n }\n selectedAgentIdRef.current = resolvedAgentId;\n bootstrapRef.current = result;\n setSelectedAgentId(resolvedAgentId);\n setBootstrap(result);\n setEffectivePolicy(null);\n } catch (error) {\n setLocalOperationError(error);\n throw error;\n }\n })();\n agentChangePromiseRef.current = request;\n const clearRequest = () => {\n if (agentChangePromiseRef.current === request) agentChangePromiseRef.current = null;\n if (mountedRef.current) setIsChangingAgent(false);\n };\n void request.then(clearRequest, clearRequest);\n return request;\n }, [clearOperationError, client, controller.activeRunId, controller.activeThreadId, controller.runState]);\n\n const modelOptions = effectivePolicy\n ? modelsFromEffectivePolicy(effectivePolicy).models\n : bootstrap\n ? modelsFromAgentChatBootstrap(bootstrap).models\n : [];\n const fatalError = bootstrapError || controller.error;\n const operationError = localOperationError || controller.operationError?.cause;\n const state: AgentChatRuntimeViewState = isBootstrapping\n ? \"loading\"\n : fatalError\n ? agentChatRuntimeStateFromError(fatalError)\n : controller.runState === \"uploading\"\n ? \"uploading\"\n : controller.runState === \"streaming\"\n ? \"streaming\"\n : controller.runState === \"reconnecting\"\n ? \"reconnecting\"\n : controller.runState === \"paused\"\n ? \"paused\"\n : controller.runState === \"cancelling\"\n ? \"cancelling\"\n : controller.runState === \"cancelled\"\n ? \"cancelled\"\n : \"ready\";\n const connectionState: AgentChatRuntimeConnectionState = state === \"offline\"\n ? \"offline\"\n : state === \"expired\"\n ? \"expired\"\n : state === \"reconnecting\"\n ? \"reconnecting\"\n : isBootstrapping\n ? \"connecting\"\n : \"connected\";\n return {\n agent: agentOverride || { name: bootstrap?.deployment.name || \"Agent\" },\n inputContract: bootstrap?.features.inputs || null,\n allowFeedback: Boolean(bootstrap?.capabilities.includes(\"feedback.write\")),\n backgroundError: controller.backgroundError?.cause || null,\n bootstrap,\n capabilities: bootstrap?.capabilities || [],\n agentId: selectedAgentId,\n agents: bootstrap?.features.agents?.options.map((item) => ({ id: item.id, label: item.label })) || [],\n changeAgent,\n changeModel,\n clearOperationError,\n connectionState,\n contextWindow: controller.contextWindow,\n contextCompression: controller.contextCompression,\n controller,\n deleteThread,\n errorMessage: agentChatRuntimeErrorMessage(fatalError || operationError),\n fatalError,\n getHitlActionState,\n isBootstrapping,\n isChangingAgent,\n isSubmitting: isSubmitting || controller.isSubmitting,\n isUploading: attachments.isUploading || controller.runState === \"uploading\",\n modelId: selectedModelId,\n models: modelOptions,\n newThread,\n onHitlAction,\n openThread,\n operationError,\n retryBootstrap,\n resolveAttachmentContent,\n state,\n submit,\n };\n}\n","import type { AgentClient, ClientBootstrap, HitlResponse } from \"@agents24/client\";\nimport { type AgentChatController, type ChatHitlPart, useAgentMcp } from \"@agents24/react\";\nimport * as React from \"react\";\nimport { browserChatCrypto, createMcpPkceProof, validateMcpCallbackResult, waitForMcpOauthComplete } from \"../mcp-oauth\";\nimport type { AgentChatMcpAuthorizationCompletion, AgentChatRuntimeHitlActionState } from \"./use-agent-chat-runtime\";\n\ntype HitlOptions = {\n client: AgentClient;\n bootstrap: ClientBootstrap | null;\n controller: AgentChatController;\n selectionGeneration: React.MutableRefObject<number>;\n completeMcpAuthorization?: AgentChatMcpAuthorizationCompletion;\n mcpRedirectUri?: string;\n clearOperationError(): void;\n onError(error: unknown): void;\n};\n\ntype HitlOperation = {\n abort: AbortController;\n isCurrent(): boolean;\n phase: \"connecting\" | \"resuming\";\n popup?: Window;\n};\n\nfunction detach(operation: HitlOperation) {\n operation.abort.abort();\n operation.popup?.close();\n}\n\nexport function useAgentChatHitl(options: HitlOptions) {\n const mcp = useAgentMcp();\n const latest = React.useRef(options);\n latest.current = options;\n const mounted = React.useRef(true);\n const operations = React.useRef(new Map<string, HitlOperation>());\n const [states, setStates] = React.useState<Record<string, AgentChatRuntimeHitlActionState>>({});\n\n React.useEffect(() => {\n mounted.current = true;\n const active = operations.current;\n return () => {\n mounted.current = false;\n for (const operation of active.values()) detach(operation);\n active.clear();\n };\n }, []);\n React.useEffect(() => {\n for (const [key, operation] of operations.current) {\n if (operation.isCurrent()) continue;\n detach(operation);\n operations.current.delete(key);\n setStates((current) => {\n const next = { ...current };\n delete next[key];\n return next;\n });\n }\n });\n React.useEffect(() => { setStates({}); }, [options.client, options.controller.activeThreadId]);\n\n const onHitlAction = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const captured = latest.current;\n const { controller, client, bootstrap, selectionGeneration } = captured;\n const key = part.interruptId || part.id;\n if (operations.current.has(key)) return;\n const generation = selectionGeneration.current;\n const threadId = controller.activeThreadId;\n const runId = controller.messages.find((message) => message.parts.includes(part))?.runId || controller.activeRunId;\n const operation: HitlOperation = {\n abort: new AbortController(),\n phase: part.hitlKind === \"mcp_auth\" && response.action === \"connect\" ? \"connecting\" : \"resuming\",\n isCurrent() {\n const current = latest.current;\n return mounted.current && !operation.abort.signal.aborted\n && current.client === client && current.selectionGeneration.current === generation\n && current.controller.activeThreadId === threadId\n && (!current.controller.activeRunId || current.controller.activeRunId === runId)\n && ![\"cancelling\", \"cancelled\", \"failed\", \"completed\"].includes(current.controller.runState)\n && (operation.phase === \"resuming\" || current.controller.messages.some((message) =>\n message.runId === runId && message.parts.some((candidate) => candidate.type === \"hitl\"\n && candidate.interruptId === part.interruptId && candidate.status === \"pending\")));\n },\n };\n if (!operation.isCurrent()) return;\n captured.clearOperationError();\n operations.current.set(key, operation);\n setStates((current) => ({ ...current, [key]: { action: response.action, status: operation.phase } }));\n try {\n if (operation.phase === \"connecting\") {\n if (!runId) throw new Error(\"MCP authorization is missing its paused run.\");\n if (!bootstrap) throw new Error(\"MCP authorization requires runtime bootstrap.\");\n if (!captured.mcpRedirectUri) throw new Error(\"mcpRedirectUri is required for MCP Connect.\");\n const serverId = String(part.presentation.server_id || \"\").trim();\n if (!serverId) throw new Error(\"MCP authorization is missing its server identity.\");\n const serverEmbed = bootstrap.authentication.modes.includes(\"server_embed\");\n const popupNonce = browserChatCrypto().randomUUID();\n // Open within the click before awaiting crypto or the network.\n const popup = window.open(\"about:blank\", \"agents24-mcp\", \"popup,width=560,height=720\");\n if (!popup) throw new Error(\"Allow popups to connect this MCP account.\");\n operation.popup = popup;\n popup.document.title = \"Connecting to MCP\";\n popup.document.body.textContent = \"Opening secure connection…\";\n const proof = await createMcpPkceProof();\n if (!operation.isCurrent()) return;\n const started = await mcp.startAuthorization({\n runId, serverId, interruptId: part.interruptId, redirectUri: captured.mcpRedirectUri,\n popupNonce, codeChallenge: proof.challenge, signal: operation.abort.signal,\n });\n if (!operation.isCurrent()) return;\n if (!started.callback_origin) throw new Error(\"MCP authorization did not return a callback origin.\");\n const completionPromise = waitForMcpOauthComplete({\n popup, callbackOrigin: started.callback_origin, popupNonce, serverId,\n runId, interruptId: part.interruptId, signal: operation.abort.signal,\n requireConnectionId: serverEmbed || Boolean(captured.completeMcpAuthorization),\n });\n // Ensure a navigation exception cannot leave a rejected waiter unobserved.\n void completionPromise.catch(() => undefined);\n popup.location.replace(started.authorization_url);\n const completion = await completionPromise;\n if (!operation.isCurrent()) return;\n if (captured.completeMcpAuthorization) {\n await captured.completeMcpAuthorization({ completion, codeVerifier: proof.verifier, serverId });\n } else if (serverEmbed) {\n validateMcpCallbackResult({ server_id: completion.serverId, connection_id: completion.connectionId || \"\" }, serverId);\n } else {\n const redeemed = await mcp.redeemCallback({\n code: completion.code, codeVerifier: proof.verifier, signal: operation.abort.signal,\n });\n if (!operation.isCurrent()) return;\n validateMcpCallbackResult(redeemed, serverId);\n }\n popup.close();\n }\n if (!operation.isCurrent()) return;\n operation.phase = \"resuming\";\n setStates((current) => ({ ...current, [key]: { action: response.action, status: \"resuming\" } }));\n await controller.resumeHitl(part, response);\n } catch (error) {\n if (!operation.isCurrent()) return;\n captured.onError(error);\n setStates((current) => ({ ...current, [key]: {\n action: response.action, status: \"error\", error: error instanceof Error ? error.message : String(error),\n } }));\n throw error;\n } finally {\n const ownsState = operation.isCurrent();\n // Abort the waiter and any in-flight transport, and always release the popup.\n detach(operation);\n if (operations.current.get(key) === operation) {\n operations.current.delete(key);\n if (ownsState) setStates((current) => {\n if (current[key]?.status === \"error\") return current;\n const next = { ...current };\n delete next[key];\n return next;\n });\n }\n }\n }, [mcp]);\n\n return { onHitlAction, getHitlActionState: (part: ChatHitlPart) => states[part.interruptId || part.id] };\n}\n","import * as React from \"react\";\nimport type { DelegationEvents, DelegationTask } from \"../generated/delegation-types\";\n\nexport type DelegationTaskSource = {\n events(input: { threadId: string; after: number; signal: AbortSignal }): Promise<DelegationEvents>;\n};\n\n/** Authoritative snapshots keep task discovery alive after the run stream ends. */\nexport function useDelegationTasks({ threadId, source, pollIntervalMs = 2000 }: {\n threadId: string | null;\n source: DelegationTaskSource;\n pollIntervalMs?: number;\n}) {\n const [state, setState] = React.useState<{\n threadId: string | null; tasks: DelegationTask[]; error: unknown; loading: boolean;\n }>({ threadId: null, tasks: [], error: null, loading: false });\n const [revision, refresh] = React.useReducer((value: number) => value + 1, 0);\n React.useEffect(() => {\n if (!threadId) {\n setState({ threadId: null, tasks: [], error: null, loading: false });\n return;\n }\n const controller = new AbortController();\n let cursor = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let failures = 0;\n setState((previous) => ({ threadId, tasks: previous.threadId === threadId ? previous.tasks : [],\n error: null, loading: true }));\n const poll = async () => {\n try {\n const result = await source.events({ threadId, after: cursor, signal: controller.signal });\n if (controller.signal.aborted) return;\n cursor = result.cursor;\n failures = 0;\n setState({ threadId, tasks: result.snapshot, error: null, loading: false });\n } catch (error) {\n if (controller.signal.aborted) return;\n failures += 1;\n setState((previous) => ({ ...previous, error, loading: false }));\n }\n if (!controller.signal.aborted) {\n timer = setTimeout(poll, Math.min(30000, Math.max(250, pollIntervalMs) * 2 ** Math.min(failures, 4)));\n }\n };\n void poll();\n return () => {\n controller.abort();\n if (timer) clearTimeout(timer);\n };\n }, [threadId, source, pollIntervalMs, revision]);\n return { tasks: state.threadId === threadId ? state.tasks : [],\n error: state.threadId === threadId ? state.error : null,\n loading: Boolean(threadId) && (state.threadId !== threadId || state.loading), refresh };\n}\n"],"mappings":"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","names":["React","React"]}
@@ -0,0 +1,19 @@
1
+ import type { AgentClient, ClientBootstrap, HitlResponse } from "@agents24/client";
2
+ import { type AgentChatController, type ChatHitlPart } from "@agents24/react";
3
+ import * as React from "react";
4
+ import type { AgentChatMcpAuthorizationCompletion, AgentChatRuntimeHitlActionState } from "./use-agent-chat-runtime";
5
+ type HitlOptions = {
6
+ client: AgentClient;
7
+ bootstrap: ClientBootstrap | null;
8
+ controller: AgentChatController;
9
+ selectionGeneration: React.MutableRefObject<number>;
10
+ completeMcpAuthorization?: AgentChatMcpAuthorizationCompletion;
11
+ mcpRedirectUri?: string;
12
+ clearOperationError(): void;
13
+ onError(error: unknown): void;
14
+ };
15
+ export declare function useAgentChatHitl(options: HitlOptions): {
16
+ onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>;
17
+ getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState;
18
+ };
19
+ export {};
package/dist/types.d.ts CHANGED
@@ -15,5 +15,8 @@ export type WaitForMcpOauthCompleteInput = {
15
15
  popupNonce: string;
16
16
  requireConnectionId?: boolean;
17
17
  serverId: string;
18
+ runId?: string;
19
+ interruptId?: string;
20
+ signal?: AbortSignal;
18
21
  timeoutMs?: number;
19
22
  };
package/dist/ui/index.cjs CHANGED
@@ -2977,12 +2977,6 @@ function HitlPartRow({
2977
2977
  const presentation = part.presentation || {};
2978
2978
  const requireComment = presentation.require_comment === true;
2979
2979
  const isTerminal = part.status !== "pending";
2980
- const resolvedRef = React12.useRef(null);
2981
- const wasTerminal = React12.useRef(isTerminal);
2982
- React12.useEffect(() => {
2983
- if (isTerminal && !wasTerminal.current) resolvedRef.current?.focus();
2984
- wasTerminal.current = isTerminal;
2985
- }, [isTerminal]);
2986
2980
  if (part.hitlKind === "user_input") {
2987
2981
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2988
2982
  AskUserInteraction,
@@ -3001,9 +2995,7 @@ function HitlPartRow({
3001
2995
  }
3002
2996
  );
3003
2997
  }
3004
- if (isTerminal) {
3005
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "a24-hitl a24-hitl--resolved px-1 py-1 text-sm text-muted-foreground", ref: resolvedRef, role: "status", tabIndex: -1, children: resolvedHitlLabel(part) });
3006
- }
2998
+ if (isTerminal) return null;
3007
2999
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "a24-hitl space-y-2.5 px-1 py-2", children: [
3008
3000
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "a24-hitl__title text-sm font-medium text-foreground text-pretty", children: hitlTitle(part) }),
3009
3001
  requireComment ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
@@ -3154,7 +3146,7 @@ function AgentResponseTimeline({
3154
3146
  toolViewMode = "closed"
3155
3147
  }) {
3156
3148
  isLoading = isLoading && !message.responseCompletion;
3157
- const parts = (displayParts || message.parts || []).filter((part) => (part.kind !== "tool" || !isInternalAskUserTool(part)) && (part.kind !== "model-turn" || part.turnKind === "agent") && (part.kind !== "node-activity" || nodeActivityMode === "all" || nodeActivityMode === "default" && part.defaultChatVisible));
3149
+ const parts = (displayParts || message.parts || []).filter((part) => (part.kind !== "tool" || !isInternalAskUserTool(part)) && (part.kind !== "hitl" || part.hitlKind === "user_input" || part.status === "pending") && (part.kind !== "model-turn" || part.turnKind === "agent") && (part.kind !== "node-activity" || nodeActivityMode === "all" || nodeActivityMode === "default" && part.defaultChatVisible));
3158
3150
  const toolParts = parts.filter((part) => part.kind === "tool");
3159
3151
  const activeToolId = latestRunningAgentChatToolId(toolParts);
3160
3152
  const activeTextPartId = getActiveStreamingTextPartId(