@agents24/react 0.2.12 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractHash": "37437aff006eec5ea404f4259bf2e8cb0ba442ecc5aa72b4d39964530899d58a",
2
+ "contractHash": "0394b689ce7604b444b11c8792050fae0c1da4233d6b318d22832c3b89516a4a",
3
3
  "contractVersion": "0.3.0",
4
4
  "corpus": "conformance/v1/corpus.json",
5
5
  "generatedBy": "@agents24/sdk-contract",
@@ -15,11 +15,11 @@
15
15
  "reactDom": ">=19 <20"
16
16
  },
17
17
  "@agents24/client": {
18
- "contract": "37437aff006eec5ea404f4259bf2e8cb0ba442ecc5aa72b4d39964530899d58a",
18
+ "contract": "0394b689ce7604b444b11c8792050fae0c1da4233d6b318d22832c3b89516a4a",
19
19
  "runtime": "run-stream.v3"
20
20
  },
21
21
  "@agents24/node": {
22
- "contract": "37437aff006eec5ea404f4259bf2e8cb0ba442ecc5aa72b4d39964530899d58a",
22
+ "contract": "0394b689ce7604b444b11c8792050fae0c1da4233d6b318d22832c3b89516a4a",
23
23
  "node": "^22.0.0 || ^24.0.0"
24
24
  },
25
25
  "@agents24/react": {
@@ -27,11 +27,11 @@
27
27
  "react": ">=19 <20"
28
28
  },
29
29
  "@talmudpedia/runtime-sdk": {
30
- "contract": "37437aff006eec5ea404f4259bf2e8cb0ba442ecc5aa72b4d39964530899d58a",
30
+ "contract": "0394b689ce7604b444b11c8792050fae0c1da4233d6b318d22832c3b89516a4a",
31
31
  "protocolOwner": "@agents24/client"
32
32
  },
33
33
  "agents24": {
34
- "contract": "37437aff006eec5ea404f4259bf2e8cb0ba442ecc5aa72b4d39964530899d58a",
34
+ "contract": "0394b689ce7604b444b11c8792050fae0c1da4233d6b318d22832c3b89516a4a",
35
35
  "python": ">=3.10"
36
36
  }
37
37
  },
