@agents24/react 0.2.2 → 0.2.4
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/README.md +9 -1
- package/compatibility.json +4 -4
- package/dist/index.js +91 -10
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +1 -1
- package/dist/state.d.ts +4 -2
- package/dist/use-agent-chat.d.ts +3 -1
- package/dist/use-agent-resources.d.ts +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agents24 React
|
|
2
2
|
|
|
3
|
-
Last Updated: 2026-
|
|
3
|
+
Last Updated: 2026-08-24
|
|
4
4
|
|
|
5
5
|
`@agents24/react` is the DOM-free React state layer for `@agents24/client`. It owns providers, hooks, stable optimistic message identity, thread hydration and pagination, runtime-event state projection, attach/detach/cancel behavior, attachment state, repeated HITL resume, MCP authorization state, and unmount aborts.
|
|
6
6
|
|
|
@@ -45,4 +45,12 @@ sequence, but must never mutate `message.parts`. Use
|
|
|
45
45
|
`AgentResponseTimeline` from `@agents24/chat-react/ui` for the default
|
|
46
46
|
presentation or its exported part primitives for a custom host timeline.
|
|
47
47
|
|
|
48
|
+
Agent-requested questions are typed `ChatHitlPart` values with `hitlKind: "user_input"`, ordered `questions`, and `allowedActions: ["respond"]`. A custom host may present the pending part in its composer and call `useAgentChat().resumeHitl(part, { action: "respond", answers })`; preserve the canonical part and let the controller reattach to the run.
|
|
49
|
+
|
|
48
50
|
Hosts may control selection with `activeThreadId`. An explicit `null` means New Chat and must not fall through to stored selection; a non-null initial value is hydrated even when it is already the initial state value. The controller adopts the backend `thread_id` from the first runtime event so a host can update its URL before the stream completes. URL shape and History API behavior remain host-owned.
|
|
51
|
+
|
|
52
|
+
`useAgentChat().submit(...)` accepts optional `requestedAgentId` and
|
|
53
|
+
`requestedModelId`. In a conversation-scoped BFF flow, these are preferences
|
|
54
|
+
only; the server validates the Agent/model against the current allowed
|
|
55
|
+
selection and persists preferred runtime restoration separately from the thread
|
|
56
|
+
identity.
|
package/compatibility.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"contractHash": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
|
|
3
|
-
"contractVersion": "0.
|
|
3
|
+
"contractVersion": "0.3.0",
|
|
4
4
|
"corpus": "conformance/v1/corpus.json",
|
|
5
5
|
"generatedBy": "@agents24/sdk-contract",
|
|
6
6
|
"packages": {
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"schemaVersion": "agents24.compatibility.v1",
|
|
49
49
|
"targetOperationCounts": {
|
|
50
|
-
"client":
|
|
51
|
-
"node":
|
|
52
|
-
"python":
|
|
50
|
+
"client": 60,
|
|
51
|
+
"node": 97,
|
|
52
|
+
"python": 88
|
|
53
53
|
}
|
|
54
54
|
}
|
package/dist/index.js
CHANGED
|
@@ -484,6 +484,23 @@ function reconcileRefreshedThreads(current, incoming, activeThreadId) {
|
|
|
484
484
|
const active = current.find((thread) => thread.id === activeThreadId);
|
|
485
485
|
return active?.isHydrated ? [active, ...incoming] : incoming;
|
|
486
486
|
}
|
|
487
|
+
function adoptStreamingThread(state, threadId) {
|
|
488
|
+
const normalizedThreadId = threadId.trim();
|
|
489
|
+
if (!normalizedThreadId || state.activeThreadId) return state;
|
|
490
|
+
const existing = state.threads.find((thread) => thread.id === normalizedThreadId);
|
|
491
|
+
const adopted = existing ? { ...existing, messages: state.messages, isHydrated: true } : {
|
|
492
|
+
id: normalizedThreadId,
|
|
493
|
+
runtime_selection: { agent_id: null, agent_alias: null, model_id: null },
|
|
494
|
+
participant_agents: [],
|
|
495
|
+
messages: state.messages,
|
|
496
|
+
isHydrated: true
|
|
497
|
+
};
|
|
498
|
+
return {
|
|
499
|
+
...state,
|
|
500
|
+
activeThreadId: normalizedThreadId,
|
|
501
|
+
threads: existing ? state.threads.map((thread) => thread.id === normalizedThreadId ? adopted : thread) : [adopted, ...state.threads]
|
|
502
|
+
};
|
|
503
|
+
}
|
|
487
504
|
function appendStableStreamingTurn(messages, userMessage, assistantMessage) {
|
|
488
505
|
const next = [...messages];
|
|
489
506
|
if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);
|
|
@@ -602,6 +619,8 @@ function applyRuntimeEvent(state, event) {
|
|
|
602
619
|
} : thread) : [{
|
|
603
620
|
id: activeThreadId,
|
|
604
621
|
title: null,
|
|
622
|
+
runtime_selection: { agent_id: null, agent_alias: null, model_id: null },
|
|
623
|
+
participant_agents: [],
|
|
605
624
|
messages,
|
|
606
625
|
isHydrated: true,
|
|
607
626
|
last_run_id: runId,
|
|
@@ -939,8 +958,12 @@ function useAgentChat(options = {}) {
|
|
|
939
958
|
}
|
|
940
959
|
}, [clearOperationError, client, detach, failOperation, pageSize, runtime, update]);
|
|
941
960
|
const consumeEvent = React2.useCallback((event) => {
|
|
961
|
+
const eventThreadId = typeof event.payload?.thread_id === "string" ? event.payload.thread_id.trim() : "";
|
|
962
|
+
if (eventThreadId && !stateRef.current.activeThreadId) {
|
|
963
|
+
update((current) => adoptStreamingThread(current, eventThreadId));
|
|
964
|
+
}
|
|
942
965
|
eventBuffer.push(event);
|
|
943
|
-
}, [eventBuffer]);
|
|
966
|
+
}, [eventBuffer, update]);
|
|
944
967
|
const attachRun = React2.useCallback(async (runId, cursor) => {
|
|
945
968
|
streamControllerRef.current?.abort();
|
|
946
969
|
const controller = runtime.createAbortController();
|
|
@@ -962,7 +985,7 @@ function useAgentChat(options = {}) {
|
|
|
962
985
|
}, [clearOperationError, client, consumeEvent, failOperation, runtime, update]);
|
|
963
986
|
attachRunRef.current = attachRun;
|
|
964
987
|
const submit = React2.useCallback(async (input) => {
|
|
965
|
-
if (!input.text.trim() && !input.attachmentIds?.length) return;
|
|
988
|
+
if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;
|
|
966
989
|
invalidateThreadOpen();
|
|
967
990
|
detach();
|
|
968
991
|
const controller = runtime.createAbortController();
|
|
@@ -970,18 +993,75 @@ function useAgentChat(options = {}) {
|
|
|
970
993
|
const userId = runtime.createId();
|
|
971
994
|
const assistantId = runtime.createId();
|
|
972
995
|
const idempotencyKey = runtime.createId();
|
|
973
|
-
const
|
|
996
|
+
const optimisticAttachments = input.attachments?.length ? input.attachments : input.uploads?.map((upload, index) => ({
|
|
997
|
+
id: `${userId}-attachment-${index}`,
|
|
998
|
+
filename: upload.name,
|
|
999
|
+
mediaType: upload.mediaType,
|
|
1000
|
+
status: "uploading"
|
|
1001
|
+
}));
|
|
1002
|
+
const userMessage = { id: userId, role: "user", content: input.text.trim(), createdAt: (/* @__PURE__ */ new Date()).toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: "text", kind: "text", text: input.text.trim() }] : [], attachments: optimisticAttachments };
|
|
974
1003
|
const assistantMessage = { id: assistantId, role: "assistant", content: "", createdAt: (/* @__PURE__ */ new Date()).toISOString(), isFinal: false, parts: [] };
|
|
975
1004
|
clearOperationError();
|
|
976
|
-
|
|
1005
|
+
const hasPendingUploads = Boolean(input.uploads?.length);
|
|
1006
|
+
update((current) => ({
|
|
1007
|
+
...current,
|
|
1008
|
+
messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage),
|
|
1009
|
+
streamingMessageId: assistantId,
|
|
1010
|
+
runState: hasPendingUploads ? "uploading" : "streaming",
|
|
1011
|
+
error: null
|
|
1012
|
+
}));
|
|
977
1013
|
setIsSubmitting(true);
|
|
1014
|
+
let streamStarted = false;
|
|
978
1015
|
try {
|
|
979
|
-
const
|
|
980
|
-
|
|
1016
|
+
const uploaded = hasPendingUploads ? await client.attachments.uploadBatch({
|
|
1017
|
+
uploads: input.uploads || [],
|
|
1018
|
+
threadId: stateRef.current.activeThreadId || void 0,
|
|
1019
|
+
requestedAgentId: input.requestedAgentId,
|
|
1020
|
+
idempotencyKey: runtime.createId(),
|
|
1021
|
+
signal: controller.signal
|
|
1022
|
+
}) : [];
|
|
1023
|
+
if (hasPendingUploads && uploaded.length !== input.uploads?.length) {
|
|
1024
|
+
throw new Error("Attachment upload returned an incomplete batch");
|
|
1025
|
+
}
|
|
1026
|
+
const resolvedAttachments = uploaded.length ? uploaded.map(attachmentResultToChatAttachment) : input.attachments;
|
|
1027
|
+
const attachmentIds = uploaded.length ? uploaded.map((attachment) => attachment.id) : input.attachmentIds;
|
|
1028
|
+
if (uploaded.length) {
|
|
1029
|
+
update((current) => ({
|
|
1030
|
+
...current,
|
|
1031
|
+
messages: current.messages.map((message) => message.id === userId ? { ...message, attachments: resolvedAttachments } : message),
|
|
1032
|
+
runState: "streaming"
|
|
1033
|
+
}));
|
|
1034
|
+
}
|
|
1035
|
+
streamStarted = true;
|
|
1036
|
+
const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || void 0, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);
|
|
1037
|
+
eventBuffer.flush();
|
|
1038
|
+
update((current) => {
|
|
1039
|
+
const threadId = result.threadId || current.activeThreadId;
|
|
1040
|
+
return {
|
|
1041
|
+
...current,
|
|
1042
|
+
activeThreadId: threadId,
|
|
1043
|
+
activeRunId: result.detached ? result.runId : current.activeRunId,
|
|
1044
|
+
cursor: result.cursor,
|
|
1045
|
+
runState: result.detached ? "reconnecting" : current.runState,
|
|
1046
|
+
threads: threadId ? current.threads.map((thread) => thread.id === threadId ? { ...thread, messages: current.messages, isHydrated: true } : thread) : current.threads
|
|
1047
|
+
};
|
|
1048
|
+
});
|
|
981
1049
|
if (result.threadId) await refreshThreads().catch(() => void 0);
|
|
982
1050
|
} catch (error) {
|
|
983
|
-
if (
|
|
984
|
-
update((current) =>
|
|
1051
|
+
if (isAbortLike(error) && !streamStarted) {
|
|
1052
|
+
update((current) => current.streamingMessageId === assistantId ? {
|
|
1053
|
+
...current,
|
|
1054
|
+
messages: current.messages.filter((message) => message.id !== userId && message.id !== assistantId),
|
|
1055
|
+
runState: "idle",
|
|
1056
|
+
streamingMessageId: null
|
|
1057
|
+
} : current);
|
|
1058
|
+
} else if (!isAbortLike(error)) {
|
|
1059
|
+
update((current) => ({
|
|
1060
|
+
...current,
|
|
1061
|
+
messages: streamStarted ? current.messages : current.messages.filter((message) => message.id !== userId && message.id !== assistantId),
|
|
1062
|
+
runState: "failed",
|
|
1063
|
+
streamingMessageId: null
|
|
1064
|
+
}));
|
|
985
1065
|
failOperation("submit", error);
|
|
986
1066
|
throw error;
|
|
987
1067
|
}
|
|
@@ -989,7 +1069,7 @@ function useAgentChat(options = {}) {
|
|
|
989
1069
|
setIsSubmitting(false);
|
|
990
1070
|
if (streamControllerRef.current === controller) streamControllerRef.current = null;
|
|
991
1071
|
}
|
|
992
|
-
}, [clearOperationError, client, consumeEvent, detach, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);
|
|
1072
|
+
}, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);
|
|
993
1073
|
const startNewThread = React2.useCallback(() => {
|
|
994
1074
|
invalidateThreadOpen();
|
|
995
1075
|
detach();
|
|
@@ -1319,7 +1399,7 @@ function useAgentAttachments() {
|
|
|
1319
1399
|
const uploadBatch = React3.useCallback(async (input) => {
|
|
1320
1400
|
setIsUploading(true);
|
|
1321
1401
|
try {
|
|
1322
|
-
const results = await client.attachments.uploadBatch({ uploads: input.uploads, threadId: input.threadId, idempotencyKey: createId(), signal: input.signal });
|
|
1402
|
+
const results = await client.attachments.uploadBatch({ uploads: input.uploads, threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });
|
|
1323
1403
|
setUploads((current) => Object.fromEntries([
|
|
1324
1404
|
...Object.entries(current),
|
|
1325
1405
|
...results.map((result) => [result.id, result])
|
|
@@ -1367,6 +1447,7 @@ function useAgentMcp() {
|
|
|
1367
1447
|
}
|
|
1368
1448
|
export {
|
|
1369
1449
|
Agents24Provider,
|
|
1450
|
+
adoptStreamingThread,
|
|
1370
1451
|
appendStableStreamingTurn,
|
|
1371
1452
|
applyRuntimeEvent,
|
|
1372
1453
|
applyRuntimeEvents,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/state.ts","../src/use-agent-chat.ts","../src/runtime-event-buffer.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"cancelling\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport function chatAttachmentIds(attachments?: readonly ChatAttachment[]): string[] {\n return (attachments || []).flatMap((attachment) => typeof attachment.id === \"string\" && attachment.id.trim()\n ? [attachment.id.trim()]\n : []);\n}\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatPartMetadata = {\n id: string;\n runId?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n raw?: Record<string, unknown>;\n};\n\nexport type ChatToolChildRun = {\n runId?: string | null;\n agentId?: string | null;\n agentName?: string | null;\n status?: string | null;\n error?: string | null;\n};\n\nexport type ChatToolChild = {\n id: string;\n runId?: string | null;\n toolCallId?: string | null;\n toolName: string;\n title: string;\n status: string;\n detail?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n};\n\nexport type ChatToolPresentation = Record<string, unknown> & {\n title?: string | null;\n activity?: string | null;\n detail?: string | null;\n category?: string | null;\n groupKey?: string | null;\n groupLabel?: string | null;\n path?: string | null;\n threadId?: string | null;\n isExploration?: boolean;\n childRun?: ChatToolChildRun | null;\n childTools?: ChatToolChild[];\n activeChildToolId?: string | null;\n};\n\nexport type ChatTextPart = ChatPartMetadata & { type: \"text\"; kind: \"text\"; text: string };\nexport type ChatToolPart = ChatPartMetadata & {\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolKey?: string | null;\n action?: string | null;\n displayName?: string | null;\n summary?: string | null;\n toolCallId?: string | null;\n sourceKind?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n errorText?: string | null;\n failure?: FailureView | null;\n presentation: ChatToolPresentation;\n};\nexport type ChatReasoningPart = ChatPartMetadata & { type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null };\nexport type ChatModelTurnPart = ChatPartMetadata & {\n type: \"model-turn\";\n kind: \"model-turn\";\n modelTurnId: string;\n turnKind: \"agent\" | \"model\";\n status: \"running\";\n iteration?: number | null;\n};\nexport type ChatContextCompressionPart = ChatPartMetadata & {\n type: \"context-compression\";\n kind: \"context-compression\";\n status: \"started\" | \"completed\" | \"failed\";\n compression: ContextCompression;\n};\nexport type ChatNodeActivityState = \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\nexport type ChatNodeSkipReason = \"missing_required_input\" | \"upstream_input_unavailable\" | \"empty_optional_source\";\nconst chatNodeSkipReason = (value: unknown): ChatNodeSkipReason | null => {\n const normalized = text(value);\n return normalized === \"missing_required_input\"\n || normalized === \"upstream_input_unavailable\"\n || normalized === \"empty_optional_source\"\n ? normalized\n : null;\n};\nexport type ChatNodeActivityPart = ChatPartMetadata & {\n type: \"node-activity\";\n kind: \"node-activity\";\n activityId: string;\n /** Opaque trusted-host trace selector; absent from public projections. */\n traceStepId?: string | null;\n label: string;\n nodeKind: string;\n status: ChatNodeActivityState;\n defaultChatVisible: boolean;\n reason?: ChatNodeSkipReason | null;\n failure?: FailureView | null;\n};\nexport type ChatUiBlocksPart = ChatPartMetadata & { type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\" | \"user_input\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlQuestion = {\n id: string;\n header: string;\n question: string;\n options: Array<{ id: string; label: string }>;\n multiSelect: boolean;\n};\nexport type ChatHitlAnswer = {\n questionId: string;\n selectedOptionIds: string[];\n customText?: string;\n};\nexport type ChatHitlResolution = Record<string, unknown> & {\n answers?: ChatHitlAnswer[];\n outcome?: string;\n status?: string;\n};\nexport type ChatHitlPart = ChatPartMetadata & {\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n questions: ChatHitlQuestion[];\n resolution?: ChatHitlResolution | null;\n};\nexport type ChatErrorPart = ChatPartMetadata & { type: \"error\"; kind: \"error\"; errorText: string; failure?: FailureView | null };\nexport type ChatDataPart = ChatPartMetadata & { type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown> };\nexport type ChatSourcePart = ChatPartMetadata & { type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null };\nexport type ChatCitationPart = ChatPartMetadata & { type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null };\nexport type ChatAttachmentPart = ChatPartMetadata & { type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatModelTurnPart | ChatContextCompressionPart | ChatNodeActivityPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n feedback?: ResponseFeedback | null;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n contextWindow?: ContextWindow | null;\n contextCompression?: ContextCompression | null;\n};\n\nexport type ThreadActivity = {\n status: string | null;\n runId: string | null;\n isSpinning: boolean;\n isPaused: boolean;\n isFailed: boolean;\n isCompleted: boolean;\n isCancelled: boolean;\n};\n\nexport function getThreadActivity(thread: Pick<ThreadSummary, \"active_run\" | \"last_run_id\" | \"last_run_status\">): ThreadActivity {\n const activeRun = thread.active_run || null;\n const status = String(activeRun?.status || thread.last_run_status || \"\").trim().toLowerCase() || null;\n return {\n status,\n runId: activeRun?.run_id || thread.last_run_id || null,\n isSpinning: Boolean(activeRun),\n isPaused: status === \"paused\",\n isFailed: status === \"failed\",\n isCompleted: status === \"completed\",\n isCancelled: status === \"cancelled\" || status === \"canceled\",\n };\n}\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst finiteNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nfunction failureView(value: unknown): FailureView | null {\n const candidate = record(value);\n return candidate?.schema_version === \"agents24.failure.v1\"\n && text(candidate.failure_id)\n && text(candidate.code)\n && text(candidate.message)\n && typeof candidate.retryable === \"boolean\"\n && record(candidate.details)\n ? candidate as unknown as FailureView\n : null;\n}\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n user_input: [\"respond\"],\n};\n\nfunction hitlQuestions(presentation: Record<string, unknown>): ChatHitlQuestion[] {\n return (Array.isArray(presentation.questions) ? presentation.questions : []).flatMap((value) => {\n const question = record(value);\n if (!question || !Array.isArray(question.options)) return [];\n const options = question.options.flatMap((rawOption) => {\n const option = record(rawOption);\n return option && text(option.id) && text(option.label)\n ? [{ id: String(option.id), label: String(option.label) }]\n : [];\n });\n return text(question.id) && text(question.header) && text(question.question) && options.length >= 2\n ? [{\n id: String(question.id),\n header: String(question.header),\n question: String(question.question),\n options,\n multiSelect: question.multi_select === true,\n }]\n : [];\n });\n}\n\nfunction hitlResolution(value: unknown): ChatHitlResolution | null {\n const resolution = record(value);\n if (!resolution) return null;\n const answers = (Array.isArray(resolution.answers) ? resolution.answers : []).flatMap((value) => {\n const answer = record(value);\n if (!answer || !text(answer.question_id) || !Array.isArray(answer.selected_option_ids)) return [];\n return [{\n questionId: String(answer.question_id),\n selectedOptionIds: answer.selected_option_ids.map(String),\n ...(text(answer.custom_text) ? { customText: String(answer.custom_text) } : {}),\n }];\n });\n return { ...resolution, ...(answers.length ? { answers } : {}) };\n}\n\nfunction partMetadata(block: Record<string, unknown>, id: string): ChatPartMetadata {\n return {\n id,\n runId: text(block.runId) || text(block.run_id),\n sequence: finiteNumber(block.seq),\n timestamp: text(block.ts),\n raw: block,\n };\n}\n\nfunction toolPresentation(tool: Record<string, unknown>): ChatToolPresentation {\n const nested = record(tool.presentation) || {};\n const childRunValue = record(tool.childRun) || record(tool.child_run);\n const childRun = childRunValue && (\n text(childRunValue.runId || childRunValue.run_id)\n || text(childRunValue.agentName || childRunValue.agent_name)\n || text(childRunValue.status)\n )\n ? {\n runId: text(childRunValue.runId) || text(childRunValue.run_id),\n agentId: text(childRunValue.agentId) || text(childRunValue.agent_id),\n agentName: text(childRunValue.agentName) || text(childRunValue.agent_name),\n status: text(childRunValue.status),\n error: text(childRunValue.error),\n }\n : null;\n const childTools = (Array.isArray(tool.childTools) ? tool.childTools : Array.isArray(tool.child_tools) ? tool.child_tools : [])\n .flatMap((value): ChatToolChild[] => {\n const child = record(value);\n if (!child || !text(child.id) || !text(child.title)) return [];\n return [{\n id: String(child.id),\n runId: text(child.runId) || text(child.run_id),\n toolCallId: text(child.toolCallId) || text(child.tool_call_id),\n toolName: String(child.toolName || child.tool_name || child.title),\n title: String(child.title),\n status: String(child.status || \"\"),\n detail: text(child.detail),\n sequence: finiteNumber(child.seq),\n timestamp: text(child.ts),\n }];\n });\n return {\n ...nested,\n title: text(tool.title) || text(nested.title),\n activity: text(tool.activity) || text(nested.activity),\n detail: text(tool.detail) || text(nested.detail),\n category: text(tool.category) || text(nested.category),\n groupKey: text(tool.groupKey) || text(tool.group_key) || text(nested.groupKey) || text(nested.group_key),\n groupLabel: text(tool.groupLabel) || text(tool.group_label) || text(nested.groupLabel) || text(nested.group_label),\n path: text(tool.path),\n threadId: text(tool.threadId) || text(tool.thread_id),\n isExploration: tool.isExploration === true || tool.is_exploration === true,\n childRun,\n childTools,\n activeChildToolId: text(tool.activeChildToolId) || text(tool.active_child_tool_id),\n };\n}\n\nexport function partsFromResponseBlocks(\n blocks: unknown,\n fallbackText = \"\",\n fallbackPartId = \"assistant-text\",\n): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n const metadata = partMetadata(block, id);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ ...metadata, type: \"text\", kind: \"text\", text: value }] : [];\n }\n if (kind === \"context_compression\") {\n const compression = normalizeContextCompression(block.compression);\n if (!compression?.active) return [];\n const status = compression.status === \"started\" || compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : block.status === \"complete\"\n ? \"completed\"\n : block.status === \"error\"\n ? \"failed\"\n : \"started\";\n return [{\n ...metadata,\n type: \"context-compression\",\n kind: \"context-compression\",\n status,\n compression: { ...compression, status },\n }];\n }\n if (kind === \"node_activity\") {\n const node = record(block.node);\n const activityId = text(node?.activityId) || text(node?.activity_id) || id;\n const statusValue = String(node?.status || \"\").toLowerCase();\n const status: ChatNodeActivityState = [\"completed\", \"failed\", \"cancelled\", \"skipped\"].includes(statusValue)\n ? statusValue as ChatNodeActivityState\n : \"running\";\n const label = text(node?.label) || \"Working\";\n const nodeKind = text(node?.kind) || \"node\";\n return [{\n ...metadata,\n type: \"node-activity\",\n kind: \"node-activity\",\n activityId,\n traceStepId: text(node?.traceStepId) || text(node?.trace_step_id) || null,\n label,\n nodeKind,\n status,\n defaultChatVisible: node?.defaultChatVisible === true,\n reason: chatNodeSkipReason(node?.reason),\n failure: failureView(node?.failure),\n }];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.toolName || tool.tool_name || tool.action || tool.title || \"tool\");\n return [{\n ...metadata,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolKey: text(tool.toolKey) || text(tool.tool_key),\n action: text(tool.action),\n displayName: text(tool.displayName) || text(tool.display_name),\n summary: text(tool.summary),\n toolCallId: text(tool.toolCallId) || text(tool.tool_call_id),\n sourceKind: text(tool.sourceKind) || text(tool.source_kind),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n errorText: text(tool.error || block.error),\n failure: failureView(tool.failure),\n presentation: toolPresentation(tool),\n }];\n }\n if (kind === \"reasoning_note\") return [{ ...metadata, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status) }];\n if (kind === \"ui_blocks\") return [{ ...metadata, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error) }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n ...metadata,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n questions: hitlQuestions(record(hitl.presentation) || {}),\n resolution: hitlResolution(block.resolution),\n }];\n }\n if (kind === \"error\") {\n const failure = failureView(block.failure) || failureView(block.error);\n return [{\n ...metadata,\n type: \"error\",\n kind: \"error\",\n errorText: failure?.message || String(block.text || \"The run failed.\"),\n failure,\n }];\n }\n if (kind === \"source\") return [{ ...metadata, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description) }];\n if (kind === \"citation\") return [{ ...metadata, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url) }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ ...metadata, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined } }];\n }\n return [{ ...metadata, type: \"data\", kind: \"data\", name: kind, data: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(\n payload.response_blocks,\n content,\n `${event.run_id}:assistant-text`,\n );\n if (fromBlocks.length) return {\n content: content || fromBlocks\n .filter((part): part is ChatTextPart => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n parts: fromBlocks,\n };\n const fromPatch = partsFromResponseBlocks(\n payload.response_block === undefined ? undefined : [payload.response_block],\n );\n if (fromPatch.length) return { content, parts: fromPatch };\n return { content, parts: [] };\n}\n\nexport function modelTurnPartFromEvent(event: RuntimeEvent): ChatModelTurnPart | null {\n const eventName = String(event.event || \"\");\n const payload = record(event.payload) || {};\n const source = eventName === \"run.snapshot\" ? record(payload.active_model_turn) : payload;\n if (\n !source\n || (eventName !== \"model.turn.started\" && eventName !== \"run.snapshot\")\n || source.status !== \"running\"\n || !text(source.model_turn_id)\n ) return null;\n const modelTurnId = String(source.model_turn_id);\n const iteration = finiteNumber(source.iteration);\n return {\n id: `model-turn:${modelTurnId}`,\n type: \"model-turn\",\n kind: \"model-turn\",\n modelTurnId,\n turnKind: source.kind === \"agent\" ? \"agent\" : \"model\",\n status: \"running\",\n runId: event.run_id || null,\n sequence: finiteNumber(event.seq),\n timestamp: text(event.ts),\n ...(iteration === null ? {} : { iteration }),\n raw: source,\n };\n}\n\nexport function contextCompressionPartFromEvent(\n event: RuntimeEvent,\n existingParts: readonly ChatPart[] = [],\n): ChatContextCompressionPart | null {\n if (String(event.event || \"\") !== \"context.compression.updated\") return null;\n const payload = record(event.payload) || {};\n const compression = normalizeContextCompression(payload.context_compression);\n if (!compression?.active) return null;\n const status = compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : \"started\";\n const activePart = [...existingParts].reverse().find(\n (part): part is ChatContextCompressionPart => (\n part.kind === \"context-compression\" && part.status === \"started\"\n ),\n );\n const sequence = finiteNumber(event.seq);\n const id = status === \"started\"\n ? `context-compression:${event.run_id || \"run\"}:${sequence ?? \"active\"}`\n : activePart?.id || `context-compression:${event.run_id || \"run\"}:${sequence ?? \"terminal\"}`;\n return {\n id,\n type: \"context-compression\",\n kind: \"context-compression\",\n runId: event.run_id || null,\n sequence,\n timestamp: text(event.ts),\n status,\n compression,\n };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const rawFeedback = record(turn.feedback);\n const feedback: ResponseFeedback | null = rawFeedback\n && (rawFeedback.rating === \"like\" || rawFeedback.rating === \"dislike\")\n && text(rawFeedback.created_at)\n && text(rawFeedback.updated_at)\n ? {\n rating: rawFeedback.rating === \"like\" ? \"like\" : \"dislike\",\n reason: [\n \"incorrect\",\n \"irrelevant\",\n \"incomplete\",\n \"unsafe\",\n \"citation_issue\",\n \"other\",\n ].includes(String(rawFeedback.reason || \"\"))\n ? rawFeedback.reason as ResponseFeedback[\"reason\"]\n : null,\n comment: text(rawFeedback.comment),\n created_at: String(rawFeedback.created_at),\n updated_at: String(rawFeedback.updated_at),\n }\n : null;\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => {\n const value = record(attachment);\n return value ? [attachmentResultToChatAttachment(value as AttachmentResult)] : [];\n })\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) {\n const assistantParts = partsFromResponseBlocks(\n turn.response_blocks,\n assistantText,\n `${runId || turn.id || index}-assistant-text`,\n );\n output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n isFinal: ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n feedback,\n parts: assistantParts,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n }\n return output;\n });\n}\n\nexport function latestThreadContext(detail: ThreadDetail): {\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n} {\n let contextWindow: ContextWindow | null = null;\n for (const turn of detail.turns || []) {\n contextWindow = mergeContextWindowUpdate(contextWindow, turn.context_window);\n }\n return {\n contextWindow,\n contextCompression: compressionFromContextWindow(contextWindow),\n };\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return {\n ...result,\n id: result.id,\n filename: result.filename,\n mediaType: result.mime_type,\n status: result.processing_status,\n };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: \"idle\" | \"streaming\" | \"reconnecting\" | \"paused\" | \"cancelling\" | \"completed\" | \"cancelled\" | \"failed\";\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n): StoredChatThread[] {\n if (!activeThreadId || incoming.some((thread) => thread.id === activeThreadId)) {\n return incoming;\n }\n const active = current.find((thread) => thread.id === activeThreadId);\n return active?.isHydrated ? [active, ...incoming] : incoming;\n}\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const index = next.findIndex((message) => message.role === \"assistant\" && (\n Boolean(input.messageId && message.id === input.messageId)\n || Boolean(input.runId && message.runId === input.runId)\n ));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nfunction appendAssistantDelta(\n parts: ChatMessage[\"parts\"],\n delta: string,\n fallbackPartId: string,\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n const trailing = next[next.length - 1];\n if (trailing?.kind === \"text\") {\n next[next.length - 1] = { ...trailing, text: `${trailing.text}${delta}` };\n return next;\n }\n next.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: delta });\n return next;\n}\n\nfunction upsertResponseBlockParts(\n parts: ChatMessage[\"parts\"],\n incoming: ChatMessage[\"parts\"],\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n for (const part of incoming) {\n const index = next.findIndex((current) => current.id === part.id);\n if (index === -1) next.push(part);\n else next[index] = part;\n }\n return next;\n}\n\nfunction reconcileModelTurnParts(\n parts: ChatMessage[\"parts\"],\n event: RuntimeEvent,\n): ChatMessage[\"parts\"] {\n const eventName = String(event.event || \"\");\n const payload = event.payload || {};\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const modelTurnId = typeof payload.model_turn_id === \"string\" ? payload.model_turn_id : null;\n let next = parts;\n\n if (eventName === \"run.snapshot\" || terminal) {\n next = next.filter((part) => part.kind !== \"model-turn\");\n } else if (eventName === \"assistant.delta\" && typeof payload.content === \"string\" && payload.content) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (eventName.startsWith(\"tool.\") || eventName === \"node.status.updated\") {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (\n (eventName === \"model.turn.failed\" || (eventName === \"model.turn.completed\" && payload.outcome !== \"tool_calls\"))\n && modelTurnId\n ) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.modelTurnId !== modelTurnId);\n }\n\n const active = modelTurnPartFromEvent(event);\n return active ? upsertResponseBlockParts(next, [active]) : next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = event.run_id || state.activeRunId;\n const messageId = state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && (\n message.id === messageId || Boolean(runId && message.runId === runId)\n ));\n const payload = event.payload || {};\n const eventThreadId = typeof payload.thread_id === \"string\" && payload.thread_id.trim()\n ? payload.thread_id.trim()\n : null;\n const contextApplies = (\n (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId)\n && (!state.activeRunId || !runId || runId === state.activeRunId)\n );\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, payload.context_window)\n : state.contextWindow;\n const explicitCompression = contextApplies\n ? normalizeContextCompression(payload.context_compression)\n : null;\n const contextCompression = contextApplies\n ? explicitCompression || compressionFromContextWindow(contextWindow) || state.contextCompression\n : state.contextCompression;\n const hasLiveCompressionUpdate = Boolean(\n contextApplies\n && (\n explicitCompression?.active\n || compressionFromContextWindow(\n mergeContextWindowUpdate(null, payload.context_window),\n )?.active\n )\n );\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const hasCanonicalResponseBlocks = Array.isArray(payload.response_blocks);\n const content = hasCanonicalResponseBlocks\n ? projection.content\n : delta\n ? `${existing?.content || \"\"}${delta}`\n : projection.content || existing?.content || \"\";\n const projectedParts = hasCanonicalResponseBlocks\n ? projection.parts\n : delta\n ? appendAssistantDelta(\n existing?.parts || [],\n delta,\n `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(projectedParts, event);\n const compressionPart = contextApplies && explicitCompression?.active\n ? contextCompressionPartFromEvent(event, lifecycleParts)\n : null;\n const parts = compressionPart\n ? upsertResponseBlockParts(lifecycleParts, [compressionPart])\n : lifecycleParts;\n const activeThreadId = eventThreadId || state.activeThreadId;\n const messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\n });\n const threads = activeThreadId\n ? state.threads.some((thread) => thread.id === activeThreadId)\n ? state.threads.map((thread) => thread.id === activeThreadId\n ? {\n ...thread,\n messages,\n isHydrated: true,\n last_run_id: runId ?? thread.last_run_id,\n contextWindow,\n contextCompression,\n }\n : thread)\n : [{\n id: activeThreadId,\n title: null,\n messages,\n isHydrated: true,\n last_run_id: runId,\n contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages,\n threads,\n contextWindow,\n contextCompression,\n contextCompressionRevision: hasLiveCompressionUpdate\n ? state.contextCompressionRevision + 1\n : state.contextCompressionRevision,\n runState: paused\n ? \"paused\"\n : cancelling\n ? \"cancelling\"\n : terminal\n ? eventName === \"run.completed\"\n ? \"completed\"\n : eventName === \"run.cancelled\"\n ? \"cancelled\"\n : \"failed\"\n : \"streaming\",\n streamingMessageId: terminal || paused ? null : messageId,\n };\n}\n\nexport function applyRuntimeEvents(\n state: AgentChatState,\n events: readonly RuntimeEvent[],\n): AgentChatState {\n return events.reduce(applyRuntimeEvent, state);\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = { ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated };\n return next;\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n ResponseFeedback,\n RuntimeEvent,\n ThreadSummaryEvent,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { chatAttachmentIds, getThreadActivity, latestThreadContext, threadDetailToMessages } from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n reconcileRefreshedThreads,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n requestedModelId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n clearBackgroundError(): void;\n clearOperationError(operation?: AgentChatOperation): void;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n resumeHitl(part: ChatHitlPart, response: HitlResponse): Promise<void>;\n setFeedback(\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return activity.isSpinning ? activity.runId : null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: resolveInitialActiveThreadId(\n options,\n runtime.storage?.loadActiveThreadId?.() ?? null,\n ),\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenGenerationRef = React.useRef(0);\n const refreshThreadsPromiseRef = React.useRef<Promise<void> | null>(null);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\n\n const eventBuffer = React.useMemo(\n () => createRuntimeEventFrameBuffer(\n (events) => update((current) => applyRuntimeEvents(current, events)),\n runtimeEventFrameScheduler(),\n ),\n [update],\n );\n\n const clearOperationError = React.useCallback((operation?: AgentChatOperation) => {\n update((current) => clearAgentChatOperationError(current, operation));\n }, [update]);\n\n const clearBackgroundError = React.useCallback(() => {\n update(clearAgentChatBackgroundError);\n }, [update]);\n\n const failOperation = React.useCallback((operation: AgentChatOperation, cause: unknown) => {\n update((current) => withAgentChatOperationError(current, operation, cause));\n }, [update]);\n\n const invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }, []);\n\n const detach = React.useCallback(() => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [eventBuffer, update]);\n\n React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshThreadsPromiseRef.current) return refreshThreadsPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const nextThreads = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return {\n ...current,\n threads: reconcileRefreshedThreads(\n current.threads,\n nextThreads,\n current.activeThreadId,\n ),\n };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingThreads(false);\n }\n })();\n refreshThreadsPromiseRef.current = request;\n void request.then(\n () => {\n if (refreshThreadsPromiseRef.current === request) refreshThreadsPromiseRef.current = null;\n },\n () => {\n if (refreshThreadsPromiseRef.current === request) refreshThreadsPromiseRef.current = null;\n },\n );\n return request;\n }, [clearOperationError, client, failOperation, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n clearOperationError();\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, {\n ...existing,\n ...summaryToStored(item),\n messages: existing?.messages || [],\n isHydrated: existing?.isHydrated,\n });\n }\n return { ...current, threads: [...byId.values()] };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_more_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [clearOperationError, client, failOperation, isLoadingMoreThreads, threadPageSize, threadTotal, update]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort(\"A newer thread was selected.\");\n const requestController = runtime.createAbortController();\n threadOpenControllerRef.current = requestController;\n const requestGeneration = threadOpenGenerationRef.current + 1;\n threadOpenGenerationRef.current = requestGeneration;\n detach();\n clearOperationError();\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n activeRunId: null,\n cursor: null,\n error: null,\n messages: current.threads.find((thread) => thread.id === threadId)?.messages || [],\n contextWindow: current.threads.find((thread) => thread.id === threadId)?.contextWindow || null,\n contextCompression: current.threads.find((thread) => thread.id === threadId)?.contextCompression || null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n streamingMessageId: null,\n }));\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n const messages = threadDetailToMessages(detail);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n ...context,\n };\n update((current) => isCurrentThreadOpenRequest({\n activeThreadId: current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n }) ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n } : current);\n const activeRunId = activeRunIdFromThread(stored);\n if (\n activeRunId\n && isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })\n ) await attachRunRef.current(activeRunId).catch(() => undefined);\n } catch (error) {\n if (!isAbortLike(error) && requestGeneration === threadOpenGenerationRef.current) {\n failOperation(\"open_thread\", error);\n update((current) => restoreAgentChatThreadSelection(current, previousSelection));\n if (previousSelection.activeRunId) {\n void attachRunRef.current(previousSelection.activeRunId, previousSelection.cursor ?? undefined).catch(() => undefined);\n }\n throw error;\n }\n } finally {\n if (requestGeneration === threadOpenGenerationRef.current) {\n if (threadOpenControllerRef.current === requestController) threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }\n }\n }, [clearOperationError, client, detach, failOperation, pageSize, runtime, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n eventBuffer.push(event);\n }, [eventBuffer]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n clearOperationError();\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", streamingMessageId: null }));\n failOperation(\"attach_run\", error);\n throw error;\n }\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, failOperation, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length) return;\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: input.attachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n update((current) => ({ ...current, messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage), streamingMessageId: assistantId, runState: \"streaming\", error: null }));\n setIsSubmitting(true);\n try {\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds: input.attachmentIds, requestedModelId: input.requestedModelId, idempotencyKey, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeThreadId: result.threadId || current.activeThreadId, activeRunId: result.detached ? result.runId : current.activeRunId, cursor: result.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (result.threadId) await refreshThreads().catch(() => undefined);\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", streamingMessageId: null }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);\n\n const startNewThread = React.useCallback(() => {\n invalidateThreadOpen();\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, invalidateThreadOpen, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (stateRef.current.activeThreadId === threadId) invalidateThreadOpen();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({\n ...current,\n activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId,\n messages: current.activeThreadId === threadId ? [] : current.messages,\n contextWindow: current.activeThreadId === threadId ? null : current.contextWindow,\n contextCompression: current.activeThreadId === threadId ? null : current.contextCompression,\n contextCompressionRevision: current.activeThreadId === threadId ? 0 : current.contextCompressionRevision,\n threads: current.threads.filter((thread) => thread.id !== threadId),\n }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, invalidateThreadOpen, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\n const previousRunState = stateRef.current.runState;\n clearOperationError();\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: \"cancelling\" }\n : current\n ));\n try {\n const result = await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n if (result.status === \"cancelled\") {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: \"cancelled\",\n streamingMessageId: null,\n }));\n } else if (result.status === \"cancelling\") {\n update((current) => ({\n ...current,\n activeRunId: runId,\n runState: \"cancelling\",\n }));\n } else {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: result.status === \"completed\" ? \"completed\" : \"failed\",\n streamingMessageId: null,\n }));\n }\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: previousRunState }\n : current\n ));\n failOperation(\"cancel_run\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, detach, failOperation, runtime, update]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n clearOperationError();\n if (!runId) {\n const error = new Error(\"No paused run is available to resume.\");\n failOperation(\"resume_hitl\", error);\n throw error;\n }\n try {\n const result = await client.hitl.resume({\n runId,\n interruptId: part.interruptId,\n ...response,\n idempotencyKey: runtime.createId(),\n });\n await attachRun(result.run_id || runId);\n } catch (error) {\n if (!isAbortLike(error)) failOperation(\"resume_hitl\", error);\n throw error;\n }\n }, [attachRun, clearOperationError, client, failOperation, runtime]);\n\n const setFeedback = React.useCallback(async (\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ) => {\n const runId = message.runId;\n if (!runId || message.role !== \"assistant\" || message.isFinal === false) {\n const error = new Error(\"Only persisted final responses can receive feedback.\");\n failOperation(\"set_feedback\", error);\n throw error;\n }\n const previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating\n ? {\n rating: input.rating,\n reason: input.rating === \"dislike\" ? input.reason ?? null : null,\n comment: input.rating === \"dislike\" ? input.comment?.trim() || null : null,\n created_at: previous?.created_at || timestamp,\n updated_at: timestamp,\n }\n : null;\n const replaceFeedback = (\n current: AgentChatState,\n feedback: ResponseFeedback | null,\n ): AgentChatState => {\n const messages = current.messages.map((item) =>\n item.id === message.id ? { ...item, feedback } : item\n );\n return {\n ...current,\n messages,\n threads: current.threads.map((thread) => ({\n ...thread,\n messages: thread.messages.map((item) =>\n item.id === message.id ? { ...item, feedback } : item\n ),\n })),\n };\n };\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n update((current) =>\n withAgentChatOperationError(\n replaceFeedback(current, previous),\n \"set_feedback\",\n error,\n )\n );\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n clearOperationError();\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_older_turns\", error);\n throw error;\n }\n } finally { setIsLoadingOlder(false); }\n }, [clearOperationError, client, failOperation, pageSize, update]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({\n text: user.content,\n attachmentIds: chatAttachmentIds(user.attachments),\n attachments: user.attachments,\n });\n }, [submit]);\n\n React.useEffect(() => {\n const controller = runtime.createAbortController();\n clearBackgroundError();\n void client.threads.events({ signal: controller.signal }, async (event: ThreadSummaryEvent) => {\n if (event.event === \"snapshot_required\") {\n clearBackgroundError();\n await refreshThreads();\n return;\n }\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n }).catch((error) => {\n if (!isAbortLike(error)) update((current) => withAgentChatBackgroundError(current, error));\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, refreshThreads, runtime.createAbortController, update]);\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n const activeThread = stateRef.current.threads.find((thread) => thread.id === stateRef.current.activeThreadId);\n if (shouldHydrateSelectedThread(threadId, stateRef.current.activeThreadId, Boolean(activeThread?.isHydrated))) {\n void openThread(threadId as string).catch(() => undefined);\n }\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n activeThread,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n clearBackgroundError,\n clearOperationError,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { RuntimeEvent } from \"@agents24/client\";\n\nexport type RuntimeEventFrameScheduler = (callback: () => void) => () => void;\n\nexport type RuntimeEventFrameBuffer = {\n dispose(): void;\n flush(): void;\n push(event: RuntimeEvent): void;\n};\n\ntype AnimationFrameRuntime = {\n cancelAnimationFrame?: (handle: number) => void;\n requestAnimationFrame?: (callback: () => void) => number;\n};\n\nexport function runtimeEventFrameScheduler(): RuntimeEventFrameScheduler | undefined {\n const runtime = globalThis as AnimationFrameRuntime;\n if (typeof runtime.requestAnimationFrame !== \"function\") return undefined;\n return (callback) => {\n const handle = runtime.requestAnimationFrame?.(callback);\n return () => {\n if (handle !== undefined) runtime.cancelAnimationFrame?.(handle);\n };\n };\n}\n\nexport function createRuntimeEventFrameBuffer(\n apply: (events: readonly RuntimeEvent[]) => void,\n scheduleFrame?: RuntimeEventFrameScheduler,\n): RuntimeEventFrameBuffer {\n let pending: RuntimeEvent[] = [];\n let cancelFrame: (() => void) | null = null;\n\n const flush = () => {\n cancelFrame?.();\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n };\n\n return {\n dispose() {\n cancelFrame?.();\n cancelFrame = null;\n pending = [];\n },\n flush,\n push(event) {\n if (event.event !== \"assistant.delta\" || !scheduleFrame) {\n pending.push(event);\n flush();\n return;\n }\n pending.push(event);\n if (cancelFrame) return;\n cancelFrame = scheduleFrame(() => {\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n });\n },\n };\n}\n","export function resolveInitialActiveThreadId(\n options: { activeThreadId?: string | null },\n storedThreadId: string | null,\n): string | null {\n return Object.prototype.hasOwnProperty.call(options, \"activeThreadId\")\n ? options.activeThreadId ?? null\n : storedThreadId;\n}\n\nexport function shouldHydrateSelectedThread(\n selectedThreadId: string | null | undefined,\n activeThreadId: string | null,\n activeThreadIsHydrated: boolean,\n): boolean {\n return Boolean(selectedThreadId) && (\n selectedThreadId !== activeThreadId || !activeThreadIsHydrated\n );\n}\n\nexport function isCurrentThreadOpenRequest(input: {\n activeThreadId: string | null;\n currentGeneration: number;\n requestGeneration: number;\n requestedThreadId: string;\n signalAborted: boolean;\n}): boolean {\n return !input.signalAborted\n && input.requestGeneration === input.currentGeneration\n && input.requestedThreadId === input.activeThreadId;\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const uploadBatch = React.useCallback(async (input: { uploads: readonly { data: BinaryUploadData; name: string; mediaType: string }[]; threadId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => Object.fromEntries([\n ...Object.entries(current),\n ...results.map((result) => [result.id, result]),\n ]));\n return results.map(attachmentResultToChatAttachment);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n const createContentAccess = React.useCallback(\n (input: { attachmentId: string; disposition: \"inline\" | \"attachment\"; signal?: AbortSignalLike }) =>\n client.attachments.createContentAccess(input),\n [client],\n );\n return { createContentAccess, isUploading, uploadBatch, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; answers?: import(\"@agents24/client\").HitlAnswer[]; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":"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","names":["value","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","activeThread","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/state.ts","../src/use-agent-chat.ts","../src/runtime-event-buffer.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"cancelling\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport function chatAttachmentIds(attachments?: readonly ChatAttachment[]): string[] {\n return (attachments || []).flatMap((attachment) => typeof attachment.id === \"string\" && attachment.id.trim()\n ? [attachment.id.trim()]\n : []);\n}\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatPartMetadata = {\n id: string;\n runId?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n raw?: Record<string, unknown>;\n};\n\nexport type ChatToolChildRun = {\n runId?: string | null;\n agentId?: string | null;\n agentName?: string | null;\n status?: string | null;\n error?: string | null;\n};\n\nexport type ChatToolChild = {\n id: string;\n runId?: string | null;\n toolCallId?: string | null;\n toolName: string;\n title: string;\n status: string;\n detail?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n};\n\nexport type ChatToolPresentation = Record<string, unknown> & {\n title?: string | null;\n activity?: string | null;\n detail?: string | null;\n category?: string | null;\n groupKey?: string | null;\n groupLabel?: string | null;\n path?: string | null;\n threadId?: string | null;\n isExploration?: boolean;\n childRun?: ChatToolChildRun | null;\n childTools?: ChatToolChild[];\n activeChildToolId?: string | null;\n};\n\nexport type ChatTextPart = ChatPartMetadata & { type: \"text\"; kind: \"text\"; text: string };\nexport type ChatToolPart = ChatPartMetadata & {\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolKey?: string | null;\n action?: string | null;\n displayName?: string | null;\n summary?: string | null;\n toolCallId?: string | null;\n sourceKind?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n errorText?: string | null;\n failure?: FailureView | null;\n presentation: ChatToolPresentation;\n};\nexport type ChatReasoningPart = ChatPartMetadata & { type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null };\nexport type ChatModelTurnPart = ChatPartMetadata & {\n type: \"model-turn\";\n kind: \"model-turn\";\n modelTurnId: string;\n turnKind: \"agent\" | \"model\";\n status: \"running\";\n iteration?: number | null;\n};\nexport type ChatContextCompressionPart = ChatPartMetadata & {\n type: \"context-compression\";\n kind: \"context-compression\";\n status: \"started\" | \"completed\" | \"failed\";\n compression: ContextCompression;\n};\nexport type ChatNodeActivityState = \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\nexport type ChatNodeSkipReason = \"missing_required_input\" | \"upstream_input_unavailable\" | \"empty_optional_source\";\nconst chatNodeSkipReason = (value: unknown): ChatNodeSkipReason | null => {\n const normalized = text(value);\n return normalized === \"missing_required_input\"\n || normalized === \"upstream_input_unavailable\"\n || normalized === \"empty_optional_source\"\n ? normalized\n : null;\n};\nexport type ChatNodeActivityPart = ChatPartMetadata & {\n type: \"node-activity\";\n kind: \"node-activity\";\n activityId: string;\n /** Opaque trusted-host trace selector; absent from public projections. */\n traceStepId?: string | null;\n label: string;\n nodeKind: string;\n status: ChatNodeActivityState;\n defaultChatVisible: boolean;\n reason?: ChatNodeSkipReason | null;\n failure?: FailureView | null;\n};\nexport type ChatUiBlocksPart = ChatPartMetadata & { type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\" | \"user_input\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlQuestion = {\n id: string;\n header: string;\n question: string;\n options: Array<{ id: string; label: string }>;\n multiSelect: boolean;\n};\nexport type ChatHitlAnswer = {\n questionId: string;\n selectedOptionIds: string[];\n customText?: string;\n};\nexport type ChatHitlResolution = Record<string, unknown> & {\n answers?: ChatHitlAnswer[];\n outcome?: string;\n status?: string;\n};\nexport type ChatHitlPart = ChatPartMetadata & {\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n questions: ChatHitlQuestion[];\n resolution?: ChatHitlResolution | null;\n};\nexport type ChatErrorPart = ChatPartMetadata & { type: \"error\"; kind: \"error\"; errorText: string; failure?: FailureView | null };\nexport type ChatDataPart = ChatPartMetadata & { type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown> };\nexport type ChatSourcePart = ChatPartMetadata & { type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null };\nexport type ChatCitationPart = ChatPartMetadata & { type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null };\nexport type ChatAttachmentPart = ChatPartMetadata & { type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatModelTurnPart | ChatContextCompressionPart | ChatNodeActivityPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n feedback?: ResponseFeedback | null;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n contextWindow?: ContextWindow | null;\n contextCompression?: ContextCompression | null;\n};\n\nexport type ThreadActivity = {\n status: string | null;\n runId: string | null;\n isSpinning: boolean;\n isPaused: boolean;\n isFailed: boolean;\n isCompleted: boolean;\n isCancelled: boolean;\n};\n\nexport function getThreadActivity(thread: Pick<ThreadSummary, \"active_run\" | \"last_run_id\" | \"last_run_status\">): ThreadActivity {\n const activeRun = thread.active_run || null;\n const status = String(activeRun?.status || thread.last_run_status || \"\").trim().toLowerCase() || null;\n return {\n status,\n runId: activeRun?.run_id || thread.last_run_id || null,\n isSpinning: Boolean(activeRun),\n isPaused: status === \"paused\",\n isFailed: status === \"failed\",\n isCompleted: status === \"completed\",\n isCancelled: status === \"cancelled\" || status === \"canceled\",\n };\n}\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst finiteNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nfunction failureView(value: unknown): FailureView | null {\n const candidate = record(value);\n return candidate?.schema_version === \"agents24.failure.v1\"\n && text(candidate.failure_id)\n && text(candidate.code)\n && text(candidate.message)\n && typeof candidate.retryable === \"boolean\"\n && record(candidate.details)\n ? candidate as unknown as FailureView\n : null;\n}\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n user_input: [\"respond\"],\n};\n\nfunction hitlQuestions(presentation: Record<string, unknown>): ChatHitlQuestion[] {\n return (Array.isArray(presentation.questions) ? presentation.questions : []).flatMap((value) => {\n const question = record(value);\n if (!question || !Array.isArray(question.options)) return [];\n const options = question.options.flatMap((rawOption) => {\n const option = record(rawOption);\n return option && text(option.id) && text(option.label)\n ? [{ id: String(option.id), label: String(option.label) }]\n : [];\n });\n return text(question.id) && text(question.header) && text(question.question) && options.length >= 2\n ? [{\n id: String(question.id),\n header: String(question.header),\n question: String(question.question),\n options,\n multiSelect: question.multi_select === true,\n }]\n : [];\n });\n}\n\nfunction hitlResolution(value: unknown): ChatHitlResolution | null {\n const resolution = record(value);\n if (!resolution) return null;\n const answers = (Array.isArray(resolution.answers) ? resolution.answers : []).flatMap((value) => {\n const answer = record(value);\n if (!answer || !text(answer.question_id) || !Array.isArray(answer.selected_option_ids)) return [];\n return [{\n questionId: String(answer.question_id),\n selectedOptionIds: answer.selected_option_ids.map(String),\n ...(text(answer.custom_text) ? { customText: String(answer.custom_text) } : {}),\n }];\n });\n return { ...resolution, ...(answers.length ? { answers } : {}) };\n}\n\nfunction partMetadata(block: Record<string, unknown>, id: string): ChatPartMetadata {\n return {\n id,\n runId: text(block.runId) || text(block.run_id),\n sequence: finiteNumber(block.seq),\n timestamp: text(block.ts),\n raw: block,\n };\n}\n\nfunction toolPresentation(tool: Record<string, unknown>): ChatToolPresentation {\n const nested = record(tool.presentation) || {};\n const childRunValue = record(tool.childRun) || record(tool.child_run);\n const childRun = childRunValue && (\n text(childRunValue.runId || childRunValue.run_id)\n || text(childRunValue.agentName || childRunValue.agent_name)\n || text(childRunValue.status)\n )\n ? {\n runId: text(childRunValue.runId) || text(childRunValue.run_id),\n agentId: text(childRunValue.agentId) || text(childRunValue.agent_id),\n agentName: text(childRunValue.agentName) || text(childRunValue.agent_name),\n status: text(childRunValue.status),\n error: text(childRunValue.error),\n }\n : null;\n const childTools = (Array.isArray(tool.childTools) ? tool.childTools : Array.isArray(tool.child_tools) ? tool.child_tools : [])\n .flatMap((value): ChatToolChild[] => {\n const child = record(value);\n if (!child || !text(child.id) || !text(child.title)) return [];\n return [{\n id: String(child.id),\n runId: text(child.runId) || text(child.run_id),\n toolCallId: text(child.toolCallId) || text(child.tool_call_id),\n toolName: String(child.toolName || child.tool_name || child.title),\n title: String(child.title),\n status: String(child.status || \"\"),\n detail: text(child.detail),\n sequence: finiteNumber(child.seq),\n timestamp: text(child.ts),\n }];\n });\n return {\n ...nested,\n title: text(tool.title) || text(nested.title),\n activity: text(tool.activity) || text(nested.activity),\n detail: text(tool.detail) || text(nested.detail),\n category: text(tool.category) || text(nested.category),\n groupKey: text(tool.groupKey) || text(tool.group_key) || text(nested.groupKey) || text(nested.group_key),\n groupLabel: text(tool.groupLabel) || text(tool.group_label) || text(nested.groupLabel) || text(nested.group_label),\n path: text(tool.path),\n threadId: text(tool.threadId) || text(tool.thread_id),\n isExploration: tool.isExploration === true || tool.is_exploration === true,\n childRun,\n childTools,\n activeChildToolId: text(tool.activeChildToolId) || text(tool.active_child_tool_id),\n };\n}\n\nexport function partsFromResponseBlocks(\n blocks: unknown,\n fallbackText = \"\",\n fallbackPartId = \"assistant-text\",\n): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n const metadata = partMetadata(block, id);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ ...metadata, type: \"text\", kind: \"text\", text: value }] : [];\n }\n if (kind === \"context_compression\") {\n const compression = normalizeContextCompression(block.compression);\n if (!compression?.active) return [];\n const status = compression.status === \"started\" || compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : block.status === \"complete\"\n ? \"completed\"\n : block.status === \"error\"\n ? \"failed\"\n : \"started\";\n return [{\n ...metadata,\n type: \"context-compression\",\n kind: \"context-compression\",\n status,\n compression: { ...compression, status },\n }];\n }\n if (kind === \"node_activity\") {\n const node = record(block.node);\n const activityId = text(node?.activityId) || text(node?.activity_id) || id;\n const statusValue = String(node?.status || \"\").toLowerCase();\n const status: ChatNodeActivityState = [\"completed\", \"failed\", \"cancelled\", \"skipped\"].includes(statusValue)\n ? statusValue as ChatNodeActivityState\n : \"running\";\n const label = text(node?.label) || \"Working\";\n const nodeKind = text(node?.kind) || \"node\";\n return [{\n ...metadata,\n type: \"node-activity\",\n kind: \"node-activity\",\n activityId,\n traceStepId: text(node?.traceStepId) || text(node?.trace_step_id) || null,\n label,\n nodeKind,\n status,\n defaultChatVisible: node?.defaultChatVisible === true,\n reason: chatNodeSkipReason(node?.reason),\n failure: failureView(node?.failure),\n }];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.toolName || tool.tool_name || tool.action || tool.title || \"tool\");\n return [{\n ...metadata,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolKey: text(tool.toolKey) || text(tool.tool_key),\n action: text(tool.action),\n displayName: text(tool.displayName) || text(tool.display_name),\n summary: text(tool.summary),\n toolCallId: text(tool.toolCallId) || text(tool.tool_call_id),\n sourceKind: text(tool.sourceKind) || text(tool.source_kind),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n errorText: text(tool.error || block.error),\n failure: failureView(tool.failure),\n presentation: toolPresentation(tool),\n }];\n }\n if (kind === \"reasoning_note\") return [{ ...metadata, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status) }];\n if (kind === \"ui_blocks\") return [{ ...metadata, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error) }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n ...metadata,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n questions: hitlQuestions(record(hitl.presentation) || {}),\n resolution: hitlResolution(block.resolution),\n }];\n }\n if (kind === \"error\") {\n const failure = failureView(block.failure) || failureView(block.error);\n return [{\n ...metadata,\n type: \"error\",\n kind: \"error\",\n errorText: failure?.message || String(block.text || \"The run failed.\"),\n failure,\n }];\n }\n if (kind === \"source\") return [{ ...metadata, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description) }];\n if (kind === \"citation\") return [{ ...metadata, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url) }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ ...metadata, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined } }];\n }\n return [{ ...metadata, type: \"data\", kind: \"data\", name: kind, data: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(\n payload.response_blocks,\n content,\n `${event.run_id}:assistant-text`,\n );\n if (fromBlocks.length) return {\n content: content || fromBlocks\n .filter((part): part is ChatTextPart => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n parts: fromBlocks,\n };\n const fromPatch = partsFromResponseBlocks(\n payload.response_block === undefined ? undefined : [payload.response_block],\n );\n if (fromPatch.length) return { content, parts: fromPatch };\n return { content, parts: [] };\n}\n\nexport function modelTurnPartFromEvent(event: RuntimeEvent): ChatModelTurnPart | null {\n const eventName = String(event.event || \"\");\n const payload = record(event.payload) || {};\n const source = eventName === \"run.snapshot\" ? record(payload.active_model_turn) : payload;\n if (\n !source\n || (eventName !== \"model.turn.started\" && eventName !== \"run.snapshot\")\n || source.status !== \"running\"\n || !text(source.model_turn_id)\n ) return null;\n const modelTurnId = String(source.model_turn_id);\n const iteration = finiteNumber(source.iteration);\n return {\n id: `model-turn:${modelTurnId}`,\n type: \"model-turn\",\n kind: \"model-turn\",\n modelTurnId,\n turnKind: source.kind === \"agent\" ? \"agent\" : \"model\",\n status: \"running\",\n runId: event.run_id || null,\n sequence: finiteNumber(event.seq),\n timestamp: text(event.ts),\n ...(iteration === null ? {} : { iteration }),\n raw: source,\n };\n}\n\nexport function contextCompressionPartFromEvent(\n event: RuntimeEvent,\n existingParts: readonly ChatPart[] = [],\n): ChatContextCompressionPart | null {\n if (String(event.event || \"\") !== \"context.compression.updated\") return null;\n const payload = record(event.payload) || {};\n const compression = normalizeContextCompression(payload.context_compression);\n if (!compression?.active) return null;\n const status = compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : \"started\";\n const activePart = [...existingParts].reverse().find(\n (part): part is ChatContextCompressionPart => (\n part.kind === \"context-compression\" && part.status === \"started\"\n ),\n );\n const sequence = finiteNumber(event.seq);\n const id = status === \"started\"\n ? `context-compression:${event.run_id || \"run\"}:${sequence ?? \"active\"}`\n : activePart?.id || `context-compression:${event.run_id || \"run\"}:${sequence ?? \"terminal\"}`;\n return {\n id,\n type: \"context-compression\",\n kind: \"context-compression\",\n runId: event.run_id || null,\n sequence,\n timestamp: text(event.ts),\n status,\n compression,\n };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const rawFeedback = record(turn.feedback);\n const feedback: ResponseFeedback | null = rawFeedback\n && (rawFeedback.rating === \"like\" || rawFeedback.rating === \"dislike\")\n && text(rawFeedback.created_at)\n && text(rawFeedback.updated_at)\n ? {\n rating: rawFeedback.rating === \"like\" ? \"like\" : \"dislike\",\n reason: [\n \"incorrect\",\n \"irrelevant\",\n \"incomplete\",\n \"unsafe\",\n \"citation_issue\",\n \"other\",\n ].includes(String(rawFeedback.reason || \"\"))\n ? rawFeedback.reason as ResponseFeedback[\"reason\"]\n : null,\n comment: text(rawFeedback.comment),\n created_at: String(rawFeedback.created_at),\n updated_at: String(rawFeedback.updated_at),\n }\n : null;\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => {\n const value = record(attachment);\n return value ? [attachmentResultToChatAttachment(value as AttachmentResult)] : [];\n })\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) {\n const assistantParts = partsFromResponseBlocks(\n turn.response_blocks,\n assistantText,\n `${runId || turn.id || index}-assistant-text`,\n );\n output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n isFinal: ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n feedback,\n parts: assistantParts,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n }\n return output;\n });\n}\n\nexport function latestThreadContext(detail: ThreadDetail): {\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n} {\n let contextWindow: ContextWindow | null = null;\n for (const turn of detail.turns || []) {\n contextWindow = mergeContextWindowUpdate(contextWindow, turn.context_window);\n }\n return {\n contextWindow,\n contextCompression: compressionFromContextWindow(contextWindow),\n };\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return {\n ...result,\n id: result.id,\n filename: result.filename,\n mediaType: result.mime_type,\n status: result.processing_status,\n };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n): StoredChatThread[] {\n if (!activeThreadId || incoming.some((thread) => thread.id === activeThreadId)) {\n return incoming;\n }\n const active = current.find((thread) => thread.id === activeThreadId);\n return active?.isHydrated ? [active, ...incoming] : incoming;\n}\n\n/** Adopt the server-created thread without reloading the in-memory transcript. */\nexport function adoptStreamingThread(\n state: AgentChatState,\n threadId: string,\n): AgentChatState {\n const normalizedThreadId = threadId.trim();\n if (!normalizedThreadId || state.activeThreadId) return state;\n const existing = state.threads.find((thread) => thread.id === normalizedThreadId);\n const adopted: StoredChatThread = existing\n ? { ...existing, messages: state.messages, isHydrated: true }\n : {\n id: normalizedThreadId,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages: state.messages,\n isHydrated: true,\n };\n return {\n ...state,\n activeThreadId: normalizedThreadId,\n threads: existing\n ? state.threads.map((thread) => thread.id === normalizedThreadId ? adopted : thread)\n : [adopted, ...state.threads],\n };\n}\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const index = next.findIndex((message) => message.role === \"assistant\" && (\n Boolean(input.messageId && message.id === input.messageId)\n || Boolean(input.runId && message.runId === input.runId)\n ));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nfunction appendAssistantDelta(\n parts: ChatMessage[\"parts\"],\n delta: string,\n fallbackPartId: string,\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n const trailing = next[next.length - 1];\n if (trailing?.kind === \"text\") {\n next[next.length - 1] = { ...trailing, text: `${trailing.text}${delta}` };\n return next;\n }\n next.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: delta });\n return next;\n}\n\nfunction upsertResponseBlockParts(\n parts: ChatMessage[\"parts\"],\n incoming: ChatMessage[\"parts\"],\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n for (const part of incoming) {\n const index = next.findIndex((current) => current.id === part.id);\n if (index === -1) next.push(part);\n else next[index] = part;\n }\n return next;\n}\n\nfunction reconcileModelTurnParts(\n parts: ChatMessage[\"parts\"],\n event: RuntimeEvent,\n): ChatMessage[\"parts\"] {\n const eventName = String(event.event || \"\");\n const payload = event.payload || {};\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const modelTurnId = typeof payload.model_turn_id === \"string\" ? payload.model_turn_id : null;\n let next = parts;\n\n if (eventName === \"run.snapshot\" || terminal) {\n next = next.filter((part) => part.kind !== \"model-turn\");\n } else if (eventName === \"assistant.delta\" && typeof payload.content === \"string\" && payload.content) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (eventName.startsWith(\"tool.\") || eventName === \"node.status.updated\") {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (\n (eventName === \"model.turn.failed\" || (eventName === \"model.turn.completed\" && payload.outcome !== \"tool_calls\"))\n && modelTurnId\n ) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.modelTurnId !== modelTurnId);\n }\n\n const active = modelTurnPartFromEvent(event);\n return active ? upsertResponseBlockParts(next, [active]) : next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = event.run_id || state.activeRunId;\n const messageId = state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && (\n message.id === messageId || Boolean(runId && message.runId === runId)\n ));\n const payload = event.payload || {};\n const eventThreadId = typeof payload.thread_id === \"string\" && payload.thread_id.trim()\n ? payload.thread_id.trim()\n : null;\n const contextApplies = (\n (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId)\n && (!state.activeRunId || !runId || runId === state.activeRunId)\n );\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, payload.context_window)\n : state.contextWindow;\n const explicitCompression = contextApplies\n ? normalizeContextCompression(payload.context_compression)\n : null;\n const contextCompression = contextApplies\n ? explicitCompression || compressionFromContextWindow(contextWindow) || state.contextCompression\n : state.contextCompression;\n const hasLiveCompressionUpdate = Boolean(\n contextApplies\n && (\n explicitCompression?.active\n || compressionFromContextWindow(\n mergeContextWindowUpdate(null, payload.context_window),\n )?.active\n )\n );\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const hasCanonicalResponseBlocks = Array.isArray(payload.response_blocks);\n const content = hasCanonicalResponseBlocks\n ? projection.content\n : delta\n ? `${existing?.content || \"\"}${delta}`\n : projection.content || existing?.content || \"\";\n const projectedParts = hasCanonicalResponseBlocks\n ? projection.parts\n : delta\n ? appendAssistantDelta(\n existing?.parts || [],\n delta,\n `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(projectedParts, event);\n const compressionPart = contextApplies && explicitCompression?.active\n ? contextCompressionPartFromEvent(event, lifecycleParts)\n : null;\n const parts = compressionPart\n ? upsertResponseBlockParts(lifecycleParts, [compressionPart])\n : lifecycleParts;\n const activeThreadId = eventThreadId || state.activeThreadId;\n const messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\n });\n const threads = activeThreadId\n ? state.threads.some((thread) => thread.id === activeThreadId)\n ? state.threads.map((thread) => thread.id === activeThreadId\n ? {\n ...thread,\n messages,\n isHydrated: true,\n last_run_id: runId ?? thread.last_run_id,\n contextWindow,\n contextCompression,\n }\n : thread)\n : [{\n id: activeThreadId,\n title: null,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages,\n isHydrated: true,\n last_run_id: runId,\n contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages,\n threads,\n contextWindow,\n contextCompression,\n contextCompressionRevision: hasLiveCompressionUpdate\n ? state.contextCompressionRevision + 1\n : state.contextCompressionRevision,\n runState: paused\n ? \"paused\"\n : cancelling\n ? \"cancelling\"\n : terminal\n ? eventName === \"run.completed\"\n ? \"completed\"\n : eventName === \"run.cancelled\"\n ? \"cancelled\"\n : \"failed\"\n : \"streaming\",\n streamingMessageId: terminal || paused ? null : messageId,\n };\n}\n\nexport function applyRuntimeEvents(\n state: AgentChatState,\n events: readonly RuntimeEvent[],\n): AgentChatState {\n return events.reduce(applyRuntimeEvent, state);\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = { ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated };\n return next;\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n ResponseFeedback,\n RuntimeEvent,\n ThreadSummaryEvent,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n reconcileRefreshedThreads,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n clearBackgroundError(): void;\n clearOperationError(operation?: AgentChatOperation): void;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n resumeHitl(part: ChatHitlPart, response: HitlResponse): Promise<void>;\n setFeedback(\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return activity.isSpinning ? activity.runId : null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: resolveInitialActiveThreadId(\n options,\n runtime.storage?.loadActiveThreadId?.() ?? null,\n ),\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenGenerationRef = React.useRef(0);\n const refreshThreadsPromiseRef = React.useRef<Promise<void> | null>(null);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\n\n const eventBuffer = React.useMemo(\n () => createRuntimeEventFrameBuffer(\n (events) => update((current) => applyRuntimeEvents(current, events)),\n runtimeEventFrameScheduler(),\n ),\n [update],\n );\n\n const clearOperationError = React.useCallback((operation?: AgentChatOperation) => {\n update((current) => clearAgentChatOperationError(current, operation));\n }, [update]);\n\n const clearBackgroundError = React.useCallback(() => {\n update(clearAgentChatBackgroundError);\n }, [update]);\n\n const failOperation = React.useCallback((operation: AgentChatOperation, cause: unknown) => {\n update((current) => withAgentChatOperationError(current, operation, cause));\n }, [update]);\n\n const invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }, []);\n\n const detach = React.useCallback(() => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [eventBuffer, update]);\n\n React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshThreadsPromiseRef.current) return refreshThreadsPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const nextThreads = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return {\n ...current,\n threads: reconcileRefreshedThreads(\n current.threads,\n nextThreads,\n current.activeThreadId,\n ),\n };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingThreads(false);\n }\n })();\n refreshThreadsPromiseRef.current = request;\n void request.then(\n () => {\n if (refreshThreadsPromiseRef.current === request) refreshThreadsPromiseRef.current = null;\n },\n () => {\n if (refreshThreadsPromiseRef.current === request) refreshThreadsPromiseRef.current = null;\n },\n );\n return request;\n }, [clearOperationError, client, failOperation, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n clearOperationError();\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, {\n ...existing,\n ...summaryToStored(item),\n messages: existing?.messages || [],\n isHydrated: existing?.isHydrated,\n });\n }\n return { ...current, threads: [...byId.values()] };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_more_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [clearOperationError, client, failOperation, isLoadingMoreThreads, threadPageSize, threadTotal, update]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort(\"A newer thread was selected.\");\n const requestController = runtime.createAbortController();\n threadOpenControllerRef.current = requestController;\n const requestGeneration = threadOpenGenerationRef.current + 1;\n threadOpenGenerationRef.current = requestGeneration;\n detach();\n clearOperationError();\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n activeRunId: null,\n cursor: null,\n error: null,\n messages: current.threads.find((thread) => thread.id === threadId)?.messages || [],\n contextWindow: current.threads.find((thread) => thread.id === threadId)?.contextWindow || null,\n contextCompression: current.threads.find((thread) => thread.id === threadId)?.contextCompression || null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n streamingMessageId: null,\n }));\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n const messages = threadDetailToMessages(detail);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n ...context,\n };\n update((current) => isCurrentThreadOpenRequest({\n activeThreadId: current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n }) ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n } : current);\n const activeRunId = activeRunIdFromThread(stored);\n if (\n activeRunId\n && isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })\n ) await attachRunRef.current(activeRunId).catch(() => undefined);\n } catch (error) {\n if (!isAbortLike(error) && requestGeneration === threadOpenGenerationRef.current) {\n failOperation(\"open_thread\", error);\n update((current) => restoreAgentChatThreadSelection(current, previousSelection));\n if (previousSelection.activeRunId) {\n void attachRunRef.current(previousSelection.activeRunId, previousSelection.cursor ?? undefined).catch(() => undefined);\n }\n throw error;\n }\n } finally {\n if (requestGeneration === threadOpenGenerationRef.current) {\n if (threadOpenControllerRef.current === requestController) threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }\n }\n }, [clearOperationError, client, detach, failOperation, pageSize, runtime, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n update((current) => adoptStreamingThread(current, eventThreadId));\n }\n eventBuffer.push(event);\n }, [eventBuffer, update]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n clearOperationError();\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", streamingMessageId: null }));\n failOperation(\"attach_run\", error);\n throw error;\n }\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, failOperation, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const optimisticAttachments = input.attachments?.length\n ? input.attachments\n : input.uploads?.map((upload, index) => ({\n id: `${userId}-attachment-${index}`,\n filename: upload.name,\n mediaType: upload.mediaType,\n status: \"uploading\",\n }));\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: optimisticAttachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n update((current) => ({\n ...current,\n messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage),\n streamingMessageId: assistantId,\n runState: hasPendingUploads ? \"uploading\" : \"streaming\",\n error: null,\n }));\n setIsSubmitting(true);\n let streamStarted = false;\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n streamStarted = true;\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n } catch (error) {\n if (isAbortLike(error) && !streamStarted) {\n update((current) => current.streamingMessageId === assistantId\n ? {\n ...current,\n messages: current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"idle\",\n streamingMessageId: null,\n }\n : current);\n } else if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n messages: streamStarted\n ? current.messages\n : current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"failed\",\n streamingMessageId: null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);\n\n const startNewThread = React.useCallback(() => {\n invalidateThreadOpen();\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, invalidateThreadOpen, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (stateRef.current.activeThreadId === threadId) invalidateThreadOpen();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({\n ...current,\n activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId,\n messages: current.activeThreadId === threadId ? [] : current.messages,\n contextWindow: current.activeThreadId === threadId ? null : current.contextWindow,\n contextCompression: current.activeThreadId === threadId ? null : current.contextCompression,\n contextCompressionRevision: current.activeThreadId === threadId ? 0 : current.contextCompressionRevision,\n threads: current.threads.filter((thread) => thread.id !== threadId),\n }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, invalidateThreadOpen, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\n const previousRunState = stateRef.current.runState;\n clearOperationError();\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: \"cancelling\" }\n : current\n ));\n try {\n const result = await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n if (result.status === \"cancelled\") {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: \"cancelled\",\n streamingMessageId: null,\n }));\n } else if (result.status === \"cancelling\") {\n update((current) => ({\n ...current,\n activeRunId: runId,\n runState: \"cancelling\",\n }));\n } else {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: result.status === \"completed\" ? \"completed\" : \"failed\",\n streamingMessageId: null,\n }));\n }\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: previousRunState }\n : current\n ));\n failOperation(\"cancel_run\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, detach, failOperation, runtime, update]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n clearOperationError();\n if (!runId) {\n const error = new Error(\"No paused run is available to resume.\");\n failOperation(\"resume_hitl\", error);\n throw error;\n }\n try {\n const result = await client.hitl.resume({\n runId,\n interruptId: part.interruptId,\n ...response,\n idempotencyKey: runtime.createId(),\n });\n await attachRun(result.run_id || runId);\n } catch (error) {\n if (!isAbortLike(error)) failOperation(\"resume_hitl\", error);\n throw error;\n }\n }, [attachRun, clearOperationError, client, failOperation, runtime]);\n\n const setFeedback = React.useCallback(async (\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ) => {\n const runId = message.runId;\n if (!runId || message.role !== \"assistant\" || message.isFinal === false) {\n const error = new Error(\"Only persisted final responses can receive feedback.\");\n failOperation(\"set_feedback\", error);\n throw error;\n }\n const previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating\n ? {\n rating: input.rating,\n reason: input.rating === \"dislike\" ? input.reason ?? null : null,\n comment: input.rating === \"dislike\" ? input.comment?.trim() || null : null,\n created_at: previous?.created_at || timestamp,\n updated_at: timestamp,\n }\n : null;\n const replaceFeedback = (\n current: AgentChatState,\n feedback: ResponseFeedback | null,\n ): AgentChatState => {\n const messages = current.messages.map((item) =>\n item.id === message.id ? { ...item, feedback } : item\n );\n return {\n ...current,\n messages,\n threads: current.threads.map((thread) => ({\n ...thread,\n messages: thread.messages.map((item) =>\n item.id === message.id ? { ...item, feedback } : item\n ),\n })),\n };\n };\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n update((current) =>\n withAgentChatOperationError(\n replaceFeedback(current, previous),\n \"set_feedback\",\n error,\n )\n );\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n clearOperationError();\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_older_turns\", error);\n throw error;\n }\n } finally { setIsLoadingOlder(false); }\n }, [clearOperationError, client, failOperation, pageSize, update]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({\n text: user.content,\n attachmentIds: chatAttachmentIds(user.attachments),\n attachments: user.attachments,\n });\n }, [submit]);\n\n React.useEffect(() => {\n const controller = runtime.createAbortController();\n clearBackgroundError();\n void client.threads.events({ signal: controller.signal }, async (event: ThreadSummaryEvent) => {\n if (event.event === \"snapshot_required\") {\n clearBackgroundError();\n await refreshThreads();\n return;\n }\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n }).catch((error) => {\n if (!isAbortLike(error)) update((current) => withAgentChatBackgroundError(current, error));\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, refreshThreads, runtime.createAbortController, update]);\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n const activeThread = stateRef.current.threads.find((thread) => thread.id === stateRef.current.activeThreadId);\n if (shouldHydrateSelectedThread(threadId, stateRef.current.activeThreadId, Boolean(activeThread?.isHydrated))) {\n void openThread(threadId as string).catch(() => undefined);\n }\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n activeThread,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n clearBackgroundError,\n clearOperationError,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { RuntimeEvent } from \"@agents24/client\";\n\nexport type RuntimeEventFrameScheduler = (callback: () => void) => () => void;\n\nexport type RuntimeEventFrameBuffer = {\n dispose(): void;\n flush(): void;\n push(event: RuntimeEvent): void;\n};\n\ntype AnimationFrameRuntime = {\n cancelAnimationFrame?: (handle: number) => void;\n requestAnimationFrame?: (callback: () => void) => number;\n};\n\nexport function runtimeEventFrameScheduler(): RuntimeEventFrameScheduler | undefined {\n const runtime = globalThis as AnimationFrameRuntime;\n if (typeof runtime.requestAnimationFrame !== \"function\") return undefined;\n return (callback) => {\n const handle = runtime.requestAnimationFrame?.(callback);\n return () => {\n if (handle !== undefined) runtime.cancelAnimationFrame?.(handle);\n };\n };\n}\n\nexport function createRuntimeEventFrameBuffer(\n apply: (events: readonly RuntimeEvent[]) => void,\n scheduleFrame?: RuntimeEventFrameScheduler,\n): RuntimeEventFrameBuffer {\n let pending: RuntimeEvent[] = [];\n let cancelFrame: (() => void) | null = null;\n\n const flush = () => {\n cancelFrame?.();\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n };\n\n return {\n dispose() {\n cancelFrame?.();\n cancelFrame = null;\n pending = [];\n },\n flush,\n push(event) {\n if (event.event !== \"assistant.delta\" || !scheduleFrame) {\n pending.push(event);\n flush();\n return;\n }\n pending.push(event);\n if (cancelFrame) return;\n cancelFrame = scheduleFrame(() => {\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n });\n },\n };\n}\n","export function resolveInitialActiveThreadId(\n options: { activeThreadId?: string | null },\n storedThreadId: string | null,\n): string | null {\n return Object.prototype.hasOwnProperty.call(options, \"activeThreadId\")\n ? options.activeThreadId ?? null\n : storedThreadId;\n}\n\nexport function shouldHydrateSelectedThread(\n selectedThreadId: string | null | undefined,\n activeThreadId: string | null,\n activeThreadIsHydrated: boolean,\n): boolean {\n return Boolean(selectedThreadId) && (\n selectedThreadId !== activeThreadId || !activeThreadIsHydrated\n );\n}\n\nexport function isCurrentThreadOpenRequest(input: {\n activeThreadId: string | null;\n currentGeneration: number;\n requestGeneration: number;\n requestedThreadId: string;\n signalAborted: boolean;\n}): boolean {\n return !input.signalAborted\n && input.requestGeneration === input.currentGeneration\n && input.requestedThreadId === input.activeThreadId;\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const uploadBatch = React.useCallback(async (input: { uploads: readonly { data: BinaryUploadData; name: string; mediaType: string }[]; threadId?: string; requestedAgentId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => Object.fromEntries([\n ...Object.entries(current),\n ...results.map((result) => [result.id, result]),\n ]));\n return results.map(attachmentResultToChatAttachment);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n const createContentAccess = React.useCallback(\n (input: { attachmentId: string; disposition: \"inline\" | \"attachment\"; signal?: AbortSignalLike }) =>\n client.attachments.createContentAccess(input),\n [client],\n );\n return { createContentAccess, isUploading, uploadBatch, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; answers?: import(\"@agents24/client\").HitlAnswer[]; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":"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","names":["value","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","activeThread","React"]}
|
package/dist/model.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AttachmentResult, FailureView, HitlAction, ResponseFeedback, RuntimeEvent, ThreadDetail, ThreadSummary } from "@agents24/client";
|
|
2
2
|
import { type ContextCompression, type ContextWindow } from "@agents24/client/protocol";
|
|
3
3
|
export type AgentChatMessageRole = "user" | "assistant";
|
|
4
|
-
export type AgentChatRunState = "idle" | "streaming" | "reconnecting" | "paused" | "cancelling" | "completed" | "cancelled" | "failed";
|
|
4
|
+
export type AgentChatRunState = "idle" | "uploading" | "streaming" | "reconnecting" | "paused" | "cancelling" | "completed" | "cancelled" | "failed";
|
|
5
5
|
export type ChatCitation = {
|
|
6
6
|
title: string;
|
|
7
7
|
url: string;
|
package/dist/state.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RuntimeEvent, ThreadSummaryEvent } from "@agents24/client";
|
|
2
2
|
import { type ContextCompression, type ContextWindow } from "@agents24/client/protocol";
|
|
3
|
-
import type { ChatMessage, StoredChatThread } from "./model";
|
|
3
|
+
import type { AgentChatRunState, ChatMessage, StoredChatThread } from "./model";
|
|
4
4
|
export type AgentChatOperation = "attach_run" | "cancel_run" | "delete_thread" | "load_more_threads" | "load_older_turns" | "open_thread" | "refresh_threads" | "resume_hitl" | "set_feedback" | "submit";
|
|
5
5
|
export type AgentChatOperationError = {
|
|
6
6
|
kind: "operation";
|
|
@@ -22,7 +22,7 @@ export type AgentChatState = {
|
|
|
22
22
|
contextWindow: ContextWindow | null;
|
|
23
23
|
contextCompression: ContextCompression | null;
|
|
24
24
|
contextCompressionRevision: number;
|
|
25
|
-
runState:
|
|
25
|
+
runState: AgentChatRunState;
|
|
26
26
|
/** Fatal chat initialization/session failures only. */
|
|
27
27
|
error: unknown;
|
|
28
28
|
/** The latest user-visible operation failure. It must not replace the transcript. */
|
|
@@ -43,6 +43,8 @@ export declare function clearAgentChatBackgroundError(state: AgentChatState): Ag
|
|
|
43
43
|
* active thread before it becomes visible in the server's list projection.
|
|
44
44
|
*/
|
|
45
45
|
export declare function reconcileRefreshedThreads(current: StoredChatThread[], incoming: StoredChatThread[], activeThreadId: string | null): StoredChatThread[];
|
|
46
|
+
/** Adopt the server-created thread without reloading the in-memory transcript. */
|
|
47
|
+
export declare function adoptStreamingThread(state: AgentChatState, threadId: string): AgentChatState;
|
|
46
48
|
export type StableChatMessageBase = {
|
|
47
49
|
id: string;
|
|
48
50
|
role: "user" | "assistant";
|
package/dist/use-agent-chat.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import type { AgentClient, FeedbackReason, HitlResponse } from "@agents24/client";
|
|
1
|
+
import type { AgentClient, FeedbackReason, HitlResponse, PortableUpload } from "@agents24/client";
|
|
2
2
|
import type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from "./model";
|
|
3
3
|
import { type AgentChatOperation, type AgentChatState } from "./state";
|
|
4
4
|
export type AgentChatSubmitInput = {
|
|
5
5
|
text: string;
|
|
6
6
|
attachmentIds?: readonly string[];
|
|
7
7
|
attachments?: ChatAttachment[];
|
|
8
|
+
uploads?: readonly PortableUpload[];
|
|
8
9
|
requestedModelId?: string;
|
|
10
|
+
requestedAgentId?: string;
|
|
9
11
|
};
|
|
10
12
|
export type UseAgentChatOptions = {
|
|
11
13
|
activeThreadId?: string | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agents24/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "DOM-free React state and hooks for Agents24 client applications.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"prepack": "pnpm run build && pnpm run check:boundaries"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@agents24/client": "0.2.
|
|
43
|
+
"@agents24/client": "0.2.4"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"react": ">=19.0.0 <20.0.0"
|