@agent-native/core 0.120.0 → 0.120.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +16 -0
  3. package/corpus/core/docs/content/extensions.mdx +23 -4
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/agent/production-agent.ts +4 -0
  6. package/corpus/core/src/agent/run-manager.ts +36 -10
  7. package/corpus/core/src/agent/types.ts +2 -0
  8. package/corpus/core/src/client/MultiTabAssistantChat.tsx +45 -0
  9. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +16 -3
  10. package/corpus/core/src/client/settings/ExtensionsSettingsContent.tsx +24 -0
  11. package/corpus/core/src/client/settings/SettingsPanel.tsx +10 -0
  12. package/corpus/core/src/client/use-chat-models.ts +45 -0
  13. package/corpus/core/src/deploy/build.ts +3 -0
  14. package/corpus/core/src/server/analytics.ts +164 -20
  15. package/corpus/core/src/server/auth.ts +17 -13
  16. package/corpus/core/src/server/better-auth-instance.ts +13 -1
  17. package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  18. package/corpus/core/src/templates/chat/app/routes/extensions._index.tsx +2 -2
  19. package/corpus/core/src/templates/chat/netlify.toml +1 -0
  20. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  21. package/corpus/core/src/vite/client.ts +6 -0
  22. package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +27 -43
  23. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +19 -8
  24. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +2 -2
  25. package/corpus/templates/analytics/AGENTS.md +20 -8
  26. package/corpus/templates/analytics/actions/get-explorer-dashboard.ts +3 -0
  27. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +140 -46
  28. package/corpus/templates/analytics/actions/migrate-analytics-artifacts.ts +48 -0
  29. package/corpus/templates/analytics/actions/save-analysis.ts +2 -3
  30. package/corpus/templates/analytics/actions/view-screen.ts +1 -1
  31. package/corpus/templates/analytics/app/components/dashboard/DashboardMetadata.tsx +77 -0
  32. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +7 -1
  33. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +1 -0
  34. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +103 -502
  35. package/corpus/templates/analytics/app/global.css +30 -0
  36. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +2 -2
  37. package/corpus/templates/analytics/app/i18n-data.ts +80 -0
  38. package/corpus/templates/analytics/app/pages/Agents.tsx +49 -2
  39. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +54 -11
  40. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +3 -53
  41. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +23 -25
  42. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  43. package/corpus/templates/analytics/app/routes/analyses._index.tsx +3 -2
  44. package/corpus/templates/analytics/app/routes/extensions._index.tsx +2 -2
  45. package/corpus/templates/analytics/changelog/2026-07-23-analytics-now-groups-saved-analyses-and-embedded-extensions-.md +6 -0
  46. package/corpus/templates/analytics/changelog/2026-07-23-dashboard-menus-show-who-created-and-last-updated-each-dashb.md +6 -0
  47. package/corpus/templates/analytics/changelog/2026-07-23-dashboard-usage-now-loads-reliably-for-organizations-with-ma.md +6 -0
  48. package/corpus/templates/analytics/changelog/2026-07-23-long-dashboard-building-requests-now-continue-without-stoppi.md +6 -0
  49. package/corpus/templates/analytics/netlify.toml +4 -0
  50. package/corpus/templates/analytics/server/db/schema.ts +4 -0
  51. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -1
  52. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +1 -0
  53. package/corpus/templates/analytics/server/lib/migrate-analytics-artifacts.ts +1062 -0
  54. package/corpus/templates/analytics/server/plugins/agent-chat.ts +6 -52
  55. package/corpus/templates/analytics/server/plugins/core-routes.ts +1 -1
  56. package/corpus/templates/analytics/server/plugins/db.ts +10 -0
  57. package/corpus/templates/assets/actions/generate-image-batch.ts +36 -1
  58. package/corpus/templates/assets/actions/generate-image.ts +28 -1
  59. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +47 -9
  60. package/corpus/templates/assets/app/routes/extensions._index.tsx +2 -2
  61. package/corpus/templates/assets/changelog/2026-07-23-assets-image-generation-now-recovers-after-a-completed-tool-.md +6 -0
  62. package/corpus/templates/assets/changelog/2026-07-23-new-chat-aligns-with-sidebar-controls.md +6 -0
  63. package/corpus/templates/assets/netlify.toml +1 -0
  64. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +38 -8
  65. package/corpus/templates/brain/app/routes/extensions._index.tsx +2 -2
  66. package/corpus/templates/brain/netlify.toml +1 -0
  67. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +43 -5
  68. package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +2 -16
  69. package/corpus/templates/calendar/netlify.toml +1 -0
  70. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  71. package/corpus/templates/chat/app/routes/extensions._index.tsx +2 -2
  72. package/corpus/templates/chat/netlify.toml +1 -0
  73. package/corpus/templates/clips/app/components/library/library-layout.tsx +52 -6
  74. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +2 -16
  75. package/corpus/templates/clips/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  76. package/corpus/templates/clips/changelog/2026-07-23-meeting-recording-meters-and-dismissed-prompts.md +6 -0
  77. package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +1 -1
  78. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +2 -0
  79. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +1 -3
  80. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +86 -0
  81. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +24 -0
  82. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +5 -69
  83. package/corpus/templates/clips/desktop/src/styles.css +35 -3
  84. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +13 -44
  85. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +119 -17
  86. package/corpus/templates/clips/netlify.toml +1 -0
  87. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -7
  88. package/corpus/templates/content/app/routes/_app.extensions._index.tsx +2 -2
  89. package/corpus/templates/content/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  90. package/corpus/templates/content/netlify.toml +1 -0
  91. package/corpus/templates/design/app/components/layout/Sidebar.tsx +55 -17
  92. package/corpus/templates/design/app/routes/extensions._index.tsx +2 -2
  93. package/corpus/templates/design/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  94. package/corpus/templates/design/netlify.toml +1 -0
  95. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +1 -1
  96. package/corpus/templates/dispatch/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  97. package/corpus/templates/dispatch/netlify.toml +1 -0
  98. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +9 -3
  99. package/corpus/templates/forms/AGENTS.md +11 -1
  100. package/corpus/templates/forms/README.md +24 -1
  101. package/corpus/templates/forms/actions/update-form.ts +12 -5
  102. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +199 -1
  103. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +41 -45
  104. package/corpus/templates/forms/app/i18n/en-US.ts +13 -1
  105. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +35 -4
  106. package/corpus/templates/forms/app/pages/FormFillPage.tsx +7 -16
  107. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +2 -2
  108. package/corpus/templates/forms/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  109. package/corpus/templates/forms/changelog/2026-07-23-forms-can-branch-into-follow-up-questions-and-route-response.md +6 -0
  110. package/corpus/templates/forms/netlify.toml +1 -0
  111. package/corpus/templates/forms/server/handlers/submissions.ts +22 -31
  112. package/corpus/templates/forms/server/lib/integrations.ts +11 -2
  113. package/corpus/templates/forms/server/lib/public-form-ssr.ts +26 -5
  114. package/corpus/templates/forms/server/lib/validate-fields.ts +48 -11
  115. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  116. package/corpus/templates/forms/shared/conditional.ts +67 -0
  117. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +36 -5
  118. package/corpus/templates/macros/app/routes/extensions._index.tsx +2 -2
  119. package/corpus/templates/macros/netlify.toml +1 -0
  120. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +0 -9
  121. package/corpus/templates/mail/app/routes/extensions._index.tsx +2 -2
  122. package/corpus/templates/mail/netlify.toml +1 -0
  123. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +38 -5
  124. package/corpus/templates/plan/app/routes/extensions._index.tsx +2 -2
  125. package/corpus/templates/plan/netlify.toml +1 -0
  126. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +47 -4
  127. package/corpus/templates/slides/app/routes/extensions._index.tsx +2 -2
  128. package/corpus/templates/slides/netlify.toml +1 -0
  129. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +37 -6
  130. package/corpus/templates/tasks/app/routes/extensions._index.tsx +2 -2
  131. package/corpus/templates/tasks/app/routes/settings.tsx +31 -0
  132. package/corpus/templates/tasks/netlify.toml +1 -0
  133. package/dist/agent/production-agent.d.ts.map +1 -1
  134. package/dist/agent/production-agent.js +4 -0
  135. package/dist/agent/production-agent.js.map +1 -1
  136. package/dist/agent/run-manager.d.ts +9 -0
  137. package/dist/agent/run-manager.d.ts.map +1 -1
  138. package/dist/agent/run-manager.js +25 -10
  139. package/dist/agent/run-manager.js.map +1 -1
  140. package/dist/agent/types.d.ts +2 -2
  141. package/dist/agent/types.d.ts.map +1 -1
  142. package/dist/agent/types.js.map +1 -1
  143. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  144. package/dist/client/MultiTabAssistantChat.js +35 -0
  145. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  146. package/dist/client/extensions/ExtensionsListPage.d.ts +5 -1
  147. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  148. package/dist/client/extensions/ExtensionsListPage.js +5 -3
  149. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  150. package/dist/client/settings/ExtensionsSettingsContent.d.ts +2 -0
  151. package/dist/client/settings/ExtensionsSettingsContent.d.ts.map +1 -0
  152. package/dist/client/settings/ExtensionsSettingsContent.js +10 -0
  153. package/dist/client/settings/ExtensionsSettingsContent.js.map +1 -0
  154. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  155. package/dist/client/settings/SettingsPanel.js +10 -1
  156. package/dist/client/settings/SettingsPanel.js.map +1 -1
  157. package/dist/client/use-chat-models.d.ts +1 -0
  158. package/dist/client/use-chat-models.d.ts.map +1 -1
  159. package/dist/client/use-chat-models.js +33 -0
  160. package/dist/client/use-chat-models.js.map +1 -1
  161. package/dist/collab/awareness.d.ts +2 -2
  162. package/dist/collab/awareness.d.ts.map +1 -1
  163. package/dist/deploy/build.js +1 -0
  164. package/dist/deploy/build.js.map +1 -1
  165. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  166. package/dist/observability/routes.d.ts +3 -3
  167. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  168. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  169. package/dist/server/analytics.d.ts +17 -4
  170. package/dist/server/analytics.d.ts.map +1 -1
  171. package/dist/server/analytics.js +122 -17
  172. package/dist/server/analytics.js.map +1 -1
  173. package/dist/server/auth.d.ts.map +1 -1
  174. package/dist/server/auth.js +5 -4
  175. package/dist/server/auth.js.map +1 -1
  176. package/dist/server/better-auth-instance.d.ts +8 -0
  177. package/dist/server/better-auth-instance.d.ts.map +1 -1
  178. package/dist/server/better-auth-instance.js +10 -1
  179. package/dist/server/better-auth-instance.js.map +1 -1
  180. package/dist/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  181. package/dist/templates/chat/app/routes/extensions._index.tsx +2 -2
  182. package/dist/templates/chat/netlify.toml +1 -0
  183. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  184. package/dist/vite/client.d.ts.map +1 -1
  185. package/dist/vite/client.js +2 -0
  186. package/dist/vite/client.js.map +1 -1
  187. package/docs/content/extensions.mdx +23 -4
  188. package/package.json +1 -1
  189. package/src/agent/production-agent.ts +4 -0
  190. package/src/agent/run-manager.ts +36 -10
  191. package/src/agent/types.ts +2 -0
  192. package/src/client/MultiTabAssistantChat.tsx +45 -0
  193. package/src/client/extensions/ExtensionsListPage.tsx +16 -3
  194. package/src/client/settings/ExtensionsSettingsContent.tsx +24 -0
  195. package/src/client/settings/SettingsPanel.tsx +10 -0
  196. package/src/client/use-chat-models.ts +45 -0
  197. package/src/deploy/build.ts +3 -0
  198. package/src/server/analytics.ts +164 -20
  199. package/src/server/auth.ts +17 -13
  200. package/src/server/better-auth-instance.ts +13 -1
  201. package/src/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  202. package/src/templates/chat/app/routes/extensions._index.tsx +2 -2
  203. package/src/templates/chat/netlify.toml +1 -0
  204. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  205. package/src/vite/client.ts +6 -0
  206. package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +0 -165
  207. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +0 -175
