@agent-native/core 0.58.5 → 0.59.1

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 (57) hide show
  1. package/dist/client/AgentPanel.js +1 -1
  2. package/dist/client/AgentPanel.js.map +1 -1
  3. package/dist/client/AssistantChat.d.ts.map +1 -1
  4. package/dist/client/AssistantChat.js +12 -53
  5. package/dist/client/AssistantChat.js.map +1 -1
  6. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  7. package/dist/client/MultiTabAssistantChat.js +84 -88
  8. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  9. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  10. package/dist/client/agent-chat-adapter.js +65 -12
  11. package/dist/client/agent-chat-adapter.js.map +1 -1
  12. package/dist/client/agent-chat.d.ts +28 -0
  13. package/dist/client/agent-chat.d.ts.map +1 -1
  14. package/dist/client/agent-chat.js +84 -3
  15. package/dist/client/agent-chat.js.map +1 -1
  16. package/dist/client/chat/run-recovery.d.ts +2 -1
  17. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  18. package/dist/client/chat/run-recovery.js +4 -2
  19. package/dist/client/chat/run-recovery.js.map +1 -1
  20. package/dist/client/extensions/ExtensionViewer.js +1 -1
  21. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  22. package/dist/client/index.d.ts +3 -1
  23. package/dist/client/index.d.ts.map +1 -1
  24. package/dist/client/index.js +3 -1
  25. package/dist/client/index.js.map +1 -1
  26. package/dist/client/notifications/NotificationsBell.d.ts +3 -1
  27. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  28. package/dist/client/notifications/NotificationsBell.js +7 -3
  29. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  30. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  31. package/dist/client/terminal/AgentTerminal.js +6 -7
  32. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  33. package/dist/client/use-agent-engine-configured.d.ts +16 -0
  34. package/dist/client/use-agent-engine-configured.d.ts.map +1 -0
  35. package/dist/client/use-agent-engine-configured.js +60 -0
  36. package/dist/client/use-agent-engine-configured.js.map +1 -0
  37. package/dist/org/auto-join-domain.d.ts +11 -3
  38. package/dist/org/auto-join-domain.d.ts.map +1 -1
  39. package/dist/org/auto-join-domain.js +7 -6
  40. package/dist/org/auto-join-domain.js.map +1 -1
  41. package/dist/org/context.d.ts.map +1 -1
  42. package/dist/org/context.js +68 -32
  43. package/dist/org/context.js.map +1 -1
  44. package/dist/org/migrations.d.ts.map +1 -1
  45. package/dist/org/migrations.js +6 -0
  46. package/dist/org/migrations.js.map +1 -1
  47. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +9 -0
  48. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +11 -1
  49. package/dist/vite/client.d.ts +2 -1
  50. package/dist/vite/client.d.ts.map +1 -1
  51. package/dist/vite/client.js +121 -2
  52. package/dist/vite/client.js.map +1 -1
  53. package/docs/content/context-awareness.md +14 -2
  54. package/docs/content/creating-templates.md +6 -0
  55. package/package.json +1 -1
  56. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +9 -0
  57. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +11 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport {\n IconX,\n IconPlus,\n IconHistory,\n IconSearch,\n IconLink,\n IconLinkOff,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n type AssistantChatSendOptions,\n} from \"./AssistantChat.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { cn } from \"./utils.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"./components/ui/popover.js\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { callAction } from \"./use-action.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n isReasoningEffort,\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 normalizeAgentChatContextItem,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\n\ninterface EngineModelGroup {\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n}\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}\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: isReasoningEffort(parsed.effort) ? parsed.effort : \"auto\",\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 const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n return {\n model: selection.model,\n effort:\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\",\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 requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n const effort =\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\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=\"ml-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// ─── Scope Badge ─────────────────────────────────────────────────────────────\n\nfunction formatScopeType(type: string) {\n return type.replace(/[-_]+/g, \" \");\n}\n\nfunction indefiniteArticleFor(value: string) {\n return /^[aeiou]/i.test(value.trim()) ? \"an\" : \"a\";\n}\n\nfunction getScopeCopy(scope: ChatThreadScope, isCurrentScope: boolean) {\n const type = formatScopeType(scope.type);\n const fallbackObject = isCurrentScope\n ? `this ${type}`\n : `${indefiniteArticleFor(type)} ${type}`;\n const objectLabel = scope.label || fallbackObject;\n return {\n objectLabel,\n chipLabel:\n scope.label || (isCurrentScope ? `this ${type}` : `${type} context`),\n };\n}\n\n/**\n * Compact context tab above the composer. Click → popover with related chats\n * and the remove-context action. It stays attached to the chat field so scoped\n * context is visible right where the next message will be composed.\n */\nfunction ScopeBadge({\n scope,\n currentScope,\n onDetach,\n otherScopedThreads,\n activeThreadId,\n openTabIds,\n onSelectThread,\n}: {\n scope: ChatThreadScope;\n currentScope?: ChatThreadScope | null;\n onDetach: () => void;\n /** Other threads scoped to the same resource (excluding the active one),\n * pre-sorted most-recent-first. The chip popover lists these so the user\n * can hop between this resource's chats without opening the full history. */\n otherScopedThreads: ChatThreadSummary[];\n activeThreadId: string;\n openTabIds: Set<string>;\n onSelectThread: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const isCurrentScope = Boolean(\n currentScope &&\n currentScope.type === scope.type &&\n currentScope.id === scope.id,\n );\n const hasDifferentCurrentScope = Boolean(currentScope && !isCurrentScope);\n const { objectLabel, chipLabel } = getScopeCopy(scope, isCurrentScope);\n const heading = `Using ${chipLabel}`;\n const detailSuffix = hasDifferentCurrentScope\n ? \"Start a new chat to use the current page.\"\n : isCurrentScope\n ? \"New chats here keep this context.\"\n : \"Start a new chat for a general conversation.\";\n const otherCount = otherScopedThreads.length;\n return (\n <div className=\"agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-7 min-w-0 max-w-full cursor-pointer items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-muted-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] transition-colors hover:bg-accent hover:text-foreground sm:max-w-72\"\n aria-label={heading}\n >\n <IconLink size={11} className=\"shrink-0 opacity-70\" />\n <span className=\"min-w-0 truncate\">{heading}</span>\n {otherCount > 0 && (\n <span\n className=\"ml-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground\"\n aria-label={`${otherCount} other chats for ${objectLabel}`}\n >\n +{otherCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"center\" side=\"top\" className=\"w-72 p-0\">\n <p className=\"px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground\">\n This chat can see{\" \"}\n <span className=\"text-foreground\">{objectLabel}</span>.{\" \"}\n {detailSuffix}\n </p>\n {otherCount > 0 && (\n <div className=\"border-t border-border\">\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n Chats for {objectLabel}\n </div>\n <div className=\"max-h-56 overflow-y-auto pb-1\">\n {otherScopedThreads.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelectThread,\n () => setOpen(false),\n ),\n )}\n </div>\n </div>\n )}\n <div className=\"border-t border-border p-1\">\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n onDetach();\n }}\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer\"\n >\n <IconLinkOff size={13} />\n <span>Remove context</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\n/**\n * Empty-state addon shown when the user starts a fresh chat inside a\n * scoped surface that already has other threads. Surfaces those threads\n * inline so chats don't feel \"lost\" after the user navigates away and\n * back — the chip popover lists them too, but this nudge is visible\n * without any extra clicks.\n */\nfunction PreviousScopedChatsHint({\n scope,\n threads,\n onSelectThread,\n}: {\n scope: ChatThreadScope;\n threads: ChatThreadSummary[];\n onSelectThread: (id: string) => void;\n}) {\n const MAX_INLINE = 3;\n const shown = threads.slice(0, MAX_INLINE);\n const remaining = threads.length - shown.length;\n const scopeLabel = scope.label || `this ${formatScopeType(scope.type)}`;\n return (\n <div className=\"flex w-full max-w-[280px] flex-col gap-1.5\">\n <div className=\"text-[10px] uppercase tracking-wider text-muted-foreground/70 text-center\">\n Previous chats for {scopeLabel}\n </div>\n <div className=\"flex flex-col gap-1\">\n {shown.map((thread) => (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => onSelectThread(thread.id)}\n className=\"flex items-baseline justify-between gap-2 rounded-md border border-border px-2.5 py-1.5 text-left hover:bg-accent cursor-pointer\"\n >\n <span className=\"truncate text-[12px] text-foreground\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {formatThreadTime(thread.updatedAt)}\n </span>\n </button>\n ))}\n </div>\n {remaining > 0 && (\n <div className=\"text-[10px] text-muted-foreground/70 text-center\">\n +{remaining} more\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Thin confirmation banner shown briefly after detach. The chip itself\n * unmounts the moment scope clears on the active thread, so this banner\n * holds the visual feedback long enough for the user to register what\n * just happened and learn where the chat went (History popover).\n */\nfunction DetachConfirmationBanner() {\n return (\n <div className=\"agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground\">\n <span className=\"inline-flex h-7 min-w-0 max-w-full items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] sm:max-w-80\">\n <IconCheck size={11} className=\"shrink-0 opacity-80\" />\n <span className=\"min-w-0 truncate\">\n Context removed. Find this chat in History.\n </span>\n </span>\n </div>\n );\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 renderThreadRow(\n thread: ChatThreadSummary,\n activeThreadId: string | null,\n openTabIds: Set<string>,\n formatTime: (ts: number) => string,\n onSelect: (id: string) => void,\n onClose: () => void,\n) {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n onClick={() => {\n onSelect(thread.id);\n onClose();\n }}\n className={cn(\n \"w-full px-3 py-2 text-left hover:bg-accent/50 cursor-pointer\",\n isActive && \"bg-accent/30\",\n )}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">\n {isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatTime(thread.updatedAt)}\n </span>\n </div>\n {thread.preview && thread.title !== thread.preview && (\n <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n {thread.preview}\n </div>\n )}\n {thread.scope?.label && (\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/70 truncate\">\n {thread.scope.label}\n </div>\n )}\n </button>\n );\n}\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n currentScope,\n onSelect,\n onClose,\n onSearch,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n currentScope?: ChatThreadScope | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\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 // When scope is set we split history into two sections so the user can\n // see \"this deck's chats\" first without losing access to general /\n // other-deck chats. Section labels intentionally use the current\n // resource type (deck/design/dashboard) instead of a generic phrase.\n const sectionedThreads = currentScope\n ? {\n scoped: filtered.filter(\n (t) =>\n t.scope?.type === currentScope.type &&\n t.scope?.id === currentScope.id,\n ),\n other: filtered.filter(\n (t) =>\n !t.scope ||\n t.scope.type !== currentScope.type ||\n t.scope.id !== currentScope.id,\n ),\n }\n : null;\n\n return (\n <Popover open onOpenChange={(open) => !open && onClose()}>\n <PopoverAnchor asChild>\n <span aria-hidden className=\"absolute right-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 <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border\">\n <IconSearch size={13} />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search chats...\"\n className=\"flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {isSearching ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n Searching...\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n {search ? \"No matching chats\" : \"No chats yet\"}\n </div>\n ) : sectionedThreads ? (\n <>\n {sectionedThreads.scoped.length > 0 && (\n <>\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n This {currentScope!.type}\n </div>\n {sectionedThreads.scoped.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n {sectionedThreads.other.length > 0 && (\n <>\n <div className=\"px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n All chats\n </div>\n {sectionedThreads.other.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n </>\n ) : (\n filtered.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )\n )}\n </div>\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 right-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 normalizeRequestMode(value: unknown): \"act\" | \"plan\" | undefined {\n return value === \"act\" || value === \"plan\" ? value : undefined;\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;\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 overlay 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 * Bind new chats to a resource (deck, design, dashboard, etc.). When set,\n * new chats automatically inherit this scope and scoped chats tuck away when\n * the user leaves the resource. General chats remain visible across resource\n * navigation, and the user can detach a scoped chat via the scope chip above\n * the composer.\n */\n scope?: ChatThreadScope | null;\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 scope = null,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread,\n detachThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n refreshThreads,\n isNewThread,\n } = useChatThreads(apiUrl, storageKey, scope, { restoreActiveThread });\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 const pendingSends = useRef<Map<string, PendingSend>>(new Map());\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 newThreadIds = useRef<Set<string>>(new Set());\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\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 (threadId: string, item: AgentChatContextItem) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.setComposerContextItem(item);\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 existingEffort = existing?.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const effort =\n existingEffort === \"auto\" || effortOptions.includes(existingEffort)\n ? existingEffort\n : \"auto\";\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 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 let groups: EngineModelGroup[];\n\n if (builderConnected) {\n // When Builder.io is connected, show all Builder-supported\n // models grouped by provider — all route through the builder\n // engine so no individual API keys are needed.\n const builderEngine = enginesData.engines.find(\n (e: any) => e.name === \"builder\",\n );\n const builderModels: string[] = builderEngine?.supportedModels ?? [];\n const claude = builderModels.filter((m: string) =>\n m.startsWith(\"claude-\"),\n );\n const openai = builderModels.filter((m: string) =>\n m.startsWith(\"gpt-\"),\n );\n const gemini = builderModels.filter((m: string) =>\n m.startsWith(\"gemini-\"),\n );\n\n groups = [\n ...(claude.length\n ? [\n {\n engine: \"builder\",\n label: \"Claude\",\n models: claude,\n configured: true,\n },\n ]\n : []),\n ...(openai.length\n ? [\n {\n engine: \"builder\",\n label: \"OpenAI\",\n models: openai,\n configured: true,\n },\n ]\n : []),\n ...(gemini.length\n ? [\n {\n engine: \"builder\",\n label: \"Gemini\",\n models: gemini,\n configured: true,\n },\n ]\n : []),\n ];\n } else {\n // No Builder connection — show SDK engines this app can run.\n const allowedEngines = new Set([\n \"anthropic\",\n \"ai-sdk:openai\",\n \"ai-sdk:google\",\n ]);\n groups = enginesData.engines\n .filter(\n (e: any) =>\n allowedEngines.has(e.name) && e.packageInstalled !== false,\n )\n .map((e: any) => {\n const models = [...e.supportedModels];\n if (\n e.name === currentEngineName &&\n currentModel &&\n !models.includes(currentModel)\n ) {\n models.unshift(currentModel);\n }\n return {\n engine: e.name,\n label: e.label,\n models,\n configured:\n e.requiredEnvVars.length === 0 ||\n e.requiredEnvVars.some((v: string) =>\n configuredKeys.has(v),\n ) ||\n e.name === currentEngineName,\n };\n });\n }\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {});\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 // Per-scope: when scope changes (e.g. user navigates from Deck A to Deck\n // B), the tab bar reflects whichever tabs they had open for *that*\n // resource. We do not bleed deck A's tabs into deck B's view.\n const scopeKeyPart = scope ? `:scope:${scope.type}:${scope.id}` : \"\";\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}${scopeKeyPart}`;\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 // Rehydrate open tabs when the scope flips. Mirrors `persistedKeyRef` in\n // `useChatThreads`: on a scope change we need to read the new key BEFORE\n // the persistence effect writes the current (now-wrong) tab list under\n // that new key.\n const openTabsKeyRef = useRef(OPEN_TABS_KEY);\n useEffect(() => {\n if (openTabsKeyRef.current === OPEN_TABS_KEY) return;\n openTabsKeyRef.current = OPEN_TABS_KEY;\n initializedRef.current = false;\n if (!restoreActiveThread) {\n setOpenTabIds(activeThreadId ? [activeThreadId] : []);\n return;\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)) {\n for (const id of parsed) mountedTabsRef.current.add(id);\n setOpenTabIds(parsed);\n return;\n }\n }\n } catch {}\n setOpenTabIds([]);\n }, [OPEN_TABS_KEY, activeThreadId, restoreActiveThread]);\n\n // Look up the active thread's actual scope from the list — when the\n // user opens a chat from history that was scoped to a different\n // resource, the badge should advertise that thread's binding, not\n // necessarily the resource currently in the viewport. When the thread\n // and the live prop refer to the same resource, prefer the prop's\n // label so a rename or a deferred deck-title load shows up in the UI\n // without waiting on the next persistence cycle.\n const activeThreadScope = useMemo<ChatThreadScope | null>(() => {\n if (!activeThreadId) return null;\n const t = threads.find((x) => x.id === activeThreadId);\n const stored = t?.scope ?? null;\n if (!stored) return null;\n if (scope && stored.type === scope.type && stored.id === scope.id) {\n return { ...stored, label: scope.label || stored.label };\n }\n return stored;\n }, [threads, activeThreadId, scope?.type, scope?.id, scope?.label]);\n\n // Brief confirmation banner shown after detach. The chip itself disappears\n // the instant scope clears, which the user described as \"nothing different\n // happened.\" We hold the confirmation in the same slot for ~2s so the\n // detach is visually acknowledged and the user is pointed at History.\n const [detachConfirmType, setDetachConfirmType] = useState<string | null>(\n null,\n );\n const detachTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n };\n }, []);\n const handleDetachActiveThread = useCallback(() => {\n if (!activeThreadId || !activeThreadScope) return;\n const type = activeThreadScope.type;\n setDetachConfirmType(type);\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n detachTimerRef.current = setTimeout(() => setDetachConfirmType(null), 2200);\n detachThread(activeThreadId);\n }, [activeThreadId, activeThreadScope, detachThread]);\n\n // Other chats scoped to the active thread's resource (excluding the active\n // thread itself). Sorted most-recent-first to match user expectation in the\n // chip popover and empty-state addon.\n const otherScopedThreads = useMemo<ChatThreadSummary[]>(() => {\n if (!activeThreadScope) return [];\n return threads\n .filter(\n (t) =>\n t.id !== activeThreadId &&\n t.scope?.type === activeThreadScope.type &&\n t.scope?.id === activeThreadScope.id,\n )\n .sort((a, b) => b.updatedAt - a.updatedAt);\n }, [threads, activeThreadId, activeThreadScope]);\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();\n }\n }, [activeThreadId, threads, parentMap, switchThread, createThread]);\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 // Scoped navigation can reset openTabIds from a different localStorage key\n // without changing activeThreadId. Re-check after tab-list resets so the\n // sidebar cannot end up with a live 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 }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread]);\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 void 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 setContextInTab(currentTabId, item);\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 if (event.data?.type !== \"agentNative.submitChat\") return;\n const message = event.data.data?.message as string;\n if (!message) return;\n const context = event.data.data?.context as string | undefined;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n const model = event.data.data?.model as string | undefined;\n const effort = event.data.data?.effort as unknown;\n const newTab = event.data.data?.newTab as boolean | undefined;\n const tabId = event.data.data?.tabId;\n const requestedTabId = typeof tabId === \"string\" ? tabId : undefined;\n const background = event.data.data?.background as boolean | undefined;\n const submit = event.data.data?.submit !== false;\n const rawImages = event.data.data?.images;\n const images = Array.isArray(rawImages)\n ? rawImages.filter(\n (image): image is string =>\n typeof image === \"string\" && image.length > 0,\n )\n : undefined;\n const requestMode =\n normalizeRequestMode(\n event.data.data?.requestMode ?? event.data.data?.mode,\n ) ?? 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) return;\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 sendToTab = (threadId: string) => {\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 requestedEffort = isReasoningEffort(effort) ? effort : \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const selectedEffort =\n requestedEffort === \"auto\" ||\n effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\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 const sendOptions: AssistantChatSendOptions | undefined =\n background || requestMode\n ? {\n ...(background ? { trackInRunsTray: true } : {}),\n ...(requestMode ? { requestMode } : {}),\n }\n : undefined;\n if (ref) {\n if (submit) {\n if (sendOptions) {\n ref.sendMessage(fullMessage, images, sendOptions);\n } else {\n ref.sendMessage(fullMessage, images);\n }\n } else {\n ref.prefillMessage(fullMessage);\n }\n } else {\n pendingSends.current.set(threadId, {\n message: fullMessage,\n images,\n submit,\n ...(sendOptions ? sendOptions : {}),\n });\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId).then((newId) => {\n if (newId) {\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 sendToTab(newId);\n if (background && previousTabId) {\n switchThread(previousTabId);\n }\n }\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n sendToTab(currentTabId);\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 ]);\n\n // Process pending sends when refs mount\n useEffect(() => {\n const pendingTabIds = new Set([\n ...pendingSends.current.keys(),\n ...pendingContextItems.current.keys(),\n ]);\n for (const tabId of pendingTabIds) {\n const ref = chatRefs.current.get(tabId);\n if (ref) {\n const pendingContext = pendingContextItems.current.get(tabId);\n if (pendingContext) {\n for (const item of pendingContext) {\n ref.setComposerContextItem(item);\n }\n pendingContextItems.current.delete(tabId);\n }\n const pending = pendingSends.current.get(tabId);\n if (pending) {\n setTimeout(() => {\n if (pending.submit) {\n if (pending.trackInRunsTray || pending.requestMode) {\n ref.sendMessage(pending.message, pending.images, {\n ...(pending.trackInRunsTray ? { trackInRunsTray: true } : {}),\n ...(pending.requestMode\n ? { requestMode: pending.requestMode }\n : {}),\n });\n } else {\n ref.sendMessage(pending.message, pending.images);\n }\n } else {\n ref.prefillMessage(pending.message);\n }\n }, 50);\n pendingSends.current.delete(tabId);\n }\n }\n }\n }, [openTabIds]);\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 }\n return id;\n }, [createThread]);\n\n const cleanupClosedTab = useCallback((tabId: string) => {\n if (parentMapRef.current[tabId]) {\n dismissedSubAgentTabsRef.current.add(tabId);\n }\n chatRefs.current.delete(tabId);\n pendingSends.current.delete(tabId);\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 }\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],\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 pendingSends.current.delete(key);\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 switchThread(id);\n dismissedSubAgentTabsRef.current.clear();\n // Clean up all old refs\n chatRefs.current.clear();\n pendingSends.current.clear();\n pendingContextItems.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n setSubAgentStatuses({});\n }\n }, [createThread, switchThread]);\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 | { threadId?: unknown; newThread?: unknown }\n | undefined;\n const threadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : \"\";\n if (!threadId) return;\n\n if (detail?.newThread === true) {\n newThreadIds.current.add(threadId);\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 }, [switchThread]);\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 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 // Watch for agent-issued chat-command in application-state\n const lastChatCommandRef = useRef(0);\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function pollChatCommand() {\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 if (!openTabIds.includes(threadId)) {\n setOpenTabIds((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 if (!stopped) {\n timer = setTimeout(pollChatCommand, 2000);\n }\n }\n\n pollChatCommand();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [openTabIds, 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 },\n [saveThreadData],\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-left\"\n >\n <span className=\"truncate pr-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 ml-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-left\"\n >\n <span className=\"truncate pr-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 className=\"relative flex-1 flex flex-col min-h-0\">\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 currentScope={scope}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onSearch={searchThreads}\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 tabThread = threads.find((thread) => thread.id === tabId);\n const tabScope =\n tabThread?.scope ??\n (tabId === activeThreadId ? activeThreadScope : null);\n const tabDynamicSuggestions =\n tabId === activeThreadId && !contentHidden\n ? props.dynamicSuggestions\n : false;\n const scopeComposerSlot =\n tabId === activeThreadId && !contentHidden ? (\n tabScope && activeThreadId ? (\n <ScopeBadge\n scope={tabScope}\n currentScope={scope}\n onDetach={handleDetachActiveThread}\n otherScopedThreads={otherScopedThreads}\n activeThreadId={activeThreadId}\n openTabIds={new Set(openTabIds)}\n onSelectThread={openFromHistory}\n />\n ) : detachConfirmType ? (\n <DetachConfirmationBanner />\n ) : null\n ) : null;\n const composerSlot =\n scopeComposerSlot || props.composerSlot ? (\n <>\n {props.composerSlot}\n {scopeComposerSlot}\n </>\n ) : undefined;\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 apiUrl={apiUrl}\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 emptyStateText={\n tabScope?.label && tabId === activeThreadId\n ? `Ask about ${tabScope.label}`\n : props.emptyStateText\n }\n emptyStateAddon={\n tabId === activeThreadId &&\n tabScope &&\n otherScopedThreads.length > 0 ? (\n <PreviousScopedChatsHint\n scope={tabScope}\n threads={otherScopedThreads}\n onSelectThread={openFromHistory}\n />\n ) : undefined\n }\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 contextScope={tabScope}\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={modelSelection?.effort ?? \"auto\"}\n composerSlot={composerSlot}\n defaultModel={defaultModel}\n availableModels={availableModels}\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 React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport {\n IconX,\n IconPlus,\n IconHistory,\n IconSearch,\n IconLink,\n IconLinkOff,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { cn } from \"./utils.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"./components/ui/popover.js\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { callAction } from \"./use-action.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n isReasoningEffort,\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 claimAgentChatSubmit,\n drainBufferedAgentChatSubmits,\n normalizeAgentChatContextItem,\n parseSubmitChatMessage,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\n\ninterface EngineModelGroup {\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n}\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}\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 (!send.submit) {\n ref.prefillMessage(send.message);\n return;\n }\n if (send.trackInRunsTray || send.requestMode) {\n ref.sendMessage(send.message, send.images, {\n ...(send.trackInRunsTray ? { trackInRunsTray: true } : {}),\n ...(send.requestMode ? { requestMode: send.requestMode } : {}),\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: isReasoningEffort(parsed.effort) ? parsed.effort : \"auto\",\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 const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n return {\n model: selection.model,\n effort:\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\",\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 requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n const effort =\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\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=\"ml-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// ─── Scope Badge ─────────────────────────────────────────────────────────────\n\nfunction formatScopeType(type: string) {\n return type.replace(/[-_]+/g, \" \");\n}\n\nfunction indefiniteArticleFor(value: string) {\n return /^[aeiou]/i.test(value.trim()) ? \"an\" : \"a\";\n}\n\nfunction getScopeCopy(scope: ChatThreadScope, isCurrentScope: boolean) {\n const type = formatScopeType(scope.type);\n const fallbackObject = isCurrentScope\n ? `this ${type}`\n : `${indefiniteArticleFor(type)} ${type}`;\n const objectLabel = scope.label || fallbackObject;\n return {\n objectLabel,\n chipLabel:\n scope.label || (isCurrentScope ? `this ${type}` : `${type} context`),\n };\n}\n\n/**\n * Compact context tab above the composer. Click → popover with related chats\n * and the remove-context action. It stays attached to the chat field so scoped\n * context is visible right where the next message will be composed.\n */\nfunction ScopeBadge({\n scope,\n currentScope,\n onDetach,\n otherScopedThreads,\n activeThreadId,\n openTabIds,\n onSelectThread,\n}: {\n scope: ChatThreadScope;\n currentScope?: ChatThreadScope | null;\n onDetach: () => void;\n /** Other threads scoped to the same resource (excluding the active one),\n * pre-sorted most-recent-first. The chip popover lists these so the user\n * can hop between this resource's chats without opening the full history. */\n otherScopedThreads: ChatThreadSummary[];\n activeThreadId: string;\n openTabIds: Set<string>;\n onSelectThread: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const isCurrentScope = Boolean(\n currentScope &&\n currentScope.type === scope.type &&\n currentScope.id === scope.id,\n );\n const hasDifferentCurrentScope = Boolean(currentScope && !isCurrentScope);\n const { objectLabel, chipLabel } = getScopeCopy(scope, isCurrentScope);\n const heading = `Using ${chipLabel}`;\n const detailSuffix = hasDifferentCurrentScope\n ? \"Start a new chat to use the current page.\"\n : isCurrentScope\n ? \"New chats here keep this context.\"\n : \"Start a new chat for a general conversation.\";\n const otherCount = otherScopedThreads.length;\n return (\n <div className=\"agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-7 min-w-0 max-w-full cursor-pointer items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-muted-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] transition-colors hover:bg-accent hover:text-foreground sm:max-w-72\"\n aria-label={heading}\n >\n <IconLink size={11} className=\"shrink-0 opacity-70\" />\n <span className=\"min-w-0 truncate\">{heading}</span>\n {otherCount > 0 && (\n <span\n className=\"ml-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground\"\n aria-label={`${otherCount} other chats for ${objectLabel}`}\n >\n +{otherCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"center\" side=\"top\" className=\"w-72 p-0\">\n <p className=\"px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground\">\n This chat can see{\" \"}\n <span className=\"text-foreground\">{objectLabel}</span>.{\" \"}\n {detailSuffix}\n </p>\n {otherCount > 0 && (\n <div className=\"border-t border-border\">\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n Chats for {objectLabel}\n </div>\n <div className=\"max-h-56 overflow-y-auto pb-1\">\n {otherScopedThreads.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelectThread,\n () => setOpen(false),\n ),\n )}\n </div>\n </div>\n )}\n <div className=\"border-t border-border p-1\">\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n onDetach();\n }}\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer\"\n >\n <IconLinkOff size={13} />\n <span>Remove context</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\n/**\n * Empty-state addon shown when the user starts a fresh chat inside a\n * scoped surface that already has other threads. Surfaces those threads\n * inline so chats don't feel \"lost\" after the user navigates away and\n * back — the chip popover lists them too, but this nudge is visible\n * without any extra clicks.\n */\nfunction PreviousScopedChatsHint({\n scope,\n threads,\n onSelectThread,\n}: {\n scope: ChatThreadScope;\n threads: ChatThreadSummary[];\n onSelectThread: (id: string) => void;\n}) {\n const MAX_INLINE = 3;\n const shown = threads.slice(0, MAX_INLINE);\n const remaining = threads.length - shown.length;\n const scopeLabel = scope.label || `this ${formatScopeType(scope.type)}`;\n return (\n <div className=\"flex w-full max-w-[280px] flex-col gap-1.5\">\n <div className=\"text-[10px] uppercase tracking-wider text-muted-foreground/70 text-center\">\n Previous chats for {scopeLabel}\n </div>\n <div className=\"flex flex-col gap-1\">\n {shown.map((thread) => (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => onSelectThread(thread.id)}\n className=\"flex items-baseline justify-between gap-2 rounded-md border border-border px-2.5 py-1.5 text-left hover:bg-accent cursor-pointer\"\n >\n <span className=\"truncate text-[12px] text-foreground\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {formatThreadTime(thread.updatedAt)}\n </span>\n </button>\n ))}\n </div>\n {remaining > 0 && (\n <div className=\"text-[10px] text-muted-foreground/70 text-center\">\n +{remaining} more\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Thin confirmation banner shown briefly after detach. The chip itself\n * unmounts the moment scope clears on the active thread, so this banner\n * holds the visual feedback long enough for the user to register what\n * just happened and learn where the chat went (History popover).\n */\nfunction DetachConfirmationBanner() {\n return (\n <div className=\"agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground\">\n <span className=\"inline-flex h-7 min-w-0 max-w-full items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] sm:max-w-80\">\n <IconCheck size={11} className=\"shrink-0 opacity-80\" />\n <span className=\"min-w-0 truncate\">\n Context removed. Find this chat in History.\n </span>\n </span>\n </div>\n );\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 renderThreadRow(\n thread: ChatThreadSummary,\n activeThreadId: string | null,\n openTabIds: Set<string>,\n formatTime: (ts: number) => string,\n onSelect: (id: string) => void,\n onClose: () => void,\n) {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n onClick={() => {\n onSelect(thread.id);\n onClose();\n }}\n className={cn(\n \"w-full px-3 py-2 text-left hover:bg-accent/50 cursor-pointer\",\n isActive && \"bg-accent/30\",\n )}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">\n {isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatTime(thread.updatedAt)}\n </span>\n </div>\n {thread.preview && thread.title !== thread.preview && (\n <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n {thread.preview}\n </div>\n )}\n {thread.scope?.label && (\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/70 truncate\">\n {thread.scope.label}\n </div>\n )}\n </button>\n );\n}\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n currentScope,\n onSelect,\n onClose,\n onSearch,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n currentScope?: ChatThreadScope | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\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 // When scope is set we split history into two sections so the user can\n // see \"this deck's chats\" first without losing access to general /\n // other-deck chats. Section labels intentionally use the current\n // resource type (deck/design/dashboard) instead of a generic phrase.\n const sectionedThreads = currentScope\n ? {\n scoped: filtered.filter(\n (t) =>\n t.scope?.type === currentScope.type &&\n t.scope?.id === currentScope.id,\n ),\n other: filtered.filter(\n (t) =>\n !t.scope ||\n t.scope.type !== currentScope.type ||\n t.scope.id !== currentScope.id,\n ),\n }\n : null;\n\n return (\n <Popover open onOpenChange={(open) => !open && onClose()}>\n <PopoverAnchor asChild>\n <span aria-hidden className=\"absolute right-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 <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border\">\n <IconSearch size={13} />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search chats...\"\n className=\"flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {isSearching ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n Searching...\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n {search ? \"No matching chats\" : \"No chats yet\"}\n </div>\n ) : sectionedThreads ? (\n <>\n {sectionedThreads.scoped.length > 0 && (\n <>\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n This {currentScope!.type}\n </div>\n {sectionedThreads.scoped.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n {sectionedThreads.other.length > 0 && (\n <>\n <div className=\"px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n All chats\n </div>\n {sectionedThreads.other.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n </>\n ) : (\n filtered.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )\n )}\n </div>\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 right-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;\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 overlay 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 * Bind new chats to a resource (deck, design, dashboard, etc.). When set,\n * new chats automatically inherit this scope and scoped chats tuck away when\n * the user leaves the resource. General chats remain visible across resource\n * navigation, and the user can detach a scoped chat via the scope chip above\n * the composer.\n */\n scope?: ChatThreadScope | null;\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 scope = null,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread,\n detachThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n refreshThreads,\n isNewThread,\n } = useChatThreads(apiUrl, storageKey, scope, { restoreActiveThread });\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 newThreadIds = useRef<Set<string>>(new Set());\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\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 (threadId: string, item: AgentChatContextItem) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.setComposerContextItem(item);\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 existingEffort = existing?.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const effort =\n existingEffort === \"auto\" || effortOptions.includes(existingEffort)\n ? existingEffort\n : \"auto\";\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 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 let groups: EngineModelGroup[];\n\n if (builderConnected) {\n // When Builder.io is connected, show all Builder-supported\n // models grouped by provider — all route through the builder\n // engine so no individual API keys are needed.\n const builderEngine = enginesData.engines.find(\n (e: any) => e.name === \"builder\",\n );\n const builderModels: string[] = builderEngine?.supportedModels ?? [];\n const claude = builderModels.filter((m: string) =>\n m.startsWith(\"claude-\"),\n );\n const openai = builderModels.filter((m: string) =>\n m.startsWith(\"gpt-\"),\n );\n const gemini = builderModels.filter((m: string) =>\n m.startsWith(\"gemini-\"),\n );\n\n groups = [\n ...(claude.length\n ? [\n {\n engine: \"builder\",\n label: \"Claude\",\n models: claude,\n configured: true,\n },\n ]\n : []),\n ...(openai.length\n ? [\n {\n engine: \"builder\",\n label: \"OpenAI\",\n models: openai,\n configured: true,\n },\n ]\n : []),\n ...(gemini.length\n ? [\n {\n engine: \"builder\",\n label: \"Gemini\",\n models: gemini,\n configured: true,\n },\n ]\n : []),\n ];\n } else {\n // No Builder connection — show SDK engines this app can run.\n const allowedEngines = new Set([\n \"anthropic\",\n \"ai-sdk:openai\",\n \"ai-sdk:google\",\n ]);\n groups = enginesData.engines\n .filter(\n (e: any) =>\n allowedEngines.has(e.name) && e.packageInstalled !== false,\n )\n .map((e: any) => {\n const models = [...e.supportedModels];\n if (\n e.name === currentEngineName &&\n currentModel &&\n !models.includes(currentModel)\n ) {\n models.unshift(currentModel);\n }\n return {\n engine: e.name,\n label: e.label,\n models,\n configured:\n e.requiredEnvVars.length === 0 ||\n e.requiredEnvVars.some((v: string) =>\n configuredKeys.has(v),\n ) ||\n e.name === currentEngineName,\n };\n });\n }\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {});\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 // Per-scope: when scope changes (e.g. user navigates from Deck A to Deck\n // B), the tab bar reflects whichever tabs they had open for *that*\n // resource. We do not bleed deck A's tabs into deck B's view.\n const scopeKeyPart = scope ? `:scope:${scope.type}:${scope.id}` : \"\";\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}${scopeKeyPart}`;\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 // Rehydrate open tabs when the scope flips. Mirrors `persistedKeyRef` in\n // `useChatThreads`: on a scope change we need to read the new key BEFORE\n // the persistence effect writes the current (now-wrong) tab list under\n // that new key.\n const openTabsKeyRef = useRef(OPEN_TABS_KEY);\n useEffect(() => {\n if (openTabsKeyRef.current === OPEN_TABS_KEY) return;\n openTabsKeyRef.current = OPEN_TABS_KEY;\n initializedRef.current = false;\n if (!restoreActiveThread) {\n setOpenTabIds(activeThreadId ? [activeThreadId] : []);\n return;\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)) {\n for (const id of parsed) mountedTabsRef.current.add(id);\n setOpenTabIds(parsed);\n return;\n }\n }\n } catch {}\n setOpenTabIds([]);\n }, [OPEN_TABS_KEY, activeThreadId, restoreActiveThread]);\n\n // Look up the active thread's actual scope from the list — when the\n // user opens a chat from history that was scoped to a different\n // resource, the badge should advertise that thread's binding, not\n // necessarily the resource currently in the viewport. When the thread\n // and the live prop refer to the same resource, prefer the prop's\n // label so a rename or a deferred deck-title load shows up in the UI\n // without waiting on the next persistence cycle.\n const activeThreadScope = useMemo<ChatThreadScope | null>(() => {\n if (!activeThreadId) return null;\n const t = threads.find((x) => x.id === activeThreadId);\n const stored = t?.scope ?? null;\n if (!stored) return null;\n if (scope && stored.type === scope.type && stored.id === scope.id) {\n return { ...stored, label: scope.label || stored.label };\n }\n return stored;\n }, [threads, activeThreadId, scope?.type, scope?.id, scope?.label]);\n\n // Brief confirmation banner shown after detach. The chip itself disappears\n // the instant scope clears, which the user described as \"nothing different\n // happened.\" We hold the confirmation in the same slot for ~2s so the\n // detach is visually acknowledged and the user is pointed at History.\n const [detachConfirmType, setDetachConfirmType] = useState<string | null>(\n null,\n );\n const detachTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n };\n }, []);\n const handleDetachActiveThread = useCallback(() => {\n if (!activeThreadId || !activeThreadScope) return;\n const type = activeThreadScope.type;\n setDetachConfirmType(type);\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n detachTimerRef.current = setTimeout(() => setDetachConfirmType(null), 2200);\n detachThread(activeThreadId);\n }, [activeThreadId, activeThreadScope, detachThread]);\n\n // Other chats scoped to the active thread's resource (excluding the active\n // thread itself). Sorted most-recent-first to match user expectation in the\n // chip popover and empty-state addon.\n const otherScopedThreads = useMemo<ChatThreadSummary[]>(() => {\n if (!activeThreadScope) return [];\n return threads\n .filter(\n (t) =>\n t.id !== activeThreadId &&\n t.scope?.type === activeThreadScope.type &&\n t.scope?.id === activeThreadScope.id,\n )\n .sort((a, b) => b.updatedAt - a.updatedAt);\n }, [threads, activeThreadId, activeThreadScope]);\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();\n }\n }, [activeThreadId, threads, parentMap, switchThread, createThread]);\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 // Scoped navigation can reset openTabIds from a different localStorage key\n // without changing activeThreadId. Re-check after tab-list resets so the\n // sidebar cannot end up with a live 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 }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread]);\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 void 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 setContextInTab(currentTabId, item);\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 } = 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) return;\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 };\n\n const sendToTab = (threadId: string) => {\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 requestedEffort = isReasoningEffort(effort) ? effort : \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const selectedEffort =\n requestedEffort === \"auto\" ||\n effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\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).then((newId) => {\n if (newId) {\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 sendToTab(newId);\n if (background && previousTabId) {\n switchThread(previousTabId);\n }\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 ]);\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 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 }\n return id;\n }, [createThread]);\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 }\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],\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 switchThread(id);\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, switchThread]);\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 | { threadId?: unknown; newThread?: unknown }\n | undefined;\n const threadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : \"\";\n if (!threadId) return;\n\n if (detail?.newThread === true) {\n newThreadIds.current.add(threadId);\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 }, [switchThread]);\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 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 // Watch for agent-issued chat-command in application-state\n const lastChatCommandRef = useRef(0);\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function pollChatCommand() {\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 if (!openTabIds.includes(threadId)) {\n setOpenTabIds((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 if (!stopped) {\n timer = setTimeout(pollChatCommand, 2000);\n }\n }\n\n pollChatCommand();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [openTabIds, 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 },\n [saveThreadData],\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-left\"\n >\n <span className=\"truncate pr-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 ml-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-left\"\n >\n <span className=\"truncate pr-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 className=\"relative flex-1 flex flex-col min-h-0\">\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 currentScope={scope}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onSearch={searchThreads}\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 tabThread = threads.find((thread) => thread.id === tabId);\n const tabScope =\n tabThread?.scope ??\n (tabId === activeThreadId ? activeThreadScope : null);\n const tabDynamicSuggestions =\n tabId === activeThreadId && !contentHidden\n ? props.dynamicSuggestions\n : false;\n const scopeComposerSlot =\n tabId === activeThreadId && !contentHidden ? (\n tabScope && activeThreadId ? (\n <ScopeBadge\n scope={tabScope}\n currentScope={scope}\n onDetach={handleDetachActiveThread}\n otherScopedThreads={otherScopedThreads}\n activeThreadId={activeThreadId}\n openTabIds={new Set(openTabIds)}\n onSelectThread={openFromHistory}\n />\n ) : detachConfirmType ? (\n <DetachConfirmationBanner />\n ) : null\n ) : null;\n const composerSlot =\n scopeComposerSlot || props.composerSlot ? (\n <>\n {props.composerSlot}\n {scopeComposerSlot}\n </>\n ) : undefined;\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 apiUrl={apiUrl}\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 emptyStateText={\n tabScope?.label && tabId === activeThreadId\n ? `Ask about ${tabScope.label}`\n : props.emptyStateText\n }\n emptyStateAddon={\n tabId === activeThreadId &&\n tabScope &&\n otherScopedThreads.length > 0 ? (\n <PreviousScopedChatsHint\n scope={tabScope}\n threads={otherScopedThreads}\n onSelectThread={openFromHistory}\n />\n ) : undefined\n }\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 contextScope={tabScope}\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={modelSelection?.effort ?? \"auto\"}\n composerSlot={composerSlot}\n defaultModel={defaultModel}\n availableModels={availableModels}\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"]}