@agent-native/core 0.54.1 → 0.55.0

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 (134) hide show
  1. package/README.md +16 -1
  2. package/dist/agent/production-agent.d.ts.map +1 -1
  3. package/dist/agent/production-agent.js +4 -0
  4. package/dist/agent/production-agent.js.map +1 -1
  5. package/dist/cli/connect.d.ts +3 -1
  6. package/dist/cli/connect.d.ts.map +1 -1
  7. package/dist/cli/connect.js +7 -1
  8. package/dist/cli/connect.js.map +1 -1
  9. package/dist/cli/index.js +1 -1
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/plan-local.d.ts +40 -0
  12. package/dist/cli/plan-local.d.ts.map +1 -1
  13. package/dist/cli/plan-local.js +495 -9
  14. package/dist/cli/plan-local.js.map +1 -1
  15. package/dist/cli/skills.d.ts +17 -2
  16. package/dist/cli/skills.d.ts.map +1 -1
  17. package/dist/cli/skills.js +135 -36
  18. package/dist/cli/skills.js.map +1 -1
  19. package/dist/client/AgentChatHome.d.ts +23 -0
  20. package/dist/client/AgentChatHome.d.ts.map +1 -0
  21. package/dist/client/AgentChatHome.js +13 -0
  22. package/dist/client/AgentChatHome.js.map +1 -0
  23. package/dist/client/AgentPanel.d.ts +29 -2
  24. package/dist/client/AgentPanel.d.ts.map +1 -1
  25. package/dist/client/AgentPanel.js +116 -68
  26. package/dist/client/AgentPanel.js.map +1 -1
  27. package/dist/client/AssistantChat.d.ts.map +1 -1
  28. package/dist/client/AssistantChat.js +140 -18
  29. package/dist/client/AssistantChat.js.map +1 -1
  30. package/dist/client/FeedbackButton.d.ts +7 -1
  31. package/dist/client/FeedbackButton.d.ts.map +1 -1
  32. package/dist/client/FeedbackButton.js +13 -3
  33. package/dist/client/FeedbackButton.js.map +1 -1
  34. package/dist/client/MultiTabAssistantChat.d.ts +1 -2
  35. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  36. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  37. package/dist/client/agent-sidebar-state.d.ts +2 -0
  38. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  39. package/dist/client/agent-sidebar-state.js +15 -4
  40. package/dist/client/agent-sidebar-state.js.map +1 -1
  41. package/dist/client/chat/index.d.ts +5 -0
  42. package/dist/client/chat/index.d.ts.map +1 -1
  43. package/dist/client/chat/index.js +5 -0
  44. package/dist/client/chat/index.js.map +1 -1
  45. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  46. package/dist/client/chat/run-recovery.js +4 -6
  47. package/dist/client/chat/run-recovery.js.map +1 -1
  48. package/dist/client/chat/tool-call-display.d.ts +1 -0
  49. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  50. package/dist/client/chat/tool-call-display.js +16 -0
  51. package/dist/client/chat/tool-call-display.js.map +1 -1
  52. package/dist/client/chat/tool-render-registry.d.ts +24 -0
  53. package/dist/client/chat/tool-render-registry.d.ts.map +1 -0
  54. package/dist/client/chat/tool-render-registry.js +37 -0
  55. package/dist/client/chat/tool-render-registry.js.map +1 -0
  56. package/dist/client/chat/widgets/DataChartRenderer.d.ts +5 -0
  57. package/dist/client/chat/widgets/DataChartRenderer.d.ts.map +1 -0
  58. package/dist/client/chat/widgets/DataChartRenderer.js +33 -0
  59. package/dist/client/chat/widgets/DataChartRenderer.js.map +1 -0
  60. package/dist/client/chat/widgets/DataChartWidget.d.ts +5 -0
  61. package/dist/client/chat/widgets/DataChartWidget.d.ts.map +1 -0
  62. package/dist/client/chat/widgets/DataChartWidget.js +15 -0
  63. package/dist/client/chat/widgets/DataChartWidget.js.map +1 -0
  64. package/dist/client/chat/widgets/DataInsightsWidget.d.ts +5 -0
  65. package/dist/client/chat/widgets/DataInsightsWidget.d.ts.map +1 -0
  66. package/dist/client/chat/widgets/DataInsightsWidget.js +18 -0
  67. package/dist/client/chat/widgets/DataInsightsWidget.js.map +1 -0
  68. package/dist/client/chat/widgets/DataTableWidget.d.ts +9 -0
  69. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -0
  70. package/dist/client/chat/widgets/DataTableWidget.js +95 -0
  71. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -0
  72. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts +2 -0
  73. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -0
  74. package/dist/client/chat/widgets/builtin-tool-renderers.js +27 -0
  75. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -0
  76. package/dist/client/chat/widgets/data-widget-types.d.ts +52 -0
  77. package/dist/client/chat/widgets/data-widget-types.d.ts.map +1 -0
  78. package/dist/client/chat/widgets/data-widget-types.js +93 -0
  79. package/dist/client/chat/widgets/data-widget-types.js.map +1 -0
  80. package/dist/client/chat-view-transition.d.ts +23 -0
  81. package/dist/client/chat-view-transition.d.ts.map +1 -0
  82. package/dist/client/chat-view-transition.js +50 -0
  83. package/dist/client/chat-view-transition.js.map +1 -0
  84. package/dist/client/composer/PromptComposer.d.ts +1 -1
  85. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  86. package/dist/client/composer/PromptComposer.js +2 -2
  87. package/dist/client/composer/PromptComposer.js.map +1 -1
  88. package/dist/client/composer/TiptapComposer.d.ts +2 -1
  89. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  90. package/dist/client/composer/TiptapComposer.js +2 -1
  91. package/dist/client/composer/TiptapComposer.js.map +1 -1
  92. package/dist/client/index.d.ts +5 -1
  93. package/dist/client/index.d.ts.map +1 -1
  94. package/dist/client/index.js +5 -1
  95. package/dist/client/index.js.map +1 -1
  96. package/dist/client/route-state.d.ts +6 -0
  97. package/dist/client/route-state.d.ts.map +1 -1
  98. package/dist/client/route-state.js +29 -1
  99. package/dist/client/route-state.js.map +1 -1
  100. package/dist/client/use-chat-threads.d.ts.map +1 -1
  101. package/dist/client/use-chat-threads.js +19 -4
  102. package/dist/client/use-chat-threads.js.map +1 -1
  103. package/dist/scripts/dev/index.d.ts +1 -0
  104. package/dist/scripts/dev/index.d.ts.map +1 -1
  105. package/dist/scripts/dev/index.js +129 -127
  106. package/dist/scripts/dev/index.js.map +1 -1
  107. package/dist/server/agent-chat-plugin.d.ts +8 -0
  108. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  109. package/dist/server/agent-chat-plugin.js +29 -21
  110. package/dist/server/agent-chat-plugin.js.map +1 -1
  111. package/dist/server/prompts/framework-core-compact.d.ts +4 -1
  112. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  113. package/dist/server/prompts/framework-core-compact.js +11 -4
  114. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  115. package/dist/server/prompts/framework-core.d.ts +4 -1
  116. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  117. package/dist/server/prompts/framework-core.js +15 -5
  118. package/dist/server/prompts/framework-core.js.map +1 -1
  119. package/dist/server/prompts/shared-rules.d.ts +4 -1
  120. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  121. package/dist/server/prompts/shared-rules.js +4 -1
  122. package/dist/server/prompts/shared-rules.js.map +1 -1
  123. package/dist/styles/agent-native.css +55 -0
  124. package/dist/vite/client.d.ts.map +1 -1
  125. package/dist/vite/client.js +4 -0
  126. package/dist/vite/client.js.map +1 -1
  127. package/docs/content/external-agents.md +14 -4
  128. package/docs/content/getting-started.md +1 -0
  129. package/docs/content/key-concepts.md +34 -15
  130. package/docs/content/mcp-apps.md +2 -0
  131. package/docs/content/mcp-protocol.md +2 -2
  132. package/docs/content/template-plan.md +16 -1
  133. package/docs/content/what-is-agent-native.md +10 -2
  134. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ import { type AgentChatSurfaceProps } from "./AgentPanel.js";
