@agents24/chat-react 0.5.36 → 0.5.37

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.
Files changed (40) hide show
  1. package/dist/{chunk-INO5DSSJ.js → chunk-DWDHK4FZ.js} +3 -4
  2. package/dist/chunk-DWDHK4FZ.js.map +1 -0
  3. package/dist/generated/delegation-types.d.ts +3 -2
  4. package/dist/generated/run-usage.d.ts +11 -0
  5. package/dist/registry/agents24-chat.json +13 -13
  6. package/dist/runtime/index.cjs +25 -9
  7. package/dist/runtime/index.cjs.map +1 -1
  8. package/dist/runtime/index.js +24 -7
  9. package/dist/runtime/index.js.map +1 -1
  10. package/dist/runtime/input-contract.d.ts +1 -1
  11. package/dist/runtime/use-agent-chat-hitl.d.ts +2 -2
  12. package/dist/runtime/use-agent-chat-runtime.d.ts +4 -6
  13. package/dist/scaffold/app.d.ts +2 -2
  14. package/dist/scaffold/components/chat/chat-composer.d.ts +2 -1
  15. package/dist/scaffold/components/chat/chat-message.d.ts +2 -2
  16. package/dist/scaffold/components/chat/message-parts.d.ts +2 -2
  17. package/dist/scaffold/index.cjs +17 -13
  18. package/dist/scaffold/index.cjs.map +1 -1
  19. package/dist/scaffold/index.js +11 -7
  20. package/dist/scaffold/index.js.map +1 -1
  21. package/dist/styles.css +7 -0
  22. package/dist/ui/agent-chat-composer.d.ts +2 -1
  23. package/dist/ui/agent-chat-message.d.ts +6 -2
  24. package/dist/ui/agent-response-timeline.d.ts +11 -3
  25. package/dist/ui/ask-user-interaction.d.ts +5 -1
  26. package/dist/ui/hitl-submission-status.d.ts +22 -0
  27. package/dist/ui/index.cjs +514 -337
  28. package/dist/ui/index.cjs.map +1 -1
  29. package/dist/ui/index.d.ts +1 -0
  30. package/dist/ui/index.js +510 -335
  31. package/dist/ui/index.js.map +1 -1
  32. package/dist/ui/use-agent-chat-composer.d.ts +17 -2
  33. package/dist/ui/use-audio-recorder.d.ts +15 -2
  34. package/package.json +3 -3
  35. package/scaffold/src/app.tsx +2 -1
  36. package/scaffold/src/components/chat/chat-composer.tsx +5 -3
  37. package/scaffold/src/components/chat/chat-message.tsx +3 -3
  38. package/scaffold/src/components/chat/chat-shell.tsx +2 -1
  39. package/scaffold/src/components/chat/message-parts.tsx +6 -6
  40. package/dist/chunk-INO5DSSJ.js.map +0 -1
