@agent-native/core 0.54.0 → 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.
- package/README.md +16 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +4 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/connect.d.ts +3 -1
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +7 -1
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/gateway-helpers.d.ts +15 -0
- package/dist/cli/gateway-helpers.d.ts.map +1 -0
- package/dist/cli/gateway-helpers.js +51 -0
- package/dist/cli/gateway-helpers.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plan-local.d.ts +40 -0
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +495 -9
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/skills.d.ts +17 -2
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +135 -36
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +9 -27
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentChatHome.d.ts +23 -0
- package/dist/client/AgentChatHome.d.ts.map +1 -0
- package/dist/client/AgentChatHome.js +13 -0
- package/dist/client/AgentChatHome.js.map +1 -0
- package/dist/client/AgentPanel.d.ts +29 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +116 -68
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +140 -18
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts +7 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +13 -3
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +1 -2
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-sidebar-state.d.ts +2 -0
- package/dist/client/agent-sidebar-state.d.ts.map +1 -1
- package/dist/client/agent-sidebar-state.js +15 -4
- package/dist/client/agent-sidebar-state.js.map +1 -1
- package/dist/client/chat/index.d.ts +5 -0
- package/dist/client/chat/index.d.ts.map +1 -1
- package/dist/client/chat/index.js +5 -0
- package/dist/client/chat/index.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +4 -6
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +1 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +16 -0
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/tool-render-registry.d.ts +24 -0
- package/dist/client/chat/tool-render-registry.d.ts.map +1 -0
- package/dist/client/chat/tool-render-registry.js +37 -0
- package/dist/client/chat/tool-render-registry.js.map +1 -0
- package/dist/client/chat/widgets/DataChartRenderer.d.ts +5 -0
- package/dist/client/chat/widgets/DataChartRenderer.d.ts.map +1 -0
- package/dist/client/chat/widgets/DataChartRenderer.js +33 -0
- package/dist/client/chat/widgets/DataChartRenderer.js.map +1 -0
- package/dist/client/chat/widgets/DataChartWidget.d.ts +5 -0
- package/dist/client/chat/widgets/DataChartWidget.d.ts.map +1 -0
- package/dist/client/chat/widgets/DataChartWidget.js +15 -0
- package/dist/client/chat/widgets/DataChartWidget.js.map +1 -0
- package/dist/client/chat/widgets/DataInsightsWidget.d.ts +5 -0
- package/dist/client/chat/widgets/DataInsightsWidget.d.ts.map +1 -0
- package/dist/client/chat/widgets/DataInsightsWidget.js +18 -0
- package/dist/client/chat/widgets/DataInsightsWidget.js.map +1 -0
- package/dist/client/chat/widgets/DataTableWidget.d.ts +9 -0
- package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -0
- package/dist/client/chat/widgets/DataTableWidget.js +95 -0
- package/dist/client/chat/widgets/DataTableWidget.js.map +1 -0
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts +2 -0
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -0
- package/dist/client/chat/widgets/builtin-tool-renderers.js +27 -0
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -0
- package/dist/client/chat/widgets/data-widget-types.d.ts +52 -0
- package/dist/client/chat/widgets/data-widget-types.d.ts.map +1 -0
- package/dist/client/chat/widgets/data-widget-types.js +93 -0
- package/dist/client/chat/widgets/data-widget-types.js.map +1 -0
- package/dist/client/chat-view-transition.d.ts +23 -0
- package/dist/client/chat-view-transition.d.ts.map +1 -0
- package/dist/client/chat-view-transition.js +50 -0
- package/dist/client/chat-view-transition.js.map +1 -0
- package/dist/client/composer/PromptComposer.d.ts +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +2 -2
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +2 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +2 -1
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/index.d.ts +5 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/route-state.d.ts +6 -0
- package/dist/client/route-state.d.ts.map +1 -1
- package/dist/client/route-state.js +29 -1
- package/dist/client/route-state.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +19 -4
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/scripts/dev/index.d.ts +1 -0
- package/dist/scripts/dev/index.d.ts.map +1 -1
- package/dist/scripts/dev/index.js +129 -127
- package/dist/scripts/dev/index.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +8 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +29 -21
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts +4 -1
- package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
- package/dist/server/prompts/framework-core-compact.js +11 -4
- package/dist/server/prompts/framework-core-compact.js.map +1 -1
- package/dist/server/prompts/framework-core.d.ts +4 -1
- package/dist/server/prompts/framework-core.d.ts.map +1 -1
- package/dist/server/prompts/framework-core.js +15 -5
- package/dist/server/prompts/framework-core.js.map +1 -1
- package/dist/server/prompts/shared-rules.d.ts +4 -1
- package/dist/server/prompts/shared-rules.d.ts.map +1 -1
- package/dist/server/prompts/shared-rules.js +4 -1
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/styles/agent-native.css +55 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +4 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/external-agents.md +14 -4
- package/docs/content/getting-started.md +1 -0
- package/docs/content/key-concepts.md +34 -15
- package/docs/content/mcp-apps.md +2 -0
- package/docs/content/mcp-protocol.md +2 -2
- package/docs/content/template-plan.md +16 -1
- package/docs/content/what-is-agent-native.md +10 -2
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KASN,MAAM,OAAO,CAAC;
|
|
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(
|
|
497
|
-
const
|
|
498
|
-
const [
|
|
499
|
-
const [
|
|
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(
|
|
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
|
-
|
|
523
|
-
const
|
|
524
|
-
|
|
525
|
-
const
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
return (_jsxs(_Fragment, { children: [
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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: [
|
|
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
|
-
|
|
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))
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
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
|
-
|
|
596
|
-
|
|
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-
|
|
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:
|
|
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
|
}
|