2
+ export interface AgentChatHomeProps extends Omit<AgentChatSurfaceProps, "className" | "isFullscreen" | "mode" | "style"> {
3
+ /** CSS class for the full-page shell around the chat surface. */
4
+ className?: string;
5
+ /** CSS class for the inner width/height rail. */
6
+ contentClassName?: string;
7
+ /** CSS class for the AgentChatSurface itself. */
8
+ surfaceClassName?: string;
9
+ /**
10
+ * Apply the shared chat view-transition name to the surface so it can morph
11
+ * into an AgentSidebar with `chatViewTransition` enabled.
12
+ * Default: true.
13
+ */
14
+ chatViewTransition?: boolean;
15
+ }
16
+ /**
17
+ * Minimal full-page chat route primitive for chat-first apps.
18
+ *
19
+ * It keeps the actual chat runtime in AgentChatSurface while providing a stable
20
+ * first-viewport shell that templates can use for `/`, `/ask`, or `/chat`.
21
+ */
22
+ export declare function AgentChatHome({ className, contentClassName, surfaceClassName, chatViewTransition, defaultMode, ...props }: AgentChatHomeProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=AgentChatHome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentChatHome.d.ts","sourceRoot":"","sources":["../../src/client/AgentChatHome.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAC9C,qBAAqB,EACrB,WAAW,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAChD;IACC,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,kBAAyB,EACzB,WAAoB,EACpB,GAAG,KAAK,EACT,EAAE,kBAAkB,2CA2BpB"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { AgentChatSurface } from "./AgentPanel.js";
3
+ import { cn } from "./utils.js";
4
+ /**
5
+ * Minimal full-page chat route primitive for chat-first apps.
6
+ *
7
+ * It keeps the actual chat runtime in AgentChatSurface while providing a stable
8
+ * first-viewport shell that templates can use for `/`, `/ask`, or `/chat`.
9
+ */
10
+ export function AgentChatHome({ className, contentClassName, surfaceClassName, chatViewTransition = true, defaultMode = "chat", ...props }) {
11
+ return (_jsx("main", { className: cn("flex min-h-screen w-full bg-background px-3 py-3 sm:px-4 sm:py-4", className), children: _jsx("div", { className: cn("mx-auto flex min-h-0 w-full max-w-5xl flex-1 flex-col", contentClassName), children: _jsx(AgentChatSurface, { ...props, mode: "page", defaultMode: defaultMode, chatViewTransition: chatViewTransition, className: cn("min-h-0 flex-1 rounded-lg border border-border shadow-sm", surfaceClassName) }) }) }));
12
+ }
13
+ //# sourceMappingURL=AgentChatHome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentChatHome.js","sourceRoot":"","sources":["../../src/client/AgentChatHome.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAA8B,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAoBhC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GAAG,IAAI,EACzB,WAAW,GAAG,MAAM,EACpB,GAAG,KAAK,EACW;IACnB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,kEAAkE,EAClE,SAAS,CACV,YAED,cACE,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,gBAAgB,CACjB,YAED,KAAC,gBAAgB,OACX,KAAK,EACT,IAAI,EAAC,MAAM,EACX,WAAW,EAAE,WAAW,EACxB,kBAAkB,EAAE,kBAAkB,EACtC,SAAS,EAAE,EAAE,CACX,0DAA0D,EAC1D,gBAAgB,CACjB,GACD,GACE,GACD,CACR,CAAC;AACJ,CAAC","sourcesContent":["import { AgentChatSurface, type AgentChatSurfaceProps } from \"./AgentPanel.js\";\nimport { cn } from \"./utils.js\";\n\nexport interface AgentChatHomeProps extends Omit<\n AgentChatSurfaceProps,\n \"className\" | \"isFullscreen\" | \"mode\" | \"style\"\n> {\n /** CSS class for the full-page shell around the chat surface. */\n className?: string;\n /** CSS class for the inner width/height rail. */\n contentClassName?: string;\n /** CSS class for the AgentChatSurface itself. */\n surfaceClassName?: string;\n /**\n * Apply the shared chat view-transition name to the surface so it can morph\n * into an AgentSidebar with `chatViewTransition` enabled.\n * Default: true.\n */\n chatViewTransition?: boolean;\n}\n\n/**\n * Minimal full-page chat route primitive for chat-first apps.\n *\n * It keeps the actual chat runtime in AgentChatSurface while providing a stable\n * first-viewport shell that templates can use for `/`, `/ask`, or `/chat`.\n */\nexport function AgentChatHome({\n className,\n contentClassName,\n surfaceClassName,\n chatViewTransition = true,\n defaultMode = \"chat\",\n ...props\n}: AgentChatHomeProps) {\n return (\n <main\n className={cn(\n \"flex min-h-screen w-full bg-background px-3 py-3 sm:px-4 sm:py-4\",\n className,\n )}\n >\n <div\n className={cn(\n \"mx-auto flex min-h-0 w-full max-w-5xl flex-1 flex-col\",\n contentClassName,\n )}\n >\n <AgentChatSurface\n {...props}\n mode=\"page\"\n defaultMode={defaultMode}\n chatViewTransition={chatViewTransition}\n className={cn(\n \"min-h-0 flex-1 rounded-lg border border-border shadow-sm\",\n surfaceClassName,\n )}\n />\n </div>\n </main>\n );\n}\n"]}
@@ -21,7 +21,17 @@
21
21
  * <AgentChatSurface mode="page" className="h-screen" />
22
22
  */
23
23
  import React from "react";
24
+ import type { MultiTabAssistantChatHeaderProps } from "./MultiTabAssistantChat.js";
24
25
  import { type AssistantChatProps } from "./AssistantChat.js";
26
+ export declare function getAgentPanelChatTabGroups(tabs: MultiTabAssistantChatHeaderProps["tabs"], activeTabId: string): {
27
+ activeTab: import("./MultiTabAssistantChat.js").ChatTab | undefined;
28
+ childTabs: import("./MultiTabAssistantChat.js").ChatTab[];
29
+ focusParentId: string;
30
+ hasSubTabs: boolean;
31
+ mainTabs: import("./MultiTabAssistantChat.js").ChatTab[];
32
+ };
33
+ export declare function shouldShowAgentPanelChatTabBar(tabs: MultiTabAssistantChatHeaderProps["tabs"], activeTabId: string): boolean;
34
+ export declare function shouldShowAgentPanelCliTabBar(cliTabs: string[]): boolean;
25
35
  export interface AgentPanelCodeAccess {
26
36
  /** Whether this surface can safely edit source and run shell commands. */
27
37
  enabled: boolean;
@@ -45,6 +55,8 @@ export interface AgentPanelProps extends Omit<AssistantChatProps, "onSwitchToCli
45
55
  defaultMode?: "chat" | "cli";
46
56
  /** CSS class for the outer container */
47
57
  className?: string;
58
+ /** Inline styles for the outer container. */
59
+ style?: React.CSSProperties;
48
60
  /** Called when the user clicks the collapse button. If provided, a collapse button appears in the header. */
49
61
  onCollapse?: () => void;
50
62
  /** Whether the panel is currently in fullscreen (Claude-style centered) mode. */
@@ -84,6 +96,12 @@ export interface AgentChatSurfaceProps extends AgentPanelProps {
84
96
  * Default: "panel".
85
97
  */
86
98
  mode?: AgentChatSurfaceMode;
99
+ /**
100
+ * Apply the shared chat view-transition marker/name to this surface. Pair
101
+ * with `AgentSidebar chatViewTransition` and navigate via
102
+ * `startAgentChatViewTransition` or `useAgentRouteState`.
103
+ */
104
+ chatViewTransition?: boolean;
87
105
  }
88
106
  /**
89
107
  * Reusable chat surface backed by AgentPanel internals.
@@ -92,7 +110,7 @@ export interface AgentChatSurfaceProps extends AgentPanelProps {
92
110
  * model controls, scoped chat behavior, and recovery boundary used by the
93
111
  * sidebar without introducing a second chat implementation.
94
112
  */
95
- export declare function AgentChatSurface({ mode, className, defaultMode, isFullscreen, ...props }: AgentChatSurfaceProps): import("react/jsx-runtime").JSX.Element;
113
+ export declare function AgentChatSurface({ mode, className, defaultMode, isFullscreen, style, chatViewTransition, ...props }: AgentChatSurfaceProps): import("react/jsx-runtime").JSX.Element;
96
114
  export interface AgentSidebarProps {
97
115
  children: React.ReactNode;
98
116
  /** Placeholder text for the empty chat state */
@@ -112,6 +130,15 @@ export interface AgentSidebarProps {
112
130
  defaultOpen?: boolean;
113
131
  /** Animate the mobile overlay in a sheet-style slide transition. */
114
132
  animateMobile?: boolean;
133
+ /**
134
+ * Apply the shared chat view-transition marker/name to the sidebar panel so a
135
+ * page-level AgentChatSurface can morph into it on navigation.
136
+ */
137
+ chatViewTransition?: boolean;
138
+ /** Namespace for persisted chat state. Use the same key as AgentChatHome. */
139
+ storageKey?: string;
140
+ /** Open the sidebar when a chat run is active or reconnects. */
141
+ openOnChatRunning?: boolean;
115
142
  /**
116
143
  * Bind chats to a resource. When set, every chat started here is
117
144
  * scoped to `{type, id}`, the tab bar/history partition by that scope,
@@ -126,7 +153,7 @@ export interface AgentSidebarProps {
126
153
  * Wraps app content with a toggleable agent sidebar.
127
154
  * Use AgentToggleButton in your header to open/close it.
128
155
  */
129
- export declare function AgentSidebar({ children, emptyStateText, suggestions, dynamicSuggestions, defaultSidebarWidth, sidebarWidth, position, defaultOpen, animateMobile, scope, browserTabId, }: AgentSidebarProps): import("react/jsx-runtime").JSX.Element;
156
+ export declare function AgentSidebar({ children, emptyStateText, suggestions, dynamicSuggestions, defaultSidebarWidth, sidebarWidth, position, defaultOpen, animateMobile, chatViewTransition, storageKey, openOnChatRunning, scope, browserTabId, }: AgentSidebarProps): import("react/jsx-runtime").JSX.Element;
130
157
  /**
131
158
  * Focus the agent chat composer input.
132
159
  * Opens the sidebar if closed, then focuses the text input.
@@ -1 +1 @@
1
- {"version":3,"file":"AgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"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"}
@@ -48,6 +48,7 @@ import { getFramePostMessageTargetOrigin, isTrustedFrameMessage, } from "./frame
48
48
  import { shouldParentFrameOwnAgentPanel } from "./builder-frame.js";
49
49
  import { consumeAgentSidebarUrlOpenOverride, dispatchAgentSidebarStateChange, getInitialAgentSidebarOpen, SIDEBAR_OPEN_KEY, subscribeAgentSidebarUrlChanges, } from "./agent-sidebar-state.js";
50
50
  import { AgentNativeRouteWarmup } from "./route-warmup.js";
51
+ import { AGENT_CHAT_VIEW_TRANSITION_CLASS, getAgentChatViewTransitionStyle, } from "./chat-view-transition.js";
51
52
  // Lazy-load AgentTerminal to avoid bundling xterm.js when not needed
52
53
  const AgentTerminal = lazy(() => import("./terminal/index.js").then((m) => ({ default: m.AgentTerminal })));
53
54
  const AGENT_PANEL_PREPARE_EVENT = "agent-panel:prepare";
@@ -154,6 +155,26 @@ function ChatLoadingSkeleton({ renderHeader, }) {
154
155
  };
155
156
  return (_jsxs("div", { className: "flex flex-col flex-1 min-h-0", children: [renderHeader ? renderHeader(stubProps) : null, _jsx("div", { className: "mt-auto shrink-0 border-t border-border p-3", children: _jsx("div", { className: "h-16 rounded-xl bg-muted/40 animate-pulse" }) })] }));
156
157
  }
158
+ export function getAgentPanelChatTabGroups(tabs, activeTabId) {
159
+ const activeTab = tabs.find((t) => t.id === activeTabId);
160
+ const focusParentId = activeTab?.parentThreadId || activeTabId;
161
+ const childTabs = tabs.filter((t) => t.parentThreadId === focusParentId);
162
+ const mainTabs = tabs.filter((t) => !t.parentThreadId);
163
+ return {
164
+ activeTab,
165
+ childTabs,
166
+ focusParentId,
167
+ hasSubTabs: childTabs.length > 0,
168
+ mainTabs,
169
+ };
170
+ }
171
+ export function shouldShowAgentPanelChatTabBar(tabs, activeTabId) {
172
+ const { hasSubTabs, mainTabs } = getAgentPanelChatTabGroups(tabs, activeTabId);
173
+ return mainTabs.length > 1 || hasSubTabs;
174
+ }
175
+ export function shouldShowAgentPanelCliTabBar(cliTabs) {
176
+ return cliTabs.length > 1;
177
+ }
157
178
  function useBuilderConnectUrl() {
158
179
  const [connectUrl, setConnectUrl] = useState(null);
159
180
  const [configured, setConfigured] = useState(false);
@@ -270,7 +291,7 @@ function CodeAccessUnavailablePanel({ title, description, ctaLabel, ctaHref, sec
270
291
  });
271
292
  }, className: "inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent", children: [secondaryCtaLabel, _jsx(IconExternalLink, { className: "h-3 w-3" })] })] })] }));
272
293
  }
273
- function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateText, emptyStateAddon, suggestions, dynamicSuggestions, showHeader = true, onCollapse, isFullscreen, onToggleFullscreen, devAppUrl, storageKey, restoreActiveThread = true, scope, browserTabId, chatNotice, showTabBar = true, codeAccess, ...assistantChatProps }) {
294
+ function AgentPanelInner({ defaultMode = "chat", className, style, apiUrl, emptyStateText, emptyStateAddon, suggestions, dynamicSuggestions, showHeader = true, onCollapse, isFullscreen, onToggleFullscreen, devAppUrl, storageKey, restoreActiveThread = true, scope, browserTabId, chatNotice, showTabBar = true, codeAccess, ...assistantChatProps }) {
274
295
  const mounted = useClientOnly();
275
296
  const keyPrefix = storageKey ? `:${storageKey}` : "";
276
297
  const execModeKey = `${EXEC_MODE_KEY}${keyPrefix}`;
@@ -440,7 +461,6 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
440
461
  }, [mode, activeCliTab, closeCliTab, closeAllCliTabs, isMac]);
441
462
  const availableClis = useAvailableClis();
442
463
  const [selectedCli, selectCli] = useCliSelection(keyPrefix);
443
- const selectedLabel = availableClis.find((c) => c.command === selectedCli)?.label || selectedCli;
444
464
  const { isDevMode, canToggle, setDevMode } = useDevMode(apiUrl);
445
465
  const isDevFrameChatSurface = assistantChatProps.agentChatSurface === "dev-frame";
446
466
  const inferredCodeAccessEnabled = !isDevMode || isDevFrameChatSurface;
@@ -489,14 +509,37 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
489
509
  ? "bg-accent text-foreground"
490
510
  : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(IconTerminal2, { size: 14 }), "CLI"] }) }), _jsx(TooltipContent, { className: "max-w-[260px]", children: codeAccessEnabled
491
511
  ? "CLI terminal mode"
492
- : codeUnavailableDescription })] })), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { onClick: () => switchMode("resources"), "aria-label": "Workspace files, agents, skills, and tasks", className: cn("flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none", activeMode === "resources"
493
- ? "bg-accent text-foreground"
494
- : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(IconLayoutGrid, { size: 14 }), "Workspace"] }) }), _jsx(TooltipContent, { children: "Workspace files, agents, skills, and tasks" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => switchMode("settings"), "aria-label": "Setup and configuration", className: cn("flex items-center justify-center rounded-md px-1.5 py-1", activeMode === "settings"
512
+ : codeUnavailableDescription })] })), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { onClick: () => switchMode("resources"), "aria-label": "Workspace files, agents, skills, and tasks", className: cn("agent-sidebar-hover-reveal flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none", activeMode === "resources"
495
513
  ? "bg-accent text-foreground"
496
- : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), children: _jsx(IconSettings, { size: 14 }) }) }), _jsx(TooltipContent, { children: "Setup and configuration" })] })] }) })), [codeAccessEnabled, codeUnavailableDescription, showCliMode]);
497
- const renderHeaderActions = useCallback((activeChatSessionId) => (_jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [SHOW_ONBOARDING && canUseCodeTools && (_jsx(Suspense, { fallback: null, children: _jsx(SetupButton, {}) })), _jsx(FeedbackButton, { variant: "icon", side: "bottom", align: "end", chatSessionId: activeChatSessionId, chatStorageKey: storageKey }), onToggleFullscreen && (_jsx(IconTooltip, { content: isFullscreen ? "Exit fullscreen" : "Fullscreen", children: _jsx("button", { onClick: onToggleFullscreen, "aria-label": isFullscreen ? "Exit fullscreen" : "Enter fullscreen", className: "flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: isFullscreen ? (_jsx(IconArrowsMinimize, { size: 14 })) : (_jsx(IconArrowsMaximize, { size: 14 })) }) })), onCollapse && (_jsx(IconTooltip, { content: "Collapse sidebar", children: _jsx("button", { onClick: onCollapse, "aria-label": "Collapse sidebar", className: "flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconLayoutSidebarRightCollapse, { size: 14 }) }) }))] })), [canUseCodeTools, isFullscreen, onCollapse, onToggleFullscreen, storageKey]);
498
- const [tabMenuOpen, setTabMenuOpen] = useState(null);
499
- const [cliPickerOpen, setCliPickerOpen] = useState(false);
514
+ : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(IconLayoutGrid, { size: 14 }), "Workspace"] }) }), _jsx(TooltipContent, { children: "Workspace files, agents, skills, and tasks" })] })] }) })), [codeAccessEnabled, codeUnavailableDescription, showCliMode]);
515
+ const [headerMenuOpen, setHeaderMenuOpen] = useState(false);
516
+ const [feedbackOpen, setFeedbackOpen] = useState(false);
517
+ const renderHeaderActions = useCallback(({ activeChatSessionId, activeTabId, addTab, clearActiveTab, closeAllTabs, closeOtherTabs, closeTab, showHistory, tabs, toggleHistory, }) => (_jsxs("div", { className: "relative flex shrink-0 items-center gap-0.5", children: [SHOW_ONBOARDING && canUseCodeTools && (_jsx(Suspense, { fallback: null, children: _jsx(SetupButton, {}) })), _jsx(FeedbackButton, { variant: "icon", side: "bottom", align: "end", chatSessionId: activeChatSessionId, chatStorageKey: storageKey, open: feedbackOpen, onOpenChange: setFeedbackOpen, trigger: _jsx("button", { type: "button", tabIndex: -1, "aria-hidden": "true", className: "pointer-events-none absolute right-0 top-full h-px w-px opacity-0" }) }), mode === "chat" && (_jsx(IconTooltip, { content: "New chat", children: _jsx("button", { onClick: addTab, "aria-label": "New chat", className: "agent-sidebar-hover-reveal flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 14 }) }) })), mode === "cli" && canUseCodeTools && (_jsx(IconTooltip, { content: "New terminal", children: _jsx("button", { onClick: addCliTab, "aria-label": "New terminal", className: "agent-sidebar-hover-reveal flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 14 }) }) })), _jsxs(DropdownMenu, { open: headerMenuOpen, onOpenChange: setHeaderMenuOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { className: cn("flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", (headerMenuOpen || mode === "settings") &&
518
+ "bg-accent text-foreground"), "aria-label": "Agent panel options", children: _jsx(IconDotsVertical, { size: 14 }) }) }), _jsxs(DropdownMenuContent, { align: "end", sideOffset: 6, className: "w-48", children: [mode === "chat" && toggleHistory && (_jsxs(DropdownMenuItem, { onSelect: toggleHistory, children: [_jsx(IconHistory, { size: 14, className: "shrink-0" }), showHistory ? "Hide chats" : "All chats"] })), mode === "chat" && (_jsx(RunsTrayMenuItem, { pollMs: 2000, limit: 12, showRecent: true, onOpenThread: openRunThread })), mode === "chat" && _jsx(DropdownMenuSeparator, {}), mode === "cli" && availableClis.length > 0 && (_jsxs(_Fragment, { children: [availableClis.map((cli) => (_jsxs(DropdownMenuItem, { onSelect: () => selectCli(cli.command), className: cn(cli.command === selectedCli
519
+ ? "font-medium"
520
+ : "text-muted-foreground"), children: [cli.command === selectedCli ? (_jsx(IconCheck, { size: 12, className: "shrink-0" })) : (_jsx("span", { className: "w-3" })), cli.label] }, cli.command))), _jsx(DropdownMenuSeparator, {})] })), _jsxs(DropdownMenuItem, { onSelect: () => switchMode("settings"), className: cn(mode === "settings" ? "font-medium" : "text-muted-foreground"), children: [_jsx(IconSettings, { size: 14, className: "shrink-0" }), "Settings"] }), _jsxs(DropdownMenuItem, { onSelect: () => setFeedbackOpen(true), children: [_jsx(IconMessageDots, { size: 14, className: "shrink-0" }), "Feedback"] }), onToggleFullscreen && (_jsxs(DropdownMenuItem, { onSelect: onToggleFullscreen, children: [isFullscreen ? (_jsx(IconArrowsMinimize, { size: 14, className: "shrink-0" })) : (_jsx(IconArrowsMaximize, { size: 14, className: "shrink-0" })), isFullscreen ? "Exit fullscreen" : "Fullscreen"] })), onCollapse && (_jsxs(DropdownMenuItem, { onSelect: onCollapse, children: [_jsx(IconLayoutSidebarRightCollapse, { size: 14, className: "shrink-0" }), "Collapse sidebar"] })), ((mode === "chat" && activeTabId) ||
521
+ (mode === "cli" && canUseCodeTools && activeCliTab)) && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), mode === "chat" ? (shouldShowAgentPanelChatTabBar(tabs, activeTabId) ? (_jsxs(_Fragment, { children: [_jsxs(DropdownMenuItem, { onSelect: () => closeTab(activeTabId), children: [_jsx(IconX, { size: 14, className: "shrink-0" }), "Close Tab", _jsx(DropdownMenuShortcut, { children: closeTabHint })] }), _jsx(DropdownMenuItem, { onSelect: () => closeOtherTabs(activeTabId), children: "Close Other Tabs" }), _jsxs(DropdownMenuItem, { onSelect: () => closeAllTabs(), children: ["Close All Tabs", _jsx(DropdownMenuShortcut, { children: closeAllTabsHint })] })] })) : (_jsxs(DropdownMenuItem, { onSelect: clearActiveTab, children: [_jsx(IconX, { size: 14, className: "shrink-0" }), "Clear chat"] }))) : (_jsxs(_Fragment, { children: [_jsxs(DropdownMenuItem, { onSelect: () => closeCliTab(activeCliTab), children: [_jsx(IconX, { size: 14, className: "shrink-0" }), "Close Tab", _jsx(DropdownMenuShortcut, { children: closeTabHint })] }), _jsx(DropdownMenuItem, { onSelect: () => closeOtherCliTabs(activeCliTab), children: "Close Other Tabs" }), _jsxs(DropdownMenuItem, { onSelect: () => closeAllCliTabs(), children: ["Close All Tabs", _jsx(DropdownMenuShortcut, { children: closeAllTabsHint })] })] }))] }))] })] })] })), [
522
+ activeCliTab,
523
+ addCliTab,
524
+ availableClis,
525
+ canUseCodeTools,
526
+ closeAllCliTabs,
527
+ closeAllTabsHint,
528
+ closeCliTab,
529
+ closeOtherCliTabs,
530
+ closeTabHint,
531
+ feedbackOpen,
532
+ headerMenuOpen,
533
+ isFullscreen,
534
+ mode,
535
+ onCollapse,
536
+ onToggleFullscreen,
537
+ openRunThread,
538
+ selectCli,
539
+ selectedCli,
540
+ storageKey,
541
+ switchMode,
542
+ ]);
500
543
  // Ref callback: scroll the active tab into view in the overflow container.
501
544
  // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.
502
545
  const activeTabRefCb = useCallback((el) => {
@@ -517,43 +560,39 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
517
560
  }
518
561
  });
519
562
  }, []);
520
- const renderChatHeader = useCallback(({ tabs, activeTabId, setActiveTabId, addTab, closeTab, closeOtherTabs, closeAllTabs, showHistory, toggleHistory, }) => (_jsxs("div", { className: "flex flex-col shrink-0", children: [_jsxs("div", { className: AGENT_PANEL_HEADER_CLASS, style: AGENT_PANEL_HEADER_STYLE, children: [_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-1 overflow-hidden", children: renderModeButtons(mode) }), _jsx("div", { className: "flex items-center gap-0.5", children: renderHeaderActions(activeTabId) })] }), mode === "chat" && chatNotice ? (_jsx("div", { className: "border-b border-border", children: chatNotice })) : null, (mode === "chat" || (mode === "cli" && canUseCodeTools)) &&
563
+ const renderChatHeader = useCallback(({ tabs, activeTabId, setActiveTabId, addTab, clearActiveTab, closeTab, closeOtherTabs, closeAllTabs, showHistory, toggleHistory, }) => (_jsxs("div", { className: "flex flex-col shrink-0", children: [_jsxs("div", { className: AGENT_PANEL_HEADER_CLASS, style: AGENT_PANEL_HEADER_STYLE, children: [_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-1 overflow-hidden", children: renderModeButtons(mode) }), _jsx("div", { className: "flex items-center gap-0.5", children: renderHeaderActions({
564
+ activeChatSessionId: activeTabId,
565
+ activeTabId,
566
+ addTab,
567
+ clearActiveTab,
568
+ closeAllTabs,
569
+ closeOtherTabs,
570
+ closeTab,
571
+ showHistory,
572
+ tabs,
573
+ toggleHistory,
574
+ }) })] }), mode === "chat" && chatNotice ? (_jsx("div", { className: "border-b border-border", children: chatNotice })) : null, showTabBar &&
575
+ (mode === "chat" || (mode === "cli" && canUseCodeTools)) &&
521
576
  (() => {
522
- // Compute parent/child tab groups for the sub-tab bar
523
- const activeTab = tabs.find((t) => t.id === activeTabId);
524
- // The "focus parent" is the parent thread for the active context
525
- const focusParentId = activeTab?.parentThreadId || activeTabId;
526
- const childTabs = tabs.filter((t) => t.parentThreadId === focusParentId);
527
- const hasSubTabs = childTabs.length > 0;
528
- // Main row: only show top-level (non-child) tabs
529
- const mainTabs = tabs.filter((t) => !t.parentThreadId);
530
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center px-2 py-1 border-b border-border gap-0.5", children: [_jsx("div", { className: "agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1", children: mode === "chat"
531
- ? mainTabs.map((tab) => {
532
- // Highlight the parent tab if a child is active
533
- const isActive = tab.id === activeTabId ||
534
- (tab.id === focusParentId &&
535
- activeTab?.parentThreadId === tab.id);
536
- return (_jsxs("div", { role: "button", tabIndex: 0, ref: isActive ? activeTabRefCb : undefined, onClick: () => setActiveTabId(tab.id), onKeyDown: activateOnKeyDown(() => setActiveTabId(tab.id)), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]", isActive
537
- ? "bg-accent text-foreground"
538
- : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsx("span", { className: "truncate pr-1", children: tab.label }), tab.status === "running" && (_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" })), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
539
- e.stopPropagation();
540
- closeTab(tab.id);
541
- }, className: "agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground", style: {
542
- position: "absolute",
543
- right: 0,
544
- top: 0,
545
- bottom: 0,
546
- width: 28,
547
- paddingRight: 6,
548
- borderRadius: "0 6px 6px 0",
549
- background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
550
- }, children: _jsx(IconX, { size: 10 }) })] }, tab.id));
551
- })
552
- : cliTabs.map((id, i) => (_jsxs("div", { role: "button", tabIndex: 0, ref: id === activeCliTab ? activeTabRefCb : undefined, onClick: () => setActiveCliTab(id), onKeyDown: activateOnKeyDown(() => setActiveCliTab(id)), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer", id === activeCliTab
577
+ const { activeTab, childTabs, focusParentId, hasSubTabs, mainTabs, } = getAgentPanelChatTabGroups(tabs, activeTabId);
578
+ const showChatTabBar = mode === "chat" &&
579
+ shouldShowAgentPanelChatTabBar(tabs, activeTabId);
580
+ const showCliTabBar = mode === "cli" &&
581
+ canUseCodeTools &&
582
+ shouldShowAgentPanelCliTabBar(cliTabs);
583
+ if (!showChatTabBar && !showCliTabBar)
584
+ return null;
585
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex items-center px-2 py-1 border-b border-border gap-0.5", children: _jsx("div", { className: "agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1", children: mode === "chat"
586
+ ? mainTabs.map((tab) => {
587
+ // Highlight the parent tab if a child is active
588
+ const isActive = tab.id === activeTabId ||
589
+ (tab.id === focusParentId &&
590
+ activeTab?.parentThreadId === tab.id);
591
+ return (_jsxs("div", { role: "button", tabIndex: 0, ref: isActive ? activeTabRefCb : undefined, onClick: () => setActiveTabId(tab.id), onKeyDown: activateOnKeyDown(() => setActiveTabId(tab.id)), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]", isActive
553
592
  ? "bg-accent text-foreground"
554
- : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsxs("span", { children: ["Terminal ", i + 1] }), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
593
+ : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsx("span", { className: "truncate pr-1", children: tab.label }), tab.status === "running" && (_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" })), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
555
594
  e.stopPropagation();
556
- closeCliTab(id);
595
+ closeTab(tab.id);
557
596
  }, className: "agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground", style: {
558
597
  position: "absolute",
559
598
  right: 0,
@@ -563,11 +602,23 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
563
602
  paddingRight: 6,
564
603
  borderRadius: "0 6px 6px 0",
565
604
  background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
566
- }, children: _jsx(IconX, { size: 10 }) })] }, id))) }), _jsxs("div", { className: "flex items-center gap-0.5 shrink-0 ml-auto", children: [mode === "chat" && (_jsxs(_Fragment, { children: [_jsx(IconTooltip, { content: "New chat", children: _jsx("button", { onClick: addTab, "aria-label": "New chat", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 14 }) }) }), toggleHistory && (_jsx(IconTooltip, { content: "All chats", children: _jsx("button", { onClick: toggleHistory, "aria-label": "All chats", className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", showHistory && "bg-accent text-foreground"), children: _jsx(IconHistory, { size: 14 }) }) })), _jsxs(DropdownMenu, { open: tabMenuOpen === "__chat_global", onOpenChange: (open) => setTabMenuOpen(open ? "__chat_global" : null), children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", tabMenuOpen === "__chat_global" &&
567
- "bg-accent text-foreground"), "aria-label": "Chat tab options", children: _jsx(IconDotsVertical, { size: 14 }) }) }), _jsxs(DropdownMenuContent, { align: "end", sideOffset: 4, className: "w-44", children: [_jsx(RunsTrayMenuItem, { pollMs: 2000, limit: 12, showRecent: true, onOpenThread: openRunThread }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onSelect: () => closeTab(activeTabId), children: ["Close Tab", _jsx(DropdownMenuShortcut, { children: closeTabHint })] }), _jsx(DropdownMenuItem, { onSelect: () => closeOtherTabs(activeTabId), children: "Close Other Tabs" }), _jsxs(DropdownMenuItem, { onSelect: () => closeAllTabs(), children: ["Close All Tabs", _jsx(DropdownMenuShortcut, { children: closeAllTabsHint })] })] })] })] })), mode === "cli" && (_jsxs(_Fragment, { children: [_jsx(IconTooltip, { content: "New terminal", children: _jsx("button", { onClick: addCliTab, "aria-label": "New terminal", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 14 }) }) }), availableClis.length > 0 && (_jsxs(DropdownMenu, { open: cliPickerOpen, onOpenChange: setCliPickerOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { "aria-label": `Select CLI, currently ${selectedLabel}`, className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", cliPickerOpen && "bg-accent text-foreground"), children: _jsx(IconSettings, { size: 14 }) }) }), _jsx(DropdownMenuContent, { align: "end", sideOffset: 4, className: "w-48", children: availableClis.map((cli) => (_jsxs(DropdownMenuItem, { onSelect: () => selectCli(cli.command), className: cn(cli.command === selectedCli
568
- ? "font-medium"
569
- : "text-muted-foreground"), children: [cli.command === selectedCli ? (_jsx(IconCheck, { size: 12, className: "shrink-0" })) : (_jsx("span", { className: "w-3" })), cli.label] }, cli.command))) })] })), _jsxs(DropdownMenu, { open: tabMenuOpen === "__cli_global", onOpenChange: (open) => setTabMenuOpen(open ? "__cli_global" : null), children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", tabMenuOpen === "__cli_global" &&
570
- "bg-accent text-foreground"), "aria-label": "Terminal tab options", children: _jsx(IconDotsVertical, { size: 14 }) }) }), _jsxs(DropdownMenuContent, { align: "end", sideOffset: 4, className: "w-44", children: [_jsxs(DropdownMenuItem, { onSelect: () => closeCliTab(activeCliTab), children: ["Close Tab", _jsx(DropdownMenuShortcut, { children: closeTabHint })] }), _jsx(DropdownMenuItem, { onSelect: () => closeOtherCliTabs(activeCliTab), children: "Close Other Tabs" }), _jsxs(DropdownMenuItem, { onSelect: () => closeAllCliTabs(), children: ["Close All Tabs", _jsx(DropdownMenuShortcut, { children: closeAllTabsHint })] })] })] })] }))] })] }), mode === "chat" && hasSubTabs && (_jsx("div", { className: "flex items-center px-2 py-0.5 border-b border-border gap-0.5 bg-muted/30", children: _jsxs("div", { className: "agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1", children: [_jsx("div", { role: "button", tabIndex: 0, onClick: () => setActiveTabId(focusParentId), onKeyDown: activateOnKeyDown(() => setActiveTabId(focusParentId)), className: cn("flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer", activeTabId === focusParentId
605
+ }, children: _jsx(IconX, { size: 10 }) })] }, tab.id));
606
+ })
607
+ : cliTabs.map((id, i) => (_jsxs("div", { role: "button", tabIndex: 0, ref: id === activeCliTab ? activeTabRefCb : undefined, onClick: () => setActiveCliTab(id), onKeyDown: activateOnKeyDown(() => setActiveCliTab(id)), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer", id === activeCliTab
608
+ ? "bg-accent text-foreground"
609
+ : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsxs("span", { children: ["Terminal ", i + 1] }), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
610
+ e.stopPropagation();
611
+ closeCliTab(id);
612
+ }, className: "agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground", style: {
613
+ position: "absolute",
614
+ right: 0,
615
+ top: 0,
616
+ bottom: 0,
617
+ width: 28,
618
+ paddingRight: 6,
619
+ borderRadius: "0 6px 6px 0",
620
+ background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
621
+ }, children: _jsx(IconX, { size: 10 }) })] }, id))) }) }), mode === "chat" && hasSubTabs && (_jsx("div", { className: "flex items-center px-2 py-0.5 border-b border-border gap-0.5 bg-muted/30", children: _jsxs("div", { className: "agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1", children: [_jsx("div", { role: "button", tabIndex: 0, onClick: () => setActiveTabId(focusParentId), onKeyDown: activateOnKeyDown(() => setActiveTabId(focusParentId)), className: cn("flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer", activeTabId === focusParentId
571
622
  ? "bg-accent text-foreground"
572
623
  : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: "Main" }), childTabs.map((tab) => (_jsxs("div", { role: "button", tabIndex: 0, ref: tab.id === activeTabId ? activeTabRefCb : undefined, onClick: () => setActiveTabId(tab.id), onKeyDown: activateOnKeyDown(() => setActiveTabId(tab.id)), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]", tab.id === activeTabId
573
624
  ? "bg-accent text-foreground"
@@ -590,24 +641,17 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
590
641
  renderModeButtons,
591
642
  chatNotice,
592
643
  canUseCodeTools,
644
+ showTabBar,
593
645
  cliTabs,
594
646
  activeCliTab,
595
- addCliTab,
596
- openRunThread,
647
+ activeTabRefCb,
648
+ activateOnKeyDown,
597
649
  closeCliTab,
598
- closeOtherCliTabs,
599
- closeAllCliTabs,
600
- tabMenuOpen,
601
- availableClis,
602
- selectedCli,
603
- selectedLabel,
604
- selectCli,
605
- cliPickerOpen,
606
- closeTabHint,
607
- closeAllTabsHint,
608
650
  ]);
609
- return (_jsxs("div", { className: cn("agent-panel-root flex flex-1 flex-col min-h-0 h-full text-[13px] leading-[1.2] antialiased", className), style: AGENT_PANEL_ROOT_STYLE, "data-agent-fullscreen": isFullscreen ? "true" : undefined, children: [_jsx("style", { dangerouslySetInnerHTML: {
610
- __html: ".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}" +
651
+ return (_jsxs("div", { className: cn("agent-panel-root flex flex-1 flex-col min-h-0 h-full text-[13px] leading-[1.2] antialiased", className), style: { ...AGENT_PANEL_ROOT_STYLE, ...style }, "data-agent-fullscreen": isFullscreen ? "true" : undefined, children: [_jsx("style", { dangerouslySetInnerHTML: {
652
+ __html: ".agent-sidebar-hover-reveal{opacity:0;pointer-events:none;transition:opacity 150ms ease-out;}" +
653
+ ".agent-panel-root:hover .agent-sidebar-hover-reveal,.agent-panel-root:focus-within .agent-sidebar-hover-reveal{opacity:1;pointer-events:auto;}" +
654
+ ".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}" +
611
655
  ".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}" +
612
656
  ".agent-tabs-scroll::-webkit-scrollbar{display:none;}" +
613
657
  `[data-agent-fullscreen='true'] .agent-thread-content,` +
@@ -989,15 +1033,15 @@ export function AgentPanel(props) {
989
1033
  * model controls, scoped chat behavior, and recovery boundary used by the
990
1034
  * sidebar without introducing a second chat implementation.
991
1035
  */
992
- export function AgentChatSurface({ mode = "panel", className, defaultMode = "chat", isFullscreen, ...props }) {
1036
+ export function AgentChatSurface({ mode = "panel", className, defaultMode = "chat", isFullscreen, style, chatViewTransition = false, ...props }) {
993
1037
  const pageMode = mode === "page";
994
- return (_jsx(AgentPanel, { ...props, defaultMode: defaultMode, isFullscreen: isFullscreen ?? pageMode, className: cn(pageMode && "h-full min-h-0 w-full overflow-hidden bg-background", className) }));
1038
+ return (_jsx(AgentPanel, { ...props, defaultMode: defaultMode, isFullscreen: isFullscreen ?? pageMode, className: cn(pageMode && "h-full min-h-0 w-full overflow-hidden bg-background", chatViewTransition && AGENT_CHAT_VIEW_TRANSITION_CLASS, className), style: chatViewTransition ? getAgentChatViewTransitionStyle(style) : style }));
995
1039
  }
996
1040
  /**
997
1041
  * Wraps app content with a toggleable agent sidebar.
998
1042
  * Use AgentToggleButton in your header to open/close it.
999
1043
  */
1000
- export function AgentSidebar({ children, emptyStateText = "How can I help you?", suggestions, dynamicSuggestions, defaultSidebarWidth, sidebarWidth, position = "right", defaultOpen = false, animateMobile = false, scope, browserTabId, }) {
1044
+ export function AgentSidebar({ children, emptyStateText = "How can I help you?", suggestions, dynamicSuggestions, defaultSidebarWidth, sidebarWidth, position = "right", defaultOpen = false, animateMobile = false, chatViewTransition = false, storageKey, openOnChatRunning = false, scope, browserTabId, }) {
1001
1045
  const initialWidth = defaultSidebarWidth ?? sidebarWidth ?? 380;
1002
1046
  const [open, setOpen] = useState(() => getInitialAgentSidebarOpen(defaultOpen));
1003
1047
  const [presentationMode, setPresentationMode] = useState(false);
@@ -1120,6 +1164,8 @@ export function AgentSidebar({ children, emptyStateText = "How can I help you?",
1120
1164
  ? detail.tabId
1121
1165
  : "__default__";
1122
1166
  if (detail?.isRunning === true) {
1167
+ if (openOnChatRunning)
1168
+ setOpenPersisted(true);
1123
1169
  setRunningTabIds((prev) => {
1124
1170
  const next = new Set(prev);
1125
1171
  next.add(tabId);
@@ -1144,7 +1190,7 @@ export function AgentSidebar({ children, emptyStateText = "How can I help you?",
1144
1190
  window.removeEventListener(AGENT_PANEL_PREPARE_EVENT, preparePanel);
1145
1191
  window.removeEventListener(AGENT_CHAT_RUNNING_EVENT, handleChatRunning);
1146
1192
  };
1147
- }, []);
1193
+ }, [openOnChatRunning, setOpenPersisted]);
1148
1194
  useEffect(() => {
1149
1195
  const replayAfterMount = (type, event) => {
1150
1196
  if (shouldMountPanelRef.current)
@@ -1371,9 +1417,11 @@ export function AgentSidebar({ children, emptyStateText = "How can I help you?",
1371
1417
  }
1372
1418
  // Mount the live chat surface only while visible or actively needed. Keeping
1373
1419
  // it mounted while closed starts app-state polling on every public page view.
1374
- const sidebar = shouldMountPanel ? (_jsxs(_Fragment, { children: [showResizeHandle && !isLeft && (_jsx(ResizeHandle, { position: position, onDrag: handleDrag })), _jsx("div", { className: cn("agent-sidebar-panel flex shrink-0 flex-col overflow-hidden text-[13px] leading-[1.2] antialiased", animateMobile &&
1420
+ const sidebar = shouldMountPanel ? (_jsxs(_Fragment, { children: [showResizeHandle && !isLeft && (_jsx(ResizeHandle, { position: position, onDrag: handleDrag })), _jsx("div", { className: cn("agent-sidebar-panel flex shrink-0 flex-col overflow-hidden text-[13px] leading-[1.2] antialiased", chatViewTransition && AGENT_CHAT_VIEW_TRANSITION_CLASS, animateMobile &&
1375
1421
  isMobile &&
1376
- "shadow-2xl transition-transform duration-[260ms] ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:transition-none"), style: panelStyle, inert: isMobile && !open ? true : undefined, "aria-hidden": isMobile && !open ? true : undefined, children: _jsx(AgentPanel, { emptyStateText: emptyStateText, suggestions: suggestions, dynamicSuggestions: dynamicSuggestions, onCollapse: () => setOpenPersisted(false), isFullscreen: effectiveFullscreen, onToggleFullscreen: isMobile ? undefined : toggleFullscreen, scope: scope, browserTabId: browserTabId }) }), showResizeHandle && isLeft && (_jsx(ResizeHandle, { position: position, onDrag: handleDrag }))] })) : null;
1422
+ "shadow-2xl transition-transform duration-[260ms] ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:transition-none"), style: chatViewTransition
1423
+ ? getAgentChatViewTransitionStyle(panelStyle)
1424
+ : panelStyle, inert: isMobile && !open ? true : undefined, "aria-hidden": isMobile && !open ? true : undefined, children: _jsx(AgentPanel, { emptyStateText: emptyStateText, suggestions: suggestions, dynamicSuggestions: dynamicSuggestions, onCollapse: () => setOpenPersisted(false), isFullscreen: effectiveFullscreen, onToggleFullscreen: isMobile ? undefined : toggleFullscreen, storageKey: storageKey, scope: scope, browserTabId: browserTabId }) }), showResizeHandle && isLeft && (_jsx(ResizeHandle, { position: position, onDrag: handleDrag }))] })) : null;
1377
1425
  return (_jsxs("div", { className: "flex min-w-0 flex-1 h-screen overflow-hidden", children: [_jsx(AgentNativeRouteWarmup, {}), isMobile && !presentationMode && (animateMobile || open) && (_jsx("div", { className: cn("fixed inset-0 bg-black/40", animateMobile &&
1378
1426
  "transition-opacity duration-200 motion-reduce:transition-none", animateMobile && !open && "pointer-events-none opacity-0", animateMobile && open && "opacity-100"), style: { zIndex: SIDEBAR_OVERLAY_Z_INDEX - 1 }, onClick: () => setOpenPersisted(false) })), shouldMountPanel ? _jsx(URLSync, { browserTabId: browserTabId }) : null, isLeft && !presentationMode ? sidebar : null, _jsx("div", { className: "flex flex-1 flex-col overflow-auto min-w-0", children: _jsx(ScreenRefreshBoundary, { children: children }) }), !isLeft && !presentationMode ? sidebar : null] }));
1379
1427
  }