@agents24/chat-react 0.5.39 → 0.5.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/compatibility.json
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"title": "Agents24 Chat",
|
|
6
6
|
"description": "Complete editable Agents24 chat, inheriting your application's theme.",
|
|
7
7
|
"dependencies": [
|
|
8
|
-
"@agents24/chat-react@0.5.
|
|
9
|
-
"@agents24/client@0.2.
|
|
10
|
-
"@agents24/react@0.2.
|
|
8
|
+
"@agents24/chat-react@0.5.40",
|
|
9
|
+
"@agents24/client@0.2.22",
|
|
10
|
+
"@agents24/react@0.2.27",
|
|
11
11
|
"@shadcn/react@^0.2.1",
|
|
12
12
|
"class-variance-authority@^0.7.1",
|
|
13
13
|
"clsx@^2.1.1",
|
|
@@ -254,13 +254,13 @@
|
|
|
254
254
|
}
|
|
255
255
|
],
|
|
256
256
|
"meta": {
|
|
257
|
-
"version": "0.5.
|
|
257
|
+
"version": "0.5.40",
|
|
258
258
|
"source": "packages/agents24-chat-react/scaffold",
|
|
259
259
|
"source_sha256": "411a13a78466b84a923ae81a16d1b032deb758e7f44c1df5915cfdff71df6d62",
|
|
260
260
|
"agents24": {
|
|
261
|
-
"@agents24/client": "0.2.
|
|
262
|
-
"@agents24/react": "0.2.
|
|
263
|
-
"@agents24/chat-react": "0.5.
|
|
261
|
+
"@agents24/client": "0.2.22",
|
|
262
|
+
"@agents24/react": "0.2.27",
|
|
263
|
+
"@agents24/chat-react": "0.5.40"
|
|
264
264
|
}
|
|
265
265
|
},
|
|
266
266
|
"docs": "Import the installed styles.css from your application stylesheet. Pass your configured AgentClient to Agents24ChatScaffold. Authentication and URLs remain host-owned. Installed UI is editable; review changes before reinstalling and do not use --overwrite on customized files."
|
package/dist/runtime/index.cjs
CHANGED
|
@@ -456,10 +456,13 @@ function useAgentChatRuntime(options) {
|
|
|
456
456
|
activeThreadId === void 0 ? { client } : { activeThreadId, client }
|
|
457
457
|
);
|
|
458
458
|
const attachments = (0, import_react2.useAgentAttachments)();
|
|
459
|
-
const
|
|
459
|
+
const bootstrapOwnerRef = React2.useRef(null);
|
|
460
|
+
const [bootstrapState, setBootstrap] = React2.useState(null);
|
|
461
|
+
const bootstrap = bootstrapOwnerRef.current === client ? bootstrapState : null;
|
|
460
462
|
const bootstrapRef = React2.useRef(bootstrap);
|
|
461
463
|
bootstrapRef.current = bootstrap;
|
|
462
|
-
const [
|
|
464
|
+
const [effectivePolicyState, setEffectivePolicy] = React2.useState(null);
|
|
465
|
+
const effectivePolicy = bootstrapOwnerRef.current === client ? effectivePolicyState : null;
|
|
463
466
|
const [isBootstrapping, setIsBootstrapping] = React2.useState(true);
|
|
464
467
|
const [bootstrapError, setBootstrapError] = React2.useState(null);
|
|
465
468
|
const [localOperationError, setLocalOperationError] = React2.useState(null);
|
|
@@ -476,6 +479,7 @@ function useAgentChatRuntime(options) {
|
|
|
476
479
|
const mountedRef = React2.useRef(true);
|
|
477
480
|
const clientRef = React2.useRef(client);
|
|
478
481
|
clientRef.current = client;
|
|
482
|
+
const bootstrapRetryRef = React2.useRef(0);
|
|
479
483
|
const bootstrapPromiseRef = React2.useRef(null);
|
|
480
484
|
React2.useEffect(() => {
|
|
481
485
|
mountedRef.current = true;
|
|
@@ -507,15 +511,22 @@ function useAgentChatRuntime(options) {
|
|
|
507
511
|
const requestClient = client;
|
|
508
512
|
const request = (async () => {
|
|
509
513
|
if (mountedRef.current) {
|
|
510
|
-
|
|
514
|
+
const identityChanged = bootstrapOwnerRef.current !== requestClient;
|
|
515
|
+
setIsBootstrapping(identityChanged || !bootstrapRef.current);
|
|
511
516
|
setBootstrapError(null);
|
|
512
|
-
|
|
513
|
-
|
|
517
|
+
if (identityChanged) {
|
|
518
|
+
setBootstrap(null);
|
|
519
|
+
setEffectivePolicy(null);
|
|
520
|
+
setSelectedAgentId(null);
|
|
521
|
+
setSelectedModelId(null);
|
|
522
|
+
}
|
|
514
523
|
}
|
|
515
524
|
try {
|
|
516
525
|
const requestedAgentId = selectedAgentIdRef.current;
|
|
517
526
|
const result = await requestClient.bootstrap({ agentId: requestedAgentId || void 0 });
|
|
518
527
|
if (!mountedRef.current || clientRef.current !== requestClient) return;
|
|
528
|
+
bootstrapOwnerRef.current = requestClient;
|
|
529
|
+
bootstrapRetryRef.current = 0;
|
|
519
530
|
setBootstrap(result);
|
|
520
531
|
const agentFeature = result.features.agents;
|
|
521
532
|
const resolvedAgentId = agentIdFromBootstrap(result, requestedAgentId);
|
|
@@ -527,9 +538,17 @@ function useAgentChatRuntime(options) {
|
|
|
527
538
|
if (modelId === void 0) {
|
|
528
539
|
setSelectedModelId((current) => availableModels.models.some((item) => item.id === current) ? current : availableModels.defaultModelId);
|
|
529
540
|
}
|
|
530
|
-
|
|
541
|
+
void controller.refreshThreads().catch(() => void 0);
|
|
531
542
|
} catch (error) {
|
|
532
|
-
if (mountedRef.current && clientRef.current === requestClient)
|
|
543
|
+
if (mountedRef.current && clientRef.current === requestClient) {
|
|
544
|
+
const status = error?.status;
|
|
545
|
+
if (status === 401 || status === 403 || status === 404) {
|
|
546
|
+
setBootstrap(null);
|
|
547
|
+
setEffectivePolicy(null);
|
|
548
|
+
bootstrapOwnerRef.current = null;
|
|
549
|
+
}
|
|
550
|
+
setBootstrapError(error);
|
|
551
|
+
}
|
|
533
552
|
} finally {
|
|
534
553
|
if (mountedRef.current && clientRef.current === requestClient) setIsBootstrapping(false);
|
|
535
554
|
}
|
|
@@ -540,6 +559,21 @@ function useAgentChatRuntime(options) {
|
|
|
540
559
|
});
|
|
541
560
|
return request;
|
|
542
561
|
}, [client, controller.refreshThreads, modelId]);
|
|
562
|
+
React2.useEffect(() => {
|
|
563
|
+
if (!bootstrapError || bootstrapRetryRef.current >= 4) return;
|
|
564
|
+
const error = bootstrapError;
|
|
565
|
+
if (!(error.retryable || error.kind === "network" || (error.status || 0) >= 500)) return;
|
|
566
|
+
const attempt = bootstrapRetryRef.current++;
|
|
567
|
+
const hint = error.retryAfterMs;
|
|
568
|
+
const delay = Math.max(
|
|
569
|
+
500 * 2 ** attempt + Math.random() * 250,
|
|
570
|
+
typeof hint === "number" && Number.isFinite(hint) && hint >= 0 ? Math.min(hint, 6e4) : 0
|
|
571
|
+
);
|
|
572
|
+
const timer = setTimeout(() => {
|
|
573
|
+
void retryBootstrap();
|
|
574
|
+
}, delay);
|
|
575
|
+
return () => clearTimeout(timer);
|
|
576
|
+
}, [bootstrapError, retryBootstrap]);
|
|
543
577
|
const refreshEffectivePolicy = React2.useCallback(async () => {
|
|
544
578
|
if (bootstrap?.features.agents) {
|
|
545
579
|
const refreshed = await client.bootstrap({ agentId: selectedAgentIdRef.current || void 0 });
|
|
@@ -755,18 +789,18 @@ function useAgentChatRuntime(options) {
|
|
|
755
789
|
return request;
|
|
756
790
|
}, [clearOperationError, client, controller.activeRunId, controller.activeThreadId, controller.runState]);
|
|
757
791
|
const modelOptions = effectivePolicy ? modelsFromEffectivePolicy(effectivePolicy).models : bootstrap ? modelsFromAgentChatBootstrap(bootstrap).models : [];
|
|
758
|
-
const fatalError = bootstrapError || controller.error;
|
|
792
|
+
const fatalError = (!bootstrap ? bootstrapError : null) || controller.error;
|
|
759
793
|
const operationError = localOperationError || controller.operationError?.cause;
|
|
760
794
|
const state = isBootstrapping ? "loading" : fatalError ? agentChatRuntimeStateFromError(fatalError) : controller.runState === "uploading" ? "uploading" : controller.runState === "streaming" ? "streaming" : controller.runState === "reconnecting" ? "reconnecting" : controller.runState === "paused" ? "paused" : controller.runState === "cancelling" ? "cancelling" : controller.runState === "cancelled" ? "cancelled" : "ready";
|
|
761
|
-
const connectionState = state === "offline" ? "offline" : state === "expired" ? "expired" : state === "reconnecting" ? "reconnecting" : isBootstrapping ? "connecting" : "connected";
|
|
795
|
+
const connectionState = bootstrapError && bootstrap ? "reconnecting" : state === "offline" ? "offline" : state === "expired" ? "expired" : state === "reconnecting" ? "reconnecting" : isBootstrapping ? "connecting" : "connected";
|
|
762
796
|
return {
|
|
763
797
|
agent: agentOverride || { name: bootstrap?.deployment.name || "Agent" },
|
|
764
798
|
inputContract: bootstrap?.features.inputs || null,
|
|
765
799
|
allowFeedback: Boolean(bootstrap?.capabilities.includes("feedback.write")),
|
|
766
|
-
backgroundError: controller.backgroundError?.cause || null,
|
|
800
|
+
backgroundError: bootstrap && bootstrapError || controller.backgroundError?.cause || null,
|
|
767
801
|
bootstrap,
|
|
768
802
|
capabilities: bootstrap?.capabilities || [],
|
|
769
|
-
agentId: selectedAgentId,
|
|
803
|
+
agentId: bootstrap ? selectedAgentId : null,
|
|
770
804
|
agents: bootstrap?.features.agents?.options.map((item) => ({ id: item.id, label: item.label })) || [],
|
|
771
805
|
changeAgent,
|
|
772
806
|
changeModel,
|
|
@@ -783,7 +817,7 @@ function useAgentChatRuntime(options) {
|
|
|
783
817
|
isChangingAgent,
|
|
784
818
|
isSubmitting: isSubmitting || controller.isSubmitting,
|
|
785
819
|
isUploading: attachments.isUploading || controller.runState === "uploading",
|
|
786
|
-
modelId: selectedModelId,
|
|
820
|
+
modelId: bootstrap ? selectedModelId : null,
|
|
787
821
|
models: modelOptions,
|
|
788
822
|
newThread,
|
|
789
823
|
onHitlAction,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/index.ts","../../src/runtime/use-agent-chat-runtime.ts","../../src/runtime/use-agent-chat-hitl.ts","../../src/mcp-oauth.ts","../../src/runtime/input-contract.ts","../../src/runtime/use-delegation-tasks.ts"],"sourcesContent":["export * from \"./use-agent-chat-runtime\";\nexport * from \"./input-contract\";\n\nexport * from \"./use-delegation-tasks\";\nexport type * from \"../generated/delegation-types\";\n","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 type { McpCallbackResult } from \"@agents24/client\";\nimport type { ChatMcpOauthCompletion, WaitForMcpOauthCompleteInput } from \"./types\";\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\ntype CryptoLike = {\n getRandomValues<T extends Uint8Array>(array: T): T;\n randomUUID(): string;\n subtle: { digest(algorithm: string, data: Uint8Array): Promise<ArrayBuffer> };\n};\n\nexport function browserChatCrypto(): CryptoLike {\n const value = (globalThis as unknown as { crypto?: CryptoLike }).crypto;\n if (!value?.subtle || !value.randomUUID) {\n throw new Error(\"Secure browser crypto is required for MCP authorization.\");\n }\n return value;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n bytes.forEach((byte) => { binary += String.fromCharCode(byte); });\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nexport async function createMcpPkceProof(): Promise<{ challenge: string; verifier: string }> {\n const crypto = browserChatCrypto();\n const verifier = base64Url(crypto.getRandomValues(new Uint8Array(32)));\n const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(verifier));\n return { challenge: base64Url(new Uint8Array(digest)), verifier };\n}\n\nfunction isLoopback(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\";\n}\n\nfunction normalizedOrigin(value: string): string {\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && isLoopback(url.hostname))) {\n throw new Error(\"unsafe callback origin\");\n }\n if (url.origin === \"null\") throw new Error(\"opaque callback origin\");\n return url.origin;\n } catch {\n throw new Error(\"MCP authorization returned an invalid callback origin.\");\n }\n}\n\nexport function validateMcpCallbackResult(\n result: McpCallbackResult,\n expectedServerId: string,\n): McpCallbackResult {\n const serverId = String(result.server_id || \"\").trim();\n const connectionId = String(result.connection_id || \"\").trim();\n if (!serverId || serverId !== expectedServerId) {\n throw new Error(\"MCP authorization completed for an unexpected server.\");\n }\n if (!UUID_PATTERN.test(connectionId)) {\n throw new Error(\"MCP authorization returned an invalid connection identity.\");\n }\n return result;\n}\n\nexport function waitForMcpOauthComplete({\n popup,\n callbackOrigin,\n popupNonce,\n requireConnectionId = false,\n serverId,\n runId,\n interruptId,\n signal,\n timeoutMs = 120_000,\n}: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion> {\n if (!popup) return Promise.reject(new Error(\"Could not open the MCP authorization popup.\"));\n const expectedOrigin = normalizedOrigin(callbackOrigin);\n const expectedServerId = String(serverId || \"\").trim();\n const expectedPopupNonce = String(popupNonce || \"\").trim();\n if (!expectedServerId) return Promise.reject(new Error(\"MCP authorization is missing its server identity.\"));\n if (!expectedPopupNonce) return Promise.reject(new Error(\"MCP authorization is missing its popup binding.\"));\n const aborted = () => new DOMException(\"MCP authorization detached.\", \"AbortError\");\n if (signal?.aborted) return Promise.reject(aborted());\n const returnFocusTo = typeof document !== \"undefined\"\n ? document.activeElement as { focus?: () => void } | null\n : null;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const finish = (result: ChatMcpOauthCompletion | Error) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timeout);\n window.clearInterval(closeTimer);\n window.removeEventListener(\"message\", onMessage);\n signal?.removeEventListener(\"abort\", onAbort);\n if (!signal?.aborted) returnFocusTo?.focus?.();\n if (result instanceof Error) reject(result);\n else resolve(result);\n };\n const onAbort = () => finish(aborted());\n const onMessage = (event: MessageEvent) => {\n if (event.source !== popup || event.origin !== expectedOrigin) return;\n const data = event.data as {\n type?: string;\n code?: string;\n connection_id?: string;\n popup_nonce?: string;\n server_id?: string;\n run_id?: string;\n interrupt_id?: string;\n success?: boolean;\n } | null;\n if (\n data?.type !== \"agents24.mcp.callback\" ||\n data.server_id !== expectedServerId ||\n data.popup_nonce !== expectedPopupNonce ||\n (runId !== undefined && data.run_id !== runId) ||\n (interruptId !== undefined && data.interrupt_id !== interruptId)\n ) return;\n if (data.success === false) {\n finish(new Error(\"MCP authorization could not be completed.\"));\n return;\n }\n const code = String(data.code || \"\").trim();\n if (!code || code.length > 2048) return;\n const connectionId = String(data.connection_id || \"\").trim();\n if ((requireConnectionId || connectionId) && !UUID_PATTERN.test(connectionId)) return;\n finish({\n code,\n ...(connectionId ? { connectionId } : {}),\n popupNonce: expectedPopupNonce,\n serverId: expectedServerId,\n });\n };\n const timeout = window.setTimeout(\n () => finish(new Error(\"MCP authorization timed out.\")),\n Math.max(1, timeoutMs),\n );\n const closeTimer = window.setInterval(() => {\n if (popup.closed) finish(new Error(\"MCP authorization window was closed before connecting.\"));\n }, 500);\n window.addEventListener(\"message\", onMessage);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import { normalizeAttachmentMimeType, SUPPORTED_ATTACHMENT_MIME_TYPES, type ClientInputFeature, type PortableUpload } from \"@agents24/client\";\nexport { attachmentFileAccept, normalizeAttachmentMimeType } from \"@agents24/client\";\n\nexport type AgentChatInputContract = ClientInputFeature;\n\nexport const SUPPORTED_INPUT_MIME_TYPES = SUPPORTED_ATTACHMENT_MIME_TYPES;\n\nexport type WorkflowInputRule = {\n key: string;\n enabled?: boolean;\n required?: boolean;\n};\n\nexport function workflowInputRule(\n inputs: readonly WorkflowInputRule[] | null | undefined,\n key: string,\n): { enabled: boolean; required: boolean } {\n const input = inputs?.find((candidate) => candidate.key === key);\n return {\n enabled: input?.enabled !== false,\n required: input?.required === true,\n };\n}\n\nexport function validateWorkflowInputSubmission(\n inputs: readonly WorkflowInputRule[] | null | undefined,\n text: string,\n attachmentMimeTypes: readonly string[],\n): string | null {\n const present = { files: false, images: false, audio: false };\n if (text.trim() && !workflowInputRule(inputs, \"text\").enabled) {\n return \"This workflow does not accept text input.\";\n }\n for (const rawMimeType of attachmentMimeTypes) {\n const mimeType = canonicalInputMimeType(rawMimeType);\n const modality = mimeType.startsWith(\"image/\") ? \"images\" : mimeType.startsWith(\"audio/\") ? \"audio\" : \"files\";\n const supported = (SUPPORTED_INPUT_MIME_TYPES[modality] as readonly string[]).includes(mimeType);\n if (!supported || !workflowInputRule(inputs, modality).enabled) {\n return `The attachment type ${mimeType || \"unknown\"} is not accepted.`;\n }\n present[modality] = true;\n }\n if (workflowInputRule(inputs, \"text\").required && !text.trim()) return \"Text input is required.\";\n for (const modality of [\"files\", \"images\", \"audio\"] as const) {\n if (workflowInputRule(inputs, modality).required && !present[modality]) {\n return `${modality[0].toUpperCase()}${modality.slice(1)} input is required.`;\n }\n }\n return null;\n}\n\nexport const canonicalInputMimeType = normalizeAttachmentMimeType;\n\nfunction uploadByteSize(data: PortableUpload[\"data\"]): number {\n if (data instanceof Uint8Array || data instanceof ArrayBuffer) return data.byteLength;\n return data.size;\n}\n\nexport function inputMimeTypes(contract: AgentChatInputContract | null | undefined): string[] {\n if (!contract) return [];\n return [\n ...([\"files\", \"images\", \"audio\"] as const).flatMap(key => contract.modalities[key].enabled ? contract.modalities[key].allowed_mime_types : []),\n ];\n}\n\nexport function validateAgentChatSubmission(\n contract: AgentChatInputContract,\n text: string,\n files: readonly (Pick<PortableUpload, \"mediaType\" | \"data\"> & Partial<Pick<PortableUpload, \"name\">> & { byteSize?: number })[],\n): string | null {\n const { modalities, limits } = contract;\n if (files.length && contract.validation_issues?.length) return contract.validation_issues[0].message;\n const normalizedText = text.trim();\n if (normalizedText && !modalities.text.enabled) return \"This agent does not accept text input.\";\n if (modalities.text.required && !normalizedText) return \"Text input is required.\";\n if (files.length > limits.max_attachments_per_turn) {\n return `You can attach up to ${limits.max_attachments_per_turn} items per message.`;\n }\n let totalBytes = 0;\n const present = { files: false, images: false, audio: false };\n for (const file of files) {\n const mediaType = normalizeAttachmentMimeType(file.mediaType, file.name);\n const modality = mediaType.startsWith(\"image/\") ? \"images\" : mediaType.startsWith(\"audio/\") ? \"audio\" : \"files\";\n const rule = modalities[modality];\n if (!rule.enabled || !rule.allowed_mime_types.includes(mediaType)) {\n return `The attachment type ${mediaType || \"unknown\"} is not accepted.`;\n }\n const byteSize = file.byteSize ?? uploadByteSize(file.data);\n if (byteSize > limits.max_file_bytes) return \"An attachment exceeds the per-file size limit.\";\n totalBytes += byteSize;\n present[modality] = true;\n }\n if (totalBytes > limits.max_total_bytes) return \"Attachments exceed the total size limit.\";\n for (const modality of [\"files\", \"images\", \"audio\"] as const) {\n if (modalities[modality].required && !present[modality]) return `${modality[0].toUpperCase()}${modality.slice(1)} input is required.`;\n }\n return null;\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":["import_react","React","import_client","React"]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/index.ts","../../src/runtime/use-agent-chat-runtime.ts","../../src/runtime/use-agent-chat-hitl.ts","../../src/mcp-oauth.ts","../../src/runtime/input-contract.ts","../../src/runtime/use-delegation-tasks.ts"],"sourcesContent":["export * from \"./use-agent-chat-runtime\";\nexport * from \"./input-contract\";\n\nexport * from \"./use-delegation-tasks\";\nexport type * from \"../generated/delegation-types\";\n","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 bootstrapOwnerRef = React.useRef<AgentClient | null>(null);\n const [bootstrapState, setBootstrap] = React.useState<ClientBootstrap | null>(null);\n const bootstrap = bootstrapOwnerRef.current === client ? bootstrapState : null;\n const bootstrapRef = React.useRef<ClientBootstrap | null>(bootstrap);\n bootstrapRef.current = bootstrap;\n const [effectivePolicyState, setEffectivePolicy] = React.useState<EffectiveResourcePolicy | null>(null);\n const effectivePolicy = bootstrapOwnerRef.current === client ? effectivePolicyState : 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 bootstrapRetryRef = React.useRef(0);\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 const identityChanged = bootstrapOwnerRef.current !== requestClient;\n setIsBootstrapping(identityChanged || !bootstrapRef.current);\n setBootstrapError(null);\n if (identityChanged) {\n setBootstrap(null);\n setEffectivePolicy(null);\n setSelectedAgentId(null);\n setSelectedModelId(null);\n }\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 bootstrapOwnerRef.current = requestClient;\n bootstrapRetryRef.current = 0;\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 void controller.refreshThreads().catch(() => undefined);\n } catch (error) {\n if (mountedRef.current && clientRef.current === requestClient) {\n const status = (error as Agents24ClientError)?.status;\n if (status === 401 || status === 403 || status === 404) {\n setBootstrap(null);\n setEffectivePolicy(null);\n bootstrapOwnerRef.current = null;\n }\n setBootstrapError(error);\n }\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 React.useEffect(() => {\n if (!bootstrapError || bootstrapRetryRef.current >= 4) return;\n const error = bootstrapError as Agents24ClientError;\n if (!(error.retryable || error.kind === \"network\" || (error.status || 0) >= 500)) return;\n const attempt = bootstrapRetryRef.current++;\n const hint = error.retryAfterMs;\n const delay = Math.max(500 * 2 ** attempt + Math.random() * 250,\n typeof hint === \"number\" && Number.isFinite(hint) && hint >= 0 ? Math.min(hint, 60_000) : 0);\n const timer = setTimeout(() => { void retryBootstrap(); }, delay);\n return () => clearTimeout(timer);\n }, [bootstrapError, retryBootstrap]);\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 = (!bootstrap ? bootstrapError : null) || 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 = bootstrapError && bootstrap ? \"reconnecting\" : 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: (bootstrap && bootstrapError) || controller.backgroundError?.cause || null,\n bootstrap,\n capabilities: bootstrap?.capabilities || [],\n agentId: bootstrap ? selectedAgentId : null,\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: bootstrap ? selectedModelId : null,\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 type { McpCallbackResult } from \"@agents24/client\";\nimport type { ChatMcpOauthCompletion, WaitForMcpOauthCompleteInput } from \"./types\";\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\ntype CryptoLike = {\n getRandomValues<T extends Uint8Array>(array: T): T;\n randomUUID(): string;\n subtle: { digest(algorithm: string, data: Uint8Array): Promise<ArrayBuffer> };\n};\n\nexport function browserChatCrypto(): CryptoLike {\n const value = (globalThis as unknown as { crypto?: CryptoLike }).crypto;\n if (!value?.subtle || !value.randomUUID) {\n throw new Error(\"Secure browser crypto is required for MCP authorization.\");\n }\n return value;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n bytes.forEach((byte) => { binary += String.fromCharCode(byte); });\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nexport async function createMcpPkceProof(): Promise<{ challenge: string; verifier: string }> {\n const crypto = browserChatCrypto();\n const verifier = base64Url(crypto.getRandomValues(new Uint8Array(32)));\n const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(verifier));\n return { challenge: base64Url(new Uint8Array(digest)), verifier };\n}\n\nfunction isLoopback(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\";\n}\n\nfunction normalizedOrigin(value: string): string {\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && isLoopback(url.hostname))) {\n throw new Error(\"unsafe callback origin\");\n }\n if (url.origin === \"null\") throw new Error(\"opaque callback origin\");\n return url.origin;\n } catch {\n throw new Error(\"MCP authorization returned an invalid callback origin.\");\n }\n}\n\nexport function validateMcpCallbackResult(\n result: McpCallbackResult,\n expectedServerId: string,\n): McpCallbackResult {\n const serverId = String(result.server_id || \"\").trim();\n const connectionId = String(result.connection_id || \"\").trim();\n if (!serverId || serverId !== expectedServerId) {\n throw new Error(\"MCP authorization completed for an unexpected server.\");\n }\n if (!UUID_PATTERN.test(connectionId)) {\n throw new Error(\"MCP authorization returned an invalid connection identity.\");\n }\n return result;\n}\n\nexport function waitForMcpOauthComplete({\n popup,\n callbackOrigin,\n popupNonce,\n requireConnectionId = false,\n serverId,\n runId,\n interruptId,\n signal,\n timeoutMs = 120_000,\n}: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion> {\n if (!popup) return Promise.reject(new Error(\"Could not open the MCP authorization popup.\"));\n const expectedOrigin = normalizedOrigin(callbackOrigin);\n const expectedServerId = String(serverId || \"\").trim();\n const expectedPopupNonce = String(popupNonce || \"\").trim();\n if (!expectedServerId) return Promise.reject(new Error(\"MCP authorization is missing its server identity.\"));\n if (!expectedPopupNonce) return Promise.reject(new Error(\"MCP authorization is missing its popup binding.\"));\n const aborted = () => new DOMException(\"MCP authorization detached.\", \"AbortError\");\n if (signal?.aborted) return Promise.reject(aborted());\n const returnFocusTo = typeof document !== \"undefined\"\n ? document.activeElement as { focus?: () => void } | null\n : null;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const finish = (result: ChatMcpOauthCompletion | Error) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timeout);\n window.clearInterval(closeTimer);\n window.removeEventListener(\"message\", onMessage);\n signal?.removeEventListener(\"abort\", onAbort);\n if (!signal?.aborted) returnFocusTo?.focus?.();\n if (result instanceof Error) reject(result);\n else resolve(result);\n };\n const onAbort = () => finish(aborted());\n const onMessage = (event: MessageEvent) => {\n if (event.source !== popup || event.origin !== expectedOrigin) return;\n const data = event.data as {\n type?: string;\n code?: string;\n connection_id?: string;\n popup_nonce?: string;\n server_id?: string;\n run_id?: string;\n interrupt_id?: string;\n success?: boolean;\n } | null;\n if (\n data?.type !== \"agents24.mcp.callback\" ||\n data.server_id !== expectedServerId ||\n data.popup_nonce !== expectedPopupNonce ||\n (runId !== undefined && data.run_id !== runId) ||\n (interruptId !== undefined && data.interrupt_id !== interruptId)\n ) return;\n if (data.success === false) {\n finish(new Error(\"MCP authorization could not be completed.\"));\n return;\n }\n const code = String(data.code || \"\").trim();\n if (!code || code.length > 2048) return;\n const connectionId = String(data.connection_id || \"\").trim();\n if ((requireConnectionId || connectionId) && !UUID_PATTERN.test(connectionId)) return;\n finish({\n code,\n ...(connectionId ? { connectionId } : {}),\n popupNonce: expectedPopupNonce,\n serverId: expectedServerId,\n });\n };\n const timeout = window.setTimeout(\n () => finish(new Error(\"MCP authorization timed out.\")),\n Math.max(1, timeoutMs),\n );\n const closeTimer = window.setInterval(() => {\n if (popup.closed) finish(new Error(\"MCP authorization window was closed before connecting.\"));\n }, 500);\n window.addEventListener(\"message\", onMessage);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import { normalizeAttachmentMimeType, SUPPORTED_ATTACHMENT_MIME_TYPES, type ClientInputFeature, type PortableUpload } from \"@agents24/client\";\nexport { attachmentFileAccept, normalizeAttachmentMimeType } from \"@agents24/client\";\n\nexport type AgentChatInputContract = ClientInputFeature;\n\nexport const SUPPORTED_INPUT_MIME_TYPES = SUPPORTED_ATTACHMENT_MIME_TYPES;\n\nexport type WorkflowInputRule = {\n key: string;\n enabled?: boolean;\n required?: boolean;\n};\n\nexport function workflowInputRule(\n inputs: readonly WorkflowInputRule[] | null | undefined,\n key: string,\n): { enabled: boolean; required: boolean } {\n const input = inputs?.find((candidate) => candidate.key === key);\n return {\n enabled: input?.enabled !== false,\n required: input?.required === true,\n };\n}\n\nexport function validateWorkflowInputSubmission(\n inputs: readonly WorkflowInputRule[] | null | undefined,\n text: string,\n attachmentMimeTypes: readonly string[],\n): string | null {\n const present = { files: false, images: false, audio: false };\n if (text.trim() && !workflowInputRule(inputs, \"text\").enabled) {\n return \"This workflow does not accept text input.\";\n }\n for (const rawMimeType of attachmentMimeTypes) {\n const mimeType = canonicalInputMimeType(rawMimeType);\n const modality = mimeType.startsWith(\"image/\") ? \"images\" : mimeType.startsWith(\"audio/\") ? \"audio\" : \"files\";\n const supported = (SUPPORTED_INPUT_MIME_TYPES[modality] as readonly string[]).includes(mimeType);\n if (!supported || !workflowInputRule(inputs, modality).enabled) {\n return `The attachment type ${mimeType || \"unknown\"} is not accepted.`;\n }\n present[modality] = true;\n }\n if (workflowInputRule(inputs, \"text\").required && !text.trim()) return \"Text input is required.\";\n for (const modality of [\"files\", \"images\", \"audio\"] as const) {\n if (workflowInputRule(inputs, modality).required && !present[modality]) {\n return `${modality[0].toUpperCase()}${modality.slice(1)} input is required.`;\n }\n }\n return null;\n}\n\nexport const canonicalInputMimeType = normalizeAttachmentMimeType;\n\nfunction uploadByteSize(data: PortableUpload[\"data\"]): number {\n if (data instanceof Uint8Array || data instanceof ArrayBuffer) return data.byteLength;\n return data.size;\n}\n\nexport function inputMimeTypes(contract: AgentChatInputContract | null | undefined): string[] {\n if (!contract) return [];\n return [\n ...([\"files\", \"images\", \"audio\"] as const).flatMap(key => contract.modalities[key].enabled ? contract.modalities[key].allowed_mime_types : []),\n ];\n}\n\nexport function validateAgentChatSubmission(\n contract: AgentChatInputContract,\n text: string,\n files: readonly (Pick<PortableUpload, \"mediaType\" | \"data\"> & Partial<Pick<PortableUpload, \"name\">> & { byteSize?: number })[],\n): string | null {\n const { modalities, limits } = contract;\n if (files.length && contract.validation_issues?.length) return contract.validation_issues[0].message;\n const normalizedText = text.trim();\n if (normalizedText && !modalities.text.enabled) return \"This agent does not accept text input.\";\n if (modalities.text.required && !normalizedText) return \"Text input is required.\";\n if (files.length > limits.max_attachments_per_turn) {\n return `You can attach up to ${limits.max_attachments_per_turn} items per message.`;\n }\n let totalBytes = 0;\n const present = { files: false, images: false, audio: false };\n for (const file of files) {\n const mediaType = normalizeAttachmentMimeType(file.mediaType, file.name);\n const modality = mediaType.startsWith(\"image/\") ? \"images\" : mediaType.startsWith(\"audio/\") ? \"audio\" : \"files\";\n const rule = modalities[modality];\n if (!rule.enabled || !rule.allowed_mime_types.includes(mediaType)) {\n return `The attachment type ${mediaType || \"unknown\"} is not accepted.`;\n }\n const byteSize = file.byteSize ?? uploadByteSize(file.data);\n if (byteSize > limits.max_file_bytes) return \"An attachment exceeds the per-file size limit.\";\n totalBytes += byteSize;\n present[modality] = true;\n }\n if (totalBytes > limits.max_total_bytes) return \"Attachments exceed the total size limit.\";\n for (const modality of [\"files\", \"images\", \"audio\"] as const) {\n if (modalities[modality].required && !present[modality]) return `${modality[0].toUpperCase()}${modality.slice(1)} input is required.`;\n }\n return null;\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":["import_react","React","import_client","React"]}
|
package/dist/runtime/index.js
CHANGED
|
@@ -237,10 +237,13 @@ function useAgentChatRuntime(options) {
|
|
|
237
237
|
activeThreadId === void 0 ? { client } : { activeThreadId, client }
|
|
238
238
|
);
|
|
239
239
|
const attachments = useAgentAttachments();
|
|
240
|
-
const
|
|
240
|
+
const bootstrapOwnerRef = React2.useRef(null);
|
|
241
|
+
const [bootstrapState, setBootstrap] = React2.useState(null);
|
|
242
|
+
const bootstrap = bootstrapOwnerRef.current === client ? bootstrapState : null;
|
|
241
243
|
const bootstrapRef = React2.useRef(bootstrap);
|
|
242
244
|
bootstrapRef.current = bootstrap;
|
|
243
|
-
const [
|
|
245
|
+
const [effectivePolicyState, setEffectivePolicy] = React2.useState(null);
|
|
246
|
+
const effectivePolicy = bootstrapOwnerRef.current === client ? effectivePolicyState : null;
|
|
244
247
|
const [isBootstrapping, setIsBootstrapping] = React2.useState(true);
|
|
245
248
|
const [bootstrapError, setBootstrapError] = React2.useState(null);
|
|
246
249
|
const [localOperationError, setLocalOperationError] = React2.useState(null);
|
|
@@ -257,6 +260,7 @@ function useAgentChatRuntime(options) {
|
|
|
257
260
|
const mountedRef = React2.useRef(true);
|
|
258
261
|
const clientRef = React2.useRef(client);
|
|
259
262
|
clientRef.current = client;
|
|
263
|
+
const bootstrapRetryRef = React2.useRef(0);
|
|
260
264
|
const bootstrapPromiseRef = React2.useRef(null);
|
|
261
265
|
React2.useEffect(() => {
|
|
262
266
|
mountedRef.current = true;
|
|
@@ -288,15 +292,22 @@ function useAgentChatRuntime(options) {
|
|
|
288
292
|
const requestClient = client;
|
|
289
293
|
const request = (async () => {
|
|
290
294
|
if (mountedRef.current) {
|
|
291
|
-
|
|
295
|
+
const identityChanged = bootstrapOwnerRef.current !== requestClient;
|
|
296
|
+
setIsBootstrapping(identityChanged || !bootstrapRef.current);
|
|
292
297
|
setBootstrapError(null);
|
|
293
|
-
|
|
294
|
-
|
|
298
|
+
if (identityChanged) {
|
|
299
|
+
setBootstrap(null);
|
|
300
|
+
setEffectivePolicy(null);
|
|
301
|
+
setSelectedAgentId(null);
|
|
302
|
+
setSelectedModelId(null);
|
|
303
|
+
}
|
|
295
304
|
}
|
|
296
305
|
try {
|
|
297
306
|
const requestedAgentId = selectedAgentIdRef.current;
|
|
298
307
|
const result = await requestClient.bootstrap({ agentId: requestedAgentId || void 0 });
|
|
299
308
|
if (!mountedRef.current || clientRef.current !== requestClient) return;
|
|
309
|
+
bootstrapOwnerRef.current = requestClient;
|
|
310
|
+
bootstrapRetryRef.current = 0;
|
|
300
311
|
setBootstrap(result);
|
|
301
312
|
const agentFeature = result.features.agents;
|
|
302
313
|
const resolvedAgentId = agentIdFromBootstrap(result, requestedAgentId);
|
|
@@ -308,9 +319,17 @@ function useAgentChatRuntime(options) {
|
|
|
308
319
|
if (modelId === void 0) {
|
|
309
320
|
setSelectedModelId((current) => availableModels.models.some((item) => item.id === current) ? current : availableModels.defaultModelId);
|
|
310
321
|
}
|
|
311
|
-
|
|
322
|
+
void controller.refreshThreads().catch(() => void 0);
|
|
312
323
|
} catch (error) {
|
|
313
|
-
if (mountedRef.current && clientRef.current === requestClient)
|
|
324
|
+
if (mountedRef.current && clientRef.current === requestClient) {
|
|
325
|
+
const status = error?.status;
|
|
326
|
+
if (status === 401 || status === 403 || status === 404) {
|
|
327
|
+
setBootstrap(null);
|
|
328
|
+
setEffectivePolicy(null);
|
|
329
|
+
bootstrapOwnerRef.current = null;
|
|
330
|
+
}
|
|
331
|
+
setBootstrapError(error);
|
|
332
|
+
}
|
|
314
333
|
} finally {
|
|
315
334
|
if (mountedRef.current && clientRef.current === requestClient) setIsBootstrapping(false);
|
|
316
335
|
}
|
|
@@ -321,6 +340,21 @@ function useAgentChatRuntime(options) {
|
|
|
321
340
|
});
|
|
322
341
|
return request;
|
|
323
342
|
}, [client, controller.refreshThreads, modelId]);
|
|
343
|
+
React2.useEffect(() => {
|
|
344
|
+
if (!bootstrapError || bootstrapRetryRef.current >= 4) return;
|
|
345
|
+
const error = bootstrapError;
|
|
346
|
+
if (!(error.retryable || error.kind === "network" || (error.status || 0) >= 500)) return;
|
|
347
|
+
const attempt = bootstrapRetryRef.current++;
|
|
348
|
+
const hint = error.retryAfterMs;
|
|
349
|
+
const delay = Math.max(
|
|
350
|
+
500 * 2 ** attempt + Math.random() * 250,
|
|
351
|
+
typeof hint === "number" && Number.isFinite(hint) && hint >= 0 ? Math.min(hint, 6e4) : 0
|
|
352
|
+
);
|
|
353
|
+
const timer = setTimeout(() => {
|
|
354
|
+
void retryBootstrap();
|
|
355
|
+
}, delay);
|
|
356
|
+
return () => clearTimeout(timer);
|
|
357
|
+
}, [bootstrapError, retryBootstrap]);
|
|
324
358
|
const refreshEffectivePolicy = React2.useCallback(async () => {
|
|
325
359
|
if (bootstrap?.features.agents) {
|
|
326
360
|
const refreshed = await client.bootstrap({ agentId: selectedAgentIdRef.current || void 0 });
|
|
@@ -536,18 +570,18 @@ function useAgentChatRuntime(options) {
|
|
|
536
570
|
return request;
|
|
537
571
|
}, [clearOperationError, client, controller.activeRunId, controller.activeThreadId, controller.runState]);
|
|
538
572
|
const modelOptions = effectivePolicy ? modelsFromEffectivePolicy(effectivePolicy).models : bootstrap ? modelsFromAgentChatBootstrap(bootstrap).models : [];
|
|
539
|
-
const fatalError = bootstrapError || controller.error;
|
|
573
|
+
const fatalError = (!bootstrap ? bootstrapError : null) || controller.error;
|
|
540
574
|
const operationError = localOperationError || controller.operationError?.cause;
|
|
541
575
|
const state = isBootstrapping ? "loading" : fatalError ? agentChatRuntimeStateFromError(fatalError) : controller.runState === "uploading" ? "uploading" : controller.runState === "streaming" ? "streaming" : controller.runState === "reconnecting" ? "reconnecting" : controller.runState === "paused" ? "paused" : controller.runState === "cancelling" ? "cancelling" : controller.runState === "cancelled" ? "cancelled" : "ready";
|
|
542
|
-
const connectionState = state === "offline" ? "offline" : state === "expired" ? "expired" : state === "reconnecting" ? "reconnecting" : isBootstrapping ? "connecting" : "connected";
|
|
576
|
+
const connectionState = bootstrapError && bootstrap ? "reconnecting" : state === "offline" ? "offline" : state === "expired" ? "expired" : state === "reconnecting" ? "reconnecting" : isBootstrapping ? "connecting" : "connected";
|
|
543
577
|
return {
|
|
544
578
|
agent: agentOverride || { name: bootstrap?.deployment.name || "Agent" },
|
|
545
579
|
inputContract: bootstrap?.features.inputs || null,
|
|
546
580
|
allowFeedback: Boolean(bootstrap?.capabilities.includes("feedback.write")),
|
|
547
|
-
backgroundError: controller.backgroundError?.cause || null,
|
|
581
|
+
backgroundError: bootstrap && bootstrapError || controller.backgroundError?.cause || null,
|
|
548
582
|
bootstrap,
|
|
549
583
|
capabilities: bootstrap?.capabilities || [],
|
|
550
|
-
agentId: selectedAgentId,
|
|
584
|
+
agentId: bootstrap ? selectedAgentId : null,
|
|
551
585
|
agents: bootstrap?.features.agents?.options.map((item) => ({ id: item.id, label: item.label })) || [],
|
|
552
586
|
changeAgent,
|
|
553
587
|
changeModel,
|
|
@@ -564,7 +598,7 @@ function useAgentChatRuntime(options) {
|
|
|
564
598
|
isChangingAgent,
|
|
565
599
|
isSubmitting: isSubmitting || controller.isSubmitting,
|
|
566
600
|
isUploading: attachments.isUploading || controller.runState === "uploading",
|
|
567
|
-
modelId: selectedModelId,
|
|
601
|
+
modelId: bootstrap ? selectedModelId : null,
|
|
568
602
|
models: modelOptions,
|
|
569
603
|
newThread,
|
|
570
604
|
onHitlAction,
|
|
@@ -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 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"]}
|
|
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 bootstrapOwnerRef = React.useRef<AgentClient | null>(null);\n const [bootstrapState, setBootstrap] = React.useState<ClientBootstrap | null>(null);\n const bootstrap = bootstrapOwnerRef.current === client ? bootstrapState : null;\n const bootstrapRef = React.useRef<ClientBootstrap | null>(bootstrap);\n bootstrapRef.current = bootstrap;\n const [effectivePolicyState, setEffectivePolicy] = React.useState<EffectiveResourcePolicy | null>(null);\n const effectivePolicy = bootstrapOwnerRef.current === client ? effectivePolicyState : 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 bootstrapRetryRef = React.useRef(0);\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 const identityChanged = bootstrapOwnerRef.current !== requestClient;\n setIsBootstrapping(identityChanged || !bootstrapRef.current);\n setBootstrapError(null);\n if (identityChanged) {\n setBootstrap(null);\n setEffectivePolicy(null);\n setSelectedAgentId(null);\n setSelectedModelId(null);\n }\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 bootstrapOwnerRef.current = requestClient;\n bootstrapRetryRef.current = 0;\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 void controller.refreshThreads().catch(() => undefined);\n } catch (error) {\n if (mountedRef.current && clientRef.current === requestClient) {\n const status = (error as Agents24ClientError)?.status;\n if (status === 401 || status === 403 || status === 404) {\n setBootstrap(null);\n setEffectivePolicy(null);\n bootstrapOwnerRef.current = null;\n }\n setBootstrapError(error);\n }\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 React.useEffect(() => {\n if (!bootstrapError || bootstrapRetryRef.current >= 4) return;\n const error = bootstrapError as Agents24ClientError;\n if (!(error.retryable || error.kind === \"network\" || (error.status || 0) >= 500)) return;\n const attempt = bootstrapRetryRef.current++;\n const hint = error.retryAfterMs;\n const delay = Math.max(500 * 2 ** attempt + Math.random() * 250,\n typeof hint === \"number\" && Number.isFinite(hint) && hint >= 0 ? Math.min(hint, 60_000) : 0);\n const timer = setTimeout(() => { void retryBootstrap(); }, delay);\n return () => clearTimeout(timer);\n }, [bootstrapError, retryBootstrap]);\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 = (!bootstrap ? bootstrapError : null) || 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 = bootstrapError && bootstrap ? \"reconnecting\" : 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: (bootstrap && bootstrapError) || controller.backgroundError?.cause || null,\n bootstrap,\n capabilities: bootstrap?.capabilities || [],\n agentId: bootstrap ? selectedAgentId : null,\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: bootstrap ? selectedModelId : null,\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agents24/chat-react",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.40",
|
|
4
4
|
"description": "Accessible web UI and complete default layout for Agents24 chat applications.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@untitledui/file-icons": "0.0.9",
|
|
67
|
-
"@agents24/client": "0.2.
|
|
68
|
-
"@agents24/react": "0.2.
|
|
67
|
+
"@agents24/client": "0.2.22",
|
|
68
|
+
"@agents24/react": "0.2.27",
|
|
69
69
|
"@fontsource-variable/inter": "^5.3.0",
|
|
70
70
|
"@fontsource-variable/jetbrains-mono": "^5.3.0",
|
|
71
71
|
"@fontsource-variable/merriweather": "^5.3.0",
|