@@ -1 +1 @@
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"]}
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 type HitlSubmissionOptions,\n type HitlSubmissionState,\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 = Omit<HitlSubmissionState, \"status\"> & {\n status: HitlSubmissionState[\"status\"] | \"connecting\" | \"resuming\";\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, options?: HitlSubmissionOptions): 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, type HitlSubmissionOptions, 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, submission?: HitlSubmissionOptions) => {\n const captured = latest.current;\n const { controller, client, bootstrap, selectionGeneration } = captured;\n const generation = selectionGeneration.current;\n const threadId = controller.activeThreadId;\n const runId = part.runId || controller.messages.find((message) => message.parts.some(candidate => candidate.id === part.id))?.runId || controller.activeRunId;\n const key = `${generation}:${threadId}:${runId}:${part.interruptId || part.id}`;\n if (part.hitlKind !== \"mcp_auth\" || response.action !== \"connect\") {\n captured.clearOperationError();\n // All normal decisions, including host preparation, have one headless owner.\n return controller.resumeHitl(part, response, submission).catch(error => {\n const current = latest.current;\n if (mounted.current && current.client === client && current.selectionGeneration.current === generation\n && current.controller.activeThreadId === threadId) captured.onError(error);\n throw error;\n });\n }\n const previous = operations.current.get(key);\n if (previous?.isCurrent()) return;\n if (previous) { detach(previous); operations.current.delete(key); }\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, submission);\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) => {\n const { controller, selectionGeneration } = latest.current;\n const runId = part.runId || controller.messages.find(message => message.parts.some(candidate => candidate.id === part.id))?.runId || controller.activeRunId;\n return controller.getHitlSubmissionState(part)\n || states[`${selectionGeneration.current}:${controller.activeThreadId}:${runId}:${part.interruptId || part.id}`];\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","React"]}
@@ -2,7 +2,7 @@ import { normalizeAttachmentMimeType, type ClientInputFeature, type PortableUplo
2
2
  export { attachmentFileAccept, normalizeAttachmentMimeType } from "@agents24/client";
3
3
  export type AgentChatInputContract = ClientInputFeature;
4
4
  export declare const SUPPORTED_INPUT_MIME_TYPES: {
5
- readonly files: readonly ["application/pdf", "text/plain", "text/markdown", "text/csv", "application/json"];
5
+ readonly files: readonly ["application/pdf", "text/plain", "text/markdown", "text/csv", "application/json", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"];
6
6
  readonly images: readonly ["image/png", "image/jpeg", "image/webp"];
7
7
  readonly audio: readonly ["audio/wav", "audio/mpeg", "audio/webm", "audio/mp4"];
8
8
  };
@@ -1,5 +1,5 @@
1
1
  import type { AgentClient, ClientBootstrap, HitlResponse } from "@agents24/client";
2
- import { type AgentChatController, type ChatHitlPart } from "@agents24/react";
2
+ import { type AgentChatController, type ChatHitlPart, type HitlSubmissionOptions } from "@agents24/react";
3
3
  import * as React from "react";
4
4
  import type { AgentChatMcpAuthorizationCompletion, AgentChatRuntimeHitlActionState } from "./use-agent-chat-runtime";
5
5
  type HitlOptions = {
@@ -13,7 +13,7 @@ type HitlOptions = {
13
13
  onError(error: unknown): void;
14
14
  };
15
15
  export declare function useAgentChatHitl(options: HitlOptions): {
16
- onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>;
16
+ onHitlAction: (part: ChatHitlPart, response: HitlResponse, submission?: HitlSubmissionOptions) => Promise<void>;
17
17
  getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState;
18
18
  };
19
19
  export {};
@@ -1,6 +1,6 @@
1
1
  import type { AgentClient, ClientBootstrap, HitlResponse, PortableUpload } from "@agents24/client";
2
2
  import type { ContextCompression, ContextWindow } from "@agents24/client/protocol";
3
- import { type AgentChatController, type ChatAttachment, type ChatHitlPart } from "@agents24/react";
3
+ import { type AgentChatController, type ChatAttachment, type ChatHitlPart, type HitlSubmissionOptions, type HitlSubmissionState } from "@agents24/react";
4
4
  import type { ChatMcpOauthCompletion } from "../types";
5
5
  export type AgentChatRuntimeAgent = {
6
6
  name: string;
@@ -35,10 +35,8 @@ export type AgentChatRuntimeSubmit = {
35
35
  attachments?: ChatAttachment[];
36
36
  attachmentIds?: readonly string[];
37
37
  };
38
- export type AgentChatRuntimeHitlActionState = {
39
- action: string;
40
- error?: string | null;
41
- status: "connecting" | "resuming" | "error";
38
+ export type AgentChatRuntimeHitlActionState = Omit<HitlSubmissionState, "status"> & {
39
+ status: HitlSubmissionState["status"] | "connecting" | "resuming";
42
40
  };
43
41
  export type UseAgentChatRuntimeOptions = {
44
42
  activeThreadId?: string | null;
@@ -77,7 +75,7 @@ export type AgentChatRuntime = {
77
75
  modelId: string | null;
78
76
  models: AgentChatRuntimeModel[];
79
77
  newThread(): void;
80
- onHitlAction(part: ChatHitlPart, response: HitlResponse): Promise<void>;
78
+ onHitlAction(part: ChatHitlPart, response: HitlResponse, options?: HitlSubmissionOptions): Promise<void>;
81
79
  openThread(threadId: string): Promise<void>;
82
80
  operationError: unknown;
83
81
  retryBootstrap(): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  import type { AgentClient, HitlResponse } from "@agents24/client";
2
2
  import { type AgentChatActiveThreadChangeHandler, type AgentChatMcpAuthorizationCompletion, type AgentChatRuntimeAgent } from "@agents24/chat-react/runtime";
3
3
  import type { HitlActionState } from "@agents24/chat-react/ui";
4
- import { type ChatHitlPart, type ChatMessage, type ChatPart } from "@agents24/react";
4
+ import { type ChatHitlPart, type HitlSubmissionOptions, type ChatMessage, type ChatPart } from "@agents24/react";
5
5
  import * as React from "react";
6
6
  import type { Agents24ChatComposerProps } from "./components/chat/chat-composer";
7
7
  import { type Agents24ChatIdentity } from "./identity";
@@ -29,6 +29,6 @@ export type Agents24ChatTimelineSlotProps = {
29
29
  parts: readonly ChatPart[];
30
30
  isLoading: boolean;
31
31
  getHitlActionState: (part: ChatHitlPart) => HitlActionState | undefined;
32
- onHitlAction: (part: ChatHitlPart, response: ChatHitlResponse) => void;
32
+ onHitlAction: (part: ChatHitlPart, response: ChatHitlResponse, options?: HitlSubmissionOptions) => void;
33
33
  };
34
34
  export declare function App(props: Agents24ChatAppProps): import("react/jsx-runtime").JSX.Element;
@@ -8,6 +8,7 @@ export type Agents24ChatComposerProps = {
8
8
  inputContract: AgentChatInputContract;
9
9
  disabled?: boolean;
10
10
  contextWindow?: ContextWindow | null;
11
+ scopeKey?: string | null;
11
12
  focusKey?: string | null;
12
13
  forceExpanded?: boolean;
13
14
  isCancelling?: boolean;
@@ -33,4 +34,4 @@ export type Agents24ChatComposerProps = {
33
34
  } | null;
34
35
  utilityRow?: "inline" | "below";
35
36
  };
36
- export declare function ChatComposer({ inputContract, queue, onRecordingStreamChange, disabled, contextWindow, focusKey, forceExpanded, isCancelling, isRunning, agentId, agents, modelId, models, onModelChange, onAgentChange, onStop, onSubmit, restoredDraft, utilityRow, }: Agents24ChatComposerProps): import("react/jsx-runtime").JSX.Element;
37
+ export declare function ChatComposer({ inputContract, queue, onRecordingStreamChange, disabled, contextWindow, focusKey, scopeKey, forceExpanded, isCancelling, isRunning, agentId, agents, modelId, models, onModelChange, onAgentChange, onStop, onSubmit, restoredDraft, utilityRow, }: Agents24ChatComposerProps): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { ChatHitlPart, ChatMessage as ChatMessageModel } from "@agents24/react";
1
+ import type { ChatHitlPart, HitlSubmissionOptions, ChatMessage as ChatMessageModel } from "@agents24/react";
2
2
  import type { FeedbackReason, HitlResponse } from "@agents24/client";
3
3
  import type { AgentChatRuntimeHitlActionState } from "@agents24/chat-react/runtime";
4
4
  import { type ChatAttachmentContentResolver } from "@agents24/chat-react/ui";
@@ -9,7 +9,7 @@ type Props = {
9
9
  message: ChatMessageModel;
10
10
  getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState | undefined;
11
11
  isLoading: boolean;
12
- onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>;
12
+ onHitlAction: (part: ChatHitlPart, response: HitlResponse, options?: HitlSubmissionOptions) => Promise<void>;
13
13
  onRegenerate: () => Promise<void>;
14
14
  allowFeedback: boolean;
15
15
  onSetFeedback: (input: {
@@ -1,4 +1,4 @@
1
- import type { ChatHitlPart, ChatMessage } from "@agents24/react";
1
+ import type { ChatHitlPart, HitlSubmissionOptions, ChatMessage } from "@agents24/react";
2
2
  import type { HitlResponse } from "@agents24/client";
3
3
  import type { AgentChatRuntimeHitlActionState } from "@agents24/chat-react/runtime";
4
4
  import * as React from "react";
@@ -7,6 +7,6 @@ export declare function MessageParts({ message, getHitlActionState, isLoading, o
7
7
  message: ChatMessage;
8
8
  getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState | undefined;
9
9
  isLoading: boolean;
10
- onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>;
10
+ onHitlAction: (part: ChatHitlPart, response: HitlResponse, options?: HitlSubmissionOptions) => Promise<void>;
11
11
  Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>;
12
12
  }): import("react/jsx-runtime").JSX.Element;
@@ -41,11 +41,11 @@ module.exports = __toCommonJS(src_exports);
41
41
 
42
42
  // scaffold/src/app.tsx
43
43
  var import_browser = require("@agents24/client/browser");
44
- var import_runtime3 = require("@agents24/chat-react/runtime");
44
+ var import_runtime4 = require("@agents24/chat-react/runtime");
45
45
  var import_react3 = require("@agents24/react");
46
46
 
47
47
  // scaffold/src/components/chat/chat-shell.tsx
48
- var import_runtime2 = require("@agents24/chat-react/runtime");
48
+ var import_runtime3 = require("@agents24/chat-react/runtime");
49
49
  var import_ui5 = require("@agents24/chat-react/ui");
50
50
  var import_lucide_react11 = require("lucide-react");
51
51
  var React9 = __toESM(require("react"), 1);
@@ -54,6 +54,7 @@ var React9 = __toESM(require("react"), 1);
54
54
  var import_lucide_react3 = require("lucide-react");
55
55
  var React2 = __toESM(require("react"), 1);
56
56
  var import_ui = require("@agents24/chat-react/ui");
57
+ var import_runtime = require("@agents24/chat-react/runtime");
57
58
 
58
59
  // scaffold/src/components/ui/button.tsx
59
60
  var import_class_variance_authority = require("class-variance-authority");
@@ -520,6 +521,7 @@ function ChatComposer({
520
521
  disabled,
521
522
  contextWindow,
522
523
  focusKey,
524
+ scopeKey,
523
525
  forceExpanded = false,
524
526
  isCancelling = false,
525
527
  isRunning,
@@ -555,6 +557,7 @@ function ChatComposer({
555
557
  } = (0, import_ui.useAgentChatComposer)({
556
558
  inputContract,
557
559
  disabled,
560
+ scopeKey,
558
561
  focusKey,
559
562
  forceExpanded,
560
563
  isCancelling,
@@ -639,7 +642,7 @@ function ChatComposer({
639
642
  className: "sr-only",
640
643
  type: "file",
641
644
  multiple: true,
642
- accept: attachmentMimeTypes.join(","),
645
+ accept: (0, import_runtime.attachmentFileAccept)(attachmentMimeTypes),
643
646
  onChange: (event) => {
644
647
  addFiles(Array.from(event.target.files ?? []));
645
648
  event.currentTarget.value = "";
@@ -969,8 +972,8 @@ function MessageParts({
969
972
  getHitlActionState,
970
973
  isLoading,
971
974
  message,
972
- onHitlAction: (part, response) => {
973
- void onHitlAction(part, response).catch(() => void 0);
975
+ onHitlAction: (part, response, options2) => {
976
+ void onHitlAction(part, response, options2).catch(() => void 0);
974
977
  },
975
978
  parts: message.parts
976
979
  }
@@ -984,8 +987,8 @@ function MessageParts({
984
987
  {
985
988
  getHitlActionState,
986
989
  message,
987
- onHitlAction: (hitlPart, response) => {
988
- void onHitlAction(hitlPart, response).catch(() => void 0);
990
+ onHitlAction: (hitlPart, response, options2) => {
991
+ void onHitlAction(hitlPart, response, options2).catch(() => void 0);
989
992
  },
990
993
  part
991
994
  },
@@ -1167,7 +1170,7 @@ function ChatMessage({
1167
1170
  message
1168
1171
  }
1169
1172
  ) }),
1170
- showCompletionActions && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MessageFooter, { className: "gap-1 opacity-70 transition-opacity group-hover/message:opacity-100", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1173
+ showCompletionActions && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MessageFooter, { className: "a24-chat-message-action-row--assistant gap-1", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1171
1174
  import_ui3.AgentChatDefaultActions,
1172
1175
  {
1173
1176
  animateCompletion: animateCompletionActions,
@@ -1189,12 +1192,12 @@ function ChatMessage({
1189
1192
  var React5 = __toESM(require("react"), 1);
1190
1193
  var import_react = require("@agents24/react");
1191
1194
  var import_ui4 = require("@agents24/chat-react/ui");
1192
- var import_runtime = require("@agents24/chat-react/runtime");
1195
+ var import_runtime2 = require("@agents24/chat-react/runtime");
1193
1196
  var import_jsx_runtime15 = require("react/jsx-runtime");
1194
1197
  function SubagentTasks({ threadId }) {
1195
1198
  const client = (0, import_react.useAgentClient)();
1196
1199
  const source = React5.useMemo(() => ({ events: (input) => client.threads.delegations.events(input) }), [client]);
1197
- const { tasks, error, refresh } = (0, import_runtime.useDelegationTasks)({ threadId, source });
1200
+ const { tasks, error, refresh } = (0, import_runtime2.useDelegationTasks)({ threadId, source });
1198
1201
  const [selection, setSelection] = React5.useState({ threadId: null, handle: null });
1199
1202
  const selected = selection.threadId === threadId ? selection.handle : null;
1200
1203
  if (!threadId || !tasks.length && !error) return null;
@@ -2140,7 +2143,7 @@ function isScaffoldTimelineLoading({
2140
2143
  var import_chat_react2 = require("@agents24/chat-react");
2141
2144
  var import_jsx_runtime25 = require("react/jsx-runtime");
2142
2145
  var LOADING_INPUT_CONTRACT = {
2143
- version: "agents24.runtime-inputs.v2",
2146
+ version: "agents24.runtime-inputs.v3",
2144
2147
  modalities: {
2145
2148
  text: { enabled: false, required: false },
2146
2149
  files: { enabled: false, required: false, allowed_mime_types: [] },
@@ -2167,7 +2170,7 @@ function OperationErrorNotice({ runtime }) {
2167
2170
  if (!error) return null;
2168
2171
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "pointer-events-none absolute inset-x-0 top-3 z-40 flex justify-center px-4", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "pointer-events-auto flex max-w-lg items-start gap-2 rounded-lg border border-destructive/20 bg-background px-3 py-2 text-sm shadow-md", role: "alert", children: [
2169
2172
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.CircleAlert, { className: "mt-0.5 size-4 shrink-0 text-destructive" }),
2170
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "min-w-0 flex-1 wrap-break-word", children: (0, import_runtime2.agentChatRuntimeErrorMessage)(error) || "The chat could not complete that action." }),
2173
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "min-w-0 flex-1 wrap-break-word", children: (0, import_runtime3.agentChatRuntimeErrorMessage)(error) || "The chat could not complete that action." }),
2171
2174
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2172
2175
  Button,
2173
2176
  {
@@ -2348,6 +2351,7 @@ function ChatShell({
2348
2351
  inputContract: runtime.inputContract || LOADING_INPUT_CONTRACT,
2349
2352
  contextWindow: runtime.contextWindow,
2350
2353
  disabled: runtime.isBootstrapping || runtime.isChangingAgent || isUploading || hasBlockingError,
2354
+ scopeKey: controller.activeThreadId,
2351
2355
  focusKey: controller.activeThreadId,
2352
2356
  forceExpanded: isEmptyState,
2353
2357
  isCancelling,
@@ -2401,7 +2405,7 @@ function RuntimeChat({
2401
2405
  identity = GUEST_CHAT_IDENTITY,
2402
2406
  ...props
2403
2407
  }) {
2404
- const runtime = (0, import_runtime3.useAgentChatRuntime)({
2408
+ const runtime = (0, import_runtime4.useAgentChatRuntime)({
2405
2409
  ...props,
2406
2410
  mcpRedirectUri: props.mcpRedirectUri || (typeof window === "undefined" ? void 0 : window.location.href)
2407
2411
  });