@agents24/react 0.2.2 → 0.2.3

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Agents24 React
2
2
 
3
- Last Updated: 2026-07-29
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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contractHash": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
3
- "contractVersion": "0.2.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": 22,
51
- "node": 79,
52
- "python": 70
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();
@@ -976,8 +999,19 @@ function useAgentChat(options = {}) {
976
999
  update((current) => ({ ...current, messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage), streamingMessageId: assistantId, runState: "streaming", error: null }));
977
1000
  setIsSubmitting(true);
978
1001
  try {
979
- const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || void 0, attachmentIds: input.attachmentIds, requestedModelId: input.requestedModelId, idempotencyKey, signal: controller.signal }, consumeEvent);
980
- update((current) => ({ ...current, activeThreadId: result.threadId || current.activeThreadId, activeRunId: result.detached ? result.runId : current.activeRunId, cursor: result.cursor, runState: result.detached ? "reconnecting" : current.runState }));
1002
+ const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || void 0, attachmentIds: input.attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);
1003
+ eventBuffer.flush();
1004
+ update((current) => {
1005
+ const threadId = result.threadId || current.activeThreadId;
1006
+ return {
1007
+ ...current,
1008
+ activeThreadId: threadId,
1009
+ activeRunId: result.detached ? result.runId : current.activeRunId,
1010
+ cursor: result.cursor,
1011
+ runState: result.detached ? "reconnecting" : current.runState,
1012
+ threads: threadId ? current.threads.map((thread) => thread.id === threadId ? { ...thread, messages: current.messages, isHydrated: true } : thread) : current.threads
1013
+ };
1014
+ });
981
1015
  if (result.threadId) await refreshThreads().catch(() => void 0);
982
1016
  } catch (error) {
983
1017
  if (!isAbortLike(error)) {
@@ -989,7 +1023,7 @@ function useAgentChat(options = {}) {
989
1023
  setIsSubmitting(false);
990
1024
  if (streamControllerRef.current === controller) streamControllerRef.current = null;
991
1025
  }
992
- }, [clearOperationError, client, consumeEvent, detach, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);
1026
+ }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);
993
1027
  const startNewThread = React2.useCallback(() => {
994
1028
  invalidateThreadOpen();
995
1029
  detach();
@@ -1319,7 +1353,7 @@ function useAgentAttachments() {
1319
1353
  const uploadBatch = React3.useCallback(async (input) => {
1320
1354
  setIsUploading(true);
1321
1355
  try {
1322
- const results = await client.attachments.uploadBatch({ uploads: input.uploads, threadId: input.threadId, idempotencyKey: createId(), signal: input.signal });
1356
+ const results = await client.attachments.uploadBatch({ uploads: input.uploads, threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });
1323
1357
  setUploads((current) => Object.fromEntries([
1324
1358
  ...Object.entries(current),
1325
1359
  ...results.map((result) => [result.id, result])
@@ -1367,6 +1401,7 @@ function useAgentMcp() {
1367
1401
  }
1368
1402
  export {
1369
1403
  Agents24Provider,
1404
+ adoptStreamingThread,
1370
1405
  appendStableStreamingTurn,
1371
1406
  applyRuntimeEvent,
1372
1407
  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 | \"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\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 { 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 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 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) 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, 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)) {\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, 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/state.d.ts CHANGED
@@ -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";
@@ -6,6 +6,7 @@ export type AgentChatSubmitInput = {
6
6
  attachmentIds?: readonly string[];
7
7
  attachments?: ChatAttachment[];
8
8
  requestedModelId?: string;
9
+ requestedAgentId?: string;
9
10
  };
10
11
  export type UseAgentChatOptions = {
11
12
  activeThreadId?: string | null;
@@ -39,6 +39,7 @@ export declare function useAgentAttachments(): {
39
39
  mediaType: string;
40
40
  }[];
41
41
  threadId?: string;
42
+ requestedAgentId?: string;
42
43
  signal?: AbortSignalLike;
43
44
  }) => Promise<import("./model").ChatAttachment[]>;
44
45
  uploads: Record<string, AttachmentResult>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents24/react",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
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.2"
43
+ "@agents24/client": "0.2.3"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "react": ">=19.0.0 <20.0.0"