@@ -1 +1 @@
1
- {"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconPlus, IconHistory, IconX } from \"@tabler/icons-react\";\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\n\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n DEFAULT_REASONING_EFFORT,\n isReasoningEffort,\n resolveReasoningEffortSelection,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\nimport {\n AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE,\n appendAgentChatContextToMessage,\n claimAgentChatOpenRequest,\n claimAgentChatSubmit,\n drainBufferedAgentChatOpenRequests,\n drainBufferedAgentChatSubmits,\n getAgentChatContextState,\n isAgentChatSubmitCancelled,\n normalizeAgentChatContextItem,\n parseSubmitChatMessage,\n removeAgentChatContextItem,\n reportAgentChatSubmitResult,\n setAgentChatContextItem,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\nimport { agentNativePath, appPath } from \"./api-path.js\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport {\n buildChatModelGroups,\n type EngineModelGroup,\n} from \"./chat-model-groups.js\";\nimport {\n ChatHistoryList,\n type ChatHistoryItem,\n type ChatHistorySection,\n} from \"./chat/ChatHistoryList.js\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n} from \"./components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { callAction } from \"./use-action.js\";\nimport { useChangeVersion } from \"./use-change-version.js\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\nimport { cn } from \"./utils.js\";\n\ninterface ModelSelection {\n model: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\ninterface PendingSend {\n message: string;\n images?: string[];\n submit: boolean;\n trackInRunsTray?: boolean;\n requestMode?: \"act\" | \"plan\";\n /** Correlates with `AGENT_CHAT_SUBMIT_RESULT_EVENT` — see agent-chat.ts. */\n submitMessageId?: string;\n}\n\n/**\n * A send queued until its target thread is ready. `threadId: null` targets the\n * first thread to become active (cold start); a concrete id is a thread whose\n * chat ref hasn't mounted yet. Drained by the flush effect.\n */\ninterface PendingDelivery {\n threadId: string | null;\n send: PendingSend;\n}\n\n/** The single path that hands a queued send to a mounted chat ref. */\nfunction deliverPendingSend(ref: AssistantChatHandle, send: PendingSend): void {\n if (isAgentChatSubmitCancelled(send.submitMessageId)) return;\n if (!send.submit) {\n ref.prefillMessage(send.message);\n return;\n }\n if (send.trackInRunsTray || send.requestMode || send.submitMessageId) {\n ref.sendMessage(send.message, send.images, {\n ...(send.trackInRunsTray ? { trackInRunsTray: true } : {}),\n ...(send.requestMode ? { requestMode: send.requestMode } : {}),\n ...(send.submitMessageId\n ? { submitMessageId: send.submitMessageId }\n : {}),\n });\n } else {\n ref.sendMessage(send.message, send.images);\n }\n}\n\nconst MODEL_SELECTION_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\nfunction readStoredModelSelection(key: string): ModelSelection | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<ModelSelection>;\n if (typeof parsed.model !== \"string\" || !parsed.model.trim()) {\n return undefined;\n }\n const selection: ModelSelection = {\n model: parsed.model,\n effort: resolveReasoningEffortSelection(\n parsed.model,\n isReasoningEffort(parsed.effort) ? parsed.effort : undefined,\n ),\n };\n if (typeof parsed.engine === \"string\") selection.engine = parsed.engine;\n return selection;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredModelSelection(key: string, selection: ModelSelection) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(selection));\n } catch {}\n}\n\nfunction resolveModelSelection(\n selection: ModelSelection | undefined,\n groups: EngineModelGroup[],\n): ModelSelection | undefined {\n if (!selection?.model) return undefined;\n if (groups.length === 0) {\n return {\n model: selection.model,\n effort: resolveReasoningEffortSelection(\n selection.model,\n selection.effort,\n ),\n };\n }\n const preferredGroup = groups.find(\n (group) =>\n group.engine === selection.engine &&\n group.models.includes(selection.model),\n );\n const fallbackGroup = groups.find((group) =>\n group.models.includes(selection.model),\n );\n if (groups.length > 0 && !preferredGroup && !fallbackGroup) {\n return undefined;\n }\n const engine =\n preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;\n if (!engine && groups.length > 0) return undefined;\n\n const effort = resolveReasoningEffortSelection(\n selection.model,\n selection.effort,\n );\n const resolved: ModelSelection = { model: selection.model, effort };\n if (engine) resolved.engine = engine;\n return resolved;\n}\n\n// ─── Skeleton Loader ─────────────────────────────────────────────────────────\n\nfunction ChatSkeleton({\n header,\n headerOnly = false,\n}: {\n header?: React.ReactNode;\n headerOnly?: boolean;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n headerOnly ? \"shrink-0\" : \"flex-1 h-full\",\n )}\n >\n {header ?? (\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"h-[22px] w-20 rounded-md bg-muted animate-pulse\" />\n <div className=\"ms-auto flex gap-0.5\">\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n </div>\n </div>\n )}\n {!headerOnly && (\n <div className=\"flex-1 flex flex-col gap-3 p-4\">\n <div className=\"flex justify-center py-8\">\n <div className=\"h-10 w-10 rounded-full bg-muted animate-pulse\" />\n </div>\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse mx-auto\" />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Resource context ────────────────────────────────────────────────────────\n\nfunction formatScopeType(type: string) {\n return type.replace(/[-_]+/g, \" \");\n}\n\n// ─── History Popover ─────────────────────────────────────────────────────────\n\nfunction formatThreadTime(ts: number): string {\n const d = new Date(ts);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0)\n return d.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return d.toLocaleDateString([], { weekday: \"short\" });\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n}\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n hasMoreThreads = false,\n isLoadingMoreThreads = false,\n loadError,\n onSelect,\n onClose,\n onLoadMore,\n onSearch,\n onTogglePin,\n onRename,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n hasMoreThreads?: boolean;\n isLoadingMoreThreads?: boolean;\n loadError?: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onLoadMore?: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\n /** Presence enables the pin/unpin row action. Receives the thread's\n * current pinned state so the caller can flip it. */\n onTogglePin?: (id: string, pinned: boolean) => void;\n /** Presence enables the inline rename row action. */\n onRename?: (id: string, nextTitle: string) => void;\n}) {\n const [search, setSearch] = useState(\"\");\n const [searchResults, setSearchResults] = useState<\n ChatThreadSummary[] | null\n >(null);\n const [isSearching, setIsSearching] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Debounced server-side search\n const searchIdRef = useRef(0);\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const q = search.trim();\n if (!q) {\n searchIdRef.current++;\n setSearchResults(null);\n setIsSearching(false);\n return;\n }\n setIsSearching(true);\n const id = ++searchIdRef.current;\n debounceRef.current = setTimeout(async () => {\n if (onSearch) {\n const results = await onSearch(q);\n if (id !== searchIdRef.current) return;\n setSearchResults(results);\n } else {\n // Fallback to client-side filtering\n setSearchResults(null);\n }\n setIsSearching(false);\n }, 250);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [search, onSearch]);\n\n // Hide empty threads from the history list — except the currently-active\n // one. The active thread always belongs in the list so the user can see\n // they're in it (the previous filter dropped a brand-new chat the user\n // had just opened, making them think their chat had vanished).\n const visibleThreads = threads.filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n );\n\n const filtered = search.trim()\n ? (searchResults ?? visibleThreads).filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n )\n : visibleThreads;\n\n // Pinned threads always float to the top of `threads` already (see\n // `sortThreadSummaries` in use-chat-threads.ts and the matching server\n // ORDER BY), but pulling them into their own labeled section — instead of\n // just relying on sort order within \"All chats\" — makes the pin affordance\n // visible at a glance, matching common chat-history UX.\n const pinnedThreads = filtered.filter((t) => t.pinnedAt != null);\n const unpinnedThreads = filtered.filter((t) => t.pinnedAt == null);\n\n const toHistoryItem = (thread: ChatThreadSummary): ChatHistoryItem => {\n const isActive = thread.id === activeThreadId;\n const title = thread.title || thread.preview || \"Chat\";\n return {\n id: thread.id,\n title,\n titleText: title,\n subtitle:\n thread.preview && thread.title !== thread.preview\n ? thread.preview\n : undefined,\n timestamp: isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatThreadTime(thread.updatedAt),\n pinned: thread.pinnedAt != null,\n };\n };\n\n const historySections: ChatHistorySection[] = [\n ...(pinnedThreads.length > 0\n ? [\n {\n id: \"pinned\",\n label: \"Pinned\",\n items: pinnedThreads.map(toHistoryItem),\n },\n ]\n : []),\n { id: \"all\", items: unpinnedThreads.map(toHistoryItem) },\n ];\n\n return (\n <Popover open onOpenChange={(open) => !open && onClose()}>\n <PopoverAnchor asChild>\n <span aria-hidden className=\"absolute end-2 top-0 h-px w-px\" />\n </PopoverAnchor>\n <PopoverContent\n align=\"end\"\n side=\"bottom\"\n sideOffset={0}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }}\n className=\"w-72 rounded-lg p-0\"\n >\n <ChatHistoryList\n sections={historySections}\n activeId={activeThreadId}\n onSelect={(id) => {\n onSelect(id);\n onClose();\n }}\n onTogglePin={\n onTogglePin\n ? (id) => {\n const isPinned =\n threads.find((t) => t.id === id)?.pinnedAt != null;\n onTogglePin(id, !isPinned);\n }\n : undefined\n }\n onRename={onRename}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder=\"Search chats...\"\n searchInputRef={inputRef}\n loading={isSearching}\n loadingLabel=\"Searching...\"\n error={loadError && !search.trim() ? loadError : undefined}\n emptyLabel=\"No chats yet\"\n emptySearchLabel=\"No matching chats\"\n footer={\n !search.trim() && hasMoreThreads ? (\n <button\n type=\"button\"\n onClick={() => onLoadMore?.()}\n disabled={isLoadingMoreThreads}\n className=\"mx-1 mt-1 flex w-[calc(100%-0.5rem)] items-center justify-center rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-default disabled:opacity-60\"\n >\n {isLoadingMoreThreads ? \"Loading...\" : \"Load older chats\"}\n </button>\n ) : undefined\n }\n />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Help Popover ────────────────────────────────────────────────────────────\n\nfunction HelpPopover({ onClose }: { onClose: () => void }) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const commands = [\n {\n name: \"/clear\",\n description: \"Start a new chat (keeps current chat in history)\",\n },\n { name: \"/new\", description: \"Same as /clear\" },\n { name: \"/history\", description: \"Browse all chats\" },\n { name: \"/plan\", description: \"Switch to read-only planning\" },\n { name: \"/act\", description: \"Switch back to acting\" },\n { name: \"/help\", description: \"Show this list of commands\" },\n { name: \"@\", description: \"Mention files, agents, or resources\" },\n ];\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute end-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-foreground\">\n Available Commands\n </span>\n <button\n onClick={onClose}\n aria-label=\"Close help\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX size={12} />\n </button>\n </div>\n <div className=\"py-1\">\n {commands.map((cmd) => (\n <div key={cmd.name} className=\"px-3 py-1.5\">\n <div className=\"text-xs font-medium text-foreground\">\n {cmd.name}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {cmd.description}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ChatTab {\n id: string;\n label: string;\n status: \"idle\" | \"running\" | \"completed\";\n /** If this tab is a sub-agent, the parent thread ID */\n parentThreadId?: string;\n /** Short name for sub-agent tabs (e.g. \"Research\", \"Draft email\") */\n subAgentName?: string;\n}\n\ntype AgentTeamRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\ninterface AgentTeamRunSummary {\n title?: string;\n status?: AgentTeamRunStatus;\n sourceRecord?: {\n type?: string;\n threadId?: unknown;\n parentThreadId?: unknown;\n name?: unknown;\n };\n metadata?: Record<string, unknown>;\n}\n\ninterface AgentTeamTabInfo {\n threadId: string;\n parentThreadId: string;\n name: string;\n status: AgentTeamRunStatus;\n}\n\nfunction readString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction requestModeFromExecMode(\n value: AssistantChatProps[\"execMode\"],\n): \"act\" | \"plan\" | undefined {\n if (value === \"plan\") return \"plan\";\n if (value === \"build\") return \"act\";\n return undefined;\n}\n\nfunction isActiveAgentTeamStatus(status?: AgentTeamRunStatus): boolean {\n return (\n status === \"queued\" ||\n status === \"running\" ||\n status === \"paused\" ||\n status === \"needs-approval\"\n );\n}\n\nfunction chatTabStatusFromAgentTeamStatus(\n status?: AgentTeamRunStatus,\n): ChatTab[\"status\"] | undefined {\n if (!status) return undefined;\n return isActiveAgentTeamStatus(status) ? \"running\" : \"completed\";\n}\n\nconst STALE_THREAD_THRESHOLD_MS = 12 * 60 * 60 * 1000;\nconst DEFAULT_THREAD_URL_PARAM = \"thread\";\nconst THREAD_URL_CHANGED_EVENT = \"agent-chat:url-thread-changed\";\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// The history patch is installed once and shared via a ref count so that\n// multiple synced chats (or a remount) don't restore a stale `pushState`\n// reference and silently drop a wrapper installed by another instance.\nlet historyPatchRefCount = 0;\nlet restoreHistoryPatch: (() => void) | null = null;\n\nfunction installHistoryThreadUrlPatch(): () => void {\n if (typeof window === \"undefined\") return () => {};\n historyPatchRefCount += 1;\n if (historyPatchRefCount === 1) {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n const dispatchUrlChange = () => {\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n };\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n restoreHistoryPatch = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }\n return () => {\n historyPatchRefCount = Math.max(0, historyPatchRefCount - 1);\n if (historyPatchRefCount === 0) {\n restoreHistoryPatch?.();\n restoreHistoryPatch = null;\n }\n };\n}\n\nexport interface ChatThreadUrlSyncOptions {\n /** Query-string parameter used by the generic URL adapter. Default: `thread`. */\n paramName?: string;\n /**\n * Route-owned thread id. Pass `null` for the create route and a string for\n * thread routes like `/chat/:threadId`.\n */\n routeThreadId?: string | null;\n /** Build the URL path for a thread id, or for create mode when id is null. */\n getPath?: (threadId: string | null) => string;\n /** Optional router navigation callback used with `getPath`. */\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n}\n\nfunction normalizeUrlThreadId(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction resolveThreadUrlSync(\n value: MultiTabAssistantChatProps[\"threadUrlSync\"],\n): {\n enabled: boolean;\n paramName: string;\n routeThreadId?: string | null;\n getPath?: (threadId: string | null) => string;\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n} {\n if (!value) return { enabled: false, paramName: DEFAULT_THREAD_URL_PARAM };\n if (value === true) {\n return { enabled: true, paramName: DEFAULT_THREAD_URL_PARAM };\n }\n return {\n enabled: true,\n paramName: value.paramName?.trim() || DEFAULT_THREAD_URL_PARAM,\n ...(hasOwn.call(value, \"routeThreadId\")\n ? { routeThreadId: normalizeUrlThreadId(value.routeThreadId) }\n : {}),\n ...(value.getPath ? { getPath: value.getPath } : {}),\n ...(value.navigate ? { navigate: value.navigate } : {}),\n };\n}\n\nfunction readUrlThreadId(paramName: string): string | null {\n if (typeof window === \"undefined\") return null;\n try {\n const params = new URLSearchParams(window.location.search);\n return normalizeUrlThreadId(\n params.get(paramName) ??\n (paramName === DEFAULT_THREAD_URL_PARAM\n ? params.get(\"threadId\")\n : null),\n );\n } catch {\n return null;\n }\n}\n\nfunction runToAgentTeamTabInfo(\n run: AgentTeamRunSummary,\n): AgentTeamTabInfo | null {\n if (run.sourceRecord?.type && run.sourceRecord.type !== \"agent-team-task\") {\n return null;\n }\n const metadata = run.metadata ?? {};\n const threadId =\n readString(run.sourceRecord?.threadId) || readString(metadata.threadId);\n const parentThreadId =\n readString(run.sourceRecord?.parentThreadId) ||\n readString(metadata.parentThreadId);\n if (!threadId || !parentThreadId || threadId === parentThreadId) return null;\n const name =\n readString(run.sourceRecord?.name) ||\n readString(metadata.name) ||\n readString(run.title) ||\n \"Sub-agent\";\n return {\n threadId,\n parentThreadId,\n name,\n status: run.status ?? \"unknown\",\n };\n}\n\nexport interface MultiTabAssistantChatHeaderProps {\n tabs: ChatTab[];\n activeTabId: string;\n activeTabMessageCount: number;\n setActiveTabId: (tabId: string) => void;\n addTab: () => void;\n closeTab: (tabId: string) => void;\n closeOtherTabs: (tabId: string) => void;\n closeAllTabs: () => void;\n clearActiveTab: () => void;\n /** Open the history popover */\n showHistory?: boolean;\n toggleHistory?: () => void;\n /** Number of open tabs (useful for triggering scroll on tab count change) */\n tabCount: number;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\nexport type MultiTabAssistantChatProps = Omit<\n AssistantChatProps,\n \"tabId\" | \"threadId\"\n> & {\n /** Show the tab bar. Default: true */\n showTabBar?: boolean;\n /** Optional custom single-row header renderer */\n renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Optional page-level top-bar actions renderer for the active tab. */\n renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */\n contentHidden?: boolean;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n /** Restore the previously active thread and open tabs from localStorage. */\n restoreActiveThread?: boolean;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /**\n * Keep the active thread in URL state. `true` uses the generic `?thread=id`\n * adapter; passing `routeThreadId` + `getPath` lets an app bind chats to\n * route params such as `/chat/:threadId`.\n */\n threadUrlSync?: boolean | ChatThreadUrlSyncOptions;\n /** Ambient resource context to show as a composer chip. */\n scope?: ChatThreadScope | null;\n /** @deprecated Scope context is now rendered in the composer. */\n showScopeBadge?: boolean;\n};\n\nexport function MultiTabAssistantChat({\n showTabBar = true,\n renderHeader,\n renderOverlay,\n contentHidden = false,\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey,\n restoreActiveThread = true,\n browserTabId,\n threadUrlSync = false,\n scope = null,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n enabled: threadUrlSyncEnabled,\n paramName: threadUrlParamName,\n routeThreadId,\n getPath: getThreadPath,\n navigate: navigateThreadUrl,\n } = resolveThreadUrlSync(threadUrlSync);\n const threadRouteControlsActiveThread =\n threadUrlSyncEnabled &&\n threadUrlSync !== true &&\n typeof threadUrlSync === \"object\" &&\n hasOwn.call(threadUrlSync, \"routeThreadId\");\n const [urlThreadId, setUrlThreadId] = useState<string | null>(() =>\n threadUrlSyncEnabled\n ? threadRouteControlsActiveThread\n ? (routeThreadId ?? readUrlThreadId(threadUrlParamName))\n : readUrlThreadId(threadUrlParamName)\n : null,\n );\n const [deepLinkedThreadId] = useState<string | null>(() =>\n threadUrlSyncEnabled ? null : readUrlThreadId(DEFAULT_THREAD_URL_PARAM),\n );\n const [activeDeepLinkedThreadId, setActiveDeepLinkedThreadId] =\n useState(deepLinkedThreadId);\n const urlThreadIdRef = useRef(urlThreadId);\n urlThreadIdRef.current = urlThreadId;\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || threadRouteControlsActiveThread) return;\n const update = () => setUrlThreadId(readUrlThreadId(threadUrlParamName));\n const uninstallHistoryPatch = installHistoryThreadUrlPatch();\n update();\n window.addEventListener(\"popstate\", update);\n window.addEventListener(THREAD_URL_CHANGED_EVENT, update);\n return () => {\n uninstallHistoryPatch();\n window.removeEventListener(\"popstate\", update);\n window.removeEventListener(THREAD_URL_CHANGED_EVENT, update);\n };\n }, [\n threadRouteControlsActiveThread,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ]);\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || !threadRouteControlsActiveThread) return;\n setUrlThreadId(routeThreadId ?? readUrlThreadId(threadUrlParamName));\n }, [\n routeThreadId,\n threadRouteControlsActiveThread,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ]);\n\n useEffect(() => {\n if (threadUrlSyncEnabled) return;\n const update = () =>\n setActiveDeepLinkedThreadId(readUrlThreadId(DEFAULT_THREAD_URL_PARAM));\n const uninstallHistoryPatch = installHistoryThreadUrlPatch();\n update();\n window.addEventListener(\"popstate\", update);\n window.addEventListener(THREAD_URL_CHANGED_EVENT, update);\n return () => {\n uninstallHistoryPatch();\n window.removeEventListener(\"popstate\", update);\n window.removeEventListener(THREAD_URL_CHANGED_EVENT, update);\n };\n }, [threadUrlSyncEnabled]);\n\n const writeThreadUrl = useCallback(\n (threadId: string | null, options: { replace?: boolean } = {}): void => {\n if (!threadUrlSyncEnabled || typeof window === \"undefined\") return;\n try {\n const normalizedThreadId = normalizeUrlThreadId(threadId);\n let next: string;\n if (getThreadPath) {\n next = getThreadPath(normalizedThreadId);\n } else {\n const url = new URL(window.location.href);\n if (normalizedThreadId) {\n url.searchParams.set(threadUrlParamName, normalizedThreadId);\n } else {\n url.searchParams.delete(threadUrlParamName);\n }\n if (threadUrlParamName !== \"threadId\") {\n url.searchParams.delete(\"threadId\");\n }\n next = `${url.pathname}${url.search}${url.hash}`;\n }\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n if (next === current) {\n setUrlThreadId(normalizedThreadId);\n return;\n }\n if (getThreadPath && navigateThreadUrl) {\n navigateThreadUrl(next, { replace: options.replace === true });\n setUrlThreadId(normalizedThreadId);\n return;\n }\n const method = options.replace ? \"replaceState\" : \"pushState\";\n // `getThreadPath` returns a router-local path (no app basename). When we\n // fall back to the raw History API instead of a router navigate, resolve\n // the basename so deep-link reloads work in mounted apps.\n const historyTarget = getThreadPath ? appPath(next) : next;\n window.history[method](window.history.state, \"\", historyTarget);\n setUrlThreadId(normalizedThreadId);\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n const popstate =\n typeof PopStateEvent === \"function\"\n ? new PopStateEvent(\"popstate\", { state: window.history.state })\n : new Event(\"popstate\");\n window.dispatchEvent(popstate);\n } catch {}\n },\n [\n getThreadPath,\n navigateThreadUrl,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ],\n );\n\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread: switchThreadState,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n loadMoreThreads,\n refreshThreads,\n hasMoreThreads,\n isLoadingMoreThreads,\n threadsLoadError,\n isNewThread,\n pinThread,\n renameThread,\n } = useChatThreads(apiUrl, storageKey, null, {\n restoreActiveThread,\n routeThreadId: threadUrlSyncEnabled\n ? urlThreadId\n : (activeDeepLinkedThreadId ?? undefined),\n });\n\n const switchThread = useCallback(\n (threadId: string, options: { replace?: boolean } = {}) => {\n switchThreadState(threadId);\n writeThreadUrl(threadId, options);\n },\n [switchThreadState, writeThreadUrl],\n );\n\n // Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;\n\n // Track which tabs have been focused at least once (lazy mount for sub-agent tabs)\n const mountedTabsRef = useRef<Set<string>>(new Set());\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n // Mark the active tab as mounted so it persists when switched away\n if (activeThreadId) mountedTabsRef.current.add(activeThreadId);\n const chatRefs = useRef<Map<string, AssistantChatHandle>>(new Map());\n // Sends queued until their target thread is ready (see PendingDelivery).\n const pendingDeliveries = useRef<PendingDelivery[]>([]);\n const pendingContextItems = useRef<Map<string, AgentChatContextItem[]>>(\n new Map(),\n );\n const [runningThreads, setRunningThreads] = useState<Set<string>>(new Set());\n const [showHistory, setShowHistory] = useState(false);\n const [pageOverlayScrolled, setPageOverlayScrolled] = useState(false);\n const newThreadIds = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n setPageOverlayScrolled(false);\n }, [activeThreadId]);\n\n const handlePageOverlayScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const target = event.target;\n if (\n !renderOverlay ||\n !(target instanceof HTMLElement) ||\n !target.closest(\".agent-chat-scroll\")\n ) {\n return;\n }\n setPageOverlayScrolled(target.scrollTop > 1);\n },\n [renderOverlay],\n );\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [modelListLoading, setModelListLoading] = useState(true);\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n const threadModelRef = useRef<\n Map<string, { model: string; engine?: string; effort?: ReasoningEffort }>\n >(new Map());\n const [persistedModelSelection, setPersistedModelSelection] = useState<\n ModelSelection | undefined\n >(() => readStoredModelSelection(modelSelectionKey));\n const [modelSelectionVersion, setModelSelectionVersion] = useState(0);\n\n useEffect(() => {\n setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));\n }, [modelSelectionKey]);\n\n const bumpModelSelectionVersion = useCallback(() => {\n setModelSelectionVersion((version) => version + 1);\n }, []);\n const postMessageSubmissionsDisabled = props.composerDisabled === true;\n\n const setContextInTab = useCallback(\n (\n threadId: string,\n item: AgentChatContextItem,\n options?: { focus?: boolean },\n ) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.setComposerContextItem(item, options);\n return;\n }\n const existing = pendingContextItems.current.get(threadId) ?? [];\n const index = existing.findIndex((current) => current.key === item.key);\n const next =\n index === -1\n ? [...existing, item]\n : existing.map((current, currentIndex) =>\n currentIndex === index ? item : current,\n );\n pendingContextItems.current.set(threadId, next);\n },\n [],\n );\n\n const removeContextInTab = useCallback((threadId: string, key: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.removeComposerContextItem(key);\n return;\n }\n const existing = pendingContextItems.current.get(threadId);\n if (!existing) return;\n const next = existing.filter((item) => item.key !== key);\n if (next.length === 0) {\n pendingContextItems.current.delete(threadId);\n } else {\n pendingContextItems.current.set(threadId, next);\n }\n }, []);\n\n const clearContextInTab = useCallback((threadId: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.clearComposerContextItems();\n return;\n }\n pendingContextItems.current.delete(threadId);\n }, []);\n\n const resolveThreadModelSelection = useCallback(\n (threadId: string) =>\n resolveModelSelection(\n threadModelRef.current.get(threadId) ?? persistedModelSelection,\n availableModels,\n ),\n [availableModels, persistedModelSelection, modelSelectionVersion],\n );\n\n const persistModelSelection = useCallback(\n (selection: ModelSelection) => {\n setPersistedModelSelection(selection);\n writeStoredModelSelection(modelSelectionKey, selection);\n },\n [modelSelectionKey],\n );\n\n const handleModelChange = useCallback(\n (model: string, engine: string) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = threadModelRef.current.get(threadId);\n const effort = resolveReasoningEffortSelection(model, existing?.effort);\n const selection = { model, engine, effort };\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [bumpModelSelectionVersion, persistModelSelection],\n );\n\n const handleEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = resolveThreadModelSelection(threadId);\n const model = existing?.model ?? defaultModel;\n const engine =\n existing?.engine ??\n availableModels.find((group) => group.models.includes(model))?.engine ??\n availableModels[0]?.engine;\n const selection: ModelSelection = { model, effort };\n if (engine) selection.engine = engine;\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [\n availableModels,\n bumpModelSelectionVersion,\n defaultModel,\n persistModelSelection,\n resolveThreadModelSelection,\n ],\n );\n\n const refreshEngines = useCallback(() => {\n setModelListLoading(true);\n Promise.all([\n callAction(\"manage-agent-engine\" as any, { action: \"list\" } as any).catch(\n () => null,\n ),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n const groups = buildChatModelGroups({\n engines: enginesData.engines,\n configuredKeys,\n builderConnected,\n currentEngineName,\n currentModel,\n });\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {})\n .finally(() => setModelListLoading(false));\n }, []);\n\n useEffect(() => {\n refreshEngines();\n window.addEventListener(\"agent-engine:configured-changed\", refreshEngines);\n return () =>\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n refreshEngines,\n );\n }, [refreshEngines]);\n\n // Parent-child thread mapping — persisted to localStorage.\n // Maps childThreadId → parentThreadId for sub-agent tabs.\n const PARENT_MAP_KEY = `agent-chat-parent-map${keyPrefix}`;\n const [parentMap, setParentMap] = useState<Record<string, string>>(() => {\n try {\n const saved = localStorage.getItem(PARENT_MAP_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n });\n const parentMapRef = useRef(parentMap);\n parentMapRef.current = parentMap;\n const dismissedSubAgentTabsRef = useRef<Set<string>>(new Set());\n\n // Persist parent map to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(PARENT_MAP_KEY, JSON.stringify(parentMap));\n } catch {}\n }, [parentMap, PARENT_MAP_KEY]);\n\n // Sub-agent display names — persisted to localStorage.\n // Maps childThreadId → short name (e.g. \"Research\", \"Draft email\").\n const SUB_AGENT_NAMES_KEY = `agent-chat-sub-agent-names${keyPrefix}`;\n const [subAgentNames, setSubAgentNames] = useState<Record<string, string>>(\n () => {\n try {\n const saved = localStorage.getItem(SUB_AGENT_NAMES_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n },\n );\n const subAgentNamesRef = useRef(subAgentNames);\n subAgentNamesRef.current = subAgentNames;\n const [subAgentStatuses, setSubAgentStatuses] = useState<\n Record<string, AgentTeamRunStatus>\n >({});\n\n useEffect(() => {\n try {\n localStorage.setItem(SUB_AGENT_NAMES_KEY, JSON.stringify(subAgentNames));\n } catch {}\n }, [subAgentNames, SUB_AGENT_NAMES_KEY]);\n\n // Open tabs — persisted to localStorage so they survive refresh.\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}`;\n const [openTabIds, setOpenTabIds] = useState<string[]>(() => {\n if (!restoreActiveThread && activeThreadId) {\n for (const id of [activeThreadId]) mountedTabsRef.current.add(id);\n return [activeThreadId];\n }\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Mark restored tabs as mounted\n for (const id of parsed) mountedTabsRef.current.add(id);\n return parsed;\n }\n }\n } catch {}\n return [];\n });\n const openTabIdsRef = useRef(openTabIds);\n openTabIdsRef.current = openTabIds;\n const initializedRef = useRef(false);\n\n const openTabsKeyRef = useRef(OPEN_TABS_KEY);\n\n useEffect(() => {\n const nextScope = scope;\n if (!nextScope) return;\n const type = formatScopeType(nextScope.type);\n const title =\n nextScope.label?.trim() ||\n type.replace(/^./, (character) => character.toUpperCase());\n const key = nextScope.contextKey || \"agent-current-resource-context\";\n const marker = `Resource context: ${nextScope.type}:${nextScope.id}`;\n const existing = getAgentChatContextState().items.find(\n (item) => item.key === key,\n );\n let ownsContextItem = false;\n if (!existing || existing.context.startsWith(marker)) {\n setAgentChatContextItem({\n key,\n title,\n context: [\n marker,\n `The user is currently viewing this ${type}.`,\n nextScope.label ? `Resource name: ${nextScope.label}` : \"\",\n `Resource id: ${nextScope.id}`,\n typeof window !== \"undefined\"\n ? `Current URL: ${window.location.pathname}${window.location.search}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n openSidebar: false,\n focus: false,\n });\n ownsContextItem = true;\n }\n return () => {\n const current = getAgentChatContextState().items.find(\n (item) => item.key === key,\n );\n if (ownsContextItem && current?.context.startsWith(marker)) {\n removeAgentChatContextItem(key);\n }\n };\n }, [scope?.contextKey, scope?.id, scope?.label, scope?.type]);\n\n // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)\n useEffect(() => {\n if (openTabsKeyRef.current !== OPEN_TABS_KEY) return;\n const mainTabs = openTabIds.filter((id) => !parentMap[id]);\n if (mainTabs.length > 0) {\n try {\n localStorage.setItem(OPEN_TABS_KEY, JSON.stringify(mainTabs));\n } catch {}\n }\n }, [openTabIds, parentMap, OPEN_TABS_KEY]);\n\n // Initialize open tabs once threads load — validate saved tabs still exist\n useEffect(() => {\n if (initializedRef.current || !activeThreadId || threads.length === 0)\n return;\n initializedRef.current = true;\n const threadIds = new Set(threads.map((t) => t.id));\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n\n // Hide tabs that have had no activity for more than 12 hours. Stale tabs\n // are removed from the sidebar on load but remain accessible via history.\n const now = Date.now();\n const isStale = (id: string) => {\n const thread = threadMap.get(id);\n return thread\n ? now - thread.updatedAt > STALE_THREAD_THRESHOLD_MS\n : false;\n };\n\n // If the active thread is a sub-agent, switch to its parent or the most recent main thread\n if (parentMap[activeThreadId]) {\n const parent = parentMap[activeThreadId];\n if (parent && threadIds.has(parent)) {\n switchThread(parent);\n } else {\n // Fall back to most recent main thread\n const mainThread = threads.find((t) => !parentMap[t.id]);\n if (mainThread) switchThread(mainThread.id);\n }\n }\n\n setOpenTabIds((prev) => {\n // Filter out tabs that no longer exist, sub-agent tabs, or stale tabs (>12h inactive)\n const valid = prev.filter(\n (id) => threadIds.has(id) && !parentMap[id] && !isStale(id),\n );\n // Ensure active thread is included (only if it's not a sub-agent and not stale)\n if (\n !parentMap[activeThreadId] &&\n !valid.includes(activeThreadId) &&\n !isStale(activeThreadId)\n ) {\n valid.push(activeThreadId);\n }\n return valid;\n });\n\n // If active thread is stale, start fresh\n if (!parentMap[activeThreadId] && isStale(activeThreadId)) {\n createThread().then((id) => {\n if (id) writeThreadUrl(null);\n });\n }\n }, [\n activeThreadId,\n threads,\n parentMap,\n switchThread,\n createThread,\n writeThreadUrl,\n ]);\n\n // Ensure active thread is always in open tabs.\n // Use functional update to check inside the setter — avoids race with the\n // initialization effect that may have already added the ID in the same batch.\n //\n // Re-check after tab-list resets so the sidebar cannot end up with a live\n // active thread but no mounted chat.\n useEffect(() => {\n if (!activeThreadId || openTabIds.includes(activeThreadId)) return;\n if (parentMap[activeThreadId]) return;\n\n const activeThread = threads.find((thread) => thread.id === activeThreadId);\n if (\n activeThread &&\n Date.now() - activeThread.updatedAt > STALE_THREAD_THRESHOLD_MS\n ) {\n return;\n }\n\n setOpenTabIds((prev) =>\n prev.includes(activeThreadId) ? prev : [...prev, activeThreadId],\n );\n }, [activeThreadId, openTabIds, parentMap, threads]);\n\n // Ensure at least one tab is always open — auto-create if sidebar is empty.\n // Skipped when an active thread already exists (e.g. the hook generated an\n // optimistic id for a brand-new session); the activeThreadId effect above\n // adds it to openTabIds without spinning up a duplicate thread.\n const autoCreatingRef = useRef(false);\n useEffect(() => {\n if (isLoading || autoCreatingRef.current) return;\n if (openTabIds.length === 0 && !activeThreadId) {\n autoCreatingRef.current = true;\n createThread().then((id) => {\n autoCreatingRef.current = false;\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n writeThreadUrl(null, { replace: true });\n }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread, writeThreadUrl]);\n\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const runsUrl = `${apiUrl.replace(/\\/$/, \"\")}/runs/list?goalId=agent-team`;\n\n async function hydrateAgentTeamTabs() {\n try {\n const res = await fetch(runsUrl);\n if (res.ok) {\n const data = (await res.json()) as { runs?: AgentTeamRunSummary[] };\n const infos = Array.isArray(data.runs)\n ? data.runs\n .map(runToAgentTeamTabInfo)\n .filter((info): info is AgentTeamTabInfo => Boolean(info))\n : [];\n\n setSubAgentStatuses((prev) => {\n let changed = false;\n const next: Record<string, AgentTeamRunStatus> = {};\n for (const info of infos) {\n next[info.threadId] = info.status;\n if (prev[info.threadId] !== info.status) changed = true;\n }\n if (Object.keys(prev).length !== Object.keys(next).length) {\n changed = true;\n }\n return changed ? next : prev;\n });\n\n const openSet = new Set(openTabIdsRef.current);\n const candidates = infos.filter(\n (info) =>\n !dismissedSubAgentTabsRef.current.has(info.threadId) &&\n (openSet.has(info.parentThreadId) || openSet.has(info.threadId)),\n );\n\n if (candidates.length > 0) {\n const shouldRefreshThreads = candidates.some(\n (info) =>\n !openSet.has(info.threadId) && openSet.has(info.parentThreadId),\n );\n const candidateParents = new Map(\n candidates.map((info) => [info.threadId, info.parentThreadId]),\n );\n setParentMap((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next[info.threadId] === info.parentThreadId) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.parentThreadId }\n : { ...next, [info.threadId]: info.parentThreadId };\n }\n return next;\n });\n setSubAgentNames((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (!info.name || next[info.threadId] === info.name) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.name }\n : { ...next, [info.threadId]: info.name };\n }\n return next;\n });\n\n setOpenTabIds((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next.includes(info.threadId)) continue;\n const parentIdx = next.indexOf(info.parentThreadId);\n if (parentIdx === -1) continue;\n if (next === prev) next = [...prev];\n let insertIdx = parentIdx + 1;\n while (insertIdx < next.length) {\n const siblingParent =\n parentMapRef.current[next[insertIdx]] ||\n candidateParents.get(next[insertIdx]);\n if (siblingParent !== info.parentThreadId) break;\n insertIdx++;\n }\n next.splice(insertIdx, 0, info.threadId);\n }\n return next;\n });\n if (shouldRefreshThreads) {\n refreshThreads();\n }\n }\n }\n } catch {\n // Best effort: task cards and manual history still work if this poll fails.\n } finally {\n if (!stopped) {\n timer = setTimeout(hydrateAgentTeamTabs, 3000);\n }\n }\n }\n\n hydrateAgentTeamTabs();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [apiUrl, refreshThreads]);\n\n // Focus the composer when switching tabs\n useEffect(() => {\n if (!activeThreadId) return;\n // Small delay to ensure the tab is visible before focusing\n const t = setTimeout(() => {\n chatRefs.current.get(activeThreadId)?.focusComposer();\n }, 50);\n return () => clearTimeout(t);\n }, [activeThreadId]);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n // A margin keeps the active tab from sitting flush against either container\n // edge — at the right edge it was landing directly under the +/history/menu\n // buttons, which visually clipped the tab label.\n const activeTabRefCb = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n const MARGIN = 24;\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left + MARGIN) {\n container.scrollLeft += tabRect.left - containerRect.left - MARGIN;\n } else if (tabRect.right > containerRect.right - MARGIN) {\n container.scrollLeft += tabRect.right - containerRect.right + MARGIN;\n }\n });\n }, []);\n\n const [messageCounts, setMessageCounts] = useState<Record<string, number>>(\n () => Object.fromEntries(threads.map((t) => [t.id, t.messageCount ?? 0])),\n );\n\n // Sync message counts from threads when they load\n useEffect(() => {\n if (threads.length > 0) {\n setMessageCounts((prev) => {\n const next = { ...prev };\n for (const t of threads) {\n if (!(t.id in next)) {\n next[t.id] = t.messageCount ?? 0;\n }\n }\n return next;\n });\n }\n }, [threads]);\n\n // Listen for builder.submitChat postMessages\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE) {\n const item = normalizeAgentChatContextItem(event.data.data);\n if (!item) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar !== false) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n // Focus defaults to true; a caller opts out with `focus: false` for\n // passive context (e.g. a canvas selection) so staging never steals\n // focus from an in-progress inline editor.\n const focus = (event.data.data?.focus as boolean | undefined) !== false;\n setContextInTab(currentTabId, item, { focus });\n return;\n }\n if (event.data?.type === AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE) {\n const key =\n typeof event.data.data?.key === \"string\"\n ? event.data.data.key.trim()\n : \"\";\n if (!key) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n removeContextInTab(currentTabId, key);\n return;\n }\n if (event.data?.type === AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE) {\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n clearContextInTab(currentTabId);\n return;\n }\n const parsed = parseSubmitChatMessage(event);\n if (!parsed) return;\n // Dedup the live post against the cold-start replay; first one wins.\n if (!claimAgentChatSubmit(parsed.submitMessageId)) return;\n const {\n message,\n context,\n openSidebar,\n model,\n effort,\n newTab,\n background,\n submit,\n images,\n submitMessageId,\n } = parsed;\n const requestedTabId = parsed.tabId;\n const requestMode =\n parsed.requestMode ?? requestModeFromExecMode(props.execMode);\n\n // Make sure the sidebar is visible to show the response, unless the\n // caller explicitly opted out or it's a background send.\n if (openSidebar !== false && !background) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) {\n reportAgentChatSubmitResult(\n submitMessageId,\n false,\n \"composer-disabled\",\n );\n return;\n }\n\n // Plan mode is sent as request metadata by the chat adapter. Keep the\n // user-visible message clean so mode instructions never enter history.\n const fullMessage = context\n ? appendAgentChatContextToMessage(message, context)\n : message;\n\n const send: PendingSend = {\n message: fullMessage,\n images,\n submit,\n ...(background ? { trackInRunsTray: true } : {}),\n ...(requestMode ? { requestMode } : {}),\n ...(submitMessageId ? { submitMessageId } : {}),\n };\n\n const sendToTab = (threadId: string) => {\n if (isAgentChatSubmitCancelled(submitMessageId)) return;\n // If a model override was specified, apply it only if we recognize it\n if (model) {\n const matchedGroup = availableModels.find((g) =>\n g.models.includes(model),\n );\n if (matchedGroup) {\n const selectedEffort = resolveReasoningEffortSelection(\n model,\n isReasoningEffort(effort) ? effort : undefined,\n );\n threadModelRef.current.set(threadId, {\n model,\n engine: matchedGroup.engine,\n effort: selectedEffort,\n });\n bumpModelSelectionVersion();\n }\n }\n\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n deliverPendingSend(ref, send);\n } else {\n pendingDeliveries.current.push({ threadId, send });\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId)\n .then((newId) => {\n if (isAgentChatSubmitCancelled(submitMessageId)) return;\n if (!newId) {\n reportAgentChatSubmitResult(\n submitMessageId,\n false,\n \"thread-create-failed\",\n );\n return;\n }\n newThreadIds.current.add(newId);\n if (background) {\n mountedTabsRef.current.add(newId);\n }\n setOpenTabIds((prev) =>\n prev.includes(newId) ? prev : [...prev, newId],\n );\n if (!background) {\n writeThreadUrl(newId);\n }\n sendToTab(newId);\n if (background && previousTabId) {\n switchThreadState(previousTabId);\n }\n })\n .catch(() => {\n reportAgentChatSubmitResult(\n submitMessageId,\n false,\n \"thread-create-failed\",\n );\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (currentTabId) {\n sendToTab(currentTabId);\n } else {\n // Cold start: no thread yet. Queue for the first active thread (the\n // bootstrap effect creates it) rather than racing a second create.\n pendingDeliveries.current.push({ threadId: null, send });\n }\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [\n availableModels,\n bumpModelSelectionVersion,\n clearContextInTab,\n createThread,\n postMessageSubmissionsDisabled,\n props.execMode,\n removeContextInTab,\n setContextInTab,\n switchThread,\n switchThreadState,\n writeThreadUrl,\n ]);\n\n // Replay submits posted before this lazy panel's listener attached. Dedup in\n // the handler keeps a live + replayed message single.\n useEffect(() => {\n const buffered = drainBufferedAgentChatSubmits();\n for (const data of buffered) {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n data: { type: \"agentNative.submitChat\", data },\n origin: window.location.origin,\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Flush queued context items and sends once their thread's ref is mounted\n // (re-runs on ref mount via openTabIds and on cold-start target via\n // activeThreadId).\n useEffect(() => {\n for (const [tabId, items] of pendingContextItems.current) {\n const ref = chatRefs.current.get(tabId);\n if (!ref) continue;\n for (const item of items) ref.setComposerContextItem(item);\n pendingContextItems.current.delete(tabId);\n }\n\n if (pendingDeliveries.current.length === 0) return;\n const active = activeThreadIdRef.current;\n const remaining: PendingDelivery[] = [];\n for (const delivery of pendingDeliveries.current) {\n if (isAgentChatSubmitCancelled(delivery.send.submitMessageId)) continue;\n const threadId = delivery.threadId ?? active ?? null;\n const ref = threadId ? chatRefs.current.get(threadId) : null;\n if (threadId && ref) {\n const { send } = delivery;\n setTimeout(() => deliverPendingSend(ref, send), 50);\n } else {\n // Not ready — keep it, pinning the resolved threadId once known.\n remaining.push(threadId ? { threadId, send: delivery.send } : delivery);\n }\n }\n pendingDeliveries.current = remaining;\n }, [openTabIds, activeThreadId]);\n\n // Listen for chatRunning completion events\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const { isRunning, tabId } = detail;\n if (!tabId) return;\n\n setRunningThreads((prev) => {\n const next = new Set(prev);\n if (isRunning) {\n next.add(tabId);\n } else {\n next.delete(tabId);\n }\n return next;\n });\n };\n window.addEventListener(\"agentNative.chatRunning\", handler);\n return () => window.removeEventListener(\"agentNative.chatRunning\", handler);\n }, []);\n\n const addTab = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n writeThreadUrl(null);\n }\n return id;\n }, [createThread, writeThreadUrl]);\n\n const cleanupClosedTab = useCallback((tabId: string) => {\n if (parentMapRef.current[tabId]) {\n dismissedSubAgentTabsRef.current.add(tabId);\n }\n chatRefs.current.delete(tabId);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== tabId,\n );\n pendingContextItems.current.delete(tabId);\n newThreadIds.current.delete(tabId);\n threadModelRef.current.delete(tabId);\n // Clean up parent map and sub-agent names\n setParentMap((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentNames((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentStatuses((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const closeTab = useCallback(\n (tabId: string) => {\n setOpenTabIds((prev) => {\n if (prev.length <= 1) {\n // Last tab — create a new one and replace the old tab atomically\n createThread().then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n setOpenTabIds([newId]);\n writeThreadUrl(null);\n }\n });\n return prev; // Keep old tab until new one is ready\n }\n const next = prev.filter((id) => id !== tabId);\n if (tabId === activeThreadIdRef.current && next.length > 0) {\n const idx = prev.indexOf(tabId);\n switchThread(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n cleanupClosedTab(tabId);\n },\n [switchThread, createThread, cleanupClosedTab, writeThreadUrl],\n );\n\n const closeOtherTabs = useCallback(\n (tabId: string) => {\n for (const id of openTabIdsRef.current) {\n if (id !== tabId && parentMapRef.current[id]) {\n dismissedSubAgentTabsRef.current.add(id);\n }\n }\n setOpenTabIds([tabId]);\n if (activeThreadIdRef.current !== tabId) {\n switchThread(tabId);\n }\n // Clean up refs for closed tabs\n for (const key of chatRefs.current.keys()) {\n if (key !== tabId) {\n if (parentMapRef.current[key]) {\n dismissedSubAgentTabsRef.current.add(key);\n }\n chatRefs.current.delete(key);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== key,\n );\n pendingContextItems.current.delete(key);\n newThreadIds.current.delete(key);\n threadModelRef.current.delete(key);\n }\n }\n // Clean up parent map and sub-agent names — only keep entries for the surviving tab\n setParentMap((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentNames((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentStatuses((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n },\n [switchThread],\n );\n\n const closeAllTabs = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n switchThreadState(id);\n writeThreadUrl(null);\n dismissedSubAgentTabsRef.current.clear();\n // Clean up all old refs\n chatRefs.current.clear();\n pendingDeliveries.current = [];\n pendingContextItems.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n setSubAgentStatuses({});\n }\n }, [createThread, switchThreadState, writeThreadUrl]);\n\n // Keyboard shortcuts dispatched from AgentPanel based on the active mode\n useEffect(() => {\n const handleCloseCurrent = () => {\n const id = activeThreadIdRef.current;\n if (id) closeTab(id);\n };\n const handleCloseAll = () => {\n void closeAllTabs();\n };\n const handleNewChat = () => {\n void addTab();\n };\n window.addEventListener(\"agent-chat:close-current-tab\", handleCloseCurrent);\n window.addEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.addEventListener(\"agent-chat:new-chat\", handleNewChat);\n return () => {\n window.removeEventListener(\n \"agent-chat:close-current-tab\",\n handleCloseCurrent,\n );\n window.removeEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.removeEventListener(\"agent-chat:new-chat\", handleNewChat);\n };\n }, [closeTab, closeAllTabs, addTab]);\n\n useEffect(() => {\n const handleOpenThread = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | {\n threadId?: unknown;\n newThread?: unknown;\n onlyIfActiveThreadId?: unknown;\n openRequestId?: unknown;\n }\n | undefined;\n const threadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : \"\";\n if (!detail || !threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n\n const onlyIfActiveThreadId =\n typeof detail.onlyIfActiveThreadId === \"string\"\n ? detail.onlyIfActiveThreadId.trim()\n : \"\";\n const activeThreadId = activeThreadIdRef.current;\n if (\n onlyIfActiveThreadId &&\n activeThreadId &&\n activeThreadId !== onlyIfActiveThreadId\n ) {\n return;\n }\n\n if (detail?.newThread === true) {\n newThreadIds.current.add(threadId);\n void createThread(threadId).then((createdId) => {\n if (!createdId) return;\n setOpenTabIds((prev) =>\n prev.includes(createdId) ? prev : [...prev, createdId],\n );\n writeThreadUrl(null);\n });\n return;\n }\n setOpenTabIds((prev) =>\n prev.includes(threadId) ? prev : [...prev, threadId],\n );\n switchThread(threadId);\n };\n\n window.addEventListener(\"agent-chat:open-thread\", handleOpenThread);\n return () =>\n window.removeEventListener(\"agent-chat:open-thread\", handleOpenThread);\n }, [createThread, switchThread, writeThreadUrl]);\n\n const clearActiveTab = useCallback(() => {\n const tabIdToClear = activeThreadIdRef.current;\n void addTab().then((newTabId) => {\n if (!tabIdToClear || !newTabId || tabIdToClear === newTabId) return;\n setOpenTabIds((prev) => {\n const next = prev.filter((id) => id !== tabIdToClear);\n return next.includes(newTabId) ? next : [...next, newTabId];\n });\n cleanupClosedTab(tabIdToClear);\n });\n }, [addTab, cleanupClosedTab]);\n\n const openFromHistory = useCallback(\n (threadId: string) => {\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n },\n [openTabIds, switchThread],\n );\n\n // Listen for agent-task-open events (from AgentTaskCard \"Open\" button)\n useEffect(() => {\n function handleOpenTask(e: Event) {\n const detail = (e as CustomEvent).detail;\n const threadId = detail?.threadId;\n if (!threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n dismissedSubAgentTabsRef.current.delete(threadId);\n // Prefer an explicit parent (RunsTray/background hydration knows it);\n // inline task cards fall back to the active orchestrator thread.\n const explicitParentId =\n typeof detail?.parentThreadId === \"string\"\n ? detail.parentThreadId.trim()\n : \"\";\n const parentId = explicitParentId || activeThreadIdRef.current;\n if (parentId && parentId !== threadId) {\n setParentMap((prev) =>\n prev[threadId] === parentId\n ? prev\n : { ...prev, [threadId]: parentId },\n );\n }\n // Store the sub-agent name/description for the tab label\n const name = detail.name || detail.description || \"\";\n if (name) {\n setSubAgentNames((prev) =>\n prev[threadId] === name ? prev : { ...prev, [threadId]: name },\n );\n }\n // Refresh thread list so the new sub-agent thread appears with its title\n refreshThreads();\n // Open the sub-agent thread as a tab — insert after parent for visual grouping\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => {\n if (parentId) {\n const parentIdx = prev.indexOf(parentId);\n if (parentIdx !== -1) {\n // Insert after the parent (and any existing children of that parent)\n const next = [...prev];\n let insertIdx = parentIdx + 1;\n // Skip past any existing children of the same parent\n while (\n insertIdx < next.length &&\n parentMap[next[insertIdx]] === parentId\n ) {\n insertIdx++;\n }\n next.splice(insertIdx, 0, threadId);\n return next;\n }\n }\n return [...prev, threadId];\n });\n }\n switchThread(threadId);\n }\n window.addEventListener(\"agent-task-open\", handleOpenTask);\n return () => window.removeEventListener(\"agent-task-open\", handleOpenTask);\n }, [openTabIds, switchThread, refreshThreads, parentMap]);\n\n // Replay thread/task opens requested before this lazy panel's listeners\n // attached. Live events claim their id; replay drains only unclaimed requests.\n useEffect(() => {\n const buffered = drainBufferedAgentChatOpenRequests();\n for (const request of buffered) {\n window.dispatchEvent(\n new CustomEvent(request.eventType, { detail: request.detail }),\n );\n }\n }, []);\n\n // Watch for agent-issued chat-command in application-state. The shared\n // DB-sync transport advances this key-specific version, so the command gets\n // one initial read and one read per actual write instead of a 2s loop.\n const lastChatCommandRef = useRef(0);\n const chatCommandVersion = useChangeVersion(\"app-state:chat-command\");\n useEffect(() => {\n let stopped = false;\n\n async function readChatCommand() {\n if (stopped) return;\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n );\n if (res.ok) {\n const data = await res.json();\n if (\n data?.value?.command === \"open-thread\" &&\n data.value.threadId &&\n data.value.timestamp > lastChatCommandRef.current\n ) {\n lastChatCommandRef.current = data.value.timestamp;\n const threadId = data.value.threadId as string;\n // Open the thread as a tab and focus it\n setOpenTabIds((prev) =>\n prev.includes(threadId) ? prev : [...prev, threadId],\n );\n switchThread(threadId);\n // Clear the command\n fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n }\n }\n } catch {}\n }\n\n void readChatCommand();\n return () => {\n stopped = true;\n };\n }, [chatCommandVersion, switchThread]);\n\n const handleGenerateTitle = useCallback(\n (threadId: string, message: string) => {\n generateTitle(threadId, message).then((title) => {\n if (title) {\n // Persist the generated title to the server\n saveThreadData(threadId, {\n threadData: \"\",\n title,\n preview: message.slice(0, 120),\n titleSource: \"generated\",\n });\n }\n });\n },\n [generateTitle, saveThreadData],\n );\n\n const handleSaveThread = useCallback(\n (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => {\n saveThreadData(threadId, data);\n if (\n data.messageCount > 0 &&\n threadId === activeThreadIdRef.current &&\n urlThreadIdRef.current !== threadId\n ) {\n writeThreadUrl(threadId);\n }\n },\n [saveThreadData, writeThreadUrl],\n );\n\n // ─── Slash command handler ──────────────────────────────────────────\n const [helpVisible, setHelpVisible] = useState(false);\n\n const handleSlashCommand = useCallback(\n (command: string) => {\n switch (command) {\n case \"clear\":\n case \"new\":\n addTab();\n break;\n case \"history\":\n setShowHistory(true);\n break;\n case \"plan\":\n props.onExecModeChange?.(\"plan\");\n break;\n case \"act\":\n props.onExecModeChange?.(\"build\");\n break;\n case \"help\":\n setHelpVisible(true);\n break;\n }\n },\n [addTab, props.onExecModeChange],\n );\n\n const handleForkChat = useCallback(\n async (sourceThreadId: string) => {\n const sourceSnapshot =\n chatRefs.current.get(sourceThreadId)?.exportThreadSnapshot() ?? null;\n const forkedId = await forkThread(sourceThreadId, sourceSnapshot);\n if (!forkedId) return false;\n setOpenTabIds((prev) => {\n const idx = prev.indexOf(sourceThreadId);\n if (idx !== -1) {\n const next = [...prev];\n next.splice(idx + 1, 0, forkedId);\n return next;\n }\n return [...prev, forkedId];\n });\n switchThread(forkedId);\n return true;\n },\n [forkThread, switchThread],\n );\n\n // Build tabs from open thread IDs. During the first thread-list fetch,\n // `activeThreadId` is seeded synchronously so the chat can mount before\n // persisted open tabs have been reconciled.\n const visibleOpenTabIds =\n activeThreadId && !openTabIds.includes(activeThreadId)\n ? [...openTabIds, activeThreadId]\n : openTabIds;\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n const tabs: ChatTab[] = visibleOpenTabIds\n .filter((id) => threadMap.has(id) || id === activeThreadId)\n .map((id) => {\n const t = threadMap.get(id);\n const agentTeamStatus = chatTabStatusFromAgentTeamStatus(\n subAgentStatuses[id],\n );\n return {\n id,\n label: t?.title || t?.preview?.slice(0, 30) || \"New chat\",\n status:\n agentTeamStatus ??\n (runningThreads.has(id)\n ? (\"running\" as const)\n : (messageCounts[id] ?? t?.messageCount ?? 0) > 0\n ? (\"completed\" as const)\n : (\"idle\" as const)),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n };\n });\n\n // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)\n for (const id of visibleOpenTabIds) {\n if (!tabs.some((t) => t.id === id)) {\n tabs.push({\n id,\n label:\n subAgentNames[id] || (parentMap[id] ? \"Sub-agent...\" : \"New chat\"),\n status:\n chatTabStatusFromAgentTeamStatus(subAgentStatuses[id]) ??\n (\"running\" as const),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n });\n }\n }\n\n const headerProps: MultiTabAssistantChatHeaderProps = {\n tabs,\n activeTabId: activeThreadId ?? \"\",\n activeTabMessageCount: activeThreadId\n ? (messageCounts[activeThreadId] ?? 0)\n : 0,\n setActiveTabId: switchThread,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n clearActiveTab,\n showHistory,\n toggleHistory: () => setShowHistory((v) => !v),\n tabCount: visibleOpenTabIds.length,\n };\n\n // Wait for the first thread-list pass only when there is no synchronously\n // seeded active thread. Suggestion loading and thread-list reconciliation\n // should not block the chat shell from mounting.\n if (isLoading && !activeThreadId) {\n return (\n <ChatSkeleton\n header={renderHeader?.(headerProps)}\n headerOnly={contentHidden}\n />\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\",\n }}\n />\n {renderHeader\n ? renderHeader(headerProps)\n : showTabBar\n ? (() => {\n const activeTab = tabs.find((t) => t.id === activeThreadId);\n const focusParentId = activeTab?.parentThreadId || activeThreadId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mainTabs.map((tab) => {\n const isActive =\n tab.id === activeThreadId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n ref={isActive ? activeTabRefCb : undefined}\n className={cn(\n \"agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]\",\n isActive\n ? \"bg-accent text-foreground ring-1 ring-inset ring-border/60 shadow-sm\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <TooltipProvider delayDuration={200}>\n <div className=\"flex items-center gap-px shrink-0 ms-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setShowHistory(!showHistory)}\n aria-label=\"All chats\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>All chats</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </div>\n {hasSubTabs && (\n <div className=\"flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <button\n onClick={() => switchThread(focusParentId!)}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeThreadId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </button>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n ref={\n tab.id === activeThreadId\n ? activeTabRefCb\n : undefined\n }\n className={cn(\n \"agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]\",\n tab.id === activeThreadId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()\n : null}\n\n {/* Chat content with optional overlay */}\n <div\n className={cn(\n \"relative flex-1 flex flex-col min-h-0\",\n renderOverlay && \"pt-14\",\n )}\n data-agent-page-chat-topbar={renderOverlay ? \"\" : undefined}\n data-agent-page-chat-scrolled={\n renderOverlay && pageOverlayScrolled ? \"\" : undefined\n }\n onScrollCapture={renderOverlay ? handlePageOverlayScroll : undefined}\n >\n {renderOverlay ? renderOverlay(headerProps) : null}\n\n {/* History popover — rendered inside relative container so positioning works */}\n {showHistory && (\n <HistoryPopover\n threads={threads}\n openTabIds={new Set(openTabIds)}\n activeThreadId={activeThreadId}\n hasMoreThreads={hasMoreThreads}\n isLoadingMoreThreads={isLoadingMoreThreads}\n loadError={threadsLoadError}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onLoadMore={loadMoreThreads}\n onSearch={searchThreads}\n onTogglePin={pinThread}\n onRename={renameThread}\n />\n )}\n\n {/* Help popover — shown by /help slash command */}\n {helpVisible && <HelpPopover onClose={() => setHelpVisible(false)} />}\n\n {/* Render tabs that have been activated at least once, hide inactive ones to preserve state.\n Sub-agent tabs are only mounted when first focused — prevents stale restore from running\n while the component is display:none before the user switches to it. */}\n {[...new Set(visibleOpenTabIds)]\n .filter(\n (tabId) =>\n tabId === activeThreadId || mountedTabsRef.current.has(tabId),\n )\n .map((tabId) => {\n const modelSelection = resolveThreadModelSelection(tabId);\n const tabDynamicSuggestions =\n tabId === activeThreadId && !contentHidden\n ? props.dynamicSuggestions\n : false;\n return (\n <div\n key={tabId}\n className=\"flex-1 min-h-0 flex-col\"\n style={{\n display:\n contentHidden || tabId !== activeThreadId ? \"none\" : \"flex\",\n }}\n >\n <RunStuckBanner\n threadId={tabId}\n enabled={tabId === activeThreadId}\n apiUrl={apiUrl}\n autoRetry\n autoRetryOwnerId={browserTabId}\n hasInFlightWork={() =>\n chatRefs.current.get(tabId)?.hasInFlightWork() ?? false\n }\n onRetry={() => {\n const handle = chatRefs.current.get(tabId);\n handle?.sendRecoveryMessage(\n \"Continue from where you left off and finish my last request. Do not repeat completed work.\",\n \"continue\",\n );\n }}\n />\n <AssistantChat\n {...props}\n dynamicSuggestions={tabDynamicSuggestions}\n ref={(handle) => {\n if (handle) {\n chatRefs.current.set(tabId, handle);\n } else {\n chatRefs.current.delete(tabId);\n }\n }}\n threadId={tabId}\n tabId={tabId}\n browserTabId={browserTabId}\n isActiveComposer={tabId === activeThreadId}\n apiUrl={apiUrl}\n isNewThread={\n newThreadIds.current.has(tabId) || isNewThread(tabId)\n }\n onMessageCountChange={(count) =>\n setMessageCounts((prev) =>\n prev[tabId] === count\n ? prev\n : { ...prev, [tabId]: count },\n )\n }\n onSaveThread={handleSaveThread}\n onGenerateTitle={handleGenerateTitle}\n onSlashCommand={handleSlashCommand}\n selectedModel={modelSelection?.model}\n selectedEngine={modelSelection?.engine}\n selectedEffort={\n modelSelection?.effort ?? DEFAULT_REASONING_EFFORT\n }\n composerSlot={props.composerSlot}\n defaultModel={defaultModel}\n availableModels={availableModels}\n modelListLoading={modelListLoading}\n onModelChange={handleModelChange}\n onEffortChange={handleEffortChange}\n onForkChat={() => handleForkChat(tabId)}\n // Sub-agent tabs are read-only: sending a new message from the\n // sub-agent tab would start a fresh run on that thread and kill\n // the in-flight team chunk. Disable the composer and show a\n // hint so users know to send via the orchestrator chat instead.\n composerDisabled={Boolean(parentMap[tabId])}\n composerDisabledPlaceholder={\n parentMap[tabId]\n ? \"Send messages to the orchestrator chat — this sub-agent runs automatically\"\n : undefined\n }\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconPlus, IconHistory, IconX } from \"@tabler/icons-react\";\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\n\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n DEFAULT_REASONING_EFFORT,\n isReasoningEffort,\n resolveReasoningEffortSelection,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\nimport {\n AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE,\n appendAgentChatContextToMessage,\n claimAgentChatOpenRequest,\n claimAgentChatSubmit,\n drainBufferedAgentChatOpenRequests,\n drainBufferedAgentChatSubmits,\n getAgentChatContextState,\n isAgentChatSubmitCancelled,\n normalizeAgentChatContextItem,\n parseSubmitChatMessage,\n removeAgentChatContextItem,\n reportAgentChatSubmitResult,\n setAgentChatContextItem,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\nimport { agentNativePath, appPath } from \"./api-path.js\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport {\n buildChatModelGroups,\n type EngineModelGroup,\n} from \"./chat-model-groups.js\";\nimport {\n ChatHistoryList,\n type ChatHistoryItem,\n type ChatHistorySection,\n} from \"./chat/ChatHistoryList.js\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n} from \"./components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { callAction } from \"./use-action.js\";\nimport { useChangeVersion } from \"./use-change-version.js\";\nimport { CHAT_MODEL_SELECTION_CHANGED_EVENT } from \"./use-chat-models.js\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\nimport { cn } from \"./utils.js\";\n\ninterface ModelSelection {\n model: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\ninterface PendingSend {\n message: string;\n images?: string[];\n submit: boolean;\n trackInRunsTray?: boolean;\n requestMode?: \"act\" | \"plan\";\n /** Correlates with `AGENT_CHAT_SUBMIT_RESULT_EVENT` — see agent-chat.ts. */\n submitMessageId?: string;\n}\n\n/**\n * A send queued until its target thread is ready. `threadId: null` targets the\n * first thread to become active (cold start); a concrete id is a thread whose\n * chat ref hasn't mounted yet. Drained by the flush effect.\n */\ninterface PendingDelivery {\n threadId: string | null;\n send: PendingSend;\n}\n\n/** The single path that hands a queued send to a mounted chat ref. */\nfunction deliverPendingSend(ref: AssistantChatHandle, send: PendingSend): void {\n if (isAgentChatSubmitCancelled(send.submitMessageId)) return;\n if (!send.submit) {\n ref.prefillMessage(send.message);\n return;\n }\n if (send.trackInRunsTray || send.requestMode || send.submitMessageId) {\n ref.sendMessage(send.message, send.images, {\n ...(send.trackInRunsTray ? { trackInRunsTray: true } : {}),\n ...(send.requestMode ? { requestMode: send.requestMode } : {}),\n ...(send.submitMessageId\n ? { submitMessageId: send.submitMessageId }\n : {}),\n });\n } else {\n ref.sendMessage(send.message, send.images);\n }\n}\n\nconst MODEL_SELECTION_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\nfunction readStoredModelSelection(key: string): ModelSelection | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<ModelSelection>;\n if (typeof parsed.model !== \"string\" || !parsed.model.trim()) {\n return undefined;\n }\n const selection: ModelSelection = {\n model: parsed.model,\n effort: resolveReasoningEffortSelection(\n parsed.model,\n isReasoningEffort(parsed.effort) ? parsed.effort : undefined,\n ),\n };\n if (typeof parsed.engine === \"string\") selection.engine = parsed.engine;\n return selection;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredModelSelection(key: string, selection: ModelSelection) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(selection));\n queueMicrotask(() => {\n window.dispatchEvent(\n new CustomEvent(CHAT_MODEL_SELECTION_CHANGED_EVENT, {\n detail: { key },\n }),\n );\n });\n } catch {}\n}\n\nfunction resolveModelSelection(\n selection: ModelSelection | undefined,\n groups: EngineModelGroup[],\n): ModelSelection | undefined {\n if (!selection?.model) return undefined;\n if (groups.length === 0) {\n return {\n model: selection.model,\n effort: resolveReasoningEffortSelection(\n selection.model,\n selection.effort,\n ),\n };\n }\n const preferredGroup = groups.find(\n (group) =>\n group.engine === selection.engine &&\n group.models.includes(selection.model),\n );\n const fallbackGroup = groups.find((group) =>\n group.models.includes(selection.model),\n );\n if (groups.length > 0 && !preferredGroup && !fallbackGroup) {\n return undefined;\n }\n const engine =\n preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;\n if (!engine && groups.length > 0) return undefined;\n\n const effort = resolveReasoningEffortSelection(\n selection.model,\n selection.effort,\n );\n const resolved: ModelSelection = { model: selection.model, effort };\n if (engine) resolved.engine = engine;\n return resolved;\n}\n\n// ─── Skeleton Loader ─────────────────────────────────────────────────────────\n\nfunction ChatSkeleton({\n header,\n headerOnly = false,\n}: {\n header?: React.ReactNode;\n headerOnly?: boolean;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n headerOnly ? \"shrink-0\" : \"flex-1 h-full\",\n )}\n >\n {header ?? (\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"h-[22px] w-20 rounded-md bg-muted animate-pulse\" />\n <div className=\"ms-auto flex gap-0.5\">\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n </div>\n </div>\n )}\n {!headerOnly && (\n <div className=\"flex-1 flex flex-col gap-3 p-4\">\n <div className=\"flex justify-center py-8\">\n <div className=\"h-10 w-10 rounded-full bg-muted animate-pulse\" />\n </div>\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse mx-auto\" />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Resource context ────────────────────────────────────────────────────────\n\nfunction formatScopeType(type: string) {\n return type.replace(/[-_]+/g, \" \");\n}\n\n// ─── History Popover ─────────────────────────────────────────────────────────\n\nfunction formatThreadTime(ts: number): string {\n const d = new Date(ts);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0)\n return d.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return d.toLocaleDateString([], { weekday: \"short\" });\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n}\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n hasMoreThreads = false,\n isLoadingMoreThreads = false,\n loadError,\n onSelect,\n onClose,\n onLoadMore,\n onSearch,\n onTogglePin,\n onRename,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n hasMoreThreads?: boolean;\n isLoadingMoreThreads?: boolean;\n loadError?: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onLoadMore?: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\n /** Presence enables the pin/unpin row action. Receives the thread's\n * current pinned state so the caller can flip it. */\n onTogglePin?: (id: string, pinned: boolean) => void;\n /** Presence enables the inline rename row action. */\n onRename?: (id: string, nextTitle: string) => void;\n}) {\n const [search, setSearch] = useState(\"\");\n const [searchResults, setSearchResults] = useState<\n ChatThreadSummary[] | null\n >(null);\n const [isSearching, setIsSearching] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Debounced server-side search\n const searchIdRef = useRef(0);\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const q = search.trim();\n if (!q) {\n searchIdRef.current++;\n setSearchResults(null);\n setIsSearching(false);\n return;\n }\n setIsSearching(true);\n const id = ++searchIdRef.current;\n debounceRef.current = setTimeout(async () => {\n if (onSearch) {\n const results = await onSearch(q);\n if (id !== searchIdRef.current) return;\n setSearchResults(results);\n } else {\n // Fallback to client-side filtering\n setSearchResults(null);\n }\n setIsSearching(false);\n }, 250);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [search, onSearch]);\n\n // Hide empty threads from the history list — except the currently-active\n // one. The active thread always belongs in the list so the user can see\n // they're in it (the previous filter dropped a brand-new chat the user\n // had just opened, making them think their chat had vanished).\n const visibleThreads = threads.filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n );\n\n const filtered = search.trim()\n ? (searchResults ?? visibleThreads).filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n )\n : visibleThreads;\n\n // Pinned threads always float to the top of `threads` already (see\n // `sortThreadSummaries` in use-chat-threads.ts and the matching server\n // ORDER BY), but pulling them into their own labeled section — instead of\n // just relying on sort order within \"All chats\" — makes the pin affordance\n // visible at a glance, matching common chat-history UX.\n const pinnedThreads = filtered.filter((t) => t.pinnedAt != null);\n const unpinnedThreads = filtered.filter((t) => t.pinnedAt == null);\n\n const toHistoryItem = (thread: ChatThreadSummary): ChatHistoryItem => {\n const isActive = thread.id === activeThreadId;\n const title = thread.title || thread.preview || \"Chat\";\n return {\n id: thread.id,\n title,\n titleText: title,\n subtitle:\n thread.preview && thread.title !== thread.preview\n ? thread.preview\n : undefined,\n timestamp: isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatThreadTime(thread.updatedAt),\n pinned: thread.pinnedAt != null,\n };\n };\n\n const historySections: ChatHistorySection[] = [\n ...(pinnedThreads.length > 0\n ? [\n {\n id: \"pinned\",\n label: \"Pinned\",\n items: pinnedThreads.map(toHistoryItem),\n },\n ]\n : []),\n { id: \"all\", items: unpinnedThreads.map(toHistoryItem) },\n ];\n\n return (\n <Popover open onOpenChange={(open) => !open && onClose()}>\n <PopoverAnchor asChild>\n <span aria-hidden className=\"absolute end-2 top-0 h-px w-px\" />\n </PopoverAnchor>\n <PopoverContent\n align=\"end\"\n side=\"bottom\"\n sideOffset={0}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }}\n className=\"w-72 rounded-lg p-0\"\n >\n <ChatHistoryList\n sections={historySections}\n activeId={activeThreadId}\n onSelect={(id) => {\n onSelect(id);\n onClose();\n }}\n onTogglePin={\n onTogglePin\n ? (id) => {\n const isPinned =\n threads.find((t) => t.id === id)?.pinnedAt != null;\n onTogglePin(id, !isPinned);\n }\n : undefined\n }\n onRename={onRename}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder=\"Search chats...\"\n searchInputRef={inputRef}\n loading={isSearching}\n loadingLabel=\"Searching...\"\n error={loadError && !search.trim() ? loadError : undefined}\n emptyLabel=\"No chats yet\"\n emptySearchLabel=\"No matching chats\"\n footer={\n !search.trim() && hasMoreThreads ? (\n <button\n type=\"button\"\n onClick={() => onLoadMore?.()}\n disabled={isLoadingMoreThreads}\n className=\"mx-1 mt-1 flex w-[calc(100%-0.5rem)] items-center justify-center rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-default disabled:opacity-60\"\n >\n {isLoadingMoreThreads ? \"Loading...\" : \"Load older chats\"}\n </button>\n ) : undefined\n }\n />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Help Popover ────────────────────────────────────────────────────────────\n\nfunction HelpPopover({ onClose }: { onClose: () => void }) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const commands = [\n {\n name: \"/clear\",\n description: \"Start a new chat (keeps current chat in history)\",\n },\n { name: \"/new\", description: \"Same as /clear\" },\n { name: \"/history\", description: \"Browse all chats\" },\n { name: \"/plan\", description: \"Switch to read-only planning\" },\n { name: \"/act\", description: \"Switch back to acting\" },\n { name: \"/help\", description: \"Show this list of commands\" },\n { name: \"@\", description: \"Mention files, agents, or resources\" },\n ];\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute end-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-foreground\">\n Available Commands\n </span>\n <button\n onClick={onClose}\n aria-label=\"Close help\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX size={12} />\n </button>\n </div>\n <div className=\"py-1\">\n {commands.map((cmd) => (\n <div key={cmd.name} className=\"px-3 py-1.5\">\n <div className=\"text-xs font-medium text-foreground\">\n {cmd.name}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {cmd.description}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ChatTab {\n id: string;\n label: string;\n status: \"idle\" | \"running\" | \"completed\";\n /** If this tab is a sub-agent, the parent thread ID */\n parentThreadId?: string;\n /** Short name for sub-agent tabs (e.g. \"Research\", \"Draft email\") */\n subAgentName?: string;\n}\n\ntype AgentTeamRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\ninterface AgentTeamRunSummary {\n title?: string;\n status?: AgentTeamRunStatus;\n sourceRecord?: {\n type?: string;\n threadId?: unknown;\n parentThreadId?: unknown;\n name?: unknown;\n };\n metadata?: Record<string, unknown>;\n}\n\ninterface AgentTeamTabInfo {\n threadId: string;\n parentThreadId: string;\n name: string;\n status: AgentTeamRunStatus;\n}\n\nfunction readString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction requestModeFromExecMode(\n value: AssistantChatProps[\"execMode\"],\n): \"act\" | \"plan\" | undefined {\n if (value === \"plan\") return \"plan\";\n if (value === \"build\") return \"act\";\n return undefined;\n}\n\nfunction isActiveAgentTeamStatus(status?: AgentTeamRunStatus): boolean {\n return (\n status === \"queued\" ||\n status === \"running\" ||\n status === \"paused\" ||\n status === \"needs-approval\"\n );\n}\n\nfunction chatTabStatusFromAgentTeamStatus(\n status?: AgentTeamRunStatus,\n): ChatTab[\"status\"] | undefined {\n if (!status) return undefined;\n return isActiveAgentTeamStatus(status) ? \"running\" : \"completed\";\n}\n\nconst STALE_THREAD_THRESHOLD_MS = 12 * 60 * 60 * 1000;\nconst DEFAULT_THREAD_URL_PARAM = \"thread\";\nconst THREAD_URL_CHANGED_EVENT = \"agent-chat:url-thread-changed\";\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// The history patch is installed once and shared via a ref count so that\n// multiple synced chats (or a remount) don't restore a stale `pushState`\n// reference and silently drop a wrapper installed by another instance.\nlet historyPatchRefCount = 0;\nlet restoreHistoryPatch: (() => void) | null = null;\n\nfunction installHistoryThreadUrlPatch(): () => void {\n if (typeof window === \"undefined\") return () => {};\n historyPatchRefCount += 1;\n if (historyPatchRefCount === 1) {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n const dispatchUrlChange = () => {\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n };\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n restoreHistoryPatch = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }\n return () => {\n historyPatchRefCount = Math.max(0, historyPatchRefCount - 1);\n if (historyPatchRefCount === 0) {\n restoreHistoryPatch?.();\n restoreHistoryPatch = null;\n }\n };\n}\n\nexport interface ChatThreadUrlSyncOptions {\n /** Query-string parameter used by the generic URL adapter. Default: `thread`. */\n paramName?: string;\n /**\n * Route-owned thread id. Pass `null` for the create route and a string for\n * thread routes like `/chat/:threadId`.\n */\n routeThreadId?: string | null;\n /** Build the URL path for a thread id, or for create mode when id is null. */\n getPath?: (threadId: string | null) => string;\n /** Optional router navigation callback used with `getPath`. */\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n}\n\nfunction normalizeUrlThreadId(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction resolveThreadUrlSync(\n value: MultiTabAssistantChatProps[\"threadUrlSync\"],\n): {\n enabled: boolean;\n paramName: string;\n routeThreadId?: string | null;\n getPath?: (threadId: string | null) => string;\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n} {\n if (!value) return { enabled: false, paramName: DEFAULT_THREAD_URL_PARAM };\n if (value === true) {\n return { enabled: true, paramName: DEFAULT_THREAD_URL_PARAM };\n }\n return {\n enabled: true,\n paramName: value.paramName?.trim() || DEFAULT_THREAD_URL_PARAM,\n ...(hasOwn.call(value, \"routeThreadId\")\n ? { routeThreadId: normalizeUrlThreadId(value.routeThreadId) }\n : {}),\n ...(value.getPath ? { getPath: value.getPath } : {}),\n ...(value.navigate ? { navigate: value.navigate } : {}),\n };\n}\n\nfunction readUrlThreadId(paramName: string): string | null {\n if (typeof window === \"undefined\") return null;\n try {\n const params = new URLSearchParams(window.location.search);\n return normalizeUrlThreadId(\n params.get(paramName) ??\n (paramName === DEFAULT_THREAD_URL_PARAM\n ? params.get(\"threadId\")\n : null),\n );\n } catch {\n return null;\n }\n}\n\nfunction runToAgentTeamTabInfo(\n run: AgentTeamRunSummary,\n): AgentTeamTabInfo | null {\n if (run.sourceRecord?.type && run.sourceRecord.type !== \"agent-team-task\") {\n return null;\n }\n const metadata = run.metadata ?? {};\n const threadId =\n readString(run.sourceRecord?.threadId) || readString(metadata.threadId);\n const parentThreadId =\n readString(run.sourceRecord?.parentThreadId) ||\n readString(metadata.parentThreadId);\n if (!threadId || !parentThreadId || threadId === parentThreadId) return null;\n const name =\n readString(run.sourceRecord?.name) ||\n readString(metadata.name) ||\n readString(run.title) ||\n \"Sub-agent\";\n return {\n threadId,\n parentThreadId,\n name,\n status: run.status ?? \"unknown\",\n };\n}\n\nexport interface MultiTabAssistantChatHeaderProps {\n tabs: ChatTab[];\n activeTabId: string;\n activeTabMessageCount: number;\n setActiveTabId: (tabId: string) => void;\n addTab: () => void;\n closeTab: (tabId: string) => void;\n closeOtherTabs: (tabId: string) => void;\n closeAllTabs: () => void;\n clearActiveTab: () => void;\n /** Open the history popover */\n showHistory?: boolean;\n toggleHistory?: () => void;\n /** Number of open tabs (useful for triggering scroll on tab count change) */\n tabCount: number;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\nexport type MultiTabAssistantChatProps = Omit<\n AssistantChatProps,\n \"tabId\" | \"threadId\"\n> & {\n /** Show the tab bar. Default: true */\n showTabBar?: boolean;\n /** Optional custom single-row header renderer */\n renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Optional page-level top-bar actions renderer for the active tab. */\n renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */\n contentHidden?: boolean;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n /** Restore the previously active thread and open tabs from localStorage. */\n restoreActiveThread?: boolean;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /**\n * Keep the active thread in URL state. `true` uses the generic `?thread=id`\n * adapter; passing `routeThreadId` + `getPath` lets an app bind chats to\n * route params such as `/chat/:threadId`.\n */\n threadUrlSync?: boolean | ChatThreadUrlSyncOptions;\n /** Ambient resource context to show as a composer chip. */\n scope?: ChatThreadScope | null;\n /** @deprecated Scope context is now rendered in the composer. */\n showScopeBadge?: boolean;\n};\n\nexport function MultiTabAssistantChat({\n showTabBar = true,\n renderHeader,\n renderOverlay,\n contentHidden = false,\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey,\n restoreActiveThread = true,\n browserTabId,\n threadUrlSync = false,\n scope = null,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n enabled: threadUrlSyncEnabled,\n paramName: threadUrlParamName,\n routeThreadId,\n getPath: getThreadPath,\n navigate: navigateThreadUrl,\n } = resolveThreadUrlSync(threadUrlSync);\n const threadRouteControlsActiveThread =\n threadUrlSyncEnabled &&\n threadUrlSync !== true &&\n typeof threadUrlSync === \"object\" &&\n hasOwn.call(threadUrlSync, \"routeThreadId\");\n const [urlThreadId, setUrlThreadId] = useState<string | null>(() =>\n threadUrlSyncEnabled\n ? threadRouteControlsActiveThread\n ? (routeThreadId ?? readUrlThreadId(threadUrlParamName))\n : readUrlThreadId(threadUrlParamName)\n : null,\n );\n const [deepLinkedThreadId] = useState<string | null>(() =>\n threadUrlSyncEnabled ? null : readUrlThreadId(DEFAULT_THREAD_URL_PARAM),\n );\n const [activeDeepLinkedThreadId, setActiveDeepLinkedThreadId] =\n useState(deepLinkedThreadId);\n const urlThreadIdRef = useRef(urlThreadId);\n urlThreadIdRef.current = urlThreadId;\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || threadRouteControlsActiveThread) return;\n const update = () => setUrlThreadId(readUrlThreadId(threadUrlParamName));\n const uninstallHistoryPatch = installHistoryThreadUrlPatch();\n update();\n window.addEventListener(\"popstate\", update);\n window.addEventListener(THREAD_URL_CHANGED_EVENT, update);\n return () => {\n uninstallHistoryPatch();\n window.removeEventListener(\"popstate\", update);\n window.removeEventListener(THREAD_URL_CHANGED_EVENT, update);\n };\n }, [\n threadRouteControlsActiveThread,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ]);\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || !threadRouteControlsActiveThread) return;\n setUrlThreadId(routeThreadId ?? readUrlThreadId(threadUrlParamName));\n }, [\n routeThreadId,\n threadRouteControlsActiveThread,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ]);\n\n useEffect(() => {\n if (threadUrlSyncEnabled) return;\n const update = () =>\n setActiveDeepLinkedThreadId(readUrlThreadId(DEFAULT_THREAD_URL_PARAM));\n const uninstallHistoryPatch = installHistoryThreadUrlPatch();\n update();\n window.addEventListener(\"popstate\", update);\n window.addEventListener(THREAD_URL_CHANGED_EVENT, update);\n return () => {\n uninstallHistoryPatch();\n window.removeEventListener(\"popstate\", update);\n window.removeEventListener(THREAD_URL_CHANGED_EVENT, update);\n };\n }, [threadUrlSyncEnabled]);\n\n const writeThreadUrl = useCallback(\n (threadId: string | null, options: { replace?: boolean } = {}): void => {\n if (!threadUrlSyncEnabled || typeof window === \"undefined\") return;\n try {\n const normalizedThreadId = normalizeUrlThreadId(threadId);\n let next: string;\n if (getThreadPath) {\n next = getThreadPath(normalizedThreadId);\n } else {\n const url = new URL(window.location.href);\n if (normalizedThreadId) {\n url.searchParams.set(threadUrlParamName, normalizedThreadId);\n } else {\n url.searchParams.delete(threadUrlParamName);\n }\n if (threadUrlParamName !== \"threadId\") {\n url.searchParams.delete(\"threadId\");\n }\n next = `${url.pathname}${url.search}${url.hash}`;\n }\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n if (next === current) {\n setUrlThreadId(normalizedThreadId);\n return;\n }\n if (getThreadPath && navigateThreadUrl) {\n navigateThreadUrl(next, { replace: options.replace === true });\n setUrlThreadId(normalizedThreadId);\n return;\n }\n const method = options.replace ? \"replaceState\" : \"pushState\";\n // `getThreadPath` returns a router-local path (no app basename). When we\n // fall back to the raw History API instead of a router navigate, resolve\n // the basename so deep-link reloads work in mounted apps.\n const historyTarget = getThreadPath ? appPath(next) : next;\n window.history[method](window.history.state, \"\", historyTarget);\n setUrlThreadId(normalizedThreadId);\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n const popstate =\n typeof PopStateEvent === \"function\"\n ? new PopStateEvent(\"popstate\", { state: window.history.state })\n : new Event(\"popstate\");\n window.dispatchEvent(popstate);\n } catch {}\n },\n [\n getThreadPath,\n navigateThreadUrl,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ],\n );\n\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread: switchThreadState,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n loadMoreThreads,\n refreshThreads,\n hasMoreThreads,\n isLoadingMoreThreads,\n threadsLoadError,\n isNewThread,\n pinThread,\n renameThread,\n } = useChatThreads(apiUrl, storageKey, null, {\n restoreActiveThread,\n routeThreadId: threadUrlSyncEnabled\n ? urlThreadId\n : (activeDeepLinkedThreadId ?? undefined),\n });\n\n const switchThread = useCallback(\n (threadId: string, options: { replace?: boolean } = {}) => {\n switchThreadState(threadId);\n writeThreadUrl(threadId, options);\n },\n [switchThreadState, writeThreadUrl],\n );\n\n // Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;\n\n // Track which tabs have been focused at least once (lazy mount for sub-agent tabs)\n const mountedTabsRef = useRef<Set<string>>(new Set());\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n // Mark the active tab as mounted so it persists when switched away\n if (activeThreadId) mountedTabsRef.current.add(activeThreadId);\n const chatRefs = useRef<Map<string, AssistantChatHandle>>(new Map());\n // Sends queued until their target thread is ready (see PendingDelivery).\n const pendingDeliveries = useRef<PendingDelivery[]>([]);\n const pendingContextItems = useRef<Map<string, AgentChatContextItem[]>>(\n new Map(),\n );\n const [runningThreads, setRunningThreads] = useState<Set<string>>(new Set());\n const [showHistory, setShowHistory] = useState(false);\n const [pageOverlayScrolled, setPageOverlayScrolled] = useState(false);\n const newThreadIds = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n setPageOverlayScrolled(false);\n }, [activeThreadId]);\n\n const handlePageOverlayScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const target = event.target;\n if (\n !renderOverlay ||\n !(target instanceof HTMLElement) ||\n !target.closest(\".agent-chat-scroll\")\n ) {\n return;\n }\n setPageOverlayScrolled(target.scrollTop > 1);\n },\n [renderOverlay],\n );\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [modelListLoading, setModelListLoading] = useState(true);\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n const threadModelRef = useRef<\n Map<string, { model: string; engine?: string; effort?: ReasoningEffort }>\n >(new Map());\n const [persistedModelSelection, setPersistedModelSelection] = useState<\n ModelSelection | undefined\n >(() => readStoredModelSelection(modelSelectionKey));\n const [modelSelectionVersion, setModelSelectionVersion] = useState(0);\n\n useEffect(() => {\n setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));\n }, [modelSelectionKey]);\n\n const bumpModelSelectionVersion = useCallback(() => {\n setModelSelectionVersion((version) => version + 1);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const syncPersistedSelection = (event?: Event) => {\n const detail = (event as CustomEvent<{ key?: string }> | undefined)\n ?.detail;\n if (detail?.key && detail.key !== modelSelectionKey) return;\n\n const next = readStoredModelSelection(modelSelectionKey);\n if (!next) return;\n\n const activeThreadId = activeThreadIdRef.current;\n if (activeThreadId) {\n threadModelRef.current.set(activeThreadId, next);\n }\n setPersistedModelSelection(next);\n bumpModelSelectionVersion();\n };\n const handleStorage = (event: StorageEvent) => {\n if (event.key === modelSelectionKey) syncPersistedSelection();\n };\n\n window.addEventListener(\n CHAT_MODEL_SELECTION_CHANGED_EVENT,\n syncPersistedSelection,\n );\n window.addEventListener(\"storage\", handleStorage);\n return () => {\n window.removeEventListener(\n CHAT_MODEL_SELECTION_CHANGED_EVENT,\n syncPersistedSelection,\n );\n window.removeEventListener(\"storage\", handleStorage);\n };\n }, [bumpModelSelectionVersion, modelSelectionKey]);\n\n const postMessageSubmissionsDisabled = props.composerDisabled === true;\n\n const setContextInTab = useCallback(\n (\n threadId: string,\n item: AgentChatContextItem,\n options?: { focus?: boolean },\n ) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.setComposerContextItem(item, options);\n return;\n }\n const existing = pendingContextItems.current.get(threadId) ?? [];\n const index = existing.findIndex((current) => current.key === item.key);\n const next =\n index === -1\n ? [...existing, item]\n : existing.map((current, currentIndex) =>\n currentIndex === index ? item : current,\n );\n pendingContextItems.current.set(threadId, next);\n },\n [],\n );\n\n const removeContextInTab = useCallback((threadId: string, key: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.removeComposerContextItem(key);\n return;\n }\n const existing = pendingContextItems.current.get(threadId);\n if (!existing) return;\n const next = existing.filter((item) => item.key !== key);\n if (next.length === 0) {\n pendingContextItems.current.delete(threadId);\n } else {\n pendingContextItems.current.set(threadId, next);\n }\n }, []);\n\n const clearContextInTab = useCallback((threadId: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.clearComposerContextItems();\n return;\n }\n pendingContextItems.current.delete(threadId);\n }, []);\n\n const resolveThreadModelSelection = useCallback(\n (threadId: string) =>\n resolveModelSelection(\n threadModelRef.current.get(threadId) ?? persistedModelSelection,\n availableModels,\n ),\n [availableModels, persistedModelSelection, modelSelectionVersion],\n );\n\n const persistModelSelection = useCallback(\n (selection: ModelSelection) => {\n setPersistedModelSelection(selection);\n writeStoredModelSelection(modelSelectionKey, selection);\n },\n [modelSelectionKey],\n );\n\n const handleModelChange = useCallback(\n (model: string, engine: string) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = threadModelRef.current.get(threadId);\n const effort = resolveReasoningEffortSelection(model, existing?.effort);\n const selection = { model, engine, effort };\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [bumpModelSelectionVersion, persistModelSelection],\n );\n\n const handleEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = resolveThreadModelSelection(threadId);\n const model = existing?.model ?? defaultModel;\n const engine =\n existing?.engine ??\n availableModels.find((group) => group.models.includes(model))?.engine ??\n availableModels[0]?.engine;\n const selection: ModelSelection = { model, effort };\n if (engine) selection.engine = engine;\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [\n availableModels,\n bumpModelSelectionVersion,\n defaultModel,\n persistModelSelection,\n resolveThreadModelSelection,\n ],\n );\n\n const refreshEngines = useCallback(() => {\n setModelListLoading(true);\n Promise.all([\n callAction(\"manage-agent-engine\" as any, { action: \"list\" } as any).catch(\n () => null,\n ),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n const groups = buildChatModelGroups({\n engines: enginesData.engines,\n configuredKeys,\n builderConnected,\n currentEngineName,\n currentModel,\n });\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {})\n .finally(() => setModelListLoading(false));\n }, []);\n\n useEffect(() => {\n refreshEngines();\n window.addEventListener(\"agent-engine:configured-changed\", refreshEngines);\n return () =>\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n refreshEngines,\n );\n }, [refreshEngines]);\n\n // Parent-child thread mapping — persisted to localStorage.\n // Maps childThreadId → parentThreadId for sub-agent tabs.\n const PARENT_MAP_KEY = `agent-chat-parent-map${keyPrefix}`;\n const [parentMap, setParentMap] = useState<Record<string, string>>(() => {\n try {\n const saved = localStorage.getItem(PARENT_MAP_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n });\n const parentMapRef = useRef(parentMap);\n parentMapRef.current = parentMap;\n const dismissedSubAgentTabsRef = useRef<Set<string>>(new Set());\n\n // Persist parent map to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(PARENT_MAP_KEY, JSON.stringify(parentMap));\n } catch {}\n }, [parentMap, PARENT_MAP_KEY]);\n\n // Sub-agent display names — persisted to localStorage.\n // Maps childThreadId → short name (e.g. \"Research\", \"Draft email\").\n const SUB_AGENT_NAMES_KEY = `agent-chat-sub-agent-names${keyPrefix}`;\n const [subAgentNames, setSubAgentNames] = useState<Record<string, string>>(\n () => {\n try {\n const saved = localStorage.getItem(SUB_AGENT_NAMES_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n },\n );\n const subAgentNamesRef = useRef(subAgentNames);\n subAgentNamesRef.current = subAgentNames;\n const [subAgentStatuses, setSubAgentStatuses] = useState<\n Record<string, AgentTeamRunStatus>\n >({});\n\n useEffect(() => {\n try {\n localStorage.setItem(SUB_AGENT_NAMES_KEY, JSON.stringify(subAgentNames));\n } catch {}\n }, [subAgentNames, SUB_AGENT_NAMES_KEY]);\n\n // Open tabs — persisted to localStorage so they survive refresh.\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}`;\n const [openTabIds, setOpenTabIds] = useState<string[]>(() => {\n if (!restoreActiveThread && activeThreadId) {\n for (const id of [activeThreadId]) mountedTabsRef.current.add(id);\n return [activeThreadId];\n }\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Mark restored tabs as mounted\n for (const id of parsed) mountedTabsRef.current.add(id);\n return parsed;\n }\n }\n } catch {}\n return [];\n });\n const openTabIdsRef = useRef(openTabIds);\n openTabIdsRef.current = openTabIds;\n const initializedRef = useRef(false);\n\n const openTabsKeyRef = useRef(OPEN_TABS_KEY);\n\n useEffect(() => {\n const nextScope = scope;\n if (!nextScope) return;\n const type = formatScopeType(nextScope.type);\n const title =\n nextScope.label?.trim() ||\n type.replace(/^./, (character) => character.toUpperCase());\n const key = nextScope.contextKey || \"agent-current-resource-context\";\n const marker = `Resource context: ${nextScope.type}:${nextScope.id}`;\n const existing = getAgentChatContextState().items.find(\n (item) => item.key === key,\n );\n let ownsContextItem = false;\n if (!existing || existing.context.startsWith(marker)) {\n setAgentChatContextItem({\n key,\n title,\n context: [\n marker,\n `The user is currently viewing this ${type}.`,\n nextScope.label ? `Resource name: ${nextScope.label}` : \"\",\n `Resource id: ${nextScope.id}`,\n typeof window !== \"undefined\"\n ? `Current URL: ${window.location.pathname}${window.location.search}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n openSidebar: false,\n focus: false,\n });\n ownsContextItem = true;\n }\n return () => {\n const current = getAgentChatContextState().items.find(\n (item) => item.key === key,\n );\n if (ownsContextItem && current?.context.startsWith(marker)) {\n removeAgentChatContextItem(key);\n }\n };\n }, [scope?.contextKey, scope?.id, scope?.label, scope?.type]);\n\n // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)\n useEffect(() => {\n if (openTabsKeyRef.current !== OPEN_TABS_KEY) return;\n const mainTabs = openTabIds.filter((id) => !parentMap[id]);\n if (mainTabs.length > 0) {\n try {\n localStorage.setItem(OPEN_TABS_KEY, JSON.stringify(mainTabs));\n } catch {}\n }\n }, [openTabIds, parentMap, OPEN_TABS_KEY]);\n\n // Initialize open tabs once threads load — validate saved tabs still exist\n useEffect(() => {\n if (initializedRef.current || !activeThreadId || threads.length === 0)\n return;\n initializedRef.current = true;\n const threadIds = new Set(threads.map((t) => t.id));\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n\n // Hide tabs that have had no activity for more than 12 hours. Stale tabs\n // are removed from the sidebar on load but remain accessible via history.\n const now = Date.now();\n const isStale = (id: string) => {\n const thread = threadMap.get(id);\n return thread\n ? now - thread.updatedAt > STALE_THREAD_THRESHOLD_MS\n : false;\n };\n\n // If the active thread is a sub-agent, switch to its parent or the most recent main thread\n if (parentMap[activeThreadId]) {\n const parent = parentMap[activeThreadId];\n if (parent && threadIds.has(parent)) {\n switchThread(parent);\n } else {\n // Fall back to most recent main thread\n const mainThread = threads.find((t) => !parentMap[t.id]);\n if (mainThread) switchThread(mainThread.id);\n }\n }\n\n setOpenTabIds((prev) => {\n // Filter out tabs that no longer exist, sub-agent tabs, or stale tabs (>12h inactive)\n const valid = prev.filter(\n (id) => threadIds.has(id) && !parentMap[id] && !isStale(id),\n );\n // Ensure active thread is included (only if it's not a sub-agent and not stale)\n if (\n !parentMap[activeThreadId] &&\n !valid.includes(activeThreadId) &&\n !isStale(activeThreadId)\n ) {\n valid.push(activeThreadId);\n }\n return valid;\n });\n\n // If active thread is stale, start fresh\n if (!parentMap[activeThreadId] && isStale(activeThreadId)) {\n createThread().then((id) => {\n if (id) writeThreadUrl(null);\n });\n }\n }, [\n activeThreadId,\n threads,\n parentMap,\n switchThread,\n createThread,\n writeThreadUrl,\n ]);\n\n // Ensure active thread is always in open tabs.\n // Use functional update to check inside the setter — avoids race with the\n // initialization effect that may have already added the ID in the same batch.\n //\n // Re-check after tab-list resets so the sidebar cannot end up with a live\n // active thread but no mounted chat.\n useEffect(() => {\n if (!activeThreadId || openTabIds.includes(activeThreadId)) return;\n if (parentMap[activeThreadId]) return;\n\n const activeThread = threads.find((thread) => thread.id === activeThreadId);\n if (\n activeThread &&\n Date.now() - activeThread.updatedAt > STALE_THREAD_THRESHOLD_MS\n ) {\n return;\n }\n\n setOpenTabIds((prev) =>\n prev.includes(activeThreadId) ? prev : [...prev, activeThreadId],\n );\n }, [activeThreadId, openTabIds, parentMap, threads]);\n\n // Ensure at least one tab is always open — auto-create if sidebar is empty.\n // Skipped when an active thread already exists (e.g. the hook generated an\n // optimistic id for a brand-new session); the activeThreadId effect above\n // adds it to openTabIds without spinning up a duplicate thread.\n const autoCreatingRef = useRef(false);\n useEffect(() => {\n if (isLoading || autoCreatingRef.current) return;\n if (openTabIds.length === 0 && !activeThreadId) {\n autoCreatingRef.current = true;\n createThread().then((id) => {\n autoCreatingRef.current = false;\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n writeThreadUrl(null, { replace: true });\n }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread, writeThreadUrl]);\n\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const runsUrl = `${apiUrl.replace(/\\/$/, \"\")}/runs/list?goalId=agent-team`;\n\n async function hydrateAgentTeamTabs() {\n try {\n const res = await fetch(runsUrl);\n if (res.ok) {\n const data = (await res.json()) as { runs?: AgentTeamRunSummary[] };\n const infos = Array.isArray(data.runs)\n ? data.runs\n .map(runToAgentTeamTabInfo)\n .filter((info): info is AgentTeamTabInfo => Boolean(info))\n : [];\n\n setSubAgentStatuses((prev) => {\n let changed = false;\n const next: Record<string, AgentTeamRunStatus> = {};\n for (const info of infos) {\n next[info.threadId] = info.status;\n if (prev[info.threadId] !== info.status) changed = true;\n }\n if (Object.keys(prev).length !== Object.keys(next).length) {\n changed = true;\n }\n return changed ? next : prev;\n });\n\n const openSet = new Set(openTabIdsRef.current);\n const candidates = infos.filter(\n (info) =>\n !dismissedSubAgentTabsRef.current.has(info.threadId) &&\n (openSet.has(info.parentThreadId) || openSet.has(info.threadId)),\n );\n\n if (candidates.length > 0) {\n const shouldRefreshThreads = candidates.some(\n (info) =>\n !openSet.has(info.threadId) && openSet.has(info.parentThreadId),\n );\n const candidateParents = new Map(\n candidates.map((info) => [info.threadId, info.parentThreadId]),\n );\n setParentMap((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next[info.threadId] === info.parentThreadId) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.parentThreadId }\n : { ...next, [info.threadId]: info.parentThreadId };\n }\n return next;\n });\n setSubAgentNames((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (!info.name || next[info.threadId] === info.name) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.name }\n : { ...next, [info.threadId]: info.name };\n }\n return next;\n });\n\n setOpenTabIds((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next.includes(info.threadId)) continue;\n const parentIdx = next.indexOf(info.parentThreadId);\n if (parentIdx === -1) continue;\n if (next === prev) next = [...prev];\n let insertIdx = parentIdx + 1;\n while (insertIdx < next.length) {\n const siblingParent =\n parentMapRef.current[next[insertIdx]] ||\n candidateParents.get(next[insertIdx]);\n if (siblingParent !== info.parentThreadId) break;\n insertIdx++;\n }\n next.splice(insertIdx, 0, info.threadId);\n }\n return next;\n });\n if (shouldRefreshThreads) {\n refreshThreads();\n }\n }\n }\n } catch {\n // Best effort: task cards and manual history still work if this poll fails.\n } finally {\n if (!stopped) {\n timer = setTimeout(hydrateAgentTeamTabs, 3000);\n }\n }\n }\n\n hydrateAgentTeamTabs();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [apiUrl, refreshThreads]);\n\n // Focus the composer when switching tabs\n useEffect(() => {\n if (!activeThreadId) return;\n // Small delay to ensure the tab is visible before focusing\n const t = setTimeout(() => {\n chatRefs.current.get(activeThreadId)?.focusComposer();\n }, 50);\n return () => clearTimeout(t);\n }, [activeThreadId]);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n // A margin keeps the active tab from sitting flush against either container\n // edge — at the right edge it was landing directly under the +/history/menu\n // buttons, which visually clipped the tab label.\n const activeTabRefCb = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n const MARGIN = 24;\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left + MARGIN) {\n container.scrollLeft += tabRect.left - containerRect.left - MARGIN;\n } else if (tabRect.right > containerRect.right - MARGIN) {\n container.scrollLeft += tabRect.right - containerRect.right + MARGIN;\n }\n });\n }, []);\n\n const [messageCounts, setMessageCounts] = useState<Record<string, number>>(\n () => Object.fromEntries(threads.map((t) => [t.id, t.messageCount ?? 0])),\n );\n\n // Sync message counts from threads when they load\n useEffect(() => {\n if (threads.length > 0) {\n setMessageCounts((prev) => {\n const next = { ...prev };\n for (const t of threads) {\n if (!(t.id in next)) {\n next[t.id] = t.messageCount ?? 0;\n }\n }\n return next;\n });\n }\n }, [threads]);\n\n // Listen for builder.submitChat postMessages\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE) {\n const item = normalizeAgentChatContextItem(event.data.data);\n if (!item) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar !== false) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n // Focus defaults to true; a caller opts out with `focus: false` for\n // passive context (e.g. a canvas selection) so staging never steals\n // focus from an in-progress inline editor.\n const focus = (event.data.data?.focus as boolean | undefined) !== false;\n setContextInTab(currentTabId, item, { focus });\n return;\n }\n if (event.data?.type === AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE) {\n const key =\n typeof event.data.data?.key === \"string\"\n ? event.data.data.key.trim()\n : \"\";\n if (!key) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n removeContextInTab(currentTabId, key);\n return;\n }\n if (event.data?.type === AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE) {\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n clearContextInTab(currentTabId);\n return;\n }\n const parsed = parseSubmitChatMessage(event);\n if (!parsed) return;\n // Dedup the live post against the cold-start replay; first one wins.\n if (!claimAgentChatSubmit(parsed.submitMessageId)) return;\n const {\n message,\n context,\n openSidebar,\n model,\n effort,\n newTab,\n background,\n submit,\n images,\n submitMessageId,\n } = parsed;\n const requestedTabId = parsed.tabId;\n const requestMode =\n parsed.requestMode ?? requestModeFromExecMode(props.execMode);\n\n // Make sure the sidebar is visible to show the response, unless the\n // caller explicitly opted out or it's a background send.\n if (openSidebar !== false && !background) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) {\n reportAgentChatSubmitResult(\n submitMessageId,\n false,\n \"composer-disabled\",\n );\n return;\n }\n\n // Plan mode is sent as request metadata by the chat adapter. Keep the\n // user-visible message clean so mode instructions never enter history.\n const fullMessage = context\n ? appendAgentChatContextToMessage(message, context)\n : message;\n\n const send: PendingSend = {\n message: fullMessage,\n images,\n submit,\n ...(background ? { trackInRunsTray: true } : {}),\n ...(requestMode ? { requestMode } : {}),\n ...(submitMessageId ? { submitMessageId } : {}),\n };\n\n const sendToTab = (threadId: string) => {\n if (isAgentChatSubmitCancelled(submitMessageId)) return;\n // If a model override was specified, apply it only if we recognize it\n if (model) {\n const matchedGroup = availableModels.find((g) =>\n g.models.includes(model),\n );\n if (matchedGroup) {\n const selectedEffort = resolveReasoningEffortSelection(\n model,\n isReasoningEffort(effort) ? effort : undefined,\n );\n threadModelRef.current.set(threadId, {\n model,\n engine: matchedGroup.engine,\n effort: selectedEffort,\n });\n bumpModelSelectionVersion();\n }\n }\n\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n deliverPendingSend(ref, send);\n } else {\n pendingDeliveries.current.push({ threadId, send });\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId)\n .then((newId) => {\n if (isAgentChatSubmitCancelled(submitMessageId)) return;\n if (!newId) {\n reportAgentChatSubmitResult(\n submitMessageId,\n false,\n \"thread-create-failed\",\n );\n return;\n }\n newThreadIds.current.add(newId);\n if (background) {\n mountedTabsRef.current.add(newId);\n }\n setOpenTabIds((prev) =>\n prev.includes(newId) ? prev : [...prev, newId],\n );\n if (!background) {\n writeThreadUrl(newId);\n }\n sendToTab(newId);\n if (background && previousTabId) {\n switchThreadState(previousTabId);\n }\n })\n .catch(() => {\n reportAgentChatSubmitResult(\n submitMessageId,\n false,\n \"thread-create-failed\",\n );\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (currentTabId) {\n sendToTab(currentTabId);\n } else {\n // Cold start: no thread yet. Queue for the first active thread (the\n // bootstrap effect creates it) rather than racing a second create.\n pendingDeliveries.current.push({ threadId: null, send });\n }\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [\n availableModels,\n bumpModelSelectionVersion,\n clearContextInTab,\n createThread,\n postMessageSubmissionsDisabled,\n props.execMode,\n removeContextInTab,\n setContextInTab,\n switchThread,\n switchThreadState,\n writeThreadUrl,\n ]);\n\n // Replay submits posted before this lazy panel's listener attached. Dedup in\n // the handler keeps a live + replayed message single.\n useEffect(() => {\n const buffered = drainBufferedAgentChatSubmits();\n for (const data of buffered) {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n data: { type: \"agentNative.submitChat\", data },\n origin: window.location.origin,\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Flush queued context items and sends once their thread's ref is mounted\n // (re-runs on ref mount via openTabIds and on cold-start target via\n // activeThreadId).\n useEffect(() => {\n for (const [tabId, items] of pendingContextItems.current) {\n const ref = chatRefs.current.get(tabId);\n if (!ref) continue;\n for (const item of items) ref.setComposerContextItem(item);\n pendingContextItems.current.delete(tabId);\n }\n\n if (pendingDeliveries.current.length === 0) return;\n const active = activeThreadIdRef.current;\n const remaining: PendingDelivery[] = [];\n for (const delivery of pendingDeliveries.current) {\n if (isAgentChatSubmitCancelled(delivery.send.submitMessageId)) continue;\n const threadId = delivery.threadId ?? active ?? null;\n const ref = threadId ? chatRefs.current.get(threadId) : null;\n if (threadId && ref) {\n const { send } = delivery;\n setTimeout(() => deliverPendingSend(ref, send), 50);\n } else {\n // Not ready — keep it, pinning the resolved threadId once known.\n remaining.push(threadId ? { threadId, send: delivery.send } : delivery);\n }\n }\n pendingDeliveries.current = remaining;\n }, [openTabIds, activeThreadId]);\n\n // Listen for chatRunning completion events\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const { isRunning, tabId } = detail;\n if (!tabId) return;\n\n setRunningThreads((prev) => {\n const next = new Set(prev);\n if (isRunning) {\n next.add(tabId);\n } else {\n next.delete(tabId);\n }\n return next;\n });\n };\n window.addEventListener(\"agentNative.chatRunning\", handler);\n return () => window.removeEventListener(\"agentNative.chatRunning\", handler);\n }, []);\n\n const addTab = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n writeThreadUrl(null);\n }\n return id;\n }, [createThread, writeThreadUrl]);\n\n const cleanupClosedTab = useCallback((tabId: string) => {\n if (parentMapRef.current[tabId]) {\n dismissedSubAgentTabsRef.current.add(tabId);\n }\n chatRefs.current.delete(tabId);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== tabId,\n );\n pendingContextItems.current.delete(tabId);\n newThreadIds.current.delete(tabId);\n threadModelRef.current.delete(tabId);\n // Clean up parent map and sub-agent names\n setParentMap((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentNames((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentStatuses((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const closeTab = useCallback(\n (tabId: string) => {\n setOpenTabIds((prev) => {\n if (prev.length <= 1) {\n // Last tab — create a new one and replace the old tab atomically\n createThread().then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n setOpenTabIds([newId]);\n writeThreadUrl(null);\n }\n });\n return prev; // Keep old tab until new one is ready\n }\n const next = prev.filter((id) => id !== tabId);\n if (tabId === activeThreadIdRef.current && next.length > 0) {\n const idx = prev.indexOf(tabId);\n switchThread(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n cleanupClosedTab(tabId);\n },\n [switchThread, createThread, cleanupClosedTab, writeThreadUrl],\n );\n\n const closeOtherTabs = useCallback(\n (tabId: string) => {\n for (const id of openTabIdsRef.current) {\n if (id !== tabId && parentMapRef.current[id]) {\n dismissedSubAgentTabsRef.current.add(id);\n }\n }\n setOpenTabIds([tabId]);\n if (activeThreadIdRef.current !== tabId) {\n switchThread(tabId);\n }\n // Clean up refs for closed tabs\n for (const key of chatRefs.current.keys()) {\n if (key !== tabId) {\n if (parentMapRef.current[key]) {\n dismissedSubAgentTabsRef.current.add(key);\n }\n chatRefs.current.delete(key);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== key,\n );\n pendingContextItems.current.delete(key);\n newThreadIds.current.delete(key);\n threadModelRef.current.delete(key);\n }\n }\n // Clean up parent map and sub-agent names — only keep entries for the surviving tab\n setParentMap((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentNames((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentStatuses((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n },\n [switchThread],\n );\n\n const closeAllTabs = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n switchThreadState(id);\n writeThreadUrl(null);\n dismissedSubAgentTabsRef.current.clear();\n // Clean up all old refs\n chatRefs.current.clear();\n pendingDeliveries.current = [];\n pendingContextItems.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n setSubAgentStatuses({});\n }\n }, [createThread, switchThreadState, writeThreadUrl]);\n\n // Keyboard shortcuts dispatched from AgentPanel based on the active mode\n useEffect(() => {\n const handleCloseCurrent = () => {\n const id = activeThreadIdRef.current;\n if (id) closeTab(id);\n };\n const handleCloseAll = () => {\n void closeAllTabs();\n };\n const handleNewChat = () => {\n void addTab();\n };\n window.addEventListener(\"agent-chat:close-current-tab\", handleCloseCurrent);\n window.addEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.addEventListener(\"agent-chat:new-chat\", handleNewChat);\n return () => {\n window.removeEventListener(\n \"agent-chat:close-current-tab\",\n handleCloseCurrent,\n );\n window.removeEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.removeEventListener(\"agent-chat:new-chat\", handleNewChat);\n };\n }, [closeTab, closeAllTabs, addTab]);\n\n useEffect(() => {\n const handleOpenThread = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | {\n threadId?: unknown;\n newThread?: unknown;\n onlyIfActiveThreadId?: unknown;\n openRequestId?: unknown;\n }\n | undefined;\n const threadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : \"\";\n if (!detail || !threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n\n const onlyIfActiveThreadId =\n typeof detail.onlyIfActiveThreadId === \"string\"\n ? detail.onlyIfActiveThreadId.trim()\n : \"\";\n const activeThreadId = activeThreadIdRef.current;\n if (\n onlyIfActiveThreadId &&\n activeThreadId &&\n activeThreadId !== onlyIfActiveThreadId\n ) {\n return;\n }\n\n if (detail?.newThread === true) {\n newThreadIds.current.add(threadId);\n void createThread(threadId).then((createdId) => {\n if (!createdId) return;\n setOpenTabIds((prev) =>\n prev.includes(createdId) ? prev : [...prev, createdId],\n );\n writeThreadUrl(null);\n });\n return;\n }\n setOpenTabIds((prev) =>\n prev.includes(threadId) ? prev : [...prev, threadId],\n );\n switchThread(threadId);\n };\n\n window.addEventListener(\"agent-chat:open-thread\", handleOpenThread);\n return () =>\n window.removeEventListener(\"agent-chat:open-thread\", handleOpenThread);\n }, [createThread, switchThread, writeThreadUrl]);\n\n const clearActiveTab = useCallback(() => {\n const tabIdToClear = activeThreadIdRef.current;\n void addTab().then((newTabId) => {\n if (!tabIdToClear || !newTabId || tabIdToClear === newTabId) return;\n setOpenTabIds((prev) => {\n const next = prev.filter((id) => id !== tabIdToClear);\n return next.includes(newTabId) ? next : [...next, newTabId];\n });\n cleanupClosedTab(tabIdToClear);\n });\n }, [addTab, cleanupClosedTab]);\n\n const openFromHistory = useCallback(\n (threadId: string) => {\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n },\n [openTabIds, switchThread],\n );\n\n // Listen for agent-task-open events (from AgentTaskCard \"Open\" button)\n useEffect(() => {\n function handleOpenTask(e: Event) {\n const detail = (e as CustomEvent).detail;\n const threadId = detail?.threadId;\n if (!threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n dismissedSubAgentTabsRef.current.delete(threadId);\n // Prefer an explicit parent (RunsTray/background hydration knows it);\n // inline task cards fall back to the active orchestrator thread.\n const explicitParentId =\n typeof detail?.parentThreadId === \"string\"\n ? detail.parentThreadId.trim()\n : \"\";\n const parentId = explicitParentId || activeThreadIdRef.current;\n if (parentId && parentId !== threadId) {\n setParentMap((prev) =>\n prev[threadId] === parentId\n ? prev\n : { ...prev, [threadId]: parentId },\n );\n }\n // Store the sub-agent name/description for the tab label\n const name = detail.name || detail.description || \"\";\n if (name) {\n setSubAgentNames((prev) =>\n prev[threadId] === name ? prev : { ...prev, [threadId]: name },\n );\n }\n // Refresh thread list so the new sub-agent thread appears with its title\n refreshThreads();\n // Open the sub-agent thread as a tab — insert after parent for visual grouping\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => {\n if (parentId) {\n const parentIdx = prev.indexOf(parentId);\n if (parentIdx !== -1) {\n // Insert after the parent (and any existing children of that parent)\n const next = [...prev];\n let insertIdx = parentIdx + 1;\n // Skip past any existing children of the same parent\n while (\n insertIdx < next.length &&\n parentMap[next[insertIdx]] === parentId\n ) {\n insertIdx++;\n }\n next.splice(insertIdx, 0, threadId);\n return next;\n }\n }\n return [...prev, threadId];\n });\n }\n switchThread(threadId);\n }\n window.addEventListener(\"agent-task-open\", handleOpenTask);\n return () => window.removeEventListener(\"agent-task-open\", handleOpenTask);\n }, [openTabIds, switchThread, refreshThreads, parentMap]);\n\n // Replay thread/task opens requested before this lazy panel's listeners\n // attached. Live events claim their id; replay drains only unclaimed requests.\n useEffect(() => {\n const buffered = drainBufferedAgentChatOpenRequests();\n for (const request of buffered) {\n window.dispatchEvent(\n new CustomEvent(request.eventType, { detail: request.detail }),\n );\n }\n }, []);\n\n // Watch for agent-issued chat-command in application-state. The shared\n // DB-sync transport advances this key-specific version, so the command gets\n // one initial read and one read per actual write instead of a 2s loop.\n const lastChatCommandRef = useRef(0);\n const chatCommandVersion = useChangeVersion(\"app-state:chat-command\");\n useEffect(() => {\n let stopped = false;\n\n async function readChatCommand() {\n if (stopped) return;\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n );\n if (res.ok) {\n const data = await res.json();\n if (\n data?.value?.command === \"open-thread\" &&\n data.value.threadId &&\n data.value.timestamp > lastChatCommandRef.current\n ) {\n lastChatCommandRef.current = data.value.timestamp;\n const threadId = data.value.threadId as string;\n // Open the thread as a tab and focus it\n setOpenTabIds((prev) =>\n prev.includes(threadId) ? prev : [...prev, threadId],\n );\n switchThread(threadId);\n // Clear the command\n fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n }\n }\n } catch {}\n }\n\n void readChatCommand();\n return () => {\n stopped = true;\n };\n }, [chatCommandVersion, switchThread]);\n\n const handleGenerateTitle = useCallback(\n (threadId: string, message: string) => {\n generateTitle(threadId, message).then((title) => {\n if (title) {\n // Persist the generated title to the server\n saveThreadData(threadId, {\n threadData: \"\",\n title,\n preview: message.slice(0, 120),\n titleSource: \"generated\",\n });\n }\n });\n },\n [generateTitle, saveThreadData],\n );\n\n const handleSaveThread = useCallback(\n (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => {\n saveThreadData(threadId, data);\n if (\n data.messageCount > 0 &&\n threadId === activeThreadIdRef.current &&\n urlThreadIdRef.current !== threadId\n ) {\n writeThreadUrl(threadId);\n }\n },\n [saveThreadData, writeThreadUrl],\n );\n\n // ─── Slash command handler ──────────────────────────────────────────\n const [helpVisible, setHelpVisible] = useState(false);\n\n const handleSlashCommand = useCallback(\n (command: string) => {\n switch (command) {\n case \"clear\":\n case \"new\":\n addTab();\n break;\n case \"history\":\n setShowHistory(true);\n break;\n case \"plan\":\n props.onExecModeChange?.(\"plan\");\n break;\n case \"act\":\n props.onExecModeChange?.(\"build\");\n break;\n case \"help\":\n setHelpVisible(true);\n break;\n }\n },\n [addTab, props.onExecModeChange],\n );\n\n const handleForkChat = useCallback(\n async (sourceThreadId: string) => {\n const sourceSnapshot =\n chatRefs.current.get(sourceThreadId)?.exportThreadSnapshot() ?? null;\n const forkedId = await forkThread(sourceThreadId, sourceSnapshot);\n if (!forkedId) return false;\n setOpenTabIds((prev) => {\n const idx = prev.indexOf(sourceThreadId);\n if (idx !== -1) {\n const next = [...prev];\n next.splice(idx + 1, 0, forkedId);\n return next;\n }\n return [...prev, forkedId];\n });\n switchThread(forkedId);\n return true;\n },\n [forkThread, switchThread],\n );\n\n // Build tabs from open thread IDs. During the first thread-list fetch,\n // `activeThreadId` is seeded synchronously so the chat can mount before\n // persisted open tabs have been reconciled.\n const visibleOpenTabIds =\n activeThreadId && !openTabIds.includes(activeThreadId)\n ? [...openTabIds, activeThreadId]\n : openTabIds;\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n const tabs: ChatTab[] = visibleOpenTabIds\n .filter((id) => threadMap.has(id) || id === activeThreadId)\n .map((id) => {\n const t = threadMap.get(id);\n const agentTeamStatus = chatTabStatusFromAgentTeamStatus(\n subAgentStatuses[id],\n );\n return {\n id,\n label: t?.title || t?.preview?.slice(0, 30) || \"New chat\",\n status:\n agentTeamStatus ??\n (runningThreads.has(id)\n ? (\"running\" as const)\n : (messageCounts[id] ?? t?.messageCount ?? 0) > 0\n ? (\"completed\" as const)\n : (\"idle\" as const)),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n };\n });\n\n // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)\n for (const id of visibleOpenTabIds) {\n if (!tabs.some((t) => t.id === id)) {\n tabs.push({\n id,\n label:\n subAgentNames[id] || (parentMap[id] ? \"Sub-agent...\" : \"New chat\"),\n status:\n chatTabStatusFromAgentTeamStatus(subAgentStatuses[id]) ??\n (\"running\" as const),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n });\n }\n }\n\n const headerProps: MultiTabAssistantChatHeaderProps = {\n tabs,\n activeTabId: activeThreadId ?? \"\",\n activeTabMessageCount: activeThreadId\n ? (messageCounts[activeThreadId] ?? 0)\n : 0,\n setActiveTabId: switchThread,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n clearActiveTab,\n showHistory,\n toggleHistory: () => setShowHistory((v) => !v),\n tabCount: visibleOpenTabIds.length,\n };\n\n // Wait for the first thread-list pass only when there is no synchronously\n // seeded active thread. Suggestion loading and thread-list reconciliation\n // should not block the chat shell from mounting.\n if (isLoading && !activeThreadId) {\n return (\n <ChatSkeleton\n header={renderHeader?.(headerProps)}\n headerOnly={contentHidden}\n />\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\",\n }}\n />\n {renderHeader\n ? renderHeader(headerProps)\n : showTabBar\n ? (() => {\n const activeTab = tabs.find((t) => t.id === activeThreadId);\n const focusParentId = activeTab?.parentThreadId || activeThreadId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mainTabs.map((tab) => {\n const isActive =\n tab.id === activeThreadId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n ref={isActive ? activeTabRefCb : undefined}\n className={cn(\n \"agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]\",\n isActive\n ? \"bg-accent text-foreground ring-1 ring-inset ring-border/60 shadow-sm\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <TooltipProvider delayDuration={200}>\n <div className=\"flex items-center gap-px shrink-0 ms-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setShowHistory(!showHistory)}\n aria-label=\"All chats\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>All chats</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </div>\n {hasSubTabs && (\n <div className=\"flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <button\n onClick={() => switchThread(focusParentId!)}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeThreadId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </button>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n ref={\n tab.id === activeThreadId\n ? activeTabRefCb\n : undefined\n }\n className={cn(\n \"agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]\",\n tab.id === activeThreadId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()\n : null}\n\n {/* Chat content with optional overlay */}\n <div\n className={cn(\n \"relative flex-1 flex flex-col min-h-0\",\n renderOverlay && \"pt-14\",\n )}\n data-agent-page-chat-topbar={renderOverlay ? \"\" : undefined}\n data-agent-page-chat-scrolled={\n renderOverlay && pageOverlayScrolled ? \"\" : undefined\n }\n onScrollCapture={renderOverlay ? handlePageOverlayScroll : undefined}\n >\n {renderOverlay ? renderOverlay(headerProps) : null}\n\n {/* History popover — rendered inside relative container so positioning works */}\n {showHistory && (\n <HistoryPopover\n threads={threads}\n openTabIds={new Set(openTabIds)}\n activeThreadId={activeThreadId}\n hasMoreThreads={hasMoreThreads}\n isLoadingMoreThreads={isLoadingMoreThreads}\n loadError={threadsLoadError}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onLoadMore={loadMoreThreads}\n onSearch={searchThreads}\n onTogglePin={pinThread}\n onRename={renameThread}\n />\n )}\n\n {/* Help popover — shown by /help slash command */}\n {helpVisible && <HelpPopover onClose={() => setHelpVisible(false)} />}\n\n {/* Render tabs that have been activated at least once, hide inactive ones to preserve state.\n Sub-agent tabs are only mounted when first focused — prevents stale restore from running\n while the component is display:none before the user switches to it. */}\n {[...new Set(visibleOpenTabIds)]\n .filter(\n (tabId) =>\n tabId === activeThreadId || mountedTabsRef.current.has(tabId),\n )\n .map((tabId) => {\n const modelSelection = resolveThreadModelSelection(tabId);\n const tabDynamicSuggestions =\n tabId === activeThreadId && !contentHidden\n ? props.dynamicSuggestions\n : false;\n return (\n <div\n key={tabId}\n className=\"flex-1 min-h-0 flex-col\"\n style={{\n display:\n contentHidden || tabId !== activeThreadId ? \"none\" : \"flex\",\n }}\n >\n <RunStuckBanner\n threadId={tabId}\n enabled={tabId === activeThreadId}\n apiUrl={apiUrl}\n autoRetry\n autoRetryOwnerId={browserTabId}\n hasInFlightWork={() =>\n chatRefs.current.get(tabId)?.hasInFlightWork() ?? false\n }\n onRetry={() => {\n const handle = chatRefs.current.get(tabId);\n handle?.sendRecoveryMessage(\n \"Continue from where you left off and finish my last request. Do not repeat completed work.\",\n \"continue\",\n );\n }}\n />\n <AssistantChat\n {...props}\n dynamicSuggestions={tabDynamicSuggestions}\n ref={(handle) => {\n if (handle) {\n chatRefs.current.set(tabId, handle);\n } else {\n chatRefs.current.delete(tabId);\n }\n }}\n threadId={tabId}\n tabId={tabId}\n browserTabId={browserTabId}\n isActiveComposer={tabId === activeThreadId}\n apiUrl={apiUrl}\n isNewThread={\n newThreadIds.current.has(tabId) || isNewThread(tabId)\n }\n onMessageCountChange={(count) =>\n setMessageCounts((prev) =>\n prev[tabId] === count\n ? prev\n : { ...prev, [tabId]: count },\n )\n }\n onSaveThread={handleSaveThread}\n onGenerateTitle={handleGenerateTitle}\n onSlashCommand={handleSlashCommand}\n selectedModel={modelSelection?.model}\n selectedEngine={modelSelection?.engine}\n selectedEffort={\n modelSelection?.effort ?? DEFAULT_REASONING_EFFORT\n }\n composerSlot={props.composerSlot}\n defaultModel={defaultModel}\n availableModels={availableModels}\n modelListLoading={modelListLoading}\n onModelChange={handleModelChange}\n onEffortChange={handleEffortChange}\n onForkChat={() => handleForkChat(tabId)}\n // Sub-agent tabs are read-only: sending a new message from the\n // sub-agent tab would start a fresh run on that thread and kill\n // the in-flight team chunk. Disable the composer and show a\n // hint so users know to send via the orchestrator chat instead.\n composerDisabled={Boolean(parentMap[tabId])}\n composerDisabledPlaceholder={\n parentMap[tabId]\n ? \"Send messages to the orchestrator chat — this sub-agent runs automatically\"\n : undefined\n }\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"]}