package/dist/index.js CHANGED
@@ -379,7 +379,8 @@ function threadDetailToMessages(detail) {
379
379
  runId,
380
380
  content: assistantText,
381
381
  createdAt: text(turn.completed_at) || createdAt,
382
- isFinal: !["queued", "running", "paused", "cancelling"].includes(String(turn.status || "").toLowerCase()),
382
+ responseCompletion: item.response_completion,
383
+ isFinal: Boolean(item.response_completion) || !["queued", "running", "paused", "cancelling"].includes(String(turn.status || "").toLowerCase()),
383
384
  feedback,
384
385
  parts: assistantParts,
385
386
  messageIndex: typeof turn.turn_index === "number" ? turn.turn_index : index
@@ -399,6 +400,7 @@ function threadTimelineToMessages(items, detail) {
399
400
  content: item.text,
400
401
  createdAt: item.created_at,
401
402
  isFinal: item.status === "completed" || item.status === "delivered",
403
+ responseCompletion: item.response_completion,
402
404
  parts: item.role === "assistant" ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`) : item.text ? [{ id: `${item.id}-text`, type: "text", kind: "text", text: item.text }] : [],
403
405
  attachments: item.role === "user" ? item.attachment_ids.map((id) => {
404
406
  const descriptor = item.attachments?.find((attachment) => attachment.id === id);
@@ -613,7 +615,7 @@ function reconcileThreadTimeline(current, canonical, activeRunId, streamingMessa
613
615
  const retained = current.filter((message) => !canonicalIds.has(message.id) && (message.isFinal || activeRunId && (!message.runId || message.runId === activeRunId)));
614
616
  const reconciled = mounted.map((message) => {
615
617
  const live = current.find((item) => item.id === message.id);
616
- return activeRunId && live?.role === "assistant" && live.runId === activeRunId && (live.id === streamingMessageId || !live.isFinal) ? { ...message, ...live, durableId: message.durableId || live.durableId } : message;
618
+ return activeRunId && live?.role === "assistant" && live.runId === activeRunId && (live.id === streamingMessageId || !live.isFinal || live.responseCompletion) ? message.responseCompletion && !live.responseCompletion ? { ...message, id: live.id, durableId: message.durableId || live.durableId } : { ...message, ...live, durableId: message.durableId || live.durableId } : message;
617
619
  });
618
620
  return [...retained, ...reconciled];
619
621
  }
@@ -660,7 +662,7 @@ function reconcileModelTurnParts(parts, event) {
660
662
  const terminal = eventName === "run.completed" || eventName === "run.failed" || eventName === "run.cancelled";
661
663
  const modelTurnId = typeof payload.model_turn_id === "string" ? payload.model_turn_id : null;
662
664
  let next = parts;
663
- if (eventName === "run.snapshot" || terminal) {
665
+ if (eventName === "run.snapshot" || eventName === "assistant.completed" || terminal) {
664
666
  next = next.filter((part) => part.kind !== "model-turn");
665
667
  } else if (eventName === "assistant.delta" && typeof payload.content === "string" && payload.content) {
666
668
  next = next.filter((part) => part.kind !== "model-turn" || part.turnKind !== "agent");
@@ -673,6 +675,19 @@ function reconcileModelTurnParts(parts, event) {
673
675
  return active ? upsertResponseBlockParts(next, [active]) : next;
674
676
  }
675
677
  function applyRuntimeEvent(state, event) {
678
+ if (state.activeRunId && event.run_id && event.run_id !== state.activeRunId) {
679
+ const previous = state.messages.find((message) => message.role === "assistant" && message.runId === event.run_id);
680
+ if (event.event !== "run.accepted") {
681
+ if (!previous) return state;
682
+ const reconciled = applyRuntimeEvent({
683
+ ...state,
684
+ activeRunId: event.run_id,
685
+ streamingMessageId: previous.id
686
+ }, event);
687
+ return { ...state, messages: reconciled.messages };
688
+ }
689
+ if (previous?.isFinal) return state;
690
+ }
676
691
  if (event.event === "run.accepted" && typeof event.payload?.message_id === "string") {
677
692
  const messageId2 = event.payload.message_id;
678
693
  let optimisticIndex = -1;
@@ -690,6 +705,8 @@ function applyRuntimeEvent(state, event) {
690
705
  }
691
706
  const projection = assistantProjectionFromEvent(event);
692
707
  const eventName = String(event.event || "");
708
+ const completion = eventName === "assistant.completed" ? event.payload : event.payload?.response_completion;
709
+ const responseCompleted = Boolean(completion?.completed_at);
693
710
  const runId = state.activeRunId && event.event !== "run.accepted" ? state.activeRunId : event.run_id || state.activeRunId;
694
711
  const segmentId = typeof event.payload?.segment_id === "string" ? event.payload.segment_id : null;
695
712
  const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);
@@ -699,6 +716,7 @@ function applyRuntimeEvent(state, event) {
699
716
  const suspension = eventName === "run.waiting" ? "waiting" : eventName === "run.interrupted" ? "interrupted" : null;
700
717
  const cancelling = eventName === "run.cancelling" || String(event.payload?.status || "") === "cancelling";
701
718
  const existing = state.messages.find((message) => message.role === "assistant" && message.id === messageId) || (!distinctSegment ? state.messages.find((message) => message.role === "assistant" && Boolean(runId && message.runId === runId)) : void 0);
719
+ const sealedAfterTerminal = responseCompleted && !state.activeRunId && ["completed", "failed", "cancelled"].includes(state.runState) && existing?.runId === runId;
702
720
  const payload = event.payload || {};
703
721
  const eventThreadId = typeof payload.thread_id === "string" && payload.thread_id.trim() ? payload.thread_id.trim() : null;
704
722
  const contextApplies = (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId) && (!state.activeRunId || !runId || runId === state.activeRunId);
@@ -717,13 +735,13 @@ function applyRuntimeEvent(state, event) {
717
735
  const projectedParts = hasCanonicalResponseBlocks ? projection.parts : delta ? appendAssistantDelta(
718
736
  existing?.parts || [],
719
737
  delta,
720
- `${runId || "run"}-assistant-text-${event.seq}`
738
+ typeof payload.block_id === "string" ? payload.block_id : `${runId || "run"}-assistant-text-${event.seq}`
721
739
  ) : projection.parts.length ? upsertResponseBlockParts(existing?.parts || [], projection.parts) : existing?.parts || [];
722
740
  const lifecycleParts = reconcileModelTurnParts(projectedParts, event);
723
741
  const compressionPart = contextApplies && explicitCompression?.active ? contextCompressionPartFromEvent(event, lifecycleParts) : null;
724
742
  const parts = compressionPart ? upsertResponseBlockParts(lifecycleParts, [compressionPart]) : lifecycleParts;
725
743
  const activeThreadId = eventThreadId || state.activeThreadId;
726
- const messages = upsertStableAssistantMessage(state.messages, {
744
+ let messages = upsertStableAssistantMessage(state.messages, {
727
745
  messageId,
728
746
  runId,
729
747
  strictMessageId: distinctSegment,
@@ -733,7 +751,8 @@ function applyRuntimeEvent(state, event) {
733
751
  runId,
734
752
  content,
735
753
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
736
- isFinal: terminal,
754
+ isFinal: terminal || responseCompleted,
755
+ responseCompletion: completion,
737
756
  parts
738
757
  }),
739
758
  update: (message) => ({
@@ -741,9 +760,20 @@ function applyRuntimeEvent(state, event) {
741
760
  runId: runId ?? message.runId,
742
761
  content,
743
762
  parts,
744
- isFinal: terminal || message.isFinal
763
+ isFinal: terminal || responseCompleted || message.isFinal,
764
+ responseCompletion: completion || message.responseCompletion
745
765
  })
746
766
  });
767
+ if (responseCompleted) messages = messages.map((message) => {
768
+ if (message.role !== "assistant" || message.runId !== runId) return message;
769
+ const segment = completion?.segments.find((item) => item.message_id === message.durableId || item.message_id === message.id || message.id.endsWith(`-assistant-${item.segment_id}`)) || (!message.segmentIndex || message.segmentIndex === 1 ? completion?.segments[0] : void 0);
770
+ return {
771
+ ...message,
772
+ isFinal: true,
773
+ responseCompletion: completion,
774
+ ...segment ? { durableId: segment.message_id } : {}
775
+ };
776
+ });
747
777
  const threads = activeThreadId ? state.threads.some((thread) => thread.id === activeThreadId) ? state.threads.map((thread) => thread.id === activeThreadId ? {
748
778
  ...thread,
749
779
  messages,
@@ -765,15 +795,15 @@ function applyRuntimeEvent(state, event) {
765
795
  return {
766
796
  ...state,
767
797
  activeThreadId,
768
- activeRunId: terminal ? null : runId,
798
+ activeRunId: terminal || sealedAfterTerminal ? null : runId,
769
799
  cursor: typeof event.seq === "number" ? event.seq : state.cursor,
770
800
  messages,
771
801
  threads,
772
802
  contextWindow,
773
803
  contextCompression,
774
804
  contextCompressionRevision: hasLiveCompressionUpdate ? state.contextCompressionRevision + 1 : state.contextCompressionRevision,
775
- runState: suspension || (paused ? "paused" : cancelling ? "cancelling" : terminal ? eventName === "run.completed" ? "completed" : eventName === "run.cancelled" ? "cancelled" : "failed" : "streaming"),
776
- streamingMessageId: terminal || paused || suspension ? null : messageId
805
+ runState: sealedAfterTerminal ? state.runState : suspension || (paused ? "paused" : cancelling ? "cancelling" : terminal ? eventName === "run.completed" ? "completed" : eventName === "run.cancelled" ? "cancelled" : "failed" : "streaming"),
806
+ streamingMessageId: terminal || paused || suspension || responseCompleted || existing?.responseCompletion ? null : messageId
777
807
  };
778
808
  }
779
809
  function applyRuntimeEvents(state, events) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/runtime-event-buffer.ts","../src/state.ts","../src/thread-message-queue.ts","../src/use-agent-chat.ts","../src/thread-summary-subscription.ts","../src/use-agent-chat-thread-list.ts","../src/use-agent-chat-feedback.ts","../src/use-agent-chat-queue-actions.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"waiting\"\n | \"interrupted\"\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 ChatComputerResourceTarget = {\n type: \"computer\";\n thread_id: string;\n computer_id: string;\n path: string;\n kind: \"file\" | \"directory\";\n};\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 resourceTargets?: readonly ChatComputerResourceTarget[];\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 /** Durable timeline identity when a mounted optimistic turn keeps its display key. */\n durableId?: string;\n clientSubmissionId?: string;\n segmentIndex?: number | null;\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 taskNotifications?: Array<Record<string, unknown> & { handle: string }>;\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) && ![\"waiting\", \"interrupted\"].includes(status || \"\"),\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;\nexport function computerResourceTargets(value: unknown): ChatComputerResourceTarget[] {\n const output = record(value);\n if (!output) return [];\n const candidates = [output.resource_target,\n ...(Array.isArray(output.resource_targets) ? output.resource_targets : []),\n ...(Array.isArray(output.files) ? output.files.map(file => record(file)?.resource_target) : [])];\n const seen = new Set<string>();\n return candidates.flatMap(candidate => {\n const target = record(candidate);\n if (target?.type !== \"computer\" || typeof target.thread_id !== \"string\"\n || typeof target.computer_id !== \"string\" || typeof target.path !== \"string\"\n || !target.path.startsWith(\"/workspace\")\n || (target.kind !== \"file\" && target.kind !== \"directory\")) return [];\n const key = `${target.thread_id}:${target.computer_id}:${target.path}:${target.kind}`;\n if (seen.has(key)) return [];\n seen.add(key);\n return [target as ChatComputerResourceTarget];\n });\n}\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 resourceTargets: computerResourceTargets(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 threadTimelineToMessages(\n items: readonly import(\"@agents24/client\").ThreadMessage[],\n detail?: ThreadDetail,\n): ChatMessage[] {\n const feedbackByRun = new Map((detail?.turns || []).flatMap((turn) =>\n turn.run_id && turn.feedback ? [[turn.run_id, turn.feedback] as const] : []));\n return items.map((item) => ({\n id: item.id,\n clientSubmissionId: item.client_submission_id || undefined,\n role: item.role,\n runId: item.run_id,\n segmentIndex: item.segment_index,\n content: item.text,\n createdAt: item.created_at,\n isFinal: item.status === \"completed\" || item.status === \"delivered\",\n parts: item.role === \"assistant\"\n ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`)\n : item.text ? [{ id: `${item.id}-text`, type: \"text\" as const, kind: \"text\" as const, text: item.text }] : [],\n attachments: item.role === \"user\" ? item.attachment_ids.map((id) => {\n const descriptor = item.attachments?.find((attachment) => attachment.id === id);\n return { id, filename: descriptor?.filename || \"Attachment\", mediaType: descriptor?.mime_type || \"application/octet-stream\" };\n }) : undefined,\n feedback: item.role === \"assistant\" && item.run_id ? feedbackByRun.get(item.run_id) as ResponseFeedback | undefined : undefined,\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 } 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","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n concurrentEvents: readonly ThreadSummaryEvent[] = [],\n): StoredChatThread[] {\n const currentById = new Map(current.map((thread) => [thread.id, thread]));\n const newest = incoming.map((thread) => preferNewestThreadSummary(currentById.get(thread.id), thread));\n const active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...newest] : newest;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\n}\n\nexport function preferNewestThreadSummary(\n current: StoredChatThread | undefined,\n incoming: StoredChatThread,\n): StoredChatThread {\n if (!current?.updated_at || !incoming.updated_at) return incoming;\n const currentTime = Date.parse(current.updated_at);\n const incomingTime = Date.parse(incoming.updated_at);\n return Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : 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 strictMessageId?: boolean;\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\n/** Keep mounted display keys while matching only durable IDs and run linkage. */\nexport function preserveMountedMessageIds(\n canonical: ChatMessage[],\n current: ChatMessage[],\n): ChatMessage[] {\n return canonical.map((message) => {\n const mounted = current.find((item) => item.role === message.role && (\n item.durableId === message.id || item.id === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId)\n || (message.role === \"assistant\" && message.segmentIndex === 1 && item.runId\n && item.runId === message.runId && !item.durableId)\n ));\n return mounted && mounted.id !== message.id\n ? { ...message, id: mounted.id, durableId: message.id }\n : message;\n });\n}\n\n/** Reconcile a durable timeline without replacing a newer live assistant segment. */\nexport function reconcileThreadTimeline(\n current: ChatMessage[],\n canonical: ChatMessage[],\n activeRunId: string | null,\n streamingMessageId: string | null,\n): ChatMessage[] {\n const mounted = preserveMountedMessageIds(canonical, current);\n const canonicalIds = new Set(mounted.map((message) => message.id));\n const retained = current.filter((message) => !canonicalIds.has(message.id) && (\n message.isFinal || (activeRunId && (!message.runId || message.runId === activeRunId))\n ));\n const reconciled = mounted.map((message) => {\n const live = current.find((item) => item.id === message.id);\n return activeRunId && live?.role === \"assistant\" && live.runId === activeRunId\n && (live.id === streamingMessageId || !live.isFinal)\n ? { ...message, ...live, durableId: message.durableId || live.durableId }\n : message;\n });\n return [...retained, ...reconciled];\n}\n\n/** A promoted queue item enters the transcript under its durable message ID. */\nexport function promoteThreadMessage(\n current: ChatMessage[],\n message: ChatMessage,\n runId: string,\n): ChatMessage[] {\n const promoted = { ...message, runId, isFinal: true };\n const index = current.findIndex((item) => item.id === message.id || item.durableId === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId));\n if (index < 0) return [...current, message.clientSubmissionId\n ? { ...promoted, id: message.clientSubmissionId, durableId: message.id } : promoted];\n return current.map((item, itemIndex) => itemIndex === index\n ? { ...item, ...promoted, id: item.id, durableId: item.id === message.id ? item.durableId : message.id }\n : message.clientSubmissionId && item.role === \"assistant\" && item.id === `${current[index].id}:assistant`\n ? { ...item, runId } : item);\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.strictMessageId && input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const exactIndex = next.findIndex((message) => message.role === \"assistant\" && Boolean(input.messageId && message.id === input.messageId));\n const index = exactIndex >= 0 ? exactIndex : input.strictMessageId ? -1 : next.findIndex((message) =>\n message.role === \"assistant\" && Boolean(input.runId && message.runId === input.runId));\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 if (event.event === \"run.accepted\" && typeof event.payload?.message_id === \"string\") {\n const messageId = event.payload.message_id;\n let optimisticIndex = -1;\n for (let index = state.messages.length - 1; index >= 0; index -= 1) {\n const message = state.messages[index];\n if (message.role === \"user\" && (event.payload.client_submission_id\n ? message.clientSubmissionId === event.payload.client_submission_id\n : !message.runId && !message.durableId)) {\n optimisticIndex = index;\n break;\n }\n }\n if (optimisticIndex >= 0) {\n const assistantId = event.payload.client_submission_id\n ? `${state.messages[optimisticIndex].id}:assistant`\n : state.streamingMessageId;\n state = { ...state, streamingMessageId: assistantId, messages: state.messages.map((message, index) => index === optimisticIndex\n ? { ...message, durableId: messageId, runId: event.run_id }\n : message.role === \"assistant\" && message.id === assistantId\n ? { ...message, runId: event.run_id }\n : message) };\n }\n }\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = state.activeRunId && event.event !== \"run.accepted\"\n ? state.activeRunId : event.run_id || state.activeRunId;\n const segmentId = typeof event.payload?.segment_id === \"string\" ? event.payload.segment_id : null;\n const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);\n const messageId = distinctSegment\n ? `${runId || \"run\"}-assistant-${segmentId}`\n : 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 suspension = eventName === \"run.waiting\" ? \"waiting\" : eventName === \"run.interrupted\" ? \"interrupted\" : null;\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && message.id === messageId)\n || (!distinctSegment ? state.messages.find((message) => message.role === \"assistant\" && Boolean(runId && message.runId === runId)) : undefined);\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 contextPayload = payload.context_window && typeof payload.context_window === \"object\"\n ? { ...payload.context_window as Record<string, unknown>, run_id: runId }\n : payload.context_window;\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, contextPayload)\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, contextPayload),\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 strictMessageId: distinctSegment,\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: suspension || (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 || suspension ? 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 (String(event.event) === \"thread.task.updated\") {\n const value = event as unknown as { thread_id: string; task: Record<string, unknown> };\n const handle = value.task?.handle;\n if (typeof handle !== \"string\") return threads;\n return threads.map(thread => thread.id === value.thread_id ? { ...thread,\n taskNotifications: [...(thread.taskNotifications || []).filter(task => task.handle !== handle),\n { ...value.task, handle }].slice(-1000) } : thread);\n }\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] = preferNewestThreadSummary(next[index], {\n ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated,\n });\n return next;\n}\n","import * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { appendStableStreamingTurn, type AgentChatState } from \"./state\";\nimport type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n} from \"@agents24/client\";\n\n/** Retry uncertain admission once; the caller retains the same receipt and payload. */\nexport async function retrySubmissionAdmission<T>(admit: () => Promise<T>): Promise<T> {\n try { return await admit(); }\n catch (error) {\n const failure = error as { kind?: string; name?: string } | null;\n if (failure?.kind !== \"network\" && failure?.name !== \"HttpRequestTimeoutError\"\n && !(error instanceof TypeError)) throw error;\n return admit();\n }\n}\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n clientSubmissionId?: string | null;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string): Promise<ThreadMessagesPage>;\n submit(input: ThreadMessageInput): Promise<ThreadMessageSubmission>;\n edit(message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }): Promise<ThreadMessage>;\n remove(message: ThreadMessage): Promise<void>;\n resume(threadId: string): Promise<{ run_id: string | null }>;\n};\n\nexport type RetractedMessageDraft = Pick<ThreadMessage, \"text\" | \"attachment_ids\" | \"attachments\">;\n\nexport function useThreadMessageQueue({ threadId, transport, onPromoted, onOptimistic, onDiscard }: {\n threadId: string | null;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => void;\n onOptimistic?: (message: ThreadMessage, uploading: boolean) => void;\n onDiscard?: (message: ThreadMessage) => void;\n}) {\n const [pendingMessages, setPendingMessages] = React.useState<readonly ThreadMessage[]>([]);\n const [messageQueue, setMessageQueue] = React.useState<ThreadMessageQueueState | null>(null);\n const pendingRef = React.useRef(new Map<string, ThreadMessage & { optimisticQueued?: boolean }>());\n const versionRef = React.useRef(0);\n const cursorRef = React.useRef(0);\n const promotedRef = React.useRef(new Set<string>());\n const threadRef = React.useRef(threadId);\n const transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\n const callbacksRef = React.useRef({ onOptimistic, onDiscard });\n callbacksRef.current = { onOptimistic, onDiscard };\n\n const knownMessage = (id: string, submissionId?: string | null) => pendingRef.current.get(id)\n || (submissionId ? [...pendingRef.current.values()].find((item) => item.client_submission_id === submissionId) : undefined);\n\n const hydrate = React.useCallback((page: ThreadMessagesPage, selectedThreadId: string) => {\n if (threadRef.current !== selectedThreadId) return;\n const pending = page.pending.filter((message) => !promotedRef.current.has(message.id)).map((message) => {\n const known = knownMessage(message.id, message.client_submission_id);\n if (message.attachments?.length || !known?.attachments?.length) return message;\n return { ...message, attachments: known.attachments.filter((attachment) =>\n message.attachment_ids.includes(attachment.id)) };\n });\n for (const message of pending) pendingRef.current.set(message.id, message);\n const optimistic = [...pendingRef.current.values()].filter((message) => message.thread_id === selectedThreadId\n && message.revision === 0 && message.optimisticQueued && !pending.some((item) => item.client_submission_id === message.client_submission_id));\n setPendingMessages([...pending, ...optimistic]);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current) => {\n if (!selectedThreadId) return null;\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId);\n if (version !== versionRef.current || threadRef.current !== selectedThreadId) return null;\n for (const item of page.items) {\n if (item.role === \"user\" && item.status === \"delivered\" && item.run_id) {\n const pending = knownMessage(item.id, item.client_submission_id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.id);\n pendingRef.current.delete(pending.id);\n pendingRef.current.delete(item.id);\n onPromotedRef.current({ ...pending, ...item,\n attachments: item.attachments?.length ? item.attachments : pending.attachments }, item.run_id);\n }\n }\n }\n hydrate(page, selectedThreadId);\n return page;\n }, [hydrate]);\n\n const acceptNotice = React.useCallback((notice: ThreadMessageNotice) => {\n if (notice.cursor && notice.cursor <= cursorRef.current) return false;\n if (notice.cursor) cursorRef.current = notice.cursor;\n const pending = knownMessage(notice.messageId, notice.clientSubmissionId);\n if (notice.status === \"delivered\" && notice.runId && pending && !promotedRef.current.has(notice.messageId)) {\n promotedRef.current.add(notice.messageId);\n pendingRef.current.delete(pending.id);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current({ ...pending, id: notice.messageId, run_id: notice.runId, status: \"delivered\" }, notice.runId);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n void refresh().catch(() => undefined);\n return true;\n }, [refresh]);\n\n const beginSubmission = React.useCallback((input: {\n input: string; clientSubmissionId: string; mode?: \"queue\" | \"steer\";\n attachmentIds?: readonly string[]; attachments?: ThreadMessage[\"attachments\"]; uploading?: boolean;\n }, queued = false) => {\n const now = new Date().toISOString();\n const message: ThreadMessage = {\n id: input.clientSubmissionId, client_submission_id: input.clientSubmissionId,\n thread_id: threadRef.current || \"\", sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: 0, role: \"user\",\n status: \"queued\", requested_mode: input.mode || \"queue\", text: input.input,\n attachment_ids: input.attachmentIds || input.attachments?.map((item) => item.id) || [], attachments: input.attachments,\n response_blocks: [], revision: 0, created_at: now, updated_at: now,\n };\n pendingRef.current.set(message.id, { ...message, optimisticQueued: queued });\n versionRef.current += 1;\n if (queued) setPendingMessages((current) => [...current, message]);\n else callbacksRef.current.onOptimistic?.(message, Boolean(input.uploading));\n return message;\n }, []);\n\n const discardSubmission = React.useCallback((message: ThreadMessage) => {\n if (!pendingRef.current.has(message.id)) return;\n pendingRef.current.delete(message.id);\n callbacksRef.current.onDiscard?.(message);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== message.client_submission_id));\n }, []);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\"> & {\n attachments?: ThreadMessage[\"attachments\"];\n queued?: boolean;\n uploading?: boolean;\n prepare?: () => Promise<Pick<ThreadMessageInput, \"attachmentIds\"> & { attachments?: ThreadMessage[\"attachments\"] }>;\n }) => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) throw new Error(\"No active Agent thread is available.\");\n const { queued, prepare, attachments, uploading, ...submission } = input;\n const optimistic = beginSubmission({ ...submission, attachments, uploading,\n clientSubmissionId: submission.clientSubmissionId || submission.idempotencyKey }, queued);\n try {\n const prepared = prepare ? await prepare() : {};\n if (threadRef.current === selectedThreadId) pendingRef.current.set(optimistic.id, { ...optimistic, optimisticQueued: queued, attachment_ids: prepared.attachmentIds || optimistic.attachment_ids, attachments: prepared.attachments || attachments });\n const request = { ...submission, ...prepared, clientSubmissionId: optimistic.client_submission_id!, threadId: selectedThreadId };\n const result = await retrySubmissionAdmission(() => transportRef.current.submit(request));\n if (threadRef.current !== selectedThreadId) return result;\n versionRef.current += 1;\n const bound: ThreadMessage = { ...optimistic, id: result.message_id,\n client_submission_id: result.client_submission_id || optimistic.client_submission_id,\n attachment_ids: request.attachmentIds || [], attachments: prepared.attachments || attachments,\n run_id: result.run_id, status: result.status, revision: 1 };\n pendingRef.current.delete(optimistic.id);\n if (result.run_id) {\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== bound.client_submission_id));\n if (!promotedRef.current.has(bound.id)) {\n promotedRef.current.add(bound.id);\n onPromotedRef.current(bound, result.run_id);\n }\n } else if (!promotedRef.current.has(bound.id)) {\n if (!queued) callbacksRef.current.onDiscard?.(optimistic);\n pendingRef.current.set(bound.id, bound);\n setPendingMessages((current) => [...current.filter((item) => item.client_submission_id !== bound.client_submission_id), bound]);\n }\n void refresh().catch(() => undefined);\n return result;\n } catch (error) {\n if (threadRef.current === selectedThreadId) discardSubmission(optimistic);\n throw error; // Composer restores this draft only if newer typing is absent.\n }\n }, [beginSubmission, discardSubmission, refresh]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const updated = await transportRef.current.edit(message, input);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n await transportRef.current.remove(message);\n versionRef.current += 1;\n pendingRef.current.delete(message.id);\n setPendingMessages((current) => current.filter((item) => item.id !== message.id));\n await refresh(message.thread_id);\n }, [refresh]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n await remove(message);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const result = await transportRef.current.resume(selectedThreadId);\n await refresh(selectedThreadId);\n return result;\n }, [refresh]);\n\n React.useEffect(() => {\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n }, [threadId, refresh]);\n\n React.useEffect(() => {\n if (!threadId || !pendingMessages.length || messageQueue?.paused) return;\n const clock = globalThis as typeof globalThis & {\n setInterval(callback: () => void, interval: number): unknown;\n clearInterval(timer: unknown): void;\n };\n const timer = clock.setInterval(() => { void refresh(threadId).catch(() => undefined); }, 3000);\n return () => clock.clearInterval(timer);\n }, [threadId, pendingMessages.length, messageQueue?.paused, refresh]);\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, beginSubmission, discardSubmission, submit, edit, remove, retractForEdit, resume };\n}\n\n/** One provisional identity for first sends, idle sends, uploads and queue rows. */\nexport function optimisticSubmissionTurn(message: ThreadMessage): [ChatMessage, ChatMessage] {\n const user: ChatMessage = { id: message.client_submission_id || message.id,\n clientSubmissionId: message.client_submission_id || undefined,\n role: \"user\", content: message.text, createdAt: message.created_at, isFinal: true,\n parts: message.text ? [{ id: `${message.id}:text`, type: \"text\", kind: \"text\", text: message.text }] : [],\n attachments: message.attachments?.map((item) => ({ id: item.id, filename: item.filename,\n mediaType: item.mime_type, byteSize: item.byte_size })),\n };\n return [user, { id: `${user.id}:assistant`, role: \"assistant\", content: \"\", parts: [],\n createdAt: message.created_at, isFinal: false }];\n}\n\nexport function optimisticSubmissionState(state: AgentChatState, message: ThreadMessage, uploading: boolean): AgentChatState {\n const [user, assistant] = optimisticSubmissionTurn(message);\n return { ...state, messages: appendStableStreamingTurn(state.messages, user, assistant),\n streamingMessageId: assistant.id, runState: uploading ? \"uploading\" : \"streaming\", error: null };\n}\n\nexport function discardOptimisticSubmission(state: AgentChatState, message: ThreadMessage): AgentChatState {\n const activeDraft = state.streamingMessageId === `${message.id}:assistant`;\n return { ...state, messages: state.messages.filter((item) => item.runId\n || (item.id !== message.id && item.id !== `${message.id}:assistant`)),\n streamingMessageId: activeDraft ? null : state.streamingMessageId,\n runState: activeDraft && !state.activeRunId ? \"idle\" : state.runState };\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\n threadTimelineToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { subscribeToThreadSummaries } from \"./thread-summary-subscription\";\nimport { summaryToStored, useAgentChatThreadList } from \"./use-agent-chat-thread-list\";\nimport { useAgentChatFeedback } from \"./use-agent-chat-feedback\";\nimport { useAgentChatQueueActions } from \"./use-agent-chat-queue-actions\";\nimport { optimisticSubmissionState, discardOptimisticSubmission, useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\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 promoteThreadMessage,\n reconcileThreadTimeline,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n pendingMessages: readonly ThreadMessage[];\n messageQueue: ThreadMessageQueueState | null;\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 refreshMessages(threadId?: string): Promise<void>;\n editPendingMessage(message: ThreadMessage, input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">): Promise<void>;\n steerPendingMessage(message: ThreadMessage): Promise<void>;\n removePendingMessage(message: ThreadMessage): Promise<void>;\n retractPendingMessage(message: ThreadMessage): Promise<RetractedMessageDraft>;\n resumeQueue(): Promise<void>;\n steer(text: string): 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 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 [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 attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const messageRefreshVersionRef = React.useRef(0);\n const promotedRunHintRef = React.useRef<string | null>(null);\n const promotedAttachRef = React.useRef<string | null>(null);\n const firstSubmissionRef = React.useRef<Promise<void> | null>(null);\n const firstSubmissionAdmittedRef = React.useRef<(() => void) | null>(null);\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 queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId) => client.threads.messages.list({ threadId, limit: pageSize }),\n submit: (input) => client.threads.messages.submit(input),\n edit: (message, input) => client.threads.messages.edit({\n threadId: message.thread_id, messageId: message.id, revision: message.revision,\n input: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids, mode: input.mode,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n }),\n remove: async (message) => {\n await client.threads.messages.remove({ threadId: message.thread_id, messageId: message.id, revision: message.revision });\n },\n resume: (threadId) => client.threads.resumeQueue({ threadId }),\n }), [client, pageSize]);\n const onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n promotedRunHintRef.current = runId;\n const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: \"delivered\" }])[0];\n update((current) => current.activeThreadId === message.thread_id\n ? { ...current, messages: promoteThreadMessage(current.messages, userMessage, runId) } : current);\n if (stateRef.current.activeRunId !== runId && promotedAttachRef.current !== runId) {\n promotedAttachRef.current = runId;\n void attachRunRef.current(runId).catch(() => { promotedAttachRef.current = null; });\n }\n }, [update]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport,\n onPromoted: onQueuePromotion,\n onOptimistic: (message, uploading) => update((current) => optimisticSubmissionState(current, message, uploading)),\n onDiscard: (message) => update((current) => discardOptimisticSubmission(current, message)),\n });\n const { pendingMessages, messageQueue } = queue;\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 { isLoadingThreads, isLoadingMoreThreads, threadTotal,\n eventsDuringRefreshRef: threadEventsDuringRefreshRef, refreshThreads, loadMoreThreads,\n } = useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation });\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 const refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize });\n if (stateRef.current.activeThreadId !== target || version !== messageRefreshVersionRef.current) return;\n queue.hydrate(page, target);\n const promoted = promotedRunId || promotedRunHintRef.current;\n if (promoted && page.items.some((message) => message.role === \"user\" && message.run_id === promoted)) {\n promotedRunHintRef.current = null;\n update((current) => {\n if (current.activeThreadId !== target) return current;\n return {\n ...current,\n messages: reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), current.activeRunId, current.streamingMessageId),\n };\n });\n return;\n }\n if (stateRef.current.activeRunId) {\n const delivered = threadTimelineToMessages(page.items.filter((item) =>\n item.role === \"user\" && item.run_id === stateRef.current.activeRunId && (item.segment_index ?? 0) > 0));\n if (delivered.length) update((current) => {\n if (current.activeThreadId !== target) return current;\n const additions = delivered.filter((item) => !current.messages.some((existing) => existing.id === item.id));\n return additions.length ? { ...current, messages: [...current.messages, ...additions] } : current;\n });\n }\n if (!stateRef.current.activeRunId && page.items.length) {\n update((current) => current.activeThreadId === target && !current.activeRunId\n ? (() => {\n const messages = reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), null, null);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n })()\n : current);\n }\n }, [client, pageSize, queue.hydrate, update]);\n\n React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort();\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 timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\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 queue.hydrate(timeline, threadId);\n const messages = timeline.items.length ? threadTimelineToMessages(timeline.items, detail) : 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 (!requestController.signal.aborted && !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, queue.hydrate, 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 firstSubmissionAdmittedRef.current?.();\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 eventBuffer.flush();\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (!result.detached && result.threadId) await refreshMessages(result.threadId);\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, eventBuffer, failOperation, refreshMessages, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n if (firstSubmissionRef.current && !stateRef.current.activeThreadId) {\n await firstSubmissionRef.current;\n }\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId) {\n clearOperationError();\n setIsSubmitting(true);\n try {\n await queue.submit({\n mode: \"queue\", input: input.text.trim(),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((item, index) => ({ id: `upload-${index}`, filename: item.name,\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: 0 })),\n queued: Boolean(stateRef.current.activeRunId), uploading: Boolean(input.uploads?.length),\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n clientSubmissionId: runtime.createId(), idempotencyKey: runtime.createId(),\n prepare: async () => {\n const uploaded = input.uploads?.length ? await client.attachments.uploadBatch({\n uploads: input.uploads, threadId: existingThreadId,\n requestedAgentId: input.requestedAgentId, idempotencyKey: runtime.createId(),\n }) : [];\n if (input.uploads?.length && uploaded.length !== input.uploads.length) throw new Error(\"Attachment upload returned an incomplete batch\");\n return { attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n attachments: uploaded.length ? uploaded.map((item) => ({ id: item.id, filename: item.filename,\n mime_type: item.mime_type, byte_size: item.byte_size })) : undefined };\n },\n });\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n return;\n }\n const admission = new Promise<void>((resolve) => { firstSubmissionAdmittedRef.current = resolve; });\n const stream = (async () => {\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const ticket = queue.beginSubmission({ input: input.text.trim(), clientSubmissionId: runtime.createId(),\n uploading: Boolean(input.uploads?.length),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((upload, index) => ({ id: `upload-${index}`, filename: upload.name,\n mime_type: upload.mediaType || \"application/octet-stream\", byte_size: 0 })),\n });\n const userId = ticket.id;\n const idempotencyKey = runtime.createId();\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n setIsSubmitting(true);\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n const result = await client.chat.stream({ clientSubmissionId: ticket.client_submission_id!, input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n if (result.threadId && !result.detached) await refreshMessages(result.threadId);\n } catch (error) {\n const admitted = Boolean(stateRef.current.messages.find((message) => message.id === userId)?.runId);\n if (!admitted) queue.discardSubmission(ticket);\n if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n runState: admitted ? \"reconnecting\" : \"failed\",\n streamingMessageId: admitted ? current.streamingMessageId : null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n const accepted = Promise.race([stream, admission]);\n firstSubmissionRef.current = accepted;\n try {\n await accepted;\n } finally {\n if (firstSubmissionRef.current === accepted) firstSubmissionRef.current = null;\n firstSubmissionAdmittedRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun });\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 = useAgentChatFeedback({ client, update, clearOperationError, failOperation });\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 subscribeToThreadSummaries({\n client,\n signal: controller.signal,\n refresh: refreshThreads,\n onEvent(event) {\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n const wasQueued = queue.acceptNotice({ messageId: event.message_id,\n status: event.status, runId: event.run_id, cursor: event.cursor, clientSubmissionId: event.client_submission_id });\n if (wasQueued) void refreshMessages(event.thread_id, event.run_id || undefined).catch(() => undefined);\n }\n if (event.event === \"thread.summary.updated\" && event.thread.id === stateRef.current.activeThreadId) {\n if (streamControllerRef.current && stateRef.current.messages.some((message) =>\n message.role === \"user\" && !message.runId)) return;\n const promotedRunId = activeRunIdFromThread(summaryToStored(event.thread));\n void (async () => {\n await refreshMessages(String(event.thread.id), promotedRunId || undefined);\n if (promotedRunId && stateRef.current.activeRunId !== promotedRunId\n && stateRef.current.activeThreadId === String(event.thread.id)\n && promotedAttachRef.current !== promotedRunId) {\n promotedAttachRef.current = promotedRunId;\n await attachRunRef.current(promotedRunId);\n }\n })().catch(() => undefined);\n }\n },\n onError(error) {\n update((current) => withAgentChatBackgroundError(current, error));\n },\n onRecovered() {\n clearBackgroundError();\n },\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, queue.acceptNotice, refreshMessages, 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 pendingMessages,\n messageQueue,\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 refreshMessages,\n editPendingMessage,\n steerPendingMessage,\n removePendingMessage,\n retractPendingMessage: queue.retractForEdit,\n resumeQueue,\n steer,\n resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport { isAbortLike } from \"./lifecycle\";\n\ntype ThreadSummarySubscription = {\n client: AgentClient;\n signal: AbortSignalLike;\n onEvent(event: ThreadSummaryEvent): Promise<void> | void;\n onError(error: unknown): void;\n onRecovered(): void;\n refresh(): Promise<void>;\n};\n\nfunction waitForReconnect(signal: AbortSignalLike, delay: number): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, delay: number): unknown;\n clearTimeout(handle: unknown): void;\n };\n const finish = () => {\n clock.clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = clock.setTimeout(finish, delay);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\n/** Keep the thread list connected across clean EOFs and transient stream failures. */\nexport async function subscribeToThreadSummaries(input: ThreadSummarySubscription): Promise<void> {\n let cursor: number | undefined;\n let failures = 0;\n while (!input.signal.aborted) {\n let refreshedFromSnapshot = false;\n try {\n await input.client.threads.events({ cursor, signal: input.signal }, async (event) => {\n if (event.event === \"snapshot_required\") {\n await input.refresh();\n cursor = undefined;\n refreshedFromSnapshot = true;\n return;\n }\n cursor = event.cursor;\n failures = 0;\n await input.onEvent(event);\n });\n if (input.signal.aborted) break;\n // A clean EOF can be an expired stream authorization. Reconcile before reconnecting.\n if (!refreshedFromSnapshot) await input.refresh();\n input.onRecovered();\n failures = 0;\n } catch (error) {\n if (input.signal.aborted || isAbortLike(error)) break;\n input.onError(error);\n failures += 1;\n try {\n await input.refresh();\n input.onRecovered();\n } catch (refreshError) {\n if (!input.signal.aborted && !isAbortLike(refreshError)) input.onError(refreshError);\n }\n }\n if (!input.signal.aborted) {\n await waitForReconnect(input.signal, Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5)));\n }\n }\n}\n","import type { AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\nimport { preferNewestThreadSummary, reconcileRefreshedThreads, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nexport function useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation }: {\n client: AgentClient;\n threadPageSize: number;\n stateRef: React.RefObject<AgentChatState>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\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 refreshPromiseRef = React.useRef<Promise<void> | null>(null);\n const eventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshPromiseRef.current) return refreshPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n eventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = eventsDuringRefreshRef.current || [];\n eventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const incoming = 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 { ...current, threads: reconcileRefreshedThreads(current.threads, incoming, current.activeThreadId, concurrentEvents) };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n eventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshPromiseRef.current = request;\n void request.finally(() => {\n if (refreshPromiseRef.current === request) refreshPromiseRef.current = null;\n }).catch(() => undefined);\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, preferNewestThreadSummary(existing, {\n ...existing, ...summaryToStored(item), messages: existing?.messages || [], 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, stateRef, threadPageSize, threadTotal, update]);\n\n return { isLoadingThreads, isLoadingMoreThreads, threadTotal, eventsDuringRefreshRef, refreshThreads, loadMoreThreads };\n}\n","import type { AgentClient, FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { withAgentChatOperationError, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function useAgentChatFeedback({ client, update, clearOperationError, failOperation }: {\n client: AgentClient;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n return React.useCallback(async (message: ChatMessage, input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\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 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 } : null;\n const replaceFeedback = (current: AgentChatState, feedback: ResponseFeedback | null): AgentChatState => ({\n ...current,\n messages: current.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\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) => withAgentChatOperationError(replaceFeedback(current, previous), \"set_feedback\", error));\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n}\n","import type { ThreadMessage } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AgentChatSubmitInput } from \"./use-agent-chat\";\nimport { useThreadMessageQueue } from \"./thread-message-queue\";\nimport type { AgentChatOperation, AgentChatState } from \"./state\";\n\nexport function useAgentChatQueueActions({ queue, stateRef, createId, clearOperationError,\n failOperation, refreshMessages, attachRun }: {\n queue: ReturnType<typeof useThreadMessageQueue>;\n stateRef: React.RefObject<AgentChatState>;\n createId: () => string;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n refreshMessages: (threadId: string) => Promise<void>;\n attachRun: (runId: string) => Promise<void>;\n}) {\n const steer = React.useCallback(async (text: string) => {\n const threadId = stateRef.current.activeThreadId;\n if (!threadId || !text.trim()) throw new Error(\"An active thread and text are required to steer.\");\n clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n await refreshMessages(threadId);\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef]);\n\n const editPendingMessage = React.useCallback(async (message: ThreadMessage,\n input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">) => {\n await queue.edit(message, { text: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId });\n }, [queue.edit]);\n const steerPendingMessage = React.useCallback(async (message: ThreadMessage) => {\n await queue.edit(message, { text: message.text, attachmentIds: message.attachment_ids, mode: \"steer\" });\n }, [queue.edit]);\n const resumeQueue = React.useCallback(async () => {\n if (!stateRef.current.activeThreadId) return;\n const result = await queue.resume();\n if (result?.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef]);\n return { steer, editPendingMessage, steerPendingMessage, removePendingMessage: queue.remove, resumeQueue };\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 ThreadComputerStatus,\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 useThreadComputer(threadId: string | null) {\n const { client, createAbortController } = useAgents24Runtime();\n const [computer, setComputer] = React.useState<ThreadComputerStatus | 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 refresh = React.useCallback(async () => {\n controllerRef.current?.abort();\n if (!threadId) {\n setComputer(null);\n setIsLoading(false);\n return null;\n }\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.computer.get({ threadId, signal: controller.signal });\n setComputer(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, threadId]);\n React.useEffect(() => {\n void refresh();\n return () => controllerRef.current?.abort();\n }, [refresh]);\n const list = React.useCallback((input: { path?: string; cursor?: number; limit?: number }) => {\n if (!threadId) throw new Error(\"A thread is required to list computer files\");\n return client.threads.computer.list({ threadId, ...input });\n }, [client, threadId]);\n const read = React.useCallback((path: string) => {\n if (!threadId) throw new Error(\"A thread is required to read a computer file\");\n return client.threads.computer.read({ threadId, path });\n }, [client, threadId]);\n const createContentAccess = React.useCallback((path: string, download = false) => {\n if (!threadId) throw new Error(\"A thread is required to access a computer file\");\n return client.threads.computer.createContentAccess({ threadId, path, download });\n }, [client, threadId]);\n return { computer, error, isLoading, list, read, createContentAccess, refresh };\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","messageId","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","React","React","React","React","text","activeThread","React"]}
1
+ {"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/runtime-event-buffer.ts","../src/state.ts","../src/thread-message-queue.ts","../src/use-agent-chat.ts","../src/thread-summary-subscription.ts","../src/use-agent-chat-thread-list.ts","../src/use-agent-chat-feedback.ts","../src/use-agent-chat-queue-actions.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"waiting\"\n | \"interrupted\"\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 ChatComputerResourceTarget = {\n type: \"computer\";\n thread_id: string;\n computer_id: string;\n path: string;\n kind: \"file\" | \"directory\";\n};\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 resourceTargets?: readonly ChatComputerResourceTarget[];\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 /** Durable timeline identity when a mounted optimistic turn keeps its display key. */\n durableId?: string;\n clientSubmissionId?: string;\n segmentIndex?: number | null;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n responseCompletion?: import(\"@agents24/client/protocol\").ResponseCompletion;\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 taskNotifications?: Array<Record<string, unknown> & { handle: string }>;\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) && ![\"waiting\", \"interrupted\"].includes(status || \"\"),\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;\nexport function computerResourceTargets(value: unknown): ChatComputerResourceTarget[] {\n const output = record(value);\n if (!output) return [];\n const candidates = [output.resource_target,\n ...(Array.isArray(output.resource_targets) ? output.resource_targets : []),\n ...(Array.isArray(output.files) ? output.files.map(file => record(file)?.resource_target) : [])];\n const seen = new Set<string>();\n return candidates.flatMap(candidate => {\n const target = record(candidate);\n if (target?.type !== \"computer\" || typeof target.thread_id !== \"string\"\n || typeof target.computer_id !== \"string\" || typeof target.path !== \"string\"\n || !target.path.startsWith(\"/workspace\")\n || (target.kind !== \"file\" && target.kind !== \"directory\")) return [];\n const key = `${target.thread_id}:${target.computer_id}:${target.path}:${target.kind}`;\n if (seen.has(key)) return [];\n seen.add(key);\n return [target as ChatComputerResourceTarget];\n });\n}\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 resourceTargets: computerResourceTargets(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 responseCompletion: item.response_completion,\n isFinal: Boolean(item.response_completion) || ![\"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 threadTimelineToMessages(\n items: readonly import(\"@agents24/client\").ThreadMessage[],\n detail?: ThreadDetail,\n): ChatMessage[] {\n const feedbackByRun = new Map((detail?.turns || []).flatMap((turn) =>\n turn.run_id && turn.feedback ? [[turn.run_id, turn.feedback] as const] : []));\n return items.map((item) => ({\n id: item.id,\n clientSubmissionId: item.client_submission_id || undefined,\n role: item.role,\n runId: item.run_id,\n segmentIndex: item.segment_index,\n content: item.text,\n createdAt: item.created_at,\n isFinal: item.status === \"completed\" || item.status === \"delivered\",\n responseCompletion: item.response_completion,\n parts: item.role === \"assistant\"\n ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`)\n : item.text ? [{ id: `${item.id}-text`, type: \"text\" as const, kind: \"text\" as const, text: item.text }] : [],\n attachments: item.role === \"user\" ? item.attachment_ids.map((id) => {\n const descriptor = item.attachments?.find((attachment) => attachment.id === id);\n return { id, filename: descriptor?.filename || \"Attachment\", mediaType: descriptor?.mime_type || \"application/octet-stream\" };\n }) : undefined,\n feedback: item.role === \"assistant\" && item.run_id ? feedbackByRun.get(item.run_id) as ResponseFeedback | undefined : undefined,\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 } 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","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n concurrentEvents: readonly ThreadSummaryEvent[] = [],\n): StoredChatThread[] {\n const currentById = new Map(current.map((thread) => [thread.id, thread]));\n const newest = incoming.map((thread) => preferNewestThreadSummary(currentById.get(thread.id), thread));\n const active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...newest] : newest;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\n}\n\nexport function preferNewestThreadSummary(\n current: StoredChatThread | undefined,\n incoming: StoredChatThread,\n): StoredChatThread {\n if (!current?.updated_at || !incoming.updated_at) return incoming;\n const currentTime = Date.parse(current.updated_at);\n const incomingTime = Date.parse(incoming.updated_at);\n return Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : 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 strictMessageId?: boolean;\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\n/** Keep mounted display keys while matching only durable IDs and run linkage. */\nexport function preserveMountedMessageIds(\n canonical: ChatMessage[],\n current: ChatMessage[],\n): ChatMessage[] {\n return canonical.map((message) => {\n const mounted = current.find((item) => item.role === message.role && (\n item.durableId === message.id || item.id === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId)\n || (message.role === \"assistant\" && message.segmentIndex === 1 && item.runId\n && item.runId === message.runId && !item.durableId)\n ));\n return mounted && mounted.id !== message.id\n ? { ...message, id: mounted.id, durableId: message.id }\n : message;\n });\n}\n\n/** Reconcile a durable timeline without replacing a newer live assistant segment. */\nexport function reconcileThreadTimeline(\n current: ChatMessage[],\n canonical: ChatMessage[],\n activeRunId: string | null,\n streamingMessageId: string | null,\n): ChatMessage[] {\n const mounted = preserveMountedMessageIds(canonical, current);\n const canonicalIds = new Set(mounted.map((message) => message.id));\n const retained = current.filter((message) => !canonicalIds.has(message.id) && (\n message.isFinal || (activeRunId && (!message.runId || message.runId === activeRunId))\n ));\n const reconciled = mounted.map((message) => {\n const live = current.find((item) => item.id === message.id);\n return activeRunId && live?.role === \"assistant\" && live.runId === activeRunId\n && (live.id === streamingMessageId || !live.isFinal || live.responseCompletion)\n ? message.responseCompletion && !live.responseCompletion\n ? { ...message, id: live.id, durableId: message.durableId || live.durableId }\n : { ...message, ...live, durableId: message.durableId || live.durableId }\n : message;\n });\n return [...retained, ...reconciled];\n}\n\n/** A promoted queue item enters the transcript under its durable message ID. */\nexport function promoteThreadMessage(\n current: ChatMessage[],\n message: ChatMessage,\n runId: string,\n): ChatMessage[] {\n const promoted = { ...message, runId, isFinal: true };\n const index = current.findIndex((item) => item.id === message.id || item.durableId === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId));\n if (index < 0) return [...current, message.clientSubmissionId\n ? { ...promoted, id: message.clientSubmissionId, durableId: message.id } : promoted];\n return current.map((item, itemIndex) => itemIndex === index\n ? { ...item, ...promoted, id: item.id, durableId: item.id === message.id ? item.durableId : message.id }\n : message.clientSubmissionId && item.role === \"assistant\" && item.id === `${current[index].id}:assistant`\n ? { ...item, runId } : item);\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.strictMessageId && input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const exactIndex = next.findIndex((message) => message.role === \"assistant\" && Boolean(input.messageId && message.id === input.messageId));\n const index = exactIndex >= 0 ? exactIndex : input.strictMessageId ? -1 : next.findIndex((message) =>\n message.role === \"assistant\" && Boolean(input.runId && message.runId === input.runId));\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\" || eventName === \"assistant.completed\" || 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 if (state.activeRunId && event.run_id && event.run_id !== state.activeRunId) {\n const previous = state.messages.find((message) => message.role === \"assistant\" && message.runId === event.run_id);\n if (event.event !== \"run.accepted\") {\n if (!previous) return state;\n // A committed handoff can arrive before the preceding run's terminal SSE.\n // Reconcile that answer without changing ownership of the new live run.\n const reconciled = applyRuntimeEvent({ ...state, activeRunId: event.run_id,\n streamingMessageId: previous.id }, event);\n return { ...state, messages: reconciled.messages };\n }\n if (previous?.isFinal) return state;\n }\n\n if (event.event === \"run.accepted\" && typeof event.payload?.message_id === \"string\") {\n const messageId = event.payload.message_id;\n let optimisticIndex = -1;\n for (let index = state.messages.length - 1; index >= 0; index -= 1) {\n const message = state.messages[index];\n if (message.role === \"user\" && (event.payload.client_submission_id\n ? message.clientSubmissionId === event.payload.client_submission_id\n : !message.runId && !message.durableId)) {\n optimisticIndex = index;\n break;\n }\n }\n if (optimisticIndex >= 0) {\n const assistantId = event.payload.client_submission_id\n ? `${state.messages[optimisticIndex].id}:assistant`\n : state.streamingMessageId;\n state = { ...state, streamingMessageId: assistantId, messages: state.messages.map((message, index) => index === optimisticIndex\n ? { ...message, durableId: messageId, runId: event.run_id }\n : message.role === \"assistant\" && message.id === assistantId\n ? { ...message, runId: event.run_id }\n : message) };\n }\n }\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const completion = (eventName === \"assistant.completed\" ? event.payload : event.payload?.response_completion) as import(\"@agents24/client/protocol\").ResponseCompletion | undefined;\n const responseCompleted = Boolean(completion?.completed_at);\n const runId = state.activeRunId && event.event !== \"run.accepted\"\n ? state.activeRunId : event.run_id || state.activeRunId;\n const segmentId = typeof event.payload?.segment_id === \"string\" ? event.payload.segment_id : null;\n const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);\n const messageId = distinctSegment\n ? `${runId || \"run\"}-assistant-${segmentId}`\n : 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 suspension = eventName === \"run.waiting\" ? \"waiting\" : eventName === \"run.interrupted\" ? \"interrupted\" : null;\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && message.id === messageId)\n || (!distinctSegment ? state.messages.find((message) => message.role === \"assistant\" && Boolean(runId && message.runId === runId)) : undefined);\n const sealedAfterTerminal = responseCompleted && !state.activeRunId\n && [\"completed\", \"failed\", \"cancelled\"].includes(state.runState) && existing?.runId === runId;\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 contextPayload = payload.context_window && typeof payload.context_window === \"object\"\n ? { ...payload.context_window as Record<string, unknown>, run_id: runId }\n : payload.context_window;\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, contextPayload)\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, contextPayload),\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 typeof payload.block_id === \"string\" ? payload.block_id : `${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 let messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n strictMessageId: distinctSegment,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal || responseCompleted,\n responseCompletion: completion,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || responseCompleted || message.isFinal,\n responseCompletion: completion || message.responseCompletion,\n }),\n });\n if (responseCompleted) messages = messages.map((message) => {\n if (message.role !== \"assistant\" || message.runId !== runId) return message;\n const segment = completion?.segments.find((item) => item.message_id === message.durableId\n || item.message_id === message.id || message.id.endsWith(`-assistant-${item.segment_id}`))\n || (!message.segmentIndex || message.segmentIndex === 1 ? completion?.segments[0] : undefined);\n return { ...message, isFinal: true, responseCompletion: completion,\n ...(segment ? { durableId: segment.message_id } : {}) };\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 || sealedAfterTerminal ? 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: sealedAfterTerminal ? state.runState : suspension || (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 || suspension || responseCompleted || existing?.responseCompletion ? 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 (String(event.event) === \"thread.task.updated\") {\n const value = event as unknown as { thread_id: string; task: Record<string, unknown> };\n const handle = value.task?.handle;\n if (typeof handle !== \"string\") return threads;\n return threads.map(thread => thread.id === value.thread_id ? { ...thread,\n taskNotifications: [...(thread.taskNotifications || []).filter(task => task.handle !== handle),\n { ...value.task, handle }].slice(-1000) } : thread);\n }\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] = preferNewestThreadSummary(next[index], {\n ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated,\n });\n return next;\n}\n","import * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { appendStableStreamingTurn, type AgentChatState } from \"./state\";\nimport type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n} from \"@agents24/client\";\n\n/** Retry uncertain admission once; the caller retains the same receipt and payload. */\nexport async function retrySubmissionAdmission<T>(admit: () => Promise<T>): Promise<T> {\n try { return await admit(); }\n catch (error) {\n const failure = error as { kind?: string; name?: string } | null;\n if (failure?.kind !== \"network\" && failure?.name !== \"HttpRequestTimeoutError\"\n && !(error instanceof TypeError)) throw error;\n return admit();\n }\n}\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n clientSubmissionId?: string | null;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string): Promise<ThreadMessagesPage>;\n submit(input: ThreadMessageInput): Promise<ThreadMessageSubmission>;\n edit(message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }): Promise<ThreadMessage>;\n remove(message: ThreadMessage): Promise<void>;\n resume(threadId: string): Promise<{ run_id: string | null }>;\n};\n\nexport type RetractedMessageDraft = Pick<ThreadMessage, \"text\" | \"attachment_ids\" | \"attachments\">;\n\nexport function useThreadMessageQueue({ threadId, transport, onPromoted, onOptimistic, onDiscard }: {\n threadId: string | null;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => void;\n onOptimistic?: (message: ThreadMessage, uploading: boolean) => void;\n onDiscard?: (message: ThreadMessage) => void;\n}) {\n const [pendingMessages, setPendingMessages] = React.useState<readonly ThreadMessage[]>([]);\n const [messageQueue, setMessageQueue] = React.useState<ThreadMessageQueueState | null>(null);\n const pendingRef = React.useRef(new Map<string, ThreadMessage & { optimisticQueued?: boolean }>());\n const versionRef = React.useRef(0);\n const cursorRef = React.useRef(0);\n const promotedRef = React.useRef(new Set<string>());\n const threadRef = React.useRef(threadId);\n const transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\n const callbacksRef = React.useRef({ onOptimistic, onDiscard });\n callbacksRef.current = { onOptimistic, onDiscard };\n\n const knownMessage = (id: string, submissionId?: string | null) => pendingRef.current.get(id)\n || (submissionId ? [...pendingRef.current.values()].find((item) => item.client_submission_id === submissionId) : undefined);\n\n const hydrate = React.useCallback((page: ThreadMessagesPage, selectedThreadId: string) => {\n if (threadRef.current !== selectedThreadId) return;\n const pending = page.pending.filter((message) => !promotedRef.current.has(message.id)).map((message) => {\n const known = knownMessage(message.id, message.client_submission_id);\n if (message.attachments?.length || !known?.attachments?.length) return message;\n return { ...message, attachments: known.attachments.filter((attachment) =>\n message.attachment_ids.includes(attachment.id)) };\n });\n for (const message of pending) pendingRef.current.set(message.id, message);\n const optimistic = [...pendingRef.current.values()].filter((message) => message.thread_id === selectedThreadId\n && message.revision === 0 && message.optimisticQueued && !pending.some((item) => item.client_submission_id === message.client_submission_id));\n setPendingMessages([...pending, ...optimistic]);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current) => {\n if (!selectedThreadId) return null;\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId);\n if (version !== versionRef.current || threadRef.current !== selectedThreadId) return null;\n for (const item of page.items) {\n if (item.role === \"user\" && item.status === \"delivered\" && item.run_id) {\n const pending = knownMessage(item.id, item.client_submission_id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.id);\n pendingRef.current.delete(pending.id);\n pendingRef.current.delete(item.id);\n onPromotedRef.current({ ...pending, ...item,\n attachments: item.attachments?.length ? item.attachments : pending.attachments }, item.run_id);\n }\n }\n }\n hydrate(page, selectedThreadId);\n return page;\n }, [hydrate]);\n\n const acceptNotice = React.useCallback((notice: ThreadMessageNotice) => {\n if (notice.cursor && notice.cursor <= cursorRef.current) return false;\n if (notice.cursor) cursorRef.current = notice.cursor;\n const pending = knownMessage(notice.messageId, notice.clientSubmissionId);\n if (notice.status === \"delivered\" && notice.runId && pending && !promotedRef.current.has(notice.messageId)) {\n promotedRef.current.add(notice.messageId);\n pendingRef.current.delete(pending.id);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current({ ...pending, id: notice.messageId, run_id: notice.runId, status: \"delivered\" }, notice.runId);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n void refresh().catch(() => undefined);\n return true;\n }, [refresh]);\n\n const beginSubmission = React.useCallback((input: {\n input: string; clientSubmissionId: string; mode?: \"queue\" | \"steer\";\n attachmentIds?: readonly string[]; attachments?: ThreadMessage[\"attachments\"]; uploading?: boolean;\n }, queued = false) => {\n const now = new Date().toISOString();\n const message: ThreadMessage = {\n id: input.clientSubmissionId, client_submission_id: input.clientSubmissionId,\n thread_id: threadRef.current || \"\", sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: 0, role: \"user\",\n status: \"queued\", requested_mode: input.mode || \"queue\", text: input.input,\n attachment_ids: input.attachmentIds || input.attachments?.map((item) => item.id) || [], attachments: input.attachments,\n response_blocks: [], revision: 0, created_at: now, updated_at: now,\n };\n pendingRef.current.set(message.id, { ...message, optimisticQueued: queued });\n versionRef.current += 1;\n if (queued) setPendingMessages((current) => [...current, message]);\n else callbacksRef.current.onOptimistic?.(message, Boolean(input.uploading));\n return message;\n }, []);\n\n const discardSubmission = React.useCallback((message: ThreadMessage) => {\n if (!pendingRef.current.has(message.id)) return;\n pendingRef.current.delete(message.id);\n callbacksRef.current.onDiscard?.(message);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== message.client_submission_id));\n }, []);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\"> & {\n attachments?: ThreadMessage[\"attachments\"];\n queued?: boolean;\n uploading?: boolean;\n prepare?: () => Promise<Pick<ThreadMessageInput, \"attachmentIds\"> & { attachments?: ThreadMessage[\"attachments\"] }>;\n }) => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) throw new Error(\"No active Agent thread is available.\");\n const { queued, prepare, attachments, uploading, ...submission } = input;\n const optimistic = beginSubmission({ ...submission, attachments, uploading,\n clientSubmissionId: submission.clientSubmissionId || submission.idempotencyKey }, queued);\n try {\n const prepared = prepare ? await prepare() : {};\n if (threadRef.current === selectedThreadId) pendingRef.current.set(optimistic.id, { ...optimistic, optimisticQueued: queued, attachment_ids: prepared.attachmentIds || optimistic.attachment_ids, attachments: prepared.attachments || attachments });\n const request = { ...submission, ...prepared, clientSubmissionId: optimistic.client_submission_id!, threadId: selectedThreadId };\n const result = await retrySubmissionAdmission(() => transportRef.current.submit(request));\n if (threadRef.current !== selectedThreadId) return result;\n versionRef.current += 1;\n const bound: ThreadMessage = { ...optimistic, id: result.message_id,\n client_submission_id: result.client_submission_id || optimistic.client_submission_id,\n attachment_ids: request.attachmentIds || [], attachments: prepared.attachments || attachments,\n run_id: result.run_id, status: result.status, revision: 1 };\n pendingRef.current.delete(optimistic.id);\n if (result.run_id) {\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== bound.client_submission_id));\n if (!promotedRef.current.has(bound.id)) {\n promotedRef.current.add(bound.id);\n onPromotedRef.current(bound, result.run_id);\n }\n } else if (!promotedRef.current.has(bound.id)) {\n if (!queued) callbacksRef.current.onDiscard?.(optimistic);\n pendingRef.current.set(bound.id, bound);\n setPendingMessages((current) => [...current.filter((item) => item.client_submission_id !== bound.client_submission_id), bound]);\n }\n void refresh().catch(() => undefined);\n return result;\n } catch (error) {\n if (threadRef.current === selectedThreadId) discardSubmission(optimistic);\n throw error; // Composer restores this draft only if newer typing is absent.\n }\n }, [beginSubmission, discardSubmission, refresh]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const updated = await transportRef.current.edit(message, input);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n await transportRef.current.remove(message);\n versionRef.current += 1;\n pendingRef.current.delete(message.id);\n setPendingMessages((current) => current.filter((item) => item.id !== message.id));\n await refresh(message.thread_id);\n }, [refresh]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n await remove(message);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const result = await transportRef.current.resume(selectedThreadId);\n await refresh(selectedThreadId);\n return result;\n }, [refresh]);\n\n React.useEffect(() => {\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n }, [threadId, refresh]);\n\n React.useEffect(() => {\n if (!threadId || !pendingMessages.length || messageQueue?.paused) return;\n const clock = globalThis as typeof globalThis & {\n setInterval(callback: () => void, interval: number): unknown;\n clearInterval(timer: unknown): void;\n };\n const timer = clock.setInterval(() => { void refresh(threadId).catch(() => undefined); }, 3000);\n return () => clock.clearInterval(timer);\n }, [threadId, pendingMessages.length, messageQueue?.paused, refresh]);\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, beginSubmission, discardSubmission, submit, edit, remove, retractForEdit, resume };\n}\n\n/** One provisional identity for first sends, idle sends, uploads and queue rows. */\nexport function optimisticSubmissionTurn(message: ThreadMessage): [ChatMessage, ChatMessage] {\n const user: ChatMessage = { id: message.client_submission_id || message.id,\n clientSubmissionId: message.client_submission_id || undefined,\n role: \"user\", content: message.text, createdAt: message.created_at, isFinal: true,\n parts: message.text ? [{ id: `${message.id}:text`, type: \"text\", kind: \"text\", text: message.text }] : [],\n attachments: message.attachments?.map((item) => ({ id: item.id, filename: item.filename,\n mediaType: item.mime_type, byteSize: item.byte_size })),\n };\n return [user, { id: `${user.id}:assistant`, role: \"assistant\", content: \"\", parts: [],\n createdAt: message.created_at, isFinal: false }];\n}\n\nexport function optimisticSubmissionState(state: AgentChatState, message: ThreadMessage, uploading: boolean): AgentChatState {\n const [user, assistant] = optimisticSubmissionTurn(message);\n return { ...state, messages: appendStableStreamingTurn(state.messages, user, assistant),\n streamingMessageId: assistant.id, runState: uploading ? \"uploading\" : \"streaming\", error: null };\n}\n\nexport function discardOptimisticSubmission(state: AgentChatState, message: ThreadMessage): AgentChatState {\n const activeDraft = state.streamingMessageId === `${message.id}:assistant`;\n return { ...state, messages: state.messages.filter((item) => item.runId\n || (item.id !== message.id && item.id !== `${message.id}:assistant`)),\n streamingMessageId: activeDraft ? null : state.streamingMessageId,\n runState: activeDraft && !state.activeRunId ? \"idle\" : state.runState };\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\n threadTimelineToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { subscribeToThreadSummaries } from \"./thread-summary-subscription\";\nimport { summaryToStored, useAgentChatThreadList } from \"./use-agent-chat-thread-list\";\nimport { useAgentChatFeedback } from \"./use-agent-chat-feedback\";\nimport { useAgentChatQueueActions } from \"./use-agent-chat-queue-actions\";\nimport { optimisticSubmissionState, discardOptimisticSubmission, useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\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 promoteThreadMessage,\n reconcileThreadTimeline,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n pendingMessages: readonly ThreadMessage[];\n messageQueue: ThreadMessageQueueState | null;\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 refreshMessages(threadId?: string): Promise<void>;\n editPendingMessage(message: ThreadMessage, input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">): Promise<void>;\n steerPendingMessage(message: ThreadMessage): Promise<void>;\n removePendingMessage(message: ThreadMessage): Promise<void>;\n retractPendingMessage(message: ThreadMessage): Promise<RetractedMessageDraft>;\n resumeQueue(): Promise<void>;\n steer(text: string): 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 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 [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 attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const messageRefreshVersionRef = React.useRef(0);\n const promotedRunHintRef = React.useRef<string | null>(null);\n const promotedAttachRef = React.useRef<string | null>(null);\n const firstSubmissionRef = React.useRef<Promise<void> | null>(null);\n const firstSubmissionAdmittedRef = React.useRef<(() => void) | null>(null);\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 queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId) => client.threads.messages.list({ threadId, limit: pageSize }),\n submit: (input) => client.threads.messages.submit(input),\n edit: (message, input) => client.threads.messages.edit({\n threadId: message.thread_id, messageId: message.id, revision: message.revision,\n input: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids, mode: input.mode,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n }),\n remove: async (message) => {\n await client.threads.messages.remove({ threadId: message.thread_id, messageId: message.id, revision: message.revision });\n },\n resume: (threadId) => client.threads.resumeQueue({ threadId }),\n }), [client, pageSize]);\n const onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n promotedRunHintRef.current = runId;\n const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: \"delivered\" }])[0];\n update((current) => current.activeThreadId === message.thread_id\n ? { ...current, messages: promoteThreadMessage(current.messages, userMessage, runId) } : current);\n if (stateRef.current.activeRunId !== runId && promotedAttachRef.current !== runId) {\n promotedAttachRef.current = runId;\n void attachRunRef.current(runId).catch(() => { promotedAttachRef.current = null; });\n }\n }, [update]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport,\n onPromoted: onQueuePromotion,\n onOptimistic: (message, uploading) => update((current) => optimisticSubmissionState(current, message, uploading)),\n onDiscard: (message) => update((current) => discardOptimisticSubmission(current, message)),\n });\n const { pendingMessages, messageQueue } = queue;\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 { isLoadingThreads, isLoadingMoreThreads, threadTotal,\n eventsDuringRefreshRef: threadEventsDuringRefreshRef, refreshThreads, loadMoreThreads,\n } = useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation });\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 const refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize });\n if (stateRef.current.activeThreadId !== target || version !== messageRefreshVersionRef.current) return;\n queue.hydrate(page, target);\n const promoted = promotedRunId || promotedRunHintRef.current;\n if (promoted && page.items.some((message) => message.role === \"user\" && message.run_id === promoted)) {\n promotedRunHintRef.current = null;\n update((current) => {\n if (current.activeThreadId !== target) return current;\n return {\n ...current,\n messages: reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), current.activeRunId, current.streamingMessageId),\n };\n });\n return;\n }\n if (stateRef.current.activeRunId) {\n const delivered = threadTimelineToMessages(page.items.filter((item) =>\n item.role === \"user\" && item.run_id === stateRef.current.activeRunId && (item.segment_index ?? 0) > 0));\n if (delivered.length) update((current) => {\n if (current.activeThreadId !== target) return current;\n const additions = delivered.filter((item) => !current.messages.some((existing) => existing.id === item.id));\n return additions.length ? { ...current, messages: [...current.messages, ...additions] } : current;\n });\n }\n if (!stateRef.current.activeRunId && page.items.length) {\n update((current) => current.activeThreadId === target && !current.activeRunId\n ? (() => {\n const messages = reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), null, null);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n })()\n : current);\n }\n }, [client, pageSize, queue.hydrate, update]);\n\n React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort();\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 timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\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 queue.hydrate(timeline, threadId);\n const messages = timeline.items.length ? threadTimelineToMessages(timeline.items, detail) : 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 (!requestController.signal.aborted && !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, queue.hydrate, 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 firstSubmissionAdmittedRef.current?.();\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 eventBuffer.flush();\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (!result.detached && result.threadId) await refreshMessages(result.threadId);\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, eventBuffer, failOperation, refreshMessages, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n if (firstSubmissionRef.current && !stateRef.current.activeThreadId) {\n await firstSubmissionRef.current;\n }\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId) {\n clearOperationError();\n setIsSubmitting(true);\n try {\n await queue.submit({\n mode: \"queue\", input: input.text.trim(),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((item, index) => ({ id: `upload-${index}`, filename: item.name,\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: 0 })),\n queued: Boolean(stateRef.current.activeRunId), uploading: Boolean(input.uploads?.length),\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n clientSubmissionId: runtime.createId(), idempotencyKey: runtime.createId(),\n prepare: async () => {\n const uploaded = input.uploads?.length ? await client.attachments.uploadBatch({\n uploads: input.uploads, threadId: existingThreadId,\n requestedAgentId: input.requestedAgentId, idempotencyKey: runtime.createId(),\n }) : [];\n if (input.uploads?.length && uploaded.length !== input.uploads.length) throw new Error(\"Attachment upload returned an incomplete batch\");\n return { attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n attachments: uploaded.length ? uploaded.map((item) => ({ id: item.id, filename: item.filename,\n mime_type: item.mime_type, byte_size: item.byte_size })) : undefined };\n },\n });\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n return;\n }\n const admission = new Promise<void>((resolve) => { firstSubmissionAdmittedRef.current = resolve; });\n const stream = (async () => {\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const ticket = queue.beginSubmission({ input: input.text.trim(), clientSubmissionId: runtime.createId(),\n uploading: Boolean(input.uploads?.length),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((upload, index) => ({ id: `upload-${index}`, filename: upload.name,\n mime_type: upload.mediaType || \"application/octet-stream\", byte_size: 0 })),\n });\n const userId = ticket.id;\n const idempotencyKey = runtime.createId();\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n setIsSubmitting(true);\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n const result = await client.chat.stream({ clientSubmissionId: ticket.client_submission_id!, input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n if (result.threadId && !result.detached) await refreshMessages(result.threadId);\n } catch (error) {\n const admitted = Boolean(stateRef.current.messages.find((message) => message.id === userId)?.runId);\n if (!admitted) queue.discardSubmission(ticket);\n if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n runState: admitted ? \"reconnecting\" : \"failed\",\n streamingMessageId: admitted ? current.streamingMessageId : null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n const accepted = Promise.race([stream, admission]);\n firstSubmissionRef.current = accepted;\n try {\n await accepted;\n } finally {\n if (firstSubmissionRef.current === accepted) firstSubmissionRef.current = null;\n firstSubmissionAdmittedRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun });\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 = useAgentChatFeedback({ client, update, clearOperationError, failOperation });\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 subscribeToThreadSummaries({\n client,\n signal: controller.signal,\n refresh: refreshThreads,\n onEvent(event) {\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n const wasQueued = queue.acceptNotice({ messageId: event.message_id,\n status: event.status, runId: event.run_id, cursor: event.cursor, clientSubmissionId: event.client_submission_id });\n if (wasQueued) void refreshMessages(event.thread_id, event.run_id || undefined).catch(() => undefined);\n }\n if (event.event === \"thread.summary.updated\" && event.thread.id === stateRef.current.activeThreadId) {\n if (streamControllerRef.current && stateRef.current.messages.some((message) =>\n message.role === \"user\" && !message.runId)) return;\n const promotedRunId = activeRunIdFromThread(summaryToStored(event.thread));\n void (async () => {\n await refreshMessages(String(event.thread.id), promotedRunId || undefined);\n if (promotedRunId && stateRef.current.activeRunId !== promotedRunId\n && stateRef.current.activeThreadId === String(event.thread.id)\n && promotedAttachRef.current !== promotedRunId) {\n promotedAttachRef.current = promotedRunId;\n await attachRunRef.current(promotedRunId);\n }\n })().catch(() => undefined);\n }\n },\n onError(error) {\n update((current) => withAgentChatBackgroundError(current, error));\n },\n onRecovered() {\n clearBackgroundError();\n },\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, queue.acceptNotice, refreshMessages, 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 pendingMessages,\n messageQueue,\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 refreshMessages,\n editPendingMessage,\n steerPendingMessage,\n removePendingMessage,\n retractPendingMessage: queue.retractForEdit,\n resumeQueue,\n steer,\n resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport { isAbortLike } from \"./lifecycle\";\n\ntype ThreadSummarySubscription = {\n client: AgentClient;\n signal: AbortSignalLike;\n onEvent(event: ThreadSummaryEvent): Promise<void> | void;\n onError(error: unknown): void;\n onRecovered(): void;\n refresh(): Promise<void>;\n};\n\nfunction waitForReconnect(signal: AbortSignalLike, delay: number): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, delay: number): unknown;\n clearTimeout(handle: unknown): void;\n };\n const finish = () => {\n clock.clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = clock.setTimeout(finish, delay);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\n/** Keep the thread list connected across clean EOFs and transient stream failures. */\nexport async function subscribeToThreadSummaries(input: ThreadSummarySubscription): Promise<void> {\n let cursor: number | undefined;\n let failures = 0;\n while (!input.signal.aborted) {\n let refreshedFromSnapshot = false;\n try {\n await input.client.threads.events({ cursor, signal: input.signal }, async (event) => {\n if (event.event === \"snapshot_required\") {\n await input.refresh();\n cursor = undefined;\n refreshedFromSnapshot = true;\n return;\n }\n cursor = event.cursor;\n failures = 0;\n await input.onEvent(event);\n });\n if (input.signal.aborted) break;\n // A clean EOF can be an expired stream authorization. Reconcile before reconnecting.\n if (!refreshedFromSnapshot) await input.refresh();\n input.onRecovered();\n failures = 0;\n } catch (error) {\n if (input.signal.aborted || isAbortLike(error)) break;\n input.onError(error);\n failures += 1;\n try {\n await input.refresh();\n input.onRecovered();\n } catch (refreshError) {\n if (!input.signal.aborted && !isAbortLike(refreshError)) input.onError(refreshError);\n }\n }\n if (!input.signal.aborted) {\n await waitForReconnect(input.signal, Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5)));\n }\n }\n}\n","import type { AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\nimport { preferNewestThreadSummary, reconcileRefreshedThreads, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nexport function useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation }: {\n client: AgentClient;\n threadPageSize: number;\n stateRef: React.RefObject<AgentChatState>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\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 refreshPromiseRef = React.useRef<Promise<void> | null>(null);\n const eventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshPromiseRef.current) return refreshPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n eventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = eventsDuringRefreshRef.current || [];\n eventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const incoming = 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 { ...current, threads: reconcileRefreshedThreads(current.threads, incoming, current.activeThreadId, concurrentEvents) };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n eventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshPromiseRef.current = request;\n void request.finally(() => {\n if (refreshPromiseRef.current === request) refreshPromiseRef.current = null;\n }).catch(() => undefined);\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, preferNewestThreadSummary(existing, {\n ...existing, ...summaryToStored(item), messages: existing?.messages || [], 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, stateRef, threadPageSize, threadTotal, update]);\n\n return { isLoadingThreads, isLoadingMoreThreads, threadTotal, eventsDuringRefreshRef, refreshThreads, loadMoreThreads };\n}\n","import type { AgentClient, FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { withAgentChatOperationError, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function useAgentChatFeedback({ client, update, clearOperationError, failOperation }: {\n client: AgentClient;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n return React.useCallback(async (message: ChatMessage, input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\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 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 } : null;\n const replaceFeedback = (current: AgentChatState, feedback: ResponseFeedback | null): AgentChatState => ({\n ...current,\n messages: current.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\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) => withAgentChatOperationError(replaceFeedback(current, previous), \"set_feedback\", error));\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n}\n","import type { ThreadMessage } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AgentChatSubmitInput } from \"./use-agent-chat\";\nimport { useThreadMessageQueue } from \"./thread-message-queue\";\nimport type { AgentChatOperation, AgentChatState } from \"./state\";\n\nexport function useAgentChatQueueActions({ queue, stateRef, createId, clearOperationError,\n failOperation, refreshMessages, attachRun }: {\n queue: ReturnType<typeof useThreadMessageQueue>;\n stateRef: React.RefObject<AgentChatState>;\n createId: () => string;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n refreshMessages: (threadId: string) => Promise<void>;\n attachRun: (runId: string) => Promise<void>;\n}) {\n const steer = React.useCallback(async (text: string) => {\n const threadId = stateRef.current.activeThreadId;\n if (!threadId || !text.trim()) throw new Error(\"An active thread and text are required to steer.\");\n clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n await refreshMessages(threadId);\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef]);\n\n const editPendingMessage = React.useCallback(async (message: ThreadMessage,\n input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">) => {\n await queue.edit(message, { text: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId });\n }, [queue.edit]);\n const steerPendingMessage = React.useCallback(async (message: ThreadMessage) => {\n await queue.edit(message, { text: message.text, attachmentIds: message.attachment_ids, mode: \"steer\" });\n }, [queue.edit]);\n const resumeQueue = React.useCallback(async () => {\n if (!stateRef.current.activeThreadId) return;\n const result = await queue.resume();\n if (result?.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef]);\n return { steer, editPendingMessage, steerPendingMessage, removePendingMessage: queue.remove, resumeQueue };\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 ThreadComputerStatus,\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 useThreadComputer(threadId: string | null) {\n const { client, createAbortController } = useAgents24Runtime();\n const [computer, setComputer] = React.useState<ThreadComputerStatus | 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 refresh = React.useCallback(async () => {\n controllerRef.current?.abort();\n if (!threadId) {\n setComputer(null);\n setIsLoading(false);\n return null;\n }\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.computer.get({ threadId, signal: controller.signal });\n setComputer(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, threadId]);\n React.useEffect(() => {\n void refresh();\n return () => controllerRef.current?.abort();\n }, [refresh]);\n const list = React.useCallback((input: { path?: string; cursor?: number; limit?: number }) => {\n if (!threadId) throw new Error(\"A thread is required to list computer files\");\n return client.threads.computer.list({ threadId, ...input });\n }, [client, threadId]);\n const read = React.useCallback((path: string) => {\n if (!threadId) throw new Error(\"A thread is required to read a computer file\");\n return client.threads.computer.read({ threadId, path });\n }, [client, threadId]);\n const createContentAccess = React.useCallback((path: string, download = false) => {\n if (!threadId) throw new Error(\"A thread is required to access a computer file\");\n return client.threads.computer.createContentAccess({ threadId, path, download });\n }, [client, threadId]);\n return { computer, error, isLoading, list, read, createContentAccess, refresh };\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","messageId","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","React","React","React","React","text","activeThread","React"]}
package/dist/model.d.ts CHANGED
@@ -211,6 +211,7 @@ export type ChatMessage = {
211
211
  content: string;
212
212
  createdAt: Date | string;
213
213
  isFinal?: boolean;
214
+ responseCompletion?: import("@agents24/client/protocol").ResponseCompletion;
214
215
  parts: ChatPart[];
215
216
  attachments?: ChatAttachment[];
216
217
  citations?: ChatCitation[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents24/react",
3
- "version": "0.2.12",
3
+ "version": "0.2.14",
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.11"
43
+ "@agents24/client": "0.2.12"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "react": ">=19.0.0 <20.0.0"