@principal-ade/panel-layouts 0.3.5 → 0.3.6
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/dist/index.d.ts +39 -0
- package/dist/index.esm.js +927 -700
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +67 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/hooks/usePanelPersistence.ts","../src/services/LocalStorageWorkspaceAdapter.ts","../src/services/WorkspaceLayoutService.ts","../src/hooks/useWorkspace.ts","../src/keyboard/hooks/usePanelFocus.ts","../src/keyboard/hooks/usePanelKeyboardShortcuts.ts","../src/keyboard/hooks/usePanelFocusListener.ts","../src/keyboard/components/FocusIndicator.tsx","../src/agent-command-palette/components/AgentCommandInput.tsx","../src/agent-command-palette/components/ToolExecutionList.tsx","../src/agent-command-palette/components/AgentResponseDisplay.tsx","../src/agent-command-palette/components/QuickCommandAutocomplete.tsx","../src/agent-command-palette/components/AgentCommandPalette.tsx","../src/agent-command-palette/utils/fuzzyMatch.ts","../src/agent-command-palette/hooks/useAgentCommandPalette.ts","../src/tools/layoutTools.ts","../src/tools/aiProviderFormats.ts","../src/components/PanelControls/PanelCollapseButton.tsx","../src/components/PanelControls/PanelSwitchButton.tsx","../src/components/PanelControls/PanelConfigureButton.tsx","../src/components/PanelControls/PanelControls.tsx"],"sourcesContent":["/**\n * usePanelPersistence Hook\n *\n * Extracted and adapted from electron-app/src/renderer/hooks/usePanelPersistence.ts\n * Manages saving and loading panel sizes and collapsed states with debounced persistence.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type {\n UsePanelPersistenceOptions,\n PanelSizes,\n TwoPanelSizes,\n PanelCollapsed,\n PanelPersistence,\n PersistenceAdapter,\n} from '../types/persistence.types';\n\n/**\n * Default localStorage-based persistence adapter for web applications\n */\nexport class LocalStoragePersistenceAdapter implements PersistenceAdapter {\n private storageKey = 'panel-layouts';\n\n async load(viewKey: string) {\n try {\n const stored = localStorage.getItem(`${this.storageKey}:${viewKey}`);\n return stored ? JSON.parse(stored) : null;\n } catch (error) {\n console.error(`Failed to load panel layout for ${viewKey}:`, error);\n return null;\n }\n }\n\n async save(viewKey: string, state: { sizes: PanelSizes | TwoPanelSizes }) {\n try {\n localStorage.setItem(\n `${this.storageKey}:${viewKey}`,\n JSON.stringify(state),\n );\n } catch (error) {\n console.error(`Failed to save panel layout for ${viewKey}:`, error);\n }\n }\n}\n\n/**\n * Hook for persisting panel layouts across sessions\n *\n * Manages panel sizes and collapsed states with automatic debounced saving.\n * Supports both 2-panel and 3-panel layouts.\n *\n * @param options - Configuration options for persistence\n * @returns Panel state and handlers for resizing and collapsing\n *\n * @example\n * ```tsx\n * const persistence = usePanelPersistence({\n * viewKey: 'my-app',\n * defaultSizes: { left: 30, middle: 70, right: 0 },\n * collapsed: { left: false, right: true },\n * panelType: 'three-panel',\n * });\n *\n * <ConfigurablePanelLayout\n * {...otherProps}\n * defaultSizes={persistence.sizes}\n * collapsed={persistence.collapsed}\n * onPanelResize={persistence.handlePanelResize}\n * />\n * ```\n */\nexport function usePanelPersistence(\n options: UsePanelPersistenceOptions,\n): PanelPersistence {\n const {\n viewKey,\n defaultSizes,\n panelType,\n adapter = new LocalStoragePersistenceAdapter(),\n } = options;\n\n const [sizes, setSizes] = useState(defaultSizes);\n const [collapsed, setCollapsed] = useState(options.collapsed);\n const prevCollapsedRef = useRef(options.collapsed);\n const lastNonZeroSizesRef = useRef<Partial<PanelSizes & TwoPanelSizes>>({});\n const saveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingPersistSizesRef = useRef<typeof sizes | null>(null);\n\n // Load saved state on mount\n useEffect(() => {\n const loadSavedState = async () => {\n const saved = await adapter.load(viewKey);\n if (saved?.sizes) {\n setSizes(saved.sizes as typeof sizes);\n updateLastNonZeroSizes(saved.sizes);\n }\n };\n loadSavedState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewKey]);\n\n const updateLastNonZeroSizes = useCallback(\n (incomingSizes: PanelSizes | TwoPanelSizes) => {\n if ('left' in incomingSizes && incomingSizes.left > 0) {\n lastNonZeroSizesRef.current.left = incomingSizes.left;\n }\n\n if ('middle' in incomingSizes && incomingSizes.middle > 0) {\n lastNonZeroSizesRef.current.middle = incomingSizes.middle;\n }\n\n if ('right' in incomingSizes && incomingSizes.right > 0) {\n lastNonZeroSizesRef.current.right = incomingSizes.right;\n }\n },\n [],\n );\n\n const getFallbackSize = useCallback(\n (panel: 'left' | 'right') => {\n const storedSize = lastNonZeroSizesRef.current[panel];\n if (storedSize && storedSize > 0) {\n return storedSize;\n }\n\n if (panel === 'left' && 'left' in defaultSizes && defaultSizes.left > 0) {\n return defaultSizes.left;\n }\n\n if (\n panel === 'right' &&\n 'right' in defaultSizes &&\n defaultSizes.right > 0\n ) {\n return defaultSizes.right;\n }\n\n return undefined;\n },\n [defaultSizes],\n );\n\n // Update sizes when defaultSizes changes (parent has loaded preferences)\n const prevDefaultSizesRef = useRef(defaultSizes);\n useEffect(() => {\n // Only update if the actual values changed, not just the reference\n const hasChanged =\n ('left' in defaultSizes &&\n defaultSizes.left !== prevDefaultSizesRef.current.left) ||\n ('middle' in defaultSizes &&\n 'middle' in prevDefaultSizesRef.current &&\n defaultSizes.middle !==\n (prevDefaultSizesRef.current as PanelSizes).middle) ||\n ('right' in defaultSizes &&\n defaultSizes.right !== prevDefaultSizesRef.current.right);\n\n if (hasChanged) {\n setSizes(defaultSizes);\n updateLastNonZeroSizes(defaultSizes);\n prevDefaultSizesRef.current = defaultSizes;\n }\n }, [defaultSizes, updateLastNonZeroSizes]);\n\n // Sync with parent's collapsed state (e.g., from titlebar buttons)\n useEffect(() => {\n const leftChanged =\n options.collapsed.left !== prevCollapsedRef.current.left;\n const rightChanged =\n 'right' in options.collapsed &&\n 'right' in prevCollapsedRef.current &&\n (options.collapsed as PanelCollapsed).right !==\n (prevCollapsedRef.current as PanelCollapsed).right;\n\n if (leftChanged || rightChanged) {\n setCollapsed(options.collapsed);\n prevCollapsedRef.current = { ...options.collapsed };\n }\n }, [options.collapsed.left, (options.collapsed as PanelCollapsed).right]);\n\n // Save preferences helper (only saves sizes, not collapsed state)\n const savePreferences = useCallback(\n async (newSizes: typeof sizes) => {\n try {\n await adapter.save(viewKey, { sizes: newSizes });\n } catch (error) {\n console.error(\n `Failed to save panel preferences for ${viewKey}:`,\n error,\n );\n }\n },\n [viewKey, adapter],\n );\n\n // Handle panel resize (debounced)\n const handlePanelResize = useCallback(\n (newSizes: typeof sizes) => {\n const sanitizedSizes = { ...newSizes } as typeof newSizes;\n let shouldPersist = true;\n\n if ('left' in newSizes) {\n const leftCollapsed = Boolean((collapsed as PanelCollapsed)?.left);\n const leftSize = newSizes.left;\n\n if (leftCollapsed) {\n const fallback = getFallbackSize('left');\n if (fallback !== undefined && fallback > 0) {\n sanitizedSizes.left = fallback;\n } else {\n shouldPersist = false;\n }\n } else if (leftSize === 0) {\n shouldPersist = false;\n }\n }\n\n if (panelType === 'three-panel' && 'right' in newSizes) {\n const rightCollapsed = Boolean((collapsed as PanelCollapsed)?.right);\n const rightSize = newSizes.right;\n\n if (rightCollapsed) {\n const fallback = getFallbackSize('right');\n if (fallback !== undefined && fallback > 0) {\n sanitizedSizes.right = fallback;\n } else {\n shouldPersist = false;\n }\n } else if (rightSize === 0) {\n shouldPersist = false;\n }\n }\n\n setSizes(sanitizedSizes);\n updateLastNonZeroSizes(sanitizedSizes);\n\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current);\n saveTimeoutRef.current = null;\n }\n\n if (!shouldPersist) {\n pendingPersistSizesRef.current = null;\n return;\n }\n\n pendingPersistSizesRef.current = sanitizedSizes;\n saveTimeoutRef.current = setTimeout(() => {\n const pendingSizes = pendingPersistSizesRef.current;\n if (pendingSizes) {\n savePreferences(pendingSizes);\n pendingPersistSizesRef.current = null;\n }\n saveTimeoutRef.current = null;\n }, 500);\n },\n [\n collapsed,\n getFallbackSize,\n panelType,\n savePreferences,\n updateLastNonZeroSizes,\n ],\n );\n\n // Cleanup: save any pending changes on unmount\n useEffect(() => {\n return () => {\n if (saveTimeoutRef.current) {\n const pendingSizes = pendingPersistSizesRef.current;\n if (pendingSizes) {\n savePreferences(pendingSizes);\n pendingPersistSizesRef.current = null;\n }\n clearTimeout(saveTimeoutRef.current);\n saveTimeoutRef.current = null;\n }\n };\n }, [savePreferences]);\n\n // Collapse/expand handlers - no-ops because state is controlled by parent\n // The parent manages collapsed state via titlebar buttons and passes it down as props\n const handleLeftCollapseComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n const handleLeftExpandComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n const handleRightCollapseComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n const handleRightExpandComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n if (panelType === 'three-panel') {\n return {\n type: 'three-panel',\n sizes: sizes as PanelSizes,\n collapsed: collapsed as PanelCollapsed,\n handlePanelResize: handlePanelResize as (sizes: PanelSizes) => void,\n handleLeftCollapseComplete,\n handleLeftExpandComplete,\n handleRightCollapseComplete,\n handleRightExpandComplete,\n };\n } else {\n return {\n type: 'two-panel',\n sizes: sizes as TwoPanelSizes,\n collapsed: collapsed as { left?: boolean },\n handlePanelResize: handlePanelResize as (sizes: TwoPanelSizes) => void,\n handleLeftCollapseComplete,\n handleLeftExpandComplete,\n };\n }\n}\n","/**\n * LocalStorageWorkspaceAdapter - Browser localStorage implementation\n * Stores workspace presets and repository states in browser localStorage\n */\n\nimport type {\n WorkspaceLayout,\n WorkspaceStorageAdapter,\n RepositoryWorkspaceState,\n} from '../types/workspace.types';\n\nexport class LocalStorageWorkspaceAdapter implements WorkspaceStorageAdapter {\n private readonly PRESETS_KEY = 'panel-layouts:workspace-presets';\n private readonly REPO_STATE_PREFIX = 'panel-layouts:repo-state:';\n\n /**\n * Load all user-created workspace presets\n */\n async loadWorkspacePresets(): Promise<Record<string, WorkspaceLayout>> {\n try {\n const stored = localStorage.getItem(this.PRESETS_KEY);\n if (!stored) {\n return {};\n }\n return JSON.parse(stored);\n } catch (error) {\n console.error('Failed to load workspace presets:', error);\n return {};\n }\n }\n\n /**\n * Save workspace presets\n */\n async saveWorkspacePresets(\n presets: Record<string, WorkspaceLayout>,\n ): Promise<void> {\n try {\n localStorage.setItem(this.PRESETS_KEY, JSON.stringify(presets));\n } catch (error) {\n console.error('Failed to save workspace presets:', error);\n throw error;\n }\n }\n\n /**\n * Load repository-specific workspace state\n */\n async loadRepositoryState(\n repositoryKey: string,\n ): Promise<RepositoryWorkspaceState | null> {\n try {\n const key = `${this.REPO_STATE_PREFIX}${repositoryKey}`;\n const stored = localStorage.getItem(key);\n if (!stored) {\n return null;\n }\n return JSON.parse(stored);\n } catch (error) {\n console.error(\n `Failed to load repository state for ${repositoryKey}:`,\n error,\n );\n return null;\n }\n }\n\n /**\n * Save repository-specific workspace state\n */\n async saveRepositoryState(\n repositoryKey: string,\n state: RepositoryWorkspaceState,\n ): Promise<void> {\n try {\n const key = `${this.REPO_STATE_PREFIX}${repositoryKey}`;\n localStorage.setItem(key, JSON.stringify(state));\n } catch (error) {\n console.error(\n `Failed to save repository state for ${repositoryKey}:`,\n error,\n );\n throw error;\n }\n }\n\n /**\n * Load all repository states\n */\n async loadAllRepositoryStates(): Promise<\n Record<string, RepositoryWorkspaceState>\n > {\n try {\n const allStates: Record<string, RepositoryWorkspaceState> = {};\n\n // Iterate through all localStorage keys\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(this.REPO_STATE_PREFIX)) {\n const repositoryKey = key.substring(this.REPO_STATE_PREFIX.length);\n const stored = localStorage.getItem(key);\n if (stored) {\n try {\n allStates[repositoryKey] = JSON.parse(stored);\n } catch (parseError) {\n console.error(\n `Failed to parse repository state for ${repositoryKey}:`,\n parseError,\n );\n }\n }\n }\n }\n\n return allStates;\n } catch (error) {\n console.error('Failed to load all repository states:', error);\n return {};\n }\n }\n}\n","/**\n * WorkspaceLayoutService - Manages workspace layout presets\n * Extracted from electron-app/src/renderer/services/WorkspaceLayoutService.ts\n *\n * This service handles CRUD operations for workspace layouts (panel configuration presets)\n * and provides utilities for comparing layouts and managing built-in workspaces.\n */\n\nimport type { PanelLayout } from '@principal-ade/panels';\nimport type {\n WorkspaceLayout,\n WorkspaceStorageAdapter,\n RepositoryWorkspaceState,\n CreateWorkspaceOptions,\n UpdateWorkspaceOptions,\n} from '../types/workspace.types';\nimport { LocalStorageWorkspaceAdapter } from './LocalStorageWorkspaceAdapter';\n\nexport class WorkspaceLayoutService {\n private static adapter: WorkspaceStorageAdapter =\n new LocalStorageWorkspaceAdapter();\n\n /**\n * Configure a custom storage adapter (for Electron IPC or remote storage)\n */\n static setAdapter(adapter: WorkspaceStorageAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Get all workspace layouts (including built-in)\n */\n static async getWorkspaceLayouts(): Promise<Record<string, WorkspaceLayout>> {\n const builtInWorkspaces = this.getBuiltInWorkspaceLayouts();\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n\n // Merge built-in and user workspaces, built-in takes precedence\n return {\n ...userWorkspaces,\n ...builtInWorkspaces,\n };\n }\n\n /**\n * Get a specific workspace layout by ID\n */\n static async getWorkspaceLayout(id: string): Promise<WorkspaceLayout | null> {\n const workspaces = await this.getWorkspaceLayouts();\n return workspaces[id] || null;\n }\n\n /**\n * Create a new workspace layout\n */\n static async createWorkspaceLayout(\n options: CreateWorkspaceOptions,\n ): Promise<WorkspaceLayout> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n const id = this.generateWorkspaceId(options.name);\n\n const workspace: WorkspaceLayout = {\n id,\n name: options.name,\n description: options.description,\n layout: options.layout,\n defaultSizes: options.defaultSizes,\n defaultCollapsed: options.defaultCollapsed,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isBuiltIn: false,\n };\n\n const updatedPresets = {\n ...userWorkspaces,\n [id]: workspace,\n };\n\n await this.adapter.saveWorkspacePresets(updatedPresets);\n\n return workspace;\n }\n\n /**\n * Update an existing workspace layout\n */\n static async updateWorkspaceLayout(\n id: string,\n updates: UpdateWorkspaceOptions,\n ): Promise<WorkspaceLayout | null> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n const existingWorkspace = userWorkspaces[id];\n\n if (!existingWorkspace) {\n console.error(`Workspace layout ${id} not found`);\n return null;\n }\n\n // Don't allow updating built-in workspaces\n if (existingWorkspace.isBuiltIn) {\n console.error(`Cannot update built-in workspace layout ${id}`);\n return null;\n }\n\n const updatedWorkspace: WorkspaceLayout = {\n ...existingWorkspace,\n ...updates,\n id, // Preserve ID\n createdAt: existingWorkspace.createdAt, // Preserve creation time\n updatedAt: Date.now(),\n };\n\n const updatedPresets = {\n ...userWorkspaces,\n [id]: updatedWorkspace,\n };\n\n await this.adapter.saveWorkspacePresets(updatedPresets);\n\n return updatedWorkspace;\n }\n\n /**\n * Delete a workspace layout\n */\n static async deleteWorkspaceLayout(id: string): Promise<boolean> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n const workspace = userWorkspaces[id];\n\n if (!workspace) {\n console.error(`Workspace layout ${id} not found`);\n return false;\n }\n\n // Don't allow deleting built-in workspaces\n if (workspace.isBuiltIn) {\n console.error(`Cannot delete built-in workspace layout ${id}`);\n return false;\n }\n\n const updatedPresets = { ...userWorkspaces };\n delete updatedPresets[id];\n\n await this.adapter.saveWorkspacePresets(updatedPresets);\n\n return true;\n }\n\n /**\n * Get repository state (which workspace + current sizes/collapsed)\n */\n static async getRepositoryState(\n repositoryKey: string,\n ): Promise<RepositoryWorkspaceState | null> {\n return await this.adapter.loadRepositoryState(repositoryKey);\n }\n\n /**\n * Set repository state (which workspace + current sizes/collapsed/layout)\n */\n static async setRepositoryState(\n repositoryKey: string,\n state: RepositoryWorkspaceState,\n ): Promise<void> {\n await this.adapter.saveRepositoryState(repositoryKey, state);\n }\n\n /**\n * Update only sizes in repository state\n */\n static async updateRepositorySizes(\n repositoryKey: string,\n sizes: { left: number; middle: number; right: number },\n ): Promise<void> {\n const currentState = await this.getRepositoryState(repositoryKey);\n if (!currentState) return;\n\n await this.setRepositoryState(repositoryKey, {\n ...currentState,\n sizes,\n });\n }\n\n /**\n * Update only collapsed state in repository state\n */\n static async updateRepositoryCollapsed(\n repositoryKey: string,\n collapsed: { left?: boolean; right?: boolean },\n ): Promise<void> {\n const currentState = await this.getRepositoryState(repositoryKey);\n if (!currentState) return;\n\n await this.setRepositoryState(repositoryKey, {\n ...currentState,\n collapsed,\n });\n }\n\n /**\n * Check if repository state differs from workspace defaults\n */\n static hasStateDeviation(\n repoState: {\n workspaceId: string | null;\n sizes: { left: number; middle: number; right: number };\n collapsed: { left?: boolean; right?: boolean };\n },\n workspace: WorkspaceLayout,\n ): {\n hasSizeDeviation: boolean;\n hasCollapsedDeviation: boolean;\n } {\n const hasSizeDeviation = workspace.defaultSizes\n ? JSON.stringify(repoState.sizes) !==\n JSON.stringify(workspace.defaultSizes)\n : false;\n\n const hasCollapsedDeviation = workspace.defaultCollapsed\n ? JSON.stringify(repoState.collapsed) !==\n JSON.stringify(workspace.defaultCollapsed)\n : false;\n\n return { hasSizeDeviation, hasCollapsedDeviation };\n }\n\n /**\n * Update workspace defaults from repository state\n */\n static async updateWorkspaceFromRepositoryState(\n workspaceId: string,\n repositoryKey: string,\n ): Promise<void> {\n const workspace = await this.getWorkspaceLayout(workspaceId);\n const repoState = await this.getRepositoryState(repositoryKey);\n\n if (!workspace || !repoState || workspace.isBuiltIn) {\n console.error(\n 'Cannot update built-in workspace or workspace/state not found',\n );\n return;\n }\n\n await this.updateWorkspaceLayout(workspaceId, {\n defaultSizes: repoState.sizes,\n defaultCollapsed: repoState.collapsed,\n });\n }\n\n /**\n * Reset repository state to workspace defaults\n */\n static async resetRepositoryToWorkspaceDefaults(\n repositoryKey: string,\n workspaceId: string,\n ): Promise<void> {\n const workspace = await this.getWorkspaceLayout(workspaceId);\n if (!workspace) {\n console.error(`Workspace ${workspaceId} not found`);\n return;\n }\n\n const currentState = await this.getRepositoryState(repositoryKey);\n if (!currentState) return;\n\n await this.setRepositoryState(repositoryKey, {\n ...currentState,\n sizes: workspace.defaultSizes || { left: 20, middle: 45, right: 35 },\n collapsed: workspace.defaultCollapsed || { left: false, right: false },\n });\n }\n\n /**\n * Check if a layout matches a workspace layout\n */\n static isLayoutMatchingWorkspace(\n layout: PanelLayout,\n workspace: WorkspaceLayout,\n ): boolean {\n return this.areLayoutsEqual(layout, workspace.layout);\n }\n\n /**\n * Find workspace ID that matches the given layout\n */\n static async findMatchingWorkspace(\n layout: PanelLayout,\n ): Promise<string | null> {\n const workspaces = await this.getWorkspaceLayouts();\n\n for (const [id, workspace] of Object.entries(workspaces)) {\n if (this.isLayoutMatchingWorkspace(layout, workspace)) {\n return id;\n }\n }\n\n return null;\n }\n\n /**\n * Deep comparison of two panel layouts\n */\n private static areLayoutsEqual(\n layout1: PanelLayout,\n layout2: PanelLayout,\n ): boolean {\n return JSON.stringify(layout1) === JSON.stringify(layout2);\n }\n\n /**\n * Generate a unique ID from a workspace name\n */\n private static generateWorkspaceId(name: string): string {\n const base = name.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n return `${base}-${Date.now()}`;\n }\n\n /**\n * Get built-in workspace layouts\n */\n static getBuiltInWorkspaceLayouts(): Record<string, WorkspaceLayout> {\n const now = Date.now();\n\n return {\n 'project-management': {\n id: 'project-management',\n name: 'Project Management',\n description:\n 'Tasks, dependencies, issues, file tree, docs, drawings, multi terminal, city visualization, code viewer, markdown slides, and excalidraw',\n layout: {\n left: {\n type: 'tabs',\n panels: [\n 'tasks',\n 'dependencies',\n 'gitIssues',\n 'fileTree',\n 'docs',\n 'drawings',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'multiTerminal',\n right: {\n type: 'tabs',\n panels: [\n 'cityVisualization',\n 'codeViewer',\n 'markdownViewer',\n 'excalidrawDiagram',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 45, right: 35 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'code-review': {\n id: 'code-review',\n name: 'Code Review',\n description:\n 'Git changes, pull requests, and file tree on left, git diff and code viewer in middle, city map on right',\n layout: {\n left: {\n type: 'tabs',\n panels: ['gitChanges', 'gitPullRequests', 'fileTree'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: {\n type: 'tabs',\n panels: ['gitDiff', 'codeViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n right: 'cityVisualization',\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n documentation: {\n id: 'documentation',\n name: 'Documentation',\n description: 'Docs, markdown viewer, and code viewer',\n layout: {\n left: 'docs',\n middle: 'markdownViewer',\n right: 'codeViewer',\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'agent-work': {\n id: 'agent-work',\n name: 'Agent Work',\n description:\n 'Tasks, agent sessions, file tree, agent context, git changes, docs, multi terminal, city map, agent events, code viewer, and markdown slides',\n layout: {\n left: {\n type: 'tabs',\n panels: [\n 'tasks',\n 'agentSessions',\n 'fileTree',\n 'agentContext',\n 'gitChanges',\n 'docs',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'multiTerminal',\n right: {\n type: 'tabs',\n panels: [\n 'cityVisualization',\n 'agentEvents',\n 'codeViewer',\n 'markdownViewer',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 45, right: 35 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'quality-check': {\n id: 'quality-check',\n name: 'Quality Check',\n description:\n 'Package information, tools, and dependencies on left; city visualization map in middle; multi terminal and code viewer on right (collapsed)',\n layout: {\n left: {\n type: 'tabs',\n panels: ['packageInfo', 'tools', 'dependencies'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'cityVisualization',\n right: {\n type: 'tabs',\n panels: ['multiTerminal', 'codeViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 45, right: 35 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n drawing: {\n id: 'drawing',\n name: 'Drawing',\n description:\n 'Drawings and docs, excalidraw diagram, multi terminal and markdown viewer',\n layout: {\n left: {\n type: 'tabs',\n panels: ['drawings', 'docs'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'excalidrawDiagram',\n right: {\n type: 'tabs',\n panels: ['multiTerminal', 'markdownViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'old-school': {\n id: 'old-school',\n name: 'Old School',\n description:\n 'File tree, search, git changes, and docs on left; code viewer and markdown viewer in middle; multi terminal and city map on right (collapsed)',\n layout: {\n left: {\n type: 'tabs',\n panels: ['fileTree', 'search', 'gitChanges', 'docs'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: {\n type: 'tabs',\n panels: ['codeViewer', 'markdownViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n right: {\n type: 'tabs',\n panels: ['multiTerminal', 'cityVisualization'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'principal-office': {\n id: 'principal-office',\n name: 'Principal Office',\n description:\n 'Alexandria docs on left, MDX editor in middle, multi terminal on right',\n layout: {\n left: 'docs',\n middle: 'mdxEditor',\n right: 'multiTerminal',\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n };\n }\n\n /**\n * Initialize workspace layouts with built-in defaults if none exist\n */\n static async initializeWorkspaceLayouts(): Promise<void> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n\n // Only initialize if there are no user workspaces yet\n // Built-in workspaces are always available via getBuiltInWorkspaceLayouts()\n if (Object.keys(userWorkspaces).length === 0) {\n // Nothing to do - built-in workspaces are always available\n // This method exists for compatibility with electron-app\n }\n }\n}\n","/**\n * useWorkspace - React hook for workspace management\n * Provides easy access to workspace operations and state\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { WorkspaceLayoutService } from '../services/WorkspaceLayoutService';\nimport type {\n WorkspaceLayout,\n RepositoryWorkspaceState,\n CreateWorkspaceOptions,\n UpdateWorkspaceOptions,\n} from '../types/workspace.types';\n\nexport interface UseWorkspaceOptions {\n /**\n * Optional repository key for repository-specific state\n * If provided, the hook will manage repository state\n */\n repositoryKey?: string;\n\n /**\n * Auto-initialize repository state if it doesn't exist\n */\n autoInitialize?: boolean;\n\n /**\n * Default workspace to use for auto-initialization\n */\n defaultWorkspaceId?: string;\n}\n\nexport interface UseWorkspaceReturn {\n /**\n * All available workspaces (built-in + user-created)\n */\n workspaces: Record<string, WorkspaceLayout>;\n\n /**\n * Current repository state (if repositoryKey provided)\n */\n repositoryState: RepositoryWorkspaceState | null;\n\n /**\n * Current active workspace (if repositoryKey provided)\n */\n activeWorkspace: WorkspaceLayout | null;\n\n /**\n * Loading state\n */\n loading: boolean;\n\n /**\n * Error state\n */\n error: Error | null;\n\n /**\n * Get a specific workspace by ID\n */\n getWorkspace: (id: string) => Promise<WorkspaceLayout | null>;\n\n /**\n * Create a new workspace\n */\n createWorkspace: (options: CreateWorkspaceOptions) => Promise<WorkspaceLayout>;\n\n /**\n * Update an existing workspace\n */\n updateWorkspace: (\n id: string,\n updates: UpdateWorkspaceOptions,\n ) => Promise<WorkspaceLayout | null>;\n\n /**\n * Delete a workspace\n */\n deleteWorkspace: (id: string) => Promise<boolean>;\n\n /**\n * Apply a workspace to the current repository\n */\n applyWorkspace: (workspaceId: string) => Promise<void>;\n\n /**\n * Update repository sizes\n */\n updateSizes: (sizes: {\n left: number;\n middle: number;\n right: number;\n }) => Promise<void>;\n\n /**\n * Update repository collapsed state\n */\n updateCollapsed: (collapsed: {\n left?: boolean;\n right?: boolean;\n }) => Promise<void>;\n\n /**\n * Reset repository to workspace defaults\n */\n resetToDefaults: () => Promise<void>;\n\n /**\n * Refresh workspace data\n */\n refresh: () => Promise<void>;\n}\n\nexport function useWorkspace(\n options: UseWorkspaceOptions = {},\n): UseWorkspaceReturn {\n const { repositoryKey, autoInitialize = false, defaultWorkspaceId } = options;\n\n const [workspaces, setWorkspaces] = useState<Record<string, WorkspaceLayout>>(\n {},\n );\n const [repositoryState, setRepositoryState] =\n useState<RepositoryWorkspaceState | null>(null);\n const [activeWorkspace, setActiveWorkspace] =\n useState<WorkspaceLayout | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Load all workspaces and repository state\n */\n const loadData = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n\n // Load all workspaces\n const allWorkspaces =\n await WorkspaceLayoutService.getWorkspaceLayouts();\n setWorkspaces(allWorkspaces);\n\n // Load repository state if repositoryKey provided\n if (repositoryKey) {\n let repoState =\n await WorkspaceLayoutService.getRepositoryState(repositoryKey);\n\n // Auto-initialize if requested and state doesn't exist\n if (!repoState && autoInitialize) {\n const workspaceId =\n defaultWorkspaceId || 'project-management'; // Default to project-management\n const workspace =\n await WorkspaceLayoutService.getWorkspaceLayout(workspaceId);\n\n if (workspace) {\n repoState = {\n workspaceId,\n sizes: workspace.defaultSizes || {\n left: 20,\n middle: 45,\n right: 35,\n },\n collapsed: workspace.defaultCollapsed || {\n left: false,\n right: false,\n },\n };\n\n await WorkspaceLayoutService.setRepositoryState(\n repositoryKey,\n repoState,\n );\n }\n }\n\n setRepositoryState(repoState);\n\n // Load active workspace if repository has one\n if (repoState?.workspaceId) {\n const workspace = await WorkspaceLayoutService.getWorkspaceLayout(\n repoState.workspaceId,\n );\n setActiveWorkspace(workspace);\n } else {\n setActiveWorkspace(null);\n }\n }\n } catch (err) {\n setError(err as Error);\n console.error('Failed to load workspace data:', err);\n } finally {\n setLoading(false);\n }\n }, [repositoryKey, autoInitialize, defaultWorkspaceId]);\n\n /**\n * Initial load\n */\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n /**\n * Get a specific workspace\n */\n const getWorkspace = useCallback(\n async (id: string) => {\n return await WorkspaceLayoutService.getWorkspaceLayout(id);\n },\n [],\n );\n\n /**\n * Create a new workspace\n */\n const createWorkspace = useCallback(\n async (createOptions: CreateWorkspaceOptions) => {\n const workspace =\n await WorkspaceLayoutService.createWorkspaceLayout(createOptions);\n await loadData(); // Refresh\n return workspace;\n },\n [loadData],\n );\n\n /**\n * Update an existing workspace\n */\n const updateWorkspace = useCallback(\n async (id: string, updates: UpdateWorkspaceOptions) => {\n const workspace =\n await WorkspaceLayoutService.updateWorkspaceLayout(id, updates);\n await loadData(); // Refresh\n return workspace;\n },\n [loadData],\n );\n\n /**\n * Delete a workspace\n */\n const deleteWorkspace = useCallback(\n async (id: string) => {\n const success = await WorkspaceLayoutService.deleteWorkspaceLayout(id);\n if (success) {\n await loadData(); // Refresh\n }\n return success;\n },\n [loadData],\n );\n\n /**\n * Apply a workspace to the current repository\n */\n const applyWorkspace = useCallback(\n async (workspaceId: string) => {\n if (!repositoryKey) {\n console.error('Cannot apply workspace without repositoryKey');\n return;\n }\n\n const workspace =\n await WorkspaceLayoutService.getWorkspaceLayout(workspaceId);\n if (!workspace) {\n console.error(`Workspace ${workspaceId} not found`);\n return;\n }\n\n const newState: RepositoryWorkspaceState = {\n workspaceId,\n sizes: workspace.defaultSizes || { left: 20, middle: 45, right: 35 },\n collapsed: workspace.defaultCollapsed || {\n left: false,\n right: false,\n },\n };\n\n await WorkspaceLayoutService.setRepositoryState(repositoryKey, newState);\n await loadData(); // Refresh\n },\n [repositoryKey, loadData],\n );\n\n /**\n * Update repository sizes\n */\n const updateSizes = useCallback(\n async (sizes: { left: number; middle: number; right: number }) => {\n if (!repositoryKey) {\n console.error('Cannot update sizes without repositoryKey');\n return;\n }\n\n await WorkspaceLayoutService.updateRepositorySizes(repositoryKey, sizes);\n await loadData(); // Refresh\n },\n [repositoryKey, loadData],\n );\n\n /**\n * Update repository collapsed state\n */\n const updateCollapsed = useCallback(\n async (collapsed: { left?: boolean; right?: boolean }) => {\n if (!repositoryKey) {\n console.error('Cannot update collapsed without repositoryKey');\n return;\n }\n\n await WorkspaceLayoutService.updateRepositoryCollapsed(\n repositoryKey,\n collapsed,\n );\n await loadData(); // Refresh\n },\n [repositoryKey, loadData],\n );\n\n /**\n * Reset repository to workspace defaults\n */\n const resetToDefaults = useCallback(async () => {\n if (!repositoryKey || !repositoryState?.workspaceId) {\n console.error('Cannot reset without repositoryKey and active workspace');\n return;\n }\n\n await WorkspaceLayoutService.resetRepositoryToWorkspaceDefaults(\n repositoryKey,\n repositoryState.workspaceId,\n );\n await loadData(); // Refresh\n }, [repositoryKey, repositoryState?.workspaceId, loadData]);\n\n /**\n * Refresh workspace data\n */\n const refresh = useCallback(async () => {\n await loadData();\n }, [loadData]);\n\n return {\n workspaces,\n repositoryState,\n activeWorkspace,\n loading,\n error,\n getWorkspace,\n createWorkspace,\n updateWorkspace,\n deleteWorkspace,\n applyWorkspace,\n updateSizes,\n updateCollapsed,\n resetToDefaults,\n refresh,\n };\n}\n","/**\n * usePanelFocus - Hook for managing panel focus state\n */\n\nimport { useState, useCallback } from 'react';\nimport type {\n PanelEventEmitter,\n PanelFocusEventPayload,\n PanelBlurEventPayload,\n} from '@principal-ade/panel-framework-core';\nimport type { PanelSlotId, PanelFocusState, PanelFocusActions } from '../types';\nimport type { PanelCollapsed } from '../../types/persistence.types';\n\nexport interface UsePanelFocusOptions {\n /** Initial focused panel (optional) */\n initialFocus?: PanelSlotId | null;\n\n /** Collapsed state to determine which panels are visible */\n collapsed?: PanelCollapsed;\n\n /** Whether this is a two-panel or three-panel layout */\n panelType?: 'two-panel' | 'three-panel';\n\n /** Callback when focus changes */\n onFocusChange?: (panel: PanelSlotId | null) => void;\n\n /** Event emitter from panel framework (optional, for focus events) */\n events?: PanelEventEmitter;\n\n /** Function to map panel slot to panel ID (optional, required for event emission) */\n getPanelId?: (slot: PanelSlotId) => string | undefined;\n}\n\nexport interface UsePanelFocusReturn extends PanelFocusState, PanelFocusActions {\n /** Check if a specific panel is focused */\n isFocused: (panel: PanelSlotId) => boolean;\n}\n\n/**\n * Hook for managing panel focus state with keyboard shortcuts\n */\nexport function usePanelFocus(\n options: UsePanelFocusOptions = {}\n): UsePanelFocusReturn {\n const {\n initialFocus = null,\n collapsed = {},\n panelType = 'three-panel',\n onFocusChange,\n events,\n getPanelId,\n } = options;\n\n const [focusedPanel, setFocusedPanelState] = useState<PanelSlotId | null>(\n initialFocus\n );\n\n const setFocus = useCallback(\n (panel: PanelSlotId) => {\n const previousPanel = focusedPanel;\n setFocusedPanelState(panel);\n onFocusChange?.(panel);\n\n // Emit framework events if event emitter is provided\n if (events && getPanelId) {\n // Emit blur event for previous panel\n if (previousPanel) {\n const prevPanelId = getPanelId(previousPanel);\n if (prevPanelId) {\n events.emit<PanelBlurEventPayload>({\n type: 'panel:blur',\n source: 'panel-layouts',\n timestamp: Date.now(),\n payload: {\n panelId: prevPanelId,\n panelSlot: previousPanel,\n nextPanelId: getPanelId(panel),\n },\n });\n }\n }\n\n // Emit focus event for new panel\n const panelId = getPanelId(panel);\n if (panelId) {\n events.emit<PanelFocusEventPayload>({\n type: 'panel:focus',\n source: 'panel-layouts',\n timestamp: Date.now(),\n payload: {\n panelId,\n panelSlot: panel,\n source: 'keyboard-shortcut',\n },\n });\n }\n }\n },\n [focusedPanel, onFocusChange, events, getPanelId]\n );\n\n const clearFocus = useCallback(() => {\n const previousPanel = focusedPanel;\n setFocusedPanelState(null);\n onFocusChange?.(null);\n\n // Emit blur event when clearing focus\n if (events && getPanelId && previousPanel) {\n const prevPanelId = getPanelId(previousPanel);\n if (prevPanelId) {\n events.emit<PanelBlurEventPayload>({\n type: 'panel:blur',\n source: 'panel-layouts',\n timestamp: Date.now(),\n payload: {\n panelId: prevPanelId,\n panelSlot: previousPanel,\n },\n });\n }\n }\n }, [focusedPanel, onFocusChange, events, getPanelId]);\n\n const getVisiblePanels = useCallback((): PanelSlotId[] => {\n const panels: PanelSlotId[] = [];\n\n if (!collapsed.left) {\n panels.push('left');\n }\n panels.push('middle'); // Middle is always visible\n if (panelType === 'three-panel' && !collapsed.right) {\n panels.push('right');\n }\n\n return panels;\n }, [collapsed, panelType]);\n\n const focusNext = useCallback(() => {\n const visiblePanels = getVisiblePanels();\n if (visiblePanels.length === 0) return;\n\n if (focusedPanel === null) {\n // No panel focused, focus first visible panel\n setFocus(visiblePanels[0]);\n return;\n }\n\n const currentIndex = visiblePanels.indexOf(focusedPanel);\n if (currentIndex === -1) {\n // Current panel is not visible, focus first visible panel\n setFocus(visiblePanels[0]);\n return;\n }\n\n // Move to next panel (wrap around)\n const nextIndex = (currentIndex + 1) % visiblePanels.length;\n setFocus(visiblePanels[nextIndex]);\n }, [focusedPanel, getVisiblePanels, setFocus]);\n\n const focusPrevious = useCallback(() => {\n const visiblePanels = getVisiblePanels();\n if (visiblePanels.length === 0) return;\n\n if (focusedPanel === null) {\n // No panel focused, focus last visible panel\n setFocus(visiblePanels[visiblePanels.length - 1]);\n return;\n }\n\n const currentIndex = visiblePanels.indexOf(focusedPanel);\n if (currentIndex === -1) {\n // Current panel is not visible, focus last visible panel\n setFocus(visiblePanels[visiblePanels.length - 1]);\n return;\n }\n\n // Move to previous panel (wrap around)\n const prevIndex =\n currentIndex === 0 ? visiblePanels.length - 1 : currentIndex - 1;\n setFocus(visiblePanels[prevIndex]);\n }, [focusedPanel, getVisiblePanels, setFocus]);\n\n const isFocused = useCallback(\n (panel: PanelSlotId) => focusedPanel === panel,\n [focusedPanel]\n );\n\n return {\n focusedPanel,\n setFocus,\n clearFocus,\n focusNext,\n focusPrevious,\n isFocused,\n };\n}\n","/**\n * usePanelKeyboardShortcuts - Hook for keyboard shortcuts to control panel focus and collapse\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PanelSlotId } from '../types';\nimport type { PanelCollapsed } from '../../types/persistence.types';\n\nexport interface UsePanelKeyboardShortcutsOptions {\n /** Whether keyboard shortcuts are enabled */\n enabled?: boolean;\n\n /** Current focused panel */\n focusedPanel: PanelSlotId | null;\n\n /** Current collapsed state */\n collapsed: PanelCollapsed;\n\n /** Panel type (two-panel or three-panel) */\n panelType: 'two-panel' | 'three-panel';\n\n /** Set focus to a specific panel */\n setFocus: (panel: PanelSlotId) => void;\n\n /** Callback to expand a panel */\n onExpand: (panel: 'left' | 'right') => void | Promise<void>;\n\n /** Callback to collapse a panel */\n onCollapse: (panel: 'left' | 'right') => void | Promise<void>;\n}\n\n/**\n * Hook for handling Alt+1/2/3 keyboard shortcuts for panel toggle and focus\n *\n * Behavior:\n * - Alt+1 (Left Panel):\n * 1. If collapsed: expand (no focus change)\n * 2. If expanded but not focused: focus it\n * 3. If focused: collapse and focus middle\n *\n * - Alt+2 (Middle Panel):\n * - Always focus middle (never collapses)\n *\n * - Alt+3 (Right Panel):\n * 1. If collapsed: expand (no focus change)\n * 2. If expanded but not focused: focus it\n * 3. If focused: collapse and focus middle\n */\nexport function usePanelKeyboardShortcuts(\n options: UsePanelKeyboardShortcutsOptions\n): void {\n const {\n enabled = true,\n focusedPanel,\n collapsed,\n panelType,\n setFocus,\n onExpand,\n onCollapse,\n } = options;\n\n // Use refs to avoid recreating event listener on every render\n const focusedPanelRef = useRef(focusedPanel);\n const collapsedRef = useRef(collapsed);\n const panelTypeRef = useRef(panelType);\n\n useEffect(() => {\n focusedPanelRef.current = focusedPanel;\n }, [focusedPanel]);\n\n useEffect(() => {\n collapsedRef.current = collapsed;\n }, [collapsed]);\n\n useEffect(() => {\n panelTypeRef.current = panelType;\n }, [panelType]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Only handle Alt+Number shortcuts\n if (!event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // Use event.code instead of event.key to handle international keyboards\n // event.code gives us 'Digit1', 'Digit2', etc. regardless of keyboard layout\n const code = event.code;\n const currentFocused = focusedPanelRef.current;\n const currentCollapsed = collapsedRef.current;\n const currentPanelType = panelTypeRef.current;\n\n // Alt+1: Toggle left panel\n if (code === 'Digit1' || code === 'Numpad1') {\n event.preventDefault();\n\n if (currentCollapsed.left) {\n // State 1: Collapsed -> Expand (no focus change)\n onExpand('left');\n } else if (currentFocused !== 'left') {\n // State 2: Expanded but not focused -> Focus\n setFocus('left');\n } else {\n // State 3: Focused -> Collapse and focus middle\n onCollapse('left');\n setFocus('middle');\n }\n }\n // Alt+2: Focus middle panel\n else if (code === 'Digit2' || code === 'Numpad2') {\n event.preventDefault();\n setFocus('middle');\n }\n // Alt+3: Toggle right panel (only for three-panel layouts)\n else if ((code === 'Digit3' || code === 'Numpad3') && currentPanelType === 'three-panel') {\n event.preventDefault();\n\n if (currentCollapsed.right) {\n // State 1: Collapsed -> Expand (no focus change)\n onExpand('right');\n } else if (currentFocused !== 'right') {\n // State 2: Expanded but not focused -> Focus\n setFocus('right');\n } else {\n // State 3: Focused -> Collapse and focus middle\n onCollapse('right');\n setFocus('middle');\n }\n }\n },\n [setFocus, onExpand, onCollapse]\n );\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [enabled, handleKeyDown]);\n}\n","/**\n * usePanelFocusListener - Helper hook for panels to listen to focus events\n */\n\nimport { useEffect } from 'react';\nimport type {\n PanelEventEmitter,\n PanelFocusEventPayload,\n PanelBlurEventPayload,\n} from '@principal-ade/panel-framework-core';\n\n/**\n * Hook for panels to listen to focus events from the framework\n *\n * This is a convenience hook that panels can use to respond to focus changes\n * from keyboard shortcuts, mouse clicks, or programmatic navigation.\n *\n * @param panelId - The ID of this panel (from panel metadata)\n * @param events - Event emitter from PanelComponentProps\n * @param onFocus - Callback when this panel receives focus\n * @param onBlur - Optional callback when this panel loses focus\n *\n * @example\n * ```typescript\n * function TerminalPanel({ context, actions, events }: PanelComponentProps) {\n * const xtermRef = useRef<Terminal>();\n *\n * usePanelFocusListener(\n * 'terminal',\n * events,\n * () => xtermRef.current?.focus(),\n * () => xtermRef.current?.blur()\n * );\n *\n * return <div id=\"xterm-container\" />;\n * }\n * ```\n */\nexport function usePanelFocusListener(\n panelId: string,\n events: PanelEventEmitter,\n onFocus: () => void,\n onBlur?: () => void\n): void {\n useEffect(() => {\n // Listen for focus events\n const unsubscribeFocus = events.on<PanelFocusEventPayload>(\n 'panel:focus',\n (event) => {\n if (event.payload.panelId === panelId) {\n onFocus();\n }\n }\n );\n\n // Listen for blur events (optional)\n let unsubscribeBlur: (() => void) | undefined;\n if (onBlur) {\n unsubscribeBlur = events.on<PanelBlurEventPayload>(\n 'panel:blur',\n (event) => {\n if (event.payload.panelId === panelId) {\n onBlur();\n }\n }\n );\n }\n\n return () => {\n unsubscribeFocus();\n unsubscribeBlur?.();\n };\n }, [panelId, events, onFocus, onBlur]);\n}\n","/**\n * FocusIndicator - Visual indicator for focused panel\n */\n\nimport React from 'react';\n\nexport interface FocusIndicatorProps {\n /** Whether this panel is currently focused */\n isFocused: boolean;\n\n /** Custom class name */\n className?: string;\n\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Visual indicator that highlights the focused panel\n *\n * Renders a subtle border/glow around the focused panel for keyboard navigation feedback\n */\nexport const FocusIndicator: React.FC<FocusIndicatorProps> = ({\n isFocused,\n className = '',\n style = {},\n}) => {\n if (!isFocused) {\n return null;\n }\n\n const defaultStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n border: '2px solid var(--panel-focus-border-color, #0066cc)',\n borderRadius: '4px',\n boxShadow: '0 0 0 1px var(--panel-focus-shadow-color, rgba(0, 102, 204, 0.2))',\n zIndex: 1000,\n transition: 'opacity 0.15s ease-in-out',\n ...style,\n };\n\n return (\n <div\n className={`panel-focus-indicator ${className}`}\n style={defaultStyles}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n );\n};\n","import React, { useRef, useEffect } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { AgentCommandInputProps } from '../types';\n\n/**\n * AgentCommandInput - Input field for the Agent Command Palette\n * Supports natural language mode and quick command mode (/ prefix)\n */\nexport const AgentCommandInput: React.FC<AgentCommandInputProps> = ({\n value,\n onChange,\n onSubmit,\n onClose,\n onHistoryPrevious,\n onHistoryNext,\n mode,\n status,\n placeholder = 'What would you like to do?',\n disabled = false,\n autoFocus = true,\n agentAvailable = true,\n showAutocomplete = false,\n onAutocompleteNext,\n onAutocompletePrevious,\n onAutocompleteAccept,\n}) => {\n const { theme } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto-focus on mount\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus();\n }\n }, [autoFocus]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Stop propagation to prevent Storybook/parent shortcuts from interfering\n e.stopPropagation();\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault();\n onSubmit();\n break;\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'Tab':\n // Tab accepts autocomplete selection\n if (showAutocomplete && onAutocompleteAccept) {\n e.preventDefault();\n onAutocompleteAccept();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n // Use autocomplete navigation when dropdown is showing\n if (showAutocomplete && onAutocompletePrevious) {\n onAutocompletePrevious();\n } else {\n onHistoryPrevious();\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n // Use autocomplete navigation when dropdown is showing\n if (showAutocomplete && onAutocompleteNext) {\n onAutocompleteNext();\n } else {\n onHistoryNext();\n }\n break;\n }\n };\n\n const isProcessing = status === 'thinking' || status === 'executing';\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: theme.colors.background,\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n {/* Mode indicator */}\n <span\n style={{\n color: mode === 'quick-command'\n ? theme.colors.info\n : agentAvailable\n ? theme.colors.primary\n : theme.colors.textMuted,\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {mode === 'quick-command' ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Terminal icon */}\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n ) : agentAvailable ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Bot icon */}\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\" />\n <circle cx=\"12\" cy=\"5\" r=\"2\" />\n <path d=\"M12 7v4\" />\n <line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"16\" />\n <line x1=\"16\" y1=\"16\" x2=\"16\" y2=\"16\" />\n </svg>\n ) : (\n '>'\n )}\n </span>\n\n {/* Input field */}\n <input\n ref={inputRef}\n data-agent-command-palette-input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isProcessing}\n style={{\n flex: 1,\n backgroundColor: 'transparent',\n border: 'none',\n outline: 'none',\n color: theme.colors.text,\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n caretColor: theme.colors.primary,\n }}\n />\n\n {/* Status indicator */}\n {isProcessing && (\n <span\n style={{\n color: theme.colors.info,\n fontSize: theme.fontSizes[0],\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <span\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: theme.colors.info,\n animation: 'pulse 1s ease-in-out infinite',\n }}\n />\n {status === 'thinking' ? 'Thinking...' : 'Executing...'}\n </span>\n )}\n\n {/* Keyboard hint */}\n {!isProcessing && (\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n }}\n >\n Alt+P\n </kbd>\n )}\n </div>\n );\n};\n\nAgentCommandInput.displayName = 'AgentCommandInput';\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { ToolExecutionListProps, ToolExecution } from '../types';\n\n/**\n * Status icon for tool execution\n */\nconst StatusIcon: React.FC<{ status: ToolExecution['status'] }> = ({ status }) => {\n const { theme } = useTheme();\n\n const iconStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n fontSize: theme.fontSizes[0],\n };\n\n switch (status) {\n case 'pending':\n return (\n <span style={{ ...iconStyle, color: theme.colors.textMuted }}>○</span>\n );\n case 'running':\n return (\n <span\n style={{\n ...iconStyle,\n color: theme.colors.info,\n animation: 'spin 1s linear infinite',\n }}\n >\n ◐\n </span>\n );\n case 'success':\n return (\n <span style={{ ...iconStyle, color: theme.colors.success }}>✓</span>\n );\n case 'error':\n return (\n <span style={{ ...iconStyle, color: theme.colors.error }}>✗</span>\n );\n }\n};\n\n/**\n * Format tool arguments for display\n */\nconst formatArgs = (args: Record<string, unknown>): string => {\n const entries = Object.entries(args);\n if (entries.length === 0) return '';\n\n return entries\n .map(([key, value]) => {\n if (key === 'args' && Array.isArray(value)) {\n return value.join(', ');\n }\n if (typeof value === 'string') {\n return `\"${value}\"`;\n }\n return JSON.stringify(value);\n })\n .join(', ');\n};\n\n/**\n * Single tool execution item\n */\nconst ToolExecutionItem: React.FC<{\n tool: ToolExecution;\n compact?: boolean;\n}> = ({ tool, compact }) => {\n const { theme } = useTheme();\n\n const args = formatArgs(tool.args);\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: compact ? '4px 0' : '8px 0',\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n }}\n >\n <StatusIcon status={tool.status} />\n\n <span style={{ color: theme.colors.text }}>\n {tool.name}\n {args && (\n <span style={{ color: theme.colors.textMuted }}>({args})</span>\n )}\n </span>\n\n {tool.status === 'running' && (\n <span\n style={{\n marginLeft: 'auto',\n color: theme.colors.info,\n fontSize: theme.fontSizes[0],\n }}\n >\n [running]\n </span>\n )}\n\n {tool.status === 'success' && (\n <span\n style={{\n marginLeft: 'auto',\n color: theme.colors.success,\n fontSize: theme.fontSizes[0],\n }}\n >\n [done]\n </span>\n )}\n\n {tool.status === 'error' && (\n <span\n style={{\n marginLeft: 'auto',\n color: theme.colors.error,\n fontSize: theme.fontSizes[0],\n }}\n title={tool.error}\n >\n [error]\n </span>\n )}\n </div>\n );\n};\n\n/**\n * ToolExecutionList - Displays the list of tools being executed\n */\nexport const ToolExecutionList: React.FC<ToolExecutionListProps> = ({\n tools,\n compact = false,\n}) => {\n const { theme } = useTheme();\n\n if (tools.length === 0) {\n return null;\n }\n\n return (\n <div\n style={{\n padding: compact ? '8px 16px' : '12px 16px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '4px',\n margin: '8px 16px',\n }}\n >\n {tools.map((tool) => (\n <ToolExecutionItem key={tool.id} tool={tool} compact={compact} />\n ))}\n </div>\n );\n};\n\nToolExecutionList.displayName = 'ToolExecutionList';\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { AgentResponseDisplayProps } from '../types';\n\n/**\n * AgentResponseDisplay - Shows the agent's text response\n */\nexport const AgentResponseDisplay: React.FC<AgentResponseDisplayProps> = ({\n response,\n streaming = false,\n}) => {\n const { theme } = useTheme();\n\n if (!response) {\n return null;\n }\n\n // Determine if this is a success or error message\n const isError = response.toLowerCase().startsWith('error');\n const isSuccess = response.toLowerCase().startsWith('done') ||\n response.toLowerCase().startsWith('executed');\n\n return (\n <div\n style={{\n padding: '12px 16px',\n color: isError\n ? theme.colors.error\n : isSuccess\n ? theme.colors.success\n : theme.colors.text,\n fontSize: theme.fontSizes[1],\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}\n >\n {isSuccess && <span>✓</span>}\n {isError && <span>✗</span>}\n\n <span>\n {response}\n {streaming && (\n <span\n style={{\n display: 'inline-block',\n width: '2px',\n height: '14px',\n backgroundColor: theme.colors.primary,\n marginLeft: '2px',\n animation: 'blink 1s step-end infinite',\n }}\n />\n )}\n </span>\n </div>\n );\n};\n\nAgentResponseDisplay.displayName = 'AgentResponseDisplay';\n","import React, { useEffect, useRef } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { QuickCommandMatch, QuickCommandArg, ArgumentOptionMatch } from '../types';\n\nexport interface QuickCommandAutocompleteProps {\n /** Matched commands to display */\n matches: QuickCommandMatch[];\n /** Matched argument options to display (when entering args) */\n argumentMatches?: ArgumentOptionMatch[];\n /** Current argument definition (when entering args) */\n currentArg?: QuickCommandArg | null;\n /** Whether we're in argument entry mode */\n isEnteringArgs?: boolean;\n /** Currently selected index */\n selectedIndex: number;\n /** Called when a command is clicked */\n onSelect: (index: number) => void;\n /** Maximum number of visible items before scrolling */\n maxVisible?: number;\n}\n\n/**\n * Renders highlighted text based on matched indices\n */\nfunction HighlightedText({\n text,\n matchedIndices,\n highlightColor,\n}: {\n text: string;\n matchedIndices: number[];\n highlightColor: string;\n}) {\n if (!matchedIndices.length) {\n return <>{text}</>;\n }\n\n const matchSet = new Set(matchedIndices);\n const chars = text.split('');\n\n return (\n <>\n {chars.map((char, i) => (\n <span\n key={i}\n style={{\n color: matchSet.has(i) ? highlightColor : 'inherit',\n fontWeight: matchSet.has(i) ? 600 : 'inherit',\n }}\n >\n {char}\n </span>\n ))}\n </>\n );\n}\n\n/**\n * QuickCommandAutocomplete - Dropdown showing fuzzy-matched quick commands or argument options\n */\nexport const QuickCommandAutocomplete: React.FC<QuickCommandAutocompleteProps> = ({\n matches,\n argumentMatches = [],\n currentArg,\n isEnteringArgs = false,\n selectedIndex,\n onSelect,\n maxVisible = 6,\n}) => {\n const { theme } = useTheme();\n const listRef = useRef<HTMLDivElement>(null);\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Scroll selected item into view\n useEffect(() => {\n if (selectedRef.current && listRef.current) {\n selectedRef.current.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n }, [selectedIndex]);\n\n // Render argument options mode\n if (isEnteringArgs && argumentMatches.length > 0) {\n const itemHeight = 40;\n const maxHeight = itemHeight * maxVisible;\n\n return (\n <div\n ref={listRef}\n style={{\n maxHeight: `${maxHeight}px`,\n overflowY: 'auto',\n borderTop: `1px solid ${theme.colors.border}`,\n }}\n >\n {/* Header showing which argument we're entering */}\n {currentArg && (\n <div\n style={{\n padding: '8px 16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.backgroundSecondary,\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n <span style={{ color: theme.colors.textSecondary }}>\n {currentArg.name}\n </span>\n {currentArg.description && (\n <span style={{ marginLeft: '8px' }}>\n — {currentArg.description}\n </span>\n )}\n </div>\n )}\n\n {argumentMatches.map((match, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <div\n key={`${match.option}-${index}`}\n ref={isSelected ? selectedRef : undefined}\n onClick={() => onSelect(index)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n cursor: 'pointer',\n backgroundColor: isSelected\n ? theme.colors.backgroundSecondary\n : 'transparent',\n borderLeft: isSelected\n ? `2px solid ${theme.colors.primary}`\n : '2px solid transparent',\n transition: 'background-color 100ms ease',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundSecondary;\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {/* Option value with highlighting */}\n <span\n style={{\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n color: theme.colors.text,\n flex: 1,\n }}\n >\n <HighlightedText\n text={match.option}\n matchedIndices={match.matchedIndices}\n highlightColor={theme.colors.primary}\n />\n </span>\n\n {/* Keyboard hint for selected */}\n {isSelected && (\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundTertiary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n flexShrink: 0,\n }}\n >\n Tab\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n\n // Render command matches mode\n if (matches.length === 0) {\n return null;\n }\n\n const itemHeight = 48; // Approximate height per item\n const maxHeight = itemHeight * maxVisible;\n\n return (\n <div\n ref={listRef}\n style={{\n maxHeight: `${maxHeight}px`,\n overflowY: 'auto',\n borderTop: `1px solid ${theme.colors.border}`,\n }}\n >\n {matches.map((match, index) => {\n const isSelected = index === selectedIndex;\n const command = match.command;\n\n return (\n <div\n key={`${command.name}-${index}`}\n ref={isSelected ? selectedRef : undefined}\n onClick={() => onSelect(index)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 16px',\n cursor: 'pointer',\n backgroundColor: isSelected\n ? theme.colors.backgroundSecondary\n : 'transparent',\n borderLeft: isSelected\n ? `2px solid ${theme.colors.primary}`\n : '2px solid transparent',\n transition: 'background-color 100ms ease',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundSecondary;\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {/* Command indicator */}\n <span\n style={{\n color: theme.colors.info,\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n flexShrink: 0,\n }}\n >\n /\n </span>\n\n {/* Command name with highlighting */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n color: theme.colors.text,\n }}\n >\n <HighlightedText\n text={command.name}\n matchedIndices={match.matchedOn === command.name ? match.matchedIndices : []}\n highlightColor={theme.colors.primary}\n />\n {/* Show alias if matched on alias */}\n {match.matchedOn !== command.name && (\n <span\n style={{\n color: theme.colors.textMuted,\n marginLeft: '8px',\n fontSize: theme.fontSizes[0],\n }}\n >\n (alias: {match.matchedOn})\n </span>\n )}\n </div>\n <div\n style={{\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n marginTop: '2px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {command.description}\n </div>\n </div>\n\n {/* Args hint */}\n {command.args && command.args.length > 0 && (\n <div\n style={{\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n fontFamily: theme.fonts.monospace,\n flexShrink: 0,\n }}\n >\n {command.args.map((arg: QuickCommandArg, i: number) => (\n <span key={arg.name}>\n {i > 0 && ' '}\n <span\n style={{\n color: arg.required\n ? theme.colors.warning\n : theme.colors.textMuted,\n }}\n >\n {arg.required ? `<${arg.name}>` : `[${arg.name}]`}\n </span>\n </span>\n ))}\n </div>\n )}\n\n {/* Keyboard hint for selected */}\n {isSelected && (\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundTertiary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n flexShrink: 0,\n }}\n >\n Tab\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nQuickCommandAutocomplete.displayName = 'QuickCommandAutocomplete';\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { AgentCommandPaletteProps } from '../types';\nimport { AgentCommandInput } from './AgentCommandInput';\nimport { ToolExecutionList } from './ToolExecutionList';\nimport { AgentResponseDisplay } from './AgentResponseDisplay';\nimport { QuickCommandAutocomplete } from './QuickCommandAutocomplete';\n\n/**\n * AgentCommandPalette - AI-driven command palette component\n *\n * Displays at the bottom of the screen with an input field.\n * Users can type natural language requests or quick commands (prefixed with /).\n */\nexport const AgentCommandPalette: React.FC<AgentCommandPaletteProps> = ({\n palette,\n config,\n}) => {\n const { theme } = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n isOpen,\n close,\n query,\n setQuery,\n mode,\n status,\n pendingTools,\n completedTools,\n agentResponse,\n submit,\n historyPrevious,\n historyNext,\n suggestions,\n agentAvailable,\n // Autocomplete\n quickCommandMatches,\n argumentOptionMatches,\n parsedQuery,\n currentArgDef,\n selectedAutocompleteIndex,\n autocompleteNext,\n autocompletePrevious,\n autocompleteAccept,\n showAutocomplete,\n } = palette;\n\n // Handle click outside to close\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n close();\n }\n };\n\n // Add a small delay to prevent immediate close on open\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, close]);\n\n // Animation state for slide-up/down effect\n const [isVisible, setIsVisible] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // Mount first, then animate in\n setShouldRender(true);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n });\n } else {\n // Animate out first, then unmount\n setIsVisible(false);\n const timer = setTimeout(() => {\n setShouldRender(false);\n }, 150); // Match transition duration\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n if (!shouldRender) {\n return null;\n }\n\n const placeholder = agentAvailable\n ? (config?.placeholder || 'What would you like to do?')\n : 'Quick command mode (agent unavailable)';\n const allTools = [...completedTools, ...pendingTools];\n const showTools = allTools.length > 0;\n const showResponse = agentResponse && status !== 'idle';\n // Only show natural language suggestions when agent is available\n const showSuggestions = agentAvailable && !query && status === 'idle' && suggestions.length > 0;\n // Show quick command help when in quick-command mode OR when agent is unavailable\n const showQuickCommandHelp = (mode === 'quick-command' || !agentAvailable) && status === 'idle';\n const showAgentUnavailable = !agentAvailable && mode !== 'quick-command' && status === 'idle';\n\n return (\n <>\n {/* Backdrop (invisible, just for click-outside handling) */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999,\n }}\n onClick={close}\n />\n\n {/* Command Palette Container */}\n <div\n ref={containerRef}\n className={config?.className}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n maxHeight: '50vh',\n backgroundColor: theme.colors.background,\n borderTop: `1px solid ${theme.colors.border}`,\n boxShadow: theme.shadows[2],\n zIndex: 1000,\n display: 'flex',\n flexDirection: 'column-reverse',\n overflow: 'hidden',\n transform: isVisible ? 'translateY(0)' : 'translateY(100%)',\n transition: 'transform 150ms ease-out',\n ...config?.style,\n }}\n >\n {/* Input Section (at bottom due to column-reverse) */}\n <div>\n <AgentCommandInput\n value={query}\n onChange={setQuery}\n onSubmit={submit}\n onClose={close}\n onHistoryPrevious={historyPrevious}\n onHistoryNext={historyNext}\n mode={mode}\n status={status}\n placeholder={placeholder}\n agentAvailable={agentAvailable}\n showAutocomplete={showAutocomplete}\n onAutocompleteNext={autocompleteNext}\n onAutocompletePrevious={autocompletePrevious}\n onAutocompleteAccept={autocompleteAccept}\n />\n\n {/* Footer with keyboard hints */}\n <div\n style={{\n padding: '8px 16px',\n borderTop: `1px solid ${theme.colors.border}`,\n display: 'flex',\n gap: '16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.background,\n }}\n >\n <span>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n Enter\n </kbd>{' '}\n Execute\n </span>\n <span>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n Esc\n </kbd>{' '}\n Close\n </span>\n <span>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n ↑↓\n </kbd>{' '}\n History\n </span>\n <span style={{ marginLeft: 'auto' }}>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n /\n </kbd>{' '}\n Quick command\n </span>\n </div>\n </div>\n\n {/* Content Section (appears above input due to column-reverse) */}\n <div style={{ overflow: 'auto' }}>\n {/* Tool Execution List */}\n {showTools && (\n <ToolExecutionList tools={allTools} compact={allTools.length > 3} />\n )}\n\n {/* Agent Response */}\n {showResponse && (\n <AgentResponseDisplay\n response={agentResponse}\n streaming={status === 'thinking'}\n />\n )}\n\n {/* Suggestions (when idle and no query) */}\n {showSuggestions && (\n <div\n style={{\n padding: '12px 16px',\n display: 'flex',\n gap: '8px',\n flexWrap: 'wrap',\n }}\n >\n <span\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSizes[0],\n marginRight: '4px',\n }}\n >\n Try:\n </span>\n {suggestions.map((suggestion, index) => (\n <button\n key={index}\n onClick={() => {\n setQuery(suggestion);\n }}\n style={{\n padding: '4px 10px',\n backgroundColor: theme.colors.backgroundSecondary,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: '12px',\n color: theme.colors.textSecondary,\n fontSize: theme.fontSizes[0],\n cursor: 'pointer',\n transition: 'background-color 150ms ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundTertiary;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundSecondary;\n }}\n >\n \"{suggestion}\"\n </button>\n ))}\n </div>\n )}\n\n {/* Agent Unavailable Notice */}\n {showAgentUnavailable && (\n <div\n style={{\n padding: '12px 16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.warning,\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}\n >\n <span>Agent unavailable.</span>\n <span style={{ color: theme.colors.textMuted }}>\n Use quick commands (start with <kbd style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}>/</kbd>)\n </span>\n </div>\n )}\n\n {/* Quick Command Help */}\n {showQuickCommandHelp && (\n <div\n style={{\n padding: '12px 16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n fontFamily: theme.fonts.monospace,\n }}\n >\n <div style={{ marginBottom: '8px', color: theme.colors.textSecondary }}>\n Quick commands:\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <div>\n <span style={{ color: theme.colors.info }}>/toggle</span>{' '}\n <span style={{ color: theme.colors.textMuted }}><left|right></span>{' '}\n - Toggle sidebar visibility\n </div>\n <div>\n <span style={{ color: theme.colors.info }}>/switch</span>{' '}\n <span style={{ color: theme.colors.textMuted }}><slot> <panel></span>{' '}\n - Switch panel content\n </div>\n <div>\n <span style={{ color: theme.colors.info }}>/collapse</span>{' '}\n - Collapse all sidebars\n </div>\n <div>\n <span style={{ color: theme.colors.info }}>/expand</span>{' '}\n - Expand all sidebars\n </div>\n </div>\n </div>\n )}\n\n {/* Quick Command Autocomplete */}\n {showAutocomplete && (\n <QuickCommandAutocomplete\n matches={quickCommandMatches}\n argumentMatches={argumentOptionMatches}\n currentArg={currentArgDef}\n isEnteringArgs={parsedQuery.isEnteringArgs}\n selectedIndex={selectedAutocompleteIndex}\n onSelect={(index) => {\n // Handle argument option click\n if (parsedQuery.isEnteringArgs) {\n const match = argumentOptionMatches[index];\n if (match) {\n let newQuery = `/${parsedQuery.commandName}`;\n for (const arg of parsedQuery.enteredArgs) {\n newQuery += ` ${arg}`;\n }\n newQuery += ` ${match.option}`;\n const nextArgIndex = parsedQuery.currentArgIndex + 1;\n const hasMoreArgs = parsedQuery.command?.args && nextArgIndex < parsedQuery.command.args.length;\n if (hasMoreArgs) {\n newQuery += ' ';\n }\n setQuery(newQuery);\n }\n return;\n }\n // Handle command click\n const match = quickCommandMatches[index];\n if (match) {\n const command = match.command;\n let newQuery = `/${command.name}`;\n if (command.args && command.args.length > 0) {\n newQuery += ' ';\n }\n setQuery(newQuery);\n }\n }}\n />\n )}\n </div>\n </div>\n\n {/* CSS animations */}\n <style>\n {`\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n `}\n </style>\n </>\n );\n};\n\nAgentCommandPalette.displayName = 'AgentCommandPalette';\n","import type { QuickCommand, QuickCommandMatch, ArgumentOptionMatch, ParsedCommandQuery } from '../types';\n\n/**\n * Fuzzy match a query against a target string.\n * Returns score and matched indices, or null if no match.\n */\nexport function fuzzyMatch(\n query: string,\n target: string\n): { score: number; matchedIndices: number[] } | null {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Empty query matches everything with low score\n if (!queryLower) {\n return { score: 0, matchedIndices: [] };\n }\n\n const matchedIndices: number[] = [];\n let queryIndex = 0;\n let score = 0;\n let consecutiveMatches = 0;\n let lastMatchIndex = -1;\n\n for (let i = 0; i < targetLower.length && queryIndex < queryLower.length; i++) {\n if (targetLower[i] === queryLower[queryIndex]) {\n matchedIndices.push(i);\n\n // Bonus for consecutive matches\n if (lastMatchIndex === i - 1) {\n consecutiveMatches++;\n score += consecutiveMatches * 2;\n } else {\n consecutiveMatches = 1;\n }\n\n // Bonus for matching at start\n if (i === 0) {\n score += 10;\n }\n\n // Bonus for matching after separator (_, -, space)\n if (i > 0 && /[_\\-\\s]/.test(target[i - 1])) {\n score += 5;\n }\n\n // Base score for match\n score += 1;\n\n lastMatchIndex = i;\n queryIndex++;\n }\n }\n\n // Must match all query characters\n if (queryIndex < queryLower.length) {\n return null;\n }\n\n // Penalty for longer targets (prefer shorter, more specific matches)\n score -= target.length * 0.1;\n\n // Bonus for exact match\n if (queryLower === targetLower) {\n score += 20;\n }\n\n // Bonus for prefix match\n if (targetLower.startsWith(queryLower)) {\n score += 15;\n }\n\n return { score, matchedIndices };\n}\n\n/**\n * Search quick commands using fuzzy matching.\n * Returns sorted matches with scores.\n */\nexport function searchQuickCommands(\n query: string,\n commands: QuickCommand[],\n maxResults: number = 10\n): QuickCommandMatch[] {\n // Remove leading slash if present\n const searchQuery = query.replace(/^\\//, '').trim();\n\n if (!searchQuery) {\n // Return all commands with base score when no query\n return commands.slice(0, maxResults).map((command) => ({\n command,\n score: 0,\n matchedIndices: [],\n matchedOn: command.name,\n }));\n }\n\n const matches: QuickCommandMatch[] = [];\n\n for (const command of commands) {\n // Try matching against name\n const nameMatch = fuzzyMatch(searchQuery, command.name);\n if (nameMatch) {\n matches.push({\n command,\n score: nameMatch.score,\n matchedIndices: nameMatch.matchedIndices,\n matchedOn: command.name,\n });\n continue;\n }\n\n // Try matching against aliases\n if (command.aliases) {\n for (const alias of command.aliases) {\n const aliasMatch = fuzzyMatch(searchQuery, alias);\n if (aliasMatch) {\n matches.push({\n command,\n score: aliasMatch.score - 2, // Slight penalty for alias match\n matchedIndices: aliasMatch.matchedIndices,\n matchedOn: alias,\n });\n break;\n }\n }\n }\n }\n\n // Sort by score (descending) and limit results\n return matches\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n\n/**\n * Parse a command query to determine command and argument state.\n * Examples:\n * \"/tog\" -> { commandName: \"tog\", isEnteringArgs: false, ... }\n * \"/toggle \" -> { commandName: \"toggle\", isEnteringArgs: true, currentArgIndex: 0, ... }\n * \"/toggle left\" -> { commandName: \"toggle\", isEnteringArgs: true, currentArgIndex: 0, currentArgValue: \"left\", ... }\n * \"/toggle left \" -> { commandName: \"toggle\", isEnteringArgs: true, currentArgIndex: 1, enteredArgs: [\"left\"], ... }\n */\nexport function parseCommandQuery(\n query: string,\n commands: QuickCommand[]\n): ParsedCommandQuery {\n // Remove leading slash\n const withoutSlash = query.replace(/^\\//, '');\n\n // Split by whitespace\n const parts = withoutSlash.split(/\\s+/);\n const commandName = parts[0] || '';\n\n // Check if query ends with space (user finished typing current token)\n const endsWithSpace = query.endsWith(' ') && query.trim().length > 0;\n\n // Find matching command (exact match on name or alias)\n const command = commands.find(\n (cmd) =>\n cmd.name.toLowerCase() === commandName.toLowerCase() ||\n cmd.aliases?.some((a) => a.toLowerCase() === commandName.toLowerCase())\n ) || null;\n\n // If no exact command match, we're still typing the command name\n if (!command) {\n return {\n commandName,\n command: null,\n enteredArgs: [],\n currentArgValue: '',\n currentArgIndex: -1,\n isEnteringArgs: false,\n };\n }\n\n // We have a command match - determine argument state\n const argTokens = parts.slice(1);\n\n // If ends with space, we've completed the current token\n if (endsWithSpace) {\n return {\n commandName: command.name,\n command,\n enteredArgs: argTokens,\n currentArgValue: '',\n currentArgIndex: argTokens.length,\n isEnteringArgs: true,\n };\n }\n\n // If we have arg tokens, the last one is partial\n if (argTokens.length > 0) {\n const enteredArgs = argTokens.slice(0, -1);\n const currentArgValue = argTokens[argTokens.length - 1];\n return {\n commandName: command.name,\n command,\n enteredArgs,\n currentArgValue,\n currentArgIndex: enteredArgs.length,\n isEnteringArgs: true,\n };\n }\n\n // Command typed but no space yet - not in arg mode\n return {\n commandName: command.name,\n command,\n enteredArgs: [],\n currentArgValue: '',\n currentArgIndex: -1,\n isEnteringArgs: false,\n };\n}\n\n/**\n * Search argument options using fuzzy matching.\n * Returns sorted matches with scores.\n */\nexport function searchArgumentOptions(\n query: string,\n options: string[],\n maxResults: number = 10\n): ArgumentOptionMatch[] {\n if (!options.length) {\n return [];\n }\n\n // Empty query returns all options\n if (!query) {\n return options.slice(0, maxResults).map((option) => ({\n option,\n score: 0,\n matchedIndices: [],\n }));\n }\n\n const matches: ArgumentOptionMatch[] = [];\n\n for (const option of options) {\n const match = fuzzyMatch(query, option);\n if (match) {\n matches.push({\n option,\n score: match.score,\n matchedIndices: match.matchedIndices,\n });\n }\n }\n\n return matches\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport type {\n AgentCommandPaletteMode,\n AgentCommandPaletteStatus,\n ToolExecution,\n CommandHistoryEntry,\n UseAgentCommandPaletteOptions,\n UseAgentCommandPaletteReturn,\n QuickCommandMatch,\n ArgumentOptionMatch,\n ParsedCommandQuery,\n} from '../types';\nimport { searchQuickCommands, parseCommandQuery, searchArgumentOptions } from '../utils';\n\nconst DEFAULT_SUGGESTIONS = [\n 'hide sidebars',\n 'show terminal',\n 'focus editor',\n];\n\n/**\n * Hook for managing Agent Command Palette state and behavior\n * Handles input, history navigation, tool execution tracking, and keyboard shortcuts\n */\nexport function useAgentCommandPalette({\n events,\n keyboard = { key: 'p', altKey: true },\n config = {},\n onExecuteTool,\n initialSuggestions = DEFAULT_SUGGESTIONS,\n agentAvailable = true,\n quickCommands = [],\n}: UseAgentCommandPaletteOptions = {}): UseAgentCommandPaletteReturn {\n // Visibility state\n const [isOpen, setIsOpen] = useState(false);\n\n // Input state\n const [query, setQueryState] = useState('');\n const [mode, setMode] = useState<AgentCommandPaletteMode>('natural');\n\n // Execution state\n const [status, setStatus] = useState<AgentCommandPaletteStatus>('idle');\n const [pendingTools, setPendingTools] = useState<ToolExecution[]>([]);\n const [completedTools, setCompletedTools] = useState<ToolExecution[]>([]);\n const [agentResponse, setAgentResponse] = useState('');\n\n // History state\n const [history, setHistory] = useState<CommandHistoryEntry[]>([]);\n const [historyIndex, setHistoryIndex] = useState(-1);\n\n // Suggestions\n const suggestions = useMemo(() => initialSuggestions, [initialSuggestions]);\n\n // Autocomplete state\n const [selectedAutocompleteIndex, setSelectedAutocompleteIndex] = useState(-1);\n\n // Parse the current query to determine command and argument state\n const parsedQuery = useMemo<ParsedCommandQuery>(() => {\n if (mode !== 'quick-command' || !quickCommands.length) {\n return {\n commandName: '',\n command: null,\n enteredArgs: [],\n currentArgValue: '',\n currentArgIndex: -1,\n isEnteringArgs: false,\n };\n }\n return parseCommandQuery(query, quickCommands);\n }, [query, mode, quickCommands]);\n\n // Compute quick command matches based on query (only when not entering args)\n const quickCommandMatches = useMemo<QuickCommandMatch[]>(() => {\n if (mode !== 'quick-command' || !quickCommands.length || parsedQuery.isEnteringArgs) {\n return [];\n }\n return searchQuickCommands(query, quickCommands);\n }, [query, mode, quickCommands, parsedQuery.isEnteringArgs]);\n\n // Compute argument option matches when entering args\n const argumentOptionMatches = useMemo<ArgumentOptionMatch[]>(() => {\n if (!parsedQuery.isEnteringArgs || !parsedQuery.command?.args) {\n return [];\n }\n\n const currentArg = parsedQuery.command.args[parsedQuery.currentArgIndex];\n if (!currentArg?.options) {\n return [];\n }\n\n return searchArgumentOptions(parsedQuery.currentArgValue, currentArg.options);\n }, [parsedQuery]);\n\n // Get the current argument definition (for display purposes)\n const currentArgDef = useMemo(() => {\n if (!parsedQuery.isEnteringArgs || !parsedQuery.command?.args) {\n return null;\n }\n return parsedQuery.command.args[parsedQuery.currentArgIndex] || null;\n }, [parsedQuery]);\n\n // Determine if autocomplete should be shown\n const showAutocomplete = useMemo(() => {\n if (mode !== 'quick-command' || status !== 'idle' || query.length === 0) {\n return false;\n }\n // Show command autocomplete OR argument autocomplete\n return quickCommandMatches.length > 0 || argumentOptionMatches.length > 0;\n }, [mode, status, query.length, quickCommandMatches.length, argumentOptionMatches.length]);\n\n // Total autocomplete items (commands or argument options)\n const autocompleteItemCount = useMemo(() => {\n return parsedQuery.isEnteringArgs ? argumentOptionMatches.length : quickCommandMatches.length;\n }, [parsedQuery.isEnteringArgs, argumentOptionMatches.length, quickCommandMatches.length]);\n\n // Reset autocomplete selection when matches change\n useEffect(() => {\n setSelectedAutocompleteIndex(autocompleteItemCount > 0 ? 0 : -1);\n }, [autocompleteItemCount]);\n\n // Detect mode based on query prefix\n const setQuery = useCallback((value: string) => {\n setQueryState(value);\n setMode(value.startsWith('/') ? 'quick-command' : 'natural');\n }, []);\n\n // Open the palette\n const open = useCallback(() => {\n setIsOpen(true);\n // Default to quick-command mode when agent is unavailable\n if (agentAvailable) {\n setQueryState('');\n setMode('natural');\n } else {\n setQueryState('/');\n setMode('quick-command');\n }\n setStatus('idle');\n setPendingTools([]);\n setCompletedTools([]);\n setAgentResponse('');\n setHistoryIndex(-1);\n\n events?.emit({\n type: 'agent-command-palette:opened',\n source: 'agent-command-palette',\n timestamp: Date.now(),\n payload: {},\n });\n }, [events, agentAvailable]);\n\n // Close the palette\n const close = useCallback(() => {\n setIsOpen(false);\n\n events?.emit({\n type: 'agent-command-palette:closed',\n source: 'agent-command-palette',\n timestamp: Date.now(),\n payload: {},\n });\n }, [events]);\n\n // Toggle the palette\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n // Clear current state without closing\n const clear = useCallback(() => {\n setQueryState('');\n setMode('natural');\n setStatus('idle');\n setPendingTools([]);\n setCompletedTools([]);\n setAgentResponse('');\n setHistoryIndex(-1);\n }, []);\n\n // Add a tool to pending list\n const addPendingTool = useCallback((tool: Omit<ToolExecution, 'status'>) => {\n const newTool: ToolExecution = {\n ...tool,\n status: 'pending',\n };\n setPendingTools((prev) => [...prev, newTool]);\n return newTool;\n }, []);\n\n // Update a tool's status\n const updateToolStatus = useCallback(\n (toolId: string, status: ToolExecution['status'], result?: string, error?: string) => {\n setPendingTools((prev) => {\n const tool = prev.find((t) => t.id === toolId);\n if (!tool) return prev;\n\n const updatedTool: ToolExecution = {\n ...tool,\n status,\n result,\n error,\n };\n\n // If completed (success or error), move to completedTools\n if (status === 'success' || status === 'error') {\n setCompletedTools((completed) => [...completed, updatedTool]);\n return prev.filter((t) => t.id !== toolId);\n }\n\n // Otherwise update in place\n return prev.map((t) => (t.id === toolId ? updatedTool : t));\n });\n },\n []\n );\n\n // Execute a quick command directly (bypasses agent)\n const executeQuickCommand = useCallback(\n async (command: string) => {\n // Parse quick command: /toggle left -> { name: 'toggle', args: ['left'] }\n const parts = command.replace(/^\\//, '').trim().split(/\\s+/);\n const toolName = parts[0];\n const toolArgs = parts.slice(1);\n\n if (!toolName) return;\n\n setStatus('executing');\n\n const toolId = `quick-${Date.now()}`;\n addPendingTool({\n id: toolId,\n name: toolName,\n args: { args: toolArgs },\n });\n\n updateToolStatus(toolId, 'running');\n\n try {\n if (onExecuteTool) {\n const result = await onExecuteTool(toolName, { args: toolArgs });\n updateToolStatus(toolId, 'success', String(result));\n } else {\n updateToolStatus(toolId, 'success', 'Tool executed (no handler)');\n }\n\n // Add to history\n setHistory((prev) => [\n {\n query: command,\n timestamp: Date.now(),\n toolsExecuted: [toolName],\n success: true,\n },\n ...prev.slice(0, (config.maxHistoryEntries || 50) - 1),\n ]);\n\n setStatus('complete');\n setAgentResponse(`Executed: ${toolName}`);\n\n // Auto-close after delay\n const delay = config.autoCloseDelay ?? 1000;\n if (delay > 0) {\n setTimeout(() => close(), delay);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n updateToolStatus(toolId, 'error', undefined, errorMessage);\n setStatus('error');\n setAgentResponse(`Error: ${errorMessage}`);\n }\n },\n [onExecuteTool, addPendingTool, updateToolStatus, config.autoCloseDelay, config.maxHistoryEntries, close]\n );\n\n // Submit the current query\n const submit = useCallback(() => {\n if (!query.trim()) return;\n\n if (mode === 'quick-command') {\n executeQuickCommand(query);\n return;\n }\n\n // If agent is unavailable, don't allow natural language submissions\n if (!agentAvailable) {\n setAgentResponse('Agent unavailable. Use quick commands (start with /).');\n setStatus('error');\n return;\n }\n\n // For natural language mode, we emit an event for the agent to handle\n // The actual agent integration will be done externally\n setStatus('thinking');\n\n events?.emit({\n type: 'agent-command-palette:submit',\n source: 'agent-command-palette',\n timestamp: Date.now(),\n payload: { query, mode },\n });\n\n // Add to history (will be updated with actual results by external handler)\n setHistory((prev) => [\n {\n query,\n timestamp: Date.now(),\n toolsExecuted: [],\n success: true,\n },\n ...prev.slice(0, (config.maxHistoryEntries || 50) - 1),\n ]);\n }, [query, mode, executeQuickCommand, events, config.maxHistoryEntries, agentAvailable]);\n\n // Navigate history - previous (up arrow)\n const historyPrevious = useCallback(() => {\n if (history.length === 0) return;\n\n const newIndex = historyIndex < history.length - 1 ? historyIndex + 1 : historyIndex;\n setHistoryIndex(newIndex);\n if (history[newIndex]) {\n setQueryState(history[newIndex].query);\n setMode(history[newIndex].query.startsWith('/') ? 'quick-command' : 'natural');\n }\n }, [history, historyIndex]);\n\n // Navigate history - next (down arrow)\n const historyNext = useCallback(() => {\n if (historyIndex <= 0) {\n setHistoryIndex(-1);\n setQueryState('');\n setMode('natural');\n return;\n }\n\n const newIndex = historyIndex - 1;\n setHistoryIndex(newIndex);\n if (history[newIndex]) {\n setQueryState(history[newIndex].query);\n setMode(history[newIndex].query.startsWith('/') ? 'quick-command' : 'natural');\n }\n }, [history, historyIndex]);\n\n // Handle keyboard shortcut to open palette (Alt+P)\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const {\n key = 'p',\n altKey = true,\n ctrlKey = false,\n metaKey = false,\n shiftKey = false,\n } = keyboard;\n\n // Check if modifiers match\n const modifiersMatch =\n e.altKey === altKey &&\n e.ctrlKey === ctrlKey &&\n e.metaKey === metaKey &&\n e.shiftKey === shiftKey;\n\n // Use e.code for letter keys when Alt is pressed (Mac produces special chars with Alt+letter)\n // e.code gives us \"KeyP\" for the P key regardless of modifiers\n const keyMatches = altKey\n ? e.code === `Key${key.toUpperCase()}`\n : e.key.toLowerCase() === key.toLowerCase();\n\n if (keyMatches && modifiersMatch) {\n // Don't trigger if user is typing in an input field (unless it's our own)\n const target = e.target as HTMLElement;\n const isOurInput = target.closest('[data-agent-command-palette-input]');\n\n if (\n !isOurInput &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.isContentEditable)\n ) {\n return;\n }\n\n e.preventDefault();\n toggle();\n }\n },\n [keyboard, toggle]\n );\n\n // Register keyboard shortcut\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n // Autocomplete navigation\n const autocompleteNext = useCallback(() => {\n if (!showAutocomplete) return;\n setSelectedAutocompleteIndex((prev) =>\n prev < autocompleteItemCount - 1 ? prev + 1 : 0\n );\n }, [showAutocomplete, autocompleteItemCount]);\n\n const autocompletePrevious = useCallback(() => {\n if (!showAutocomplete) return;\n setSelectedAutocompleteIndex((prev) =>\n prev > 0 ? prev - 1 : autocompleteItemCount - 1\n );\n }, [showAutocomplete, autocompleteItemCount]);\n\n const autocompleteAccept = useCallback(() => {\n if (!showAutocomplete || selectedAutocompleteIndex < 0) return;\n\n // Handle argument option selection\n if (parsedQuery.isEnteringArgs) {\n const match = argumentOptionMatches[selectedAutocompleteIndex];\n if (!match) return;\n\n // Build new query: command + previous args + selected option\n let newQuery = `/${parsedQuery.commandName}`;\n for (const arg of parsedQuery.enteredArgs) {\n newQuery += ` ${arg}`;\n }\n newQuery += ` ${match.option}`;\n\n // Check if there are more args to enter\n const nextArgIndex = parsedQuery.currentArgIndex + 1;\n const hasMoreArgs = parsedQuery.command?.args && nextArgIndex < parsedQuery.command.args.length;\n if (hasMoreArgs) {\n newQuery += ' ';\n }\n\n setQueryState(newQuery);\n setSelectedAutocompleteIndex(-1);\n return;\n }\n\n // Handle command selection\n const match = quickCommandMatches[selectedAutocompleteIndex];\n if (!match) return;\n\n // Build the command string with the command name\n const command = match.command;\n let newQuery = `/${command.name}`;\n\n // If command has args, add a space to prompt user to enter args\n if (command.args && command.args.length > 0) {\n newQuery += ' ';\n }\n\n setQueryState(newQuery);\n setSelectedAutocompleteIndex(-1);\n }, [showAutocomplete, selectedAutocompleteIndex, parsedQuery, argumentOptionMatches, quickCommandMatches]);\n\n return {\n // Agent availability\n agentAvailable,\n\n // Visibility\n isOpen,\n open,\n close,\n toggle,\n\n // Input\n query,\n setQuery,\n mode,\n\n // Execution\n status,\n setStatus,\n pendingTools,\n completedTools,\n agentResponse,\n setAgentResponse,\n submit,\n executeQuickCommand,\n\n // Tool management (for external AI integration)\n addPendingTool,\n updateToolStatus,\n\n // History\n history,\n historyPrevious,\n historyNext,\n\n // Suggestions\n suggestions,\n\n // Actions\n clear,\n\n // Quick command autocomplete\n quickCommandMatches,\n argumentOptionMatches,\n parsedQuery,\n currentArgDef,\n selectedAutocompleteIndex,\n autocompleteNext,\n autocompletePrevious,\n autocompleteAccept,\n showAutocomplete,\n };\n}\n","/**\n * Layout Tools\n *\n * UTCP-compatible tools for panel layout operations.\n * These tools emit events that the layout system listens for.\n *\n * These are generic layout operations that any app using panel-layouts can use.\n * App-specific tools (like file operations) should be defined in the app.\n */\n\nimport type {\n PanelTool,\n PanelEventCallTemplate,\n} from '@principal-ade/panel-framework-core';\n\n// ============================================================================\n// State Query Tools\n// ============================================================================\n\n/**\n * Tool: Get Visible Panels\n *\n * Query which panels are currently visible and their state.\n * Returns layout slot info including collapsed state and active panel IDs.\n */\nconst getVisiblePanelsTool: PanelTool = {\n name: 'get_visible_panels',\n description:\n 'Get the current visibility state of all panel slots (left, middle, right). Returns which panels are active in each slot and whether side panels are collapsed.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n left: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description: 'The ID of the panel in the left slot',\n },\n collapsed: {\n type: 'boolean',\n description: 'Whether the left panel is collapsed',\n },\n size: {\n type: 'number',\n description: 'Width percentage of the left panel',\n },\n },\n },\n middle: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description: 'The ID of the panel in the middle slot',\n },\n size: {\n type: 'number',\n description: 'Width percentage of the middle panel',\n },\n },\n },\n right: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description: 'The ID of the panel in the right slot',\n },\n collapsed: {\n type: 'boolean',\n description: 'Whether the right panel is collapsed',\n },\n size: {\n type: 'number',\n description: 'Width percentage of the right panel',\n },\n },\n },\n workspaceId: {\n type: 'string',\n description: 'The ID of the currently active workspace layout',\n },\n },\n },\n tags: ['panel', 'layout', 'visibility', 'state', 'query'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:get-visibility',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Get Panel State\n *\n * Query the current state of a specific panel.\n * Panels must implement a getState function to support this.\n */\nconst getPanelStateTool: PanelTool = {\n name: 'get_panel_state',\n description:\n 'Get the current state of a specific panel. Returns panel-specific state data if the panel supports state queries.',\n inputs: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description:\n 'The ID of the panel to query state from (e.g., \"file-tree\", \"terminal\")',\n },\n },\n required: ['panelId'],\n },\n outputs: {\n type: 'object',\n properties: {\n panelId: { type: 'string', description: 'The queried panel ID' },\n hasState: {\n type: 'boolean',\n description: 'Whether the panel supports state queries',\n },\n state: {\n type: 'object',\n description: 'The panel state (shape depends on the panel)',\n },\n },\n },\n tags: ['panel', 'state', 'query'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:get-state',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: List Panels With State\n *\n * Get a list of all panels that support state queries.\n */\nconst listPanelsWithStateTool: PanelTool = {\n name: 'list_panels_with_state',\n description:\n 'Get a list of all panels that support state queries. Use this to discover which panels can be queried with get_panel_state.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n panels: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n panelId: { type: 'string', description: 'The panel ID' },\n name: { type: 'string', description: 'The panel display name' },\n description: {\n type: 'string',\n description: 'Description of the state this panel provides',\n },\n },\n },\n description: 'List of panels that support state queries',\n },\n },\n },\n tags: ['panel', 'state', 'query', 'discovery'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:list-state-panels',\n } as PanelEventCallTemplate,\n};\n\n// ============================================================================\n// Layout Action Tools\n// ============================================================================\n\n/**\n * Tool: Toggle Panel\n *\n * Collapse or expand a side panel (left or right).\n */\nconst togglePanelTool: PanelTool = {\n name: 'toggle_panel',\n description: 'Collapse or expand a side panel to give more space to the main content area.',\n inputs: {\n type: 'object',\n properties: {\n panel: {\n type: 'string',\n enum: ['left', 'right'],\n description: 'Which panel to toggle: \"left\" or \"right\"',\n },\n },\n required: ['panel'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n panel: { type: 'string' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'toggle', 'collapse', 'expand', 'sidebar'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:toggle',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Collapse All Panels\n *\n * Collapse both left and right panels to maximize the main content area.\n */\nconst collapseAllPanelsTool: PanelTool = {\n name: 'collapse_all_panels',\n description: 'Collapse both left and right panels to maximize the main content area. Useful for focus mode.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'collapse', 'focus', 'maximize'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:collapse-all',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Expand All Panels\n *\n * Expand both left and right panels to show all content.\n */\nconst expandAllPanelsTool: PanelTool = {\n name: 'expand_all_panels',\n description: 'Expand both left and right panels to show all content. Restores the default layout.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'expand', 'restore', 'show'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:expand-all',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Switch Panel\n *\n * Change which content is displayed in a panel slot.\n * The available panels depend on the application.\n */\nconst switchPanelTool: PanelTool = {\n name: 'switch_panel',\n description: 'Change which content is displayed in a panel slot (left, middle, or right).',\n inputs: {\n type: 'object',\n properties: {\n slot: {\n type: 'string',\n enum: ['left', 'middle', 'right'],\n description: 'Which slot to change: \"left\", \"middle\", or \"right\"',\n },\n panel: {\n type: 'string',\n description: 'The panel ID to display in the slot',\n },\n },\n required: ['slot', 'panel'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n slot: { type: 'string' },\n panel: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'switch', 'navigation', 'view'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:switch',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Focus Panel\n *\n * Set keyboard/logical focus to a specific panel slot.\n */\nconst focusPanelTool: PanelTool = {\n name: 'focus_panel',\n description: 'Set focus to a specific panel slot for keyboard navigation.',\n inputs: {\n type: 'object',\n properties: {\n slot: {\n type: 'string',\n enum: ['left', 'middle', 'right'],\n description: 'Which slot to focus: \"left\", \"middle\", or \"right\"',\n },\n },\n required: ['slot'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n slot: { type: 'string' },\n },\n },\n tags: ['panel', 'focus', 'navigation', 'keyboard'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:focus',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Reset Layout\n *\n * Reset panel sizes to the default layout.\n */\nconst resetLayoutTool: PanelTool = {\n name: 'reset_layout',\n description: 'Reset panel sizes to the default layout configuration.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'reset', 'default', 'restore'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:reset-layout',\n } as PanelEventCallTemplate,\n};\n\n/**\n * All layout tools exported as an array.\n *\n * Register these with PanelToolRegistry:\n * ```typescript\n * import { layoutTools } from '@principal-ade/panel-layouts';\n * import { getGlobalToolRegistry } from '@principal-ade/panel-framework-core';\n *\n * const registry = getGlobalToolRegistry();\n * registry.registerPanelTools({\n * id: 'panel-layouts',\n * name: 'Panel Layouts',\n * tools: layoutTools,\n * });\n * ```\n */\nexport const layoutTools: PanelTool[] = [\n // State query tools\n getVisiblePanelsTool,\n getPanelStateTool,\n listPanelsWithStateTool,\n // Layout action tools\n togglePanelTool,\n collapseAllPanelsTool,\n expandAllPanelsTool,\n switchPanelTool,\n focusPanelTool,\n resetLayoutTool,\n];\n\n/**\n * State query tools only (for selective registration).\n */\nexport const stateQueryTools: PanelTool[] = [\n getVisiblePanelsTool,\n getPanelStateTool,\n listPanelsWithStateTool,\n];\n\n/**\n * Layout action tools only (for selective registration).\n */\nexport const layoutActionTools: PanelTool[] = [\n togglePanelTool,\n collapseAllPanelsTool,\n expandAllPanelsTool,\n switchPanelTool,\n focusPanelTool,\n resetLayoutTool,\n];\n\n/**\n * Individual tool exports for selective use.\n */\nexport {\n // State query tools\n getVisiblePanelsTool,\n getPanelStateTool,\n listPanelsWithStateTool,\n // Layout action tools\n togglePanelTool,\n collapseAllPanelsTool,\n expandAllPanelsTool,\n switchPanelTool,\n focusPanelTool,\n resetLayoutTool,\n};\n\n/**\n * Layout tools metadata for registration.\n *\n * Use this with PanelToolRegistry.registerPanelTools():\n * ```typescript\n * registry.registerPanelTools(layoutToolsMetadata);\n * ```\n */\nexport const layoutToolsMetadata = {\n id: 'panel-layouts',\n name: 'Panel Layouts',\n description: 'Generic panel layout and state query operations',\n tools: layoutTools,\n};\n","/**\n * AI Provider Format Converters\n *\n * Utilities to convert UTCP tools to various AI provider formats\n * (Gemini, OpenAI, Anthropic, etc.)\n */\n\nimport type {\n PanelTool,\n JsonSchema,\n AIFunctionDefinition,\n} from '@principal-ade/panel-framework-core';\n\n// ============================================================================\n// Gemini Format\n// ============================================================================\n\n/**\n * Gemini function declaration format\n */\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, GeminiPropertySchema>;\n required: string[];\n };\n}\n\n/**\n * Gemini property schema (simplified)\n */\nexport interface GeminiPropertySchema {\n type: string;\n description?: string;\n enum?: string[];\n}\n\n/**\n * Gemini tools wrapper\n */\nexport interface GeminiTools {\n functionDeclarations: GeminiFunctionDeclaration[];\n}\n\n/**\n * Convert a PanelTool to Gemini function declaration format.\n */\nexport function toolToGeminiFunction(tool: PanelTool): GeminiFunctionDeclaration {\n const properties: Record<string, GeminiPropertySchema> = {};\n\n if (tool.inputs.properties) {\n for (const [key, schema] of Object.entries(tool.inputs.properties)) {\n const propSchema = schema as JsonSchema;\n properties[key] = {\n type: propSchema.type as string || 'string',\n description: propSchema.description,\n ...(propSchema.enum && { enum: propSchema.enum as string[] }),\n };\n }\n }\n\n return {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties,\n required: tool.inputs.required || [],\n },\n };\n}\n\n/**\n * Convert an array of PanelTools to Gemini tools format.\n */\nexport function toolsToGeminiFormat(tools: PanelTool[]): GeminiTools {\n return {\n functionDeclarations: tools.map(toolToGeminiFunction),\n };\n}\n\n// ============================================================================\n// OpenAI Format\n// ============================================================================\n\n/**\n * OpenAI function definition format\n */\nexport interface OpenAIFunction {\n name: string;\n description: string;\n parameters: JsonSchema;\n}\n\n/**\n * OpenAI tool wrapper\n */\nexport interface OpenAITool {\n type: 'function';\n function: OpenAIFunction;\n}\n\n/**\n * Convert a PanelTool to OpenAI function format.\n */\nexport function toolToOpenAIFunction(tool: PanelTool): OpenAITool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputs,\n },\n };\n}\n\n/**\n * Convert an array of PanelTools to OpenAI tools format.\n */\nexport function toolsToOpenAIFormat(tools: PanelTool[]): OpenAITool[] {\n return tools.map(toolToOpenAIFunction);\n}\n\n// ============================================================================\n// Anthropic Format\n// ============================================================================\n\n/**\n * Anthropic tool definition format\n */\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: JsonSchema;\n}\n\n/**\n * Convert a PanelTool to Anthropic tool format.\n */\nexport function toolToAnthropicFormat(tool: PanelTool): AnthropicTool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputs,\n };\n}\n\n/**\n * Convert an array of PanelTools to Anthropic tools format.\n */\nexport function toolsToAnthropicFormat(tools: PanelTool[]): AnthropicTool[] {\n return tools.map(toolToAnthropicFormat);\n}\n\n// ============================================================================\n// Generic AI Function Format (compatible with PanelToolRegistry)\n// ============================================================================\n\n/**\n * Convert a PanelTool to the generic AIFunctionDefinition format.\n * This is the format used by PanelToolRegistry.getToolsAsAIFunctions()\n */\nexport function toolToAIFunction(tool: PanelTool): AIFunctionDefinition {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputs,\n };\n}\n\n/**\n * Convert an array of PanelTools to AIFunctionDefinition format.\n */\nexport function toolsToAIFunctions(tools: PanelTool[]): AIFunctionDefinition[] {\n return tools.map(toolToAIFunction);\n}\n\n// ============================================================================\n// System Prompt Generation\n// ============================================================================\n\n/**\n * Generate a system prompt section describing available tools.\n *\n * @param tools - Array of tools to describe\n * @param options - Formatting options\n */\nexport function generateToolsSystemPrompt(\n tools: PanelTool[],\n options: {\n header?: string;\n includeParameters?: boolean;\n } = {}\n): string {\n const {\n header = 'You have access to the following tools:',\n includeParameters = true,\n } = options;\n\n const toolDescriptions = tools.map((tool) => {\n let desc = `- ${tool.name}: ${tool.description}`;\n\n if (includeParameters && tool.inputs.properties) {\n const params = Object.entries(tool.inputs.properties)\n .map(([name, schema]) => {\n const s = schema as JsonSchema;\n const required = tool.inputs.required?.includes(name) ? ' (required)' : '';\n return ` - ${name}: ${s.description || s.type}${required}`;\n })\n .join('\\n');\n\n if (params) {\n desc += `\\n${params}`;\n }\n }\n\n return desc;\n });\n\n return `${header}\\n\\n${toolDescriptions.join('\\n\\n')}`;\n}\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\n/**\n * SVG icons for panel collapse/expand buttons\n * Using inline SVGs to avoid lucide-react dependency\n */\nconst PanelLeftIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n);\n\nconst PanelLeftCloseIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"m16 15-3-3 3-3\" />\n </svg>\n);\n\nconst PanelRightIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M15 3v18\" />\n </svg>\n);\n\nconst PanelRightCloseIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M15 3v18\" />\n <path d=\"m8 9 3 3-3 3\" />\n </svg>\n);\n\nexport interface PanelCollapseButtonProps {\n /** Whether the panel is currently collapsed */\n isCollapsed: boolean;\n /** Callback when the button is clicked */\n onToggle: () => void;\n /** Which side the panel is on */\n side?: 'left' | 'right';\n /** Icon size in pixels */\n iconSize?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Keyboard shortcut hint to show in tooltip */\n shortcutHint?: string;\n /** Custom title/tooltip */\n title?: string;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * A button component for collapsing/expanding side panels.\n *\n * Shows appropriate icon based on panel state and side:\n * - Left panel collapsed: PanelLeft icon (show panel)\n * - Left panel expanded: PanelLeftClose icon (hide panel)\n * - Right panel collapsed: PanelRight icon (show panel)\n * - Right panel expanded: PanelRightClose icon (hide panel)\n */\nexport const PanelCollapseButton: React.FC<PanelCollapseButtonProps> = ({\n isCollapsed,\n onToggle,\n side = 'left',\n iconSize = 18,\n style,\n shortcutHint = 'Cmd/Ctrl+B',\n title,\n className,\n}) => {\n const { theme } = useTheme();\n\n const getIcon = () => {\n if (side === 'right') {\n return isCollapsed ? (\n <PanelRightIcon size={iconSize} />\n ) : (\n <PanelRightCloseIcon size={iconSize} />\n );\n }\n return isCollapsed ? (\n <PanelLeftIcon size={iconSize} />\n ) : (\n <PanelLeftCloseIcon size={iconSize} />\n );\n };\n\n const getDefaultTitle = () => {\n const action = isCollapsed ? 'Show' : 'Hide';\n const sideLabel = side === 'right' ? 'Right Panel' : 'Sidebar';\n return `${action} ${sideLabel}${shortcutHint ? ` (${shortcutHint})` : ''}`;\n };\n\n return (\n <button\n onClick={onToggle}\n title={title ?? getDefaultTitle()}\n className={className}\n style={{\n background: 'transparent',\n border: 'none',\n color: isCollapsed ? theme.colors.textSecondary : theme.colors.primary,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n width: '32px',\n height: '32px',\n ...style,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;\n e.currentTarget.style.color = theme.colors.primary;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = isCollapsed\n ? theme.colors.textSecondary\n : theme.colors.primary;\n }}\n >\n {getIcon()}\n </button>\n );\n};\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\n/**\n * SVG icons for panel switch buttons\n */\nconst ArrowLeftRightIcon: React.FC<{ size?: number }> = ({ size = 14 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 3 4 7l4 4\" />\n <path d=\"M4 7h16\" />\n <path d=\"m16 21 4-4-4-4\" />\n <path d=\"M20 17H4\" />\n </svg>\n);\n\nconst ArrowRightLeftIcon: React.FC<{ size?: number }> = ({ size = 14 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m16 3 4 4-4 4\" />\n <path d=\"M20 7H4\" />\n <path d=\"m8 21-4-4 4-4\" />\n <path d=\"M4 17h16\" />\n </svg>\n);\n\nexport interface PanelSwitchButtonProps {\n /** Callback when the button is clicked */\n onSwitch: () => void;\n /** Which panels are being switched */\n variant?: 'left-middle' | 'right-middle';\n /** Icon size in pixels */\n iconSize?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom title/tooltip */\n title?: string;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * A button component for switching/swapping panel positions.\n *\n * - left-middle: Shows ArrowLeftRight icon for swapping left and middle panels\n * - right-middle: Shows ArrowRightLeft icon for swapping right and middle panels\n */\nexport const PanelSwitchButton: React.FC<PanelSwitchButtonProps> = ({\n onSwitch,\n variant = 'left-middle',\n iconSize = 14,\n style,\n title,\n className,\n}) => {\n const { theme } = useTheme();\n\n const getDefaultTitle = () => {\n return variant === 'left-middle'\n ? 'Switch left and middle panels'\n : 'Switch right and middle panels';\n };\n\n const Icon = variant === 'left-middle' ? ArrowLeftRightIcon : ArrowRightLeftIcon;\n\n return (\n <button\n onClick={onSwitch}\n title={title ?? getDefaultTitle()}\n className={className}\n style={{\n background: 'transparent',\n border: 'none',\n color: theme.colors.textSecondary,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n width: '32px',\n height: '32px',\n ...style,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;\n e.currentTarget.style.color = theme.colors.text;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = theme.colors.textSecondary;\n }}\n >\n <Icon size={iconSize} />\n </button>\n );\n};\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\n/**\n * Layout icon for panel configuration\n */\nconst LayoutIcon: React.FC<{ size?: number }> = ({ size = 14 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 21V9\" />\n </svg>\n);\n\nexport interface PanelConfigureButtonProps {\n /** Callback when the button is clicked */\n onConfigure: () => void;\n /** Icon size in pixels */\n iconSize?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom title/tooltip */\n title?: string;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * A button component for opening panel configuration/layout settings.\n */\nexport const PanelConfigureButton: React.FC<PanelConfigureButtonProps> = ({\n onConfigure,\n iconSize = 14,\n style,\n title = 'Configure panel layout',\n className,\n}) => {\n const { theme } = useTheme();\n\n return (\n <button\n onClick={onConfigure}\n title={title}\n className={className}\n style={{\n background: 'transparent',\n border: 'none',\n color: theme.colors.textSecondary,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n width: '32px',\n height: '32px',\n ...style,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;\n e.currentTarget.style.color = theme.colors.text;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = theme.colors.textSecondary;\n }}\n >\n <LayoutIcon size={iconSize} />\n </button>\n );\n};\n","import React from 'react';\nimport { PanelCollapseButton, type PanelCollapseButtonProps } from './PanelCollapseButton';\nimport { PanelSwitchButton, type PanelSwitchButtonProps } from './PanelSwitchButton';\nimport { PanelConfigureButton, type PanelConfigureButtonProps } from './PanelConfigureButton';\n\nexport interface PanelControlsProps {\n /** Left sidebar collapsed state */\n leftSidebarCollapsed?: boolean;\n /** Callback when left sidebar toggle is clicked */\n onToggleLeftSidebar?: () => void;\n /** Whether to show the left sidebar control */\n showLeftSidebarControl?: boolean;\n\n /** Right sidebar collapsed state */\n rightSidebarCollapsed?: boolean;\n /** Callback when right sidebar toggle is clicked */\n onToggleRightSidebar?: () => void;\n /** Whether to show the right sidebar control */\n showRightSidebarControl?: boolean;\n\n /** Callback when switch left-middle panels button is clicked */\n onSwitchLeftMiddlePanels?: () => void;\n /** Whether to show the switch left-middle button */\n showSwitchLeftMiddle?: boolean;\n\n /** Callback when switch right-middle panels button is clicked */\n onSwitchRightMiddlePanels?: () => void;\n /** Whether to show the switch right-middle button */\n showSwitchRightMiddle?: boolean;\n\n /** Callback when configure panels button is clicked */\n onConfigurePanels?: () => void;\n /** Whether to show the configure panels button */\n showConfigureButton?: boolean;\n\n /** Gap between buttons in pixels */\n gap?: number;\n /** Additional inline styles for the container */\n style?: React.CSSProperties;\n /** Custom class name for the container */\n className?: string;\n /** Icon size for all buttons */\n iconSize?: number;\n\n /** Props to pass to the left collapse button */\n leftCollapseButtonProps?: Partial<Omit<PanelCollapseButtonProps, 'isCollapsed' | 'onToggle' | 'side'>>;\n /** Props to pass to the right collapse button */\n rightCollapseButtonProps?: Partial<Omit<PanelCollapseButtonProps, 'isCollapsed' | 'onToggle' | 'side'>>;\n /** Props to pass to the left-middle switch button */\n leftMiddleSwitchButtonProps?: Partial<Omit<PanelSwitchButtonProps, 'onSwitch' | 'variant'>>;\n /** Props to pass to the right-middle switch button */\n rightMiddleSwitchButtonProps?: Partial<Omit<PanelSwitchButtonProps, 'onSwitch' | 'variant'>>;\n /** Props to pass to the configure button */\n configureButtonProps?: Partial<Omit<PanelConfigureButtonProps, 'onConfigure'>>;\n}\n\n/**\n * A unified panel controls component that provides buttons for:\n * - Collapsing/expanding left and right sidebars\n * - Switching/swapping panel positions\n * - Opening panel configuration\n *\n * The buttons are rendered in order:\n * 1. Left sidebar collapse button\n * 2. Left-middle switch button\n * 3. Configure panels button\n * 4. Right-middle switch button\n * 5. Right sidebar collapse button\n *\n * @example\n * ```tsx\n * <PanelControls\n * leftSidebarCollapsed={leftCollapsed}\n * onToggleLeftSidebar={() => setLeftCollapsed(!leftCollapsed)}\n * showLeftSidebarControl\n * rightSidebarCollapsed={rightCollapsed}\n * onToggleRightSidebar={() => setRightCollapsed(!rightCollapsed)}\n * showRightSidebarControl\n * onSwitchLeftMiddlePanels={handleSwitchLeftMiddle}\n * showSwitchLeftMiddle\n * onSwitchRightMiddlePanels={handleSwitchRightMiddle}\n * showSwitchRightMiddle\n * onConfigurePanels={() => setShowConfigModal(true)}\n * showConfigureButton\n * />\n * ```\n */\nexport const PanelControls: React.FC<PanelControlsProps> = ({\n leftSidebarCollapsed = false,\n onToggleLeftSidebar,\n showLeftSidebarControl = false,\n rightSidebarCollapsed = false,\n onToggleRightSidebar,\n showRightSidebarControl = false,\n onSwitchLeftMiddlePanels,\n showSwitchLeftMiddle = false,\n onSwitchRightMiddlePanels,\n showSwitchRightMiddle = false,\n onConfigurePanels,\n showConfigureButton = false,\n gap = 4,\n style,\n className,\n iconSize,\n leftCollapseButtonProps,\n rightCollapseButtonProps,\n leftMiddleSwitchButtonProps,\n rightMiddleSwitchButtonProps,\n configureButtonProps,\n}) => {\n // Check if any controls are visible\n const hasVisibleControls =\n (showLeftSidebarControl && onToggleLeftSidebar) ||\n (showSwitchLeftMiddle && onSwitchLeftMiddlePanels) ||\n (showConfigureButton && onConfigurePanels) ||\n (showSwitchRightMiddle && onSwitchRightMiddlePanels) ||\n (showRightSidebarControl && onToggleRightSidebar);\n\n if (!hasVisibleControls) {\n return null;\n }\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${gap}px`,\n ...style,\n }}\n >\n {/* Left sidebar collapse button */}\n {showLeftSidebarControl && onToggleLeftSidebar && (\n <PanelCollapseButton\n isCollapsed={leftSidebarCollapsed}\n onToggle={onToggleLeftSidebar}\n side=\"left\"\n iconSize={iconSize ?? 18}\n {...leftCollapseButtonProps}\n />\n )}\n\n {/* Switch left-middle panels button */}\n {showSwitchLeftMiddle && onSwitchLeftMiddlePanels && (\n <PanelSwitchButton\n onSwitch={onSwitchLeftMiddlePanels}\n variant=\"left-middle\"\n iconSize={iconSize ?? 14}\n {...leftMiddleSwitchButtonProps}\n />\n )}\n\n {/* Configure panels button */}\n {showConfigureButton && onConfigurePanels && (\n <PanelConfigureButton\n onConfigure={onConfigurePanels}\n iconSize={iconSize ?? 14}\n {...configureButtonProps}\n />\n )}\n\n {/* Switch right-middle panels button */}\n {showSwitchRightMiddle && onSwitchRightMiddlePanels && (\n <PanelSwitchButton\n onSwitch={onSwitchRightMiddlePanels}\n variant=\"right-middle\"\n iconSize={iconSize ?? 14}\n {...rightMiddleSwitchButtonProps}\n />\n )}\n\n {/* Right sidebar collapse button */}\n {showRightSidebarControl && onToggleRightSidebar && (\n <PanelCollapseButton\n isCollapsed={rightSidebarCollapsed}\n onToggle={onToggleRightSidebar}\n side=\"right\"\n iconSize={iconSize ?? 18}\n {...rightCollapseButtonProps}\n />\n )}\n </div>\n );\n};\n"],"names":["LocalStoragePersistenceAdapter","__publicField","viewKey","stored","error","state","usePanelPersistence","options","defaultSizes","panelType","adapter","sizes","setSizes","useState","collapsed","setCollapsed","prevCollapsedRef","useRef","lastNonZeroSizesRef","saveTimeoutRef","pendingPersistSizesRef","useEffect","saved","updateLastNonZeroSizes","useCallback","incomingSizes","getFallbackSize","panel","storedSize","prevDefaultSizesRef","leftChanged","rightChanged","savePreferences","newSizes","handlePanelResize","sanitizedSizes","shouldPersist","leftCollapsed","leftSize","fallback","rightCollapsed","rightSize","pendingSizes","handleLeftCollapseComplete","handleLeftExpandComplete","handleRightCollapseComplete","handleRightExpandComplete","LocalStorageWorkspaceAdapter","presets","repositoryKey","key","allStates","i","parseError","WorkspaceLayoutService","builtInWorkspaces","id","userWorkspaces","workspace","updatedPresets","updates","existingWorkspace","updatedWorkspace","currentState","repoState","hasSizeDeviation","hasCollapsedDeviation","workspaceId","layout","workspaces","layout1","layout2","name","now","useWorkspace","autoInitialize","defaultWorkspaceId","setWorkspaces","repositoryState","setRepositoryState","activeWorkspace","setActiveWorkspace","loading","setLoading","setError","loadData","allWorkspaces","err","getWorkspace","createWorkspace","createOptions","updateWorkspace","deleteWorkspace","success","applyWorkspace","newState","updateSizes","updateCollapsed","resetToDefaults","refresh","usePanelFocus","initialFocus","onFocusChange","events","getPanelId","focusedPanel","setFocusedPanelState","setFocus","previousPanel","prevPanelId","panelId","clearFocus","getVisiblePanels","panels","focusNext","visiblePanels","currentIndex","nextIndex","focusPrevious","prevIndex","isFocused","usePanelKeyboardShortcuts","enabled","onExpand","onCollapse","focusedPanelRef","collapsedRef","panelTypeRef","handleKeyDown","event","code","currentFocused","currentCollapsed","currentPanelType","usePanelFocusListener","onFocus","onBlur","unsubscribeFocus","unsubscribeBlur","FocusIndicator","className","style","defaultStyles","jsx","AgentCommandInput","value","onChange","onSubmit","onClose","onHistoryPrevious","onHistoryNext","mode","status","placeholder","disabled","autoFocus","agentAvailable","showAutocomplete","onAutocompleteNext","onAutocompletePrevious","onAutocompleteAccept","theme","useTheme","inputRef","e","isProcessing","jsxs","StatusIcon","iconStyle","formatArgs","args","entries","ToolExecutionItem","tool","compact","ToolExecutionList","tools","AgentResponseDisplay","response","streaming","isError","isSuccess","HighlightedText","text","matchedIndices","highlightColor","matchSet","chars","Fragment","char","QuickCommandAutocomplete","matches","argumentMatches","currentArg","isEnteringArgs","selectedIndex","onSelect","maxVisible","listRef","selectedRef","maxHeight","itemHeight","match","index","isSelected","command","arg","AgentCommandPalette","palette","config","containerRef","isOpen","close","query","setQuery","pendingTools","completedTools","agentResponse","submit","historyPrevious","historyNext","suggestions","quickCommandMatches","argumentOptionMatches","parsedQuery","currentArgDef","selectedAutocompleteIndex","autocompleteNext","autocompletePrevious","autocompleteAccept","handleClickOutside","timeoutId","isVisible","setIsVisible","shouldRender","setShouldRender","timer","allTools","showTools","showResponse","showSuggestions","showQuickCommandHelp","showAgentUnavailable","suggestion","newQuery","nextArgIndex","_a","fuzzyMatch","target","queryLower","targetLower","queryIndex","score","consecutiveMatches","lastMatchIndex","searchQuickCommands","commands","maxResults","searchQuery","nameMatch","alias","aliasMatch","a","b","parseCommandQuery","parts","commandName","endsWithSpace","cmd","argTokens","enteredArgs","currentArgValue","searchArgumentOptions","option","DEFAULT_SUGGESTIONS","useAgentCommandPalette","keyboard","onExecuteTool","initialSuggestions","quickCommands","setIsOpen","setQueryState","setMode","setStatus","setPendingTools","setCompletedTools","setAgentResponse","history","setHistory","historyIndex","setHistoryIndex","useMemo","setSelectedAutocompleteIndex","autocompleteItemCount","open","toggle","clear","addPendingTool","newTool","prev","updateToolStatus","toolId","result","t","updatedTool","completed","executeQuickCommand","toolName","toolArgs","delay","errorMessage","newIndex","altKey","ctrlKey","metaKey","shiftKey","modifiersMatch","getVisiblePanelsTool","getPanelStateTool","listPanelsWithStateTool","togglePanelTool","collapseAllPanelsTool","expandAllPanelsTool","switchPanelTool","focusPanelTool","resetLayoutTool","layoutTools","stateQueryTools","layoutActionTools","layoutToolsMetadata","toolToGeminiFunction","properties","schema","propSchema","toolsToGeminiFormat","toolToOpenAIFunction","toolsToOpenAIFormat","toolToAnthropicFormat","toolsToAnthropicFormat","toolToAIFunction","toolsToAIFunctions","generateToolsSystemPrompt","header","includeParameters","toolDescriptions","desc","params","s","required","PanelLeftIcon","size","PanelLeftCloseIcon","PanelRightIcon","PanelRightCloseIcon","PanelCollapseButton","isCollapsed","onToggle","side","iconSize","shortcutHint","title","getIcon","ArrowLeftRightIcon","ArrowRightLeftIcon","PanelSwitchButton","onSwitch","variant","getDefaultTitle","Icon","LayoutIcon","PanelConfigureButton","onConfigure","PanelControls","leftSidebarCollapsed","onToggleLeftSidebar","showLeftSidebarControl","rightSidebarCollapsed","onToggleRightSidebar","showRightSidebarControl","onSwitchLeftMiddlePanels","showSwitchLeftMiddle","onSwitchRightMiddlePanels","showSwitchRightMiddle","onConfigurePanels","showConfigureButton","gap","leftCollapseButtonProps","rightCollapseButtonProps","leftMiddleSwitchButtonProps","rightMiddleSwitchButtonProps","configureButtonProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/hooks/usePanelPersistence.ts","../src/services/LocalStorageWorkspaceAdapter.ts","../src/services/WorkspaceLayoutService.ts","../src/hooks/useWorkspace.ts","../src/keyboard/hooks/usePanelFocus.ts","../src/keyboard/hooks/usePanelKeyboardShortcuts.ts","../src/keyboard/hooks/usePanelFocusListener.ts","../src/keyboard/components/FocusIndicator.tsx","../src/keyboard/components/FocusModeOverlay.tsx","../src/agent-command-palette/components/AgentCommandInput.tsx","../src/agent-command-palette/components/ToolExecutionList.tsx","../src/agent-command-palette/components/AgentResponseDisplay.tsx","../src/agent-command-palette/components/QuickCommandAutocomplete.tsx","../src/agent-command-palette/components/AgentCommandPalette.tsx","../src/agent-command-palette/utils/fuzzyMatch.ts","../src/agent-command-palette/hooks/useAgentCommandPalette.ts","../src/tools/layoutTools.ts","../src/tools/aiProviderFormats.ts","../src/components/PanelControls/PanelCollapseButton.tsx","../src/components/PanelControls/PanelSwitchButton.tsx","../src/components/PanelControls/PanelConfigureButton.tsx","../src/components/PanelControls/PanelControls.tsx"],"sourcesContent":["/**\n * usePanelPersistence Hook\n *\n * Extracted and adapted from electron-app/src/renderer/hooks/usePanelPersistence.ts\n * Manages saving and loading panel sizes and collapsed states with debounced persistence.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type {\n UsePanelPersistenceOptions,\n PanelSizes,\n TwoPanelSizes,\n PanelCollapsed,\n PanelPersistence,\n PersistenceAdapter,\n} from '../types/persistence.types';\n\n/**\n * Default localStorage-based persistence adapter for web applications\n */\nexport class LocalStoragePersistenceAdapter implements PersistenceAdapter {\n private storageKey = 'panel-layouts';\n\n async load(viewKey: string) {\n try {\n const stored = localStorage.getItem(`${this.storageKey}:${viewKey}`);\n return stored ? JSON.parse(stored) : null;\n } catch (error) {\n console.error(`Failed to load panel layout for ${viewKey}:`, error);\n return null;\n }\n }\n\n async save(viewKey: string, state: { sizes: PanelSizes | TwoPanelSizes }) {\n try {\n localStorage.setItem(\n `${this.storageKey}:${viewKey}`,\n JSON.stringify(state),\n );\n } catch (error) {\n console.error(`Failed to save panel layout for ${viewKey}:`, error);\n }\n }\n}\n\n/**\n * Hook for persisting panel layouts across sessions\n *\n * Manages panel sizes and collapsed states with automatic debounced saving.\n * Supports both 2-panel and 3-panel layouts.\n *\n * @param options - Configuration options for persistence\n * @returns Panel state and handlers for resizing and collapsing\n *\n * @example\n * ```tsx\n * const persistence = usePanelPersistence({\n * viewKey: 'my-app',\n * defaultSizes: { left: 30, middle: 70, right: 0 },\n * collapsed: { left: false, right: true },\n * panelType: 'three-panel',\n * });\n *\n * <ConfigurablePanelLayout\n * {...otherProps}\n * defaultSizes={persistence.sizes}\n * collapsed={persistence.collapsed}\n * onPanelResize={persistence.handlePanelResize}\n * />\n * ```\n */\nexport function usePanelPersistence(\n options: UsePanelPersistenceOptions,\n): PanelPersistence {\n const {\n viewKey,\n defaultSizes,\n panelType,\n adapter = new LocalStoragePersistenceAdapter(),\n } = options;\n\n const [sizes, setSizes] = useState(defaultSizes);\n const [collapsed, setCollapsed] = useState(options.collapsed);\n const prevCollapsedRef = useRef(options.collapsed);\n const lastNonZeroSizesRef = useRef<Partial<PanelSizes & TwoPanelSizes>>({});\n const saveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingPersistSizesRef = useRef<typeof sizes | null>(null);\n\n // Load saved state on mount\n useEffect(() => {\n const loadSavedState = async () => {\n const saved = await adapter.load(viewKey);\n if (saved?.sizes) {\n setSizes(saved.sizes as typeof sizes);\n updateLastNonZeroSizes(saved.sizes);\n }\n };\n loadSavedState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewKey]);\n\n const updateLastNonZeroSizes = useCallback(\n (incomingSizes: PanelSizes | TwoPanelSizes) => {\n if ('left' in incomingSizes && incomingSizes.left > 0) {\n lastNonZeroSizesRef.current.left = incomingSizes.left;\n }\n\n if ('middle' in incomingSizes && incomingSizes.middle > 0) {\n lastNonZeroSizesRef.current.middle = incomingSizes.middle;\n }\n\n if ('right' in incomingSizes && incomingSizes.right > 0) {\n lastNonZeroSizesRef.current.right = incomingSizes.right;\n }\n },\n [],\n );\n\n const getFallbackSize = useCallback(\n (panel: 'left' | 'right') => {\n const storedSize = lastNonZeroSizesRef.current[panel];\n if (storedSize && storedSize > 0) {\n return storedSize;\n }\n\n if (panel === 'left' && 'left' in defaultSizes && defaultSizes.left > 0) {\n return defaultSizes.left;\n }\n\n if (\n panel === 'right' &&\n 'right' in defaultSizes &&\n defaultSizes.right > 0\n ) {\n return defaultSizes.right;\n }\n\n return undefined;\n },\n [defaultSizes],\n );\n\n // Update sizes when defaultSizes changes (parent has loaded preferences)\n const prevDefaultSizesRef = useRef(defaultSizes);\n useEffect(() => {\n // Only update if the actual values changed, not just the reference\n const hasChanged =\n ('left' in defaultSizes &&\n defaultSizes.left !== prevDefaultSizesRef.current.left) ||\n ('middle' in defaultSizes &&\n 'middle' in prevDefaultSizesRef.current &&\n defaultSizes.middle !==\n (prevDefaultSizesRef.current as PanelSizes).middle) ||\n ('right' in defaultSizes &&\n defaultSizes.right !== prevDefaultSizesRef.current.right);\n\n if (hasChanged) {\n setSizes(defaultSizes);\n updateLastNonZeroSizes(defaultSizes);\n prevDefaultSizesRef.current = defaultSizes;\n }\n }, [defaultSizes, updateLastNonZeroSizes]);\n\n // Sync with parent's collapsed state (e.g., from titlebar buttons)\n useEffect(() => {\n const leftChanged =\n options.collapsed.left !== prevCollapsedRef.current.left;\n const rightChanged =\n 'right' in options.collapsed &&\n 'right' in prevCollapsedRef.current &&\n (options.collapsed as PanelCollapsed).right !==\n (prevCollapsedRef.current as PanelCollapsed).right;\n\n if (leftChanged || rightChanged) {\n setCollapsed(options.collapsed);\n prevCollapsedRef.current = { ...options.collapsed };\n }\n }, [options.collapsed.left, (options.collapsed as PanelCollapsed).right]);\n\n // Save preferences helper (only saves sizes, not collapsed state)\n const savePreferences = useCallback(\n async (newSizes: typeof sizes) => {\n try {\n await adapter.save(viewKey, { sizes: newSizes });\n } catch (error) {\n console.error(\n `Failed to save panel preferences for ${viewKey}:`,\n error,\n );\n }\n },\n [viewKey, adapter],\n );\n\n // Handle panel resize (debounced)\n const handlePanelResize = useCallback(\n (newSizes: typeof sizes) => {\n const sanitizedSizes = { ...newSizes } as typeof newSizes;\n let shouldPersist = true;\n\n if ('left' in newSizes) {\n const leftCollapsed = Boolean((collapsed as PanelCollapsed)?.left);\n const leftSize = newSizes.left;\n\n if (leftCollapsed) {\n const fallback = getFallbackSize('left');\n if (fallback !== undefined && fallback > 0) {\n sanitizedSizes.left = fallback;\n } else {\n shouldPersist = false;\n }\n } else if (leftSize === 0) {\n shouldPersist = false;\n }\n }\n\n if (panelType === 'three-panel' && 'right' in newSizes) {\n const rightCollapsed = Boolean((collapsed as PanelCollapsed)?.right);\n const rightSize = newSizes.right;\n\n if (rightCollapsed) {\n const fallback = getFallbackSize('right');\n if (fallback !== undefined && fallback > 0) {\n sanitizedSizes.right = fallback;\n } else {\n shouldPersist = false;\n }\n } else if (rightSize === 0) {\n shouldPersist = false;\n }\n }\n\n setSizes(sanitizedSizes);\n updateLastNonZeroSizes(sanitizedSizes);\n\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current);\n saveTimeoutRef.current = null;\n }\n\n if (!shouldPersist) {\n pendingPersistSizesRef.current = null;\n return;\n }\n\n pendingPersistSizesRef.current = sanitizedSizes;\n saveTimeoutRef.current = setTimeout(() => {\n const pendingSizes = pendingPersistSizesRef.current;\n if (pendingSizes) {\n savePreferences(pendingSizes);\n pendingPersistSizesRef.current = null;\n }\n saveTimeoutRef.current = null;\n }, 500);\n },\n [\n collapsed,\n getFallbackSize,\n panelType,\n savePreferences,\n updateLastNonZeroSizes,\n ],\n );\n\n // Cleanup: save any pending changes on unmount\n useEffect(() => {\n return () => {\n if (saveTimeoutRef.current) {\n const pendingSizes = pendingPersistSizesRef.current;\n if (pendingSizes) {\n savePreferences(pendingSizes);\n pendingPersistSizesRef.current = null;\n }\n clearTimeout(saveTimeoutRef.current);\n saveTimeoutRef.current = null;\n }\n };\n }, [savePreferences]);\n\n // Collapse/expand handlers - no-ops because state is controlled by parent\n // The parent manages collapsed state via titlebar buttons and passes it down as props\n const handleLeftCollapseComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n const handleLeftExpandComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n const handleRightCollapseComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n const handleRightExpandComplete = useCallback(async () => {\n // No-op: parent controls state\n }, []);\n\n if (panelType === 'three-panel') {\n return {\n type: 'three-panel',\n sizes: sizes as PanelSizes,\n collapsed: collapsed as PanelCollapsed,\n handlePanelResize: handlePanelResize as (sizes: PanelSizes) => void,\n handleLeftCollapseComplete,\n handleLeftExpandComplete,\n handleRightCollapseComplete,\n handleRightExpandComplete,\n };\n } else {\n return {\n type: 'two-panel',\n sizes: sizes as TwoPanelSizes,\n collapsed: collapsed as { left?: boolean },\n handlePanelResize: handlePanelResize as (sizes: TwoPanelSizes) => void,\n handleLeftCollapseComplete,\n handleLeftExpandComplete,\n };\n }\n}\n","/**\n * LocalStorageWorkspaceAdapter - Browser localStorage implementation\n * Stores workspace presets and repository states in browser localStorage\n */\n\nimport type {\n WorkspaceLayout,\n WorkspaceStorageAdapter,\n RepositoryWorkspaceState,\n} from '../types/workspace.types';\n\nexport class LocalStorageWorkspaceAdapter implements WorkspaceStorageAdapter {\n private readonly PRESETS_KEY = 'panel-layouts:workspace-presets';\n private readonly REPO_STATE_PREFIX = 'panel-layouts:repo-state:';\n\n /**\n * Load all user-created workspace presets\n */\n async loadWorkspacePresets(): Promise<Record<string, WorkspaceLayout>> {\n try {\n const stored = localStorage.getItem(this.PRESETS_KEY);\n if (!stored) {\n return {};\n }\n return JSON.parse(stored);\n } catch (error) {\n console.error('Failed to load workspace presets:', error);\n return {};\n }\n }\n\n /**\n * Save workspace presets\n */\n async saveWorkspacePresets(\n presets: Record<string, WorkspaceLayout>,\n ): Promise<void> {\n try {\n localStorage.setItem(this.PRESETS_KEY, JSON.stringify(presets));\n } catch (error) {\n console.error('Failed to save workspace presets:', error);\n throw error;\n }\n }\n\n /**\n * Load repository-specific workspace state\n */\n async loadRepositoryState(\n repositoryKey: string,\n ): Promise<RepositoryWorkspaceState | null> {\n try {\n const key = `${this.REPO_STATE_PREFIX}${repositoryKey}`;\n const stored = localStorage.getItem(key);\n if (!stored) {\n return null;\n }\n return JSON.parse(stored);\n } catch (error) {\n console.error(\n `Failed to load repository state for ${repositoryKey}:`,\n error,\n );\n return null;\n }\n }\n\n /**\n * Save repository-specific workspace state\n */\n async saveRepositoryState(\n repositoryKey: string,\n state: RepositoryWorkspaceState,\n ): Promise<void> {\n try {\n const key = `${this.REPO_STATE_PREFIX}${repositoryKey}`;\n localStorage.setItem(key, JSON.stringify(state));\n } catch (error) {\n console.error(\n `Failed to save repository state for ${repositoryKey}:`,\n error,\n );\n throw error;\n }\n }\n\n /**\n * Load all repository states\n */\n async loadAllRepositoryStates(): Promise<\n Record<string, RepositoryWorkspaceState>\n > {\n try {\n const allStates: Record<string, RepositoryWorkspaceState> = {};\n\n // Iterate through all localStorage keys\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(this.REPO_STATE_PREFIX)) {\n const repositoryKey = key.substring(this.REPO_STATE_PREFIX.length);\n const stored = localStorage.getItem(key);\n if (stored) {\n try {\n allStates[repositoryKey] = JSON.parse(stored);\n } catch (parseError) {\n console.error(\n `Failed to parse repository state for ${repositoryKey}:`,\n parseError,\n );\n }\n }\n }\n }\n\n return allStates;\n } catch (error) {\n console.error('Failed to load all repository states:', error);\n return {};\n }\n }\n}\n","/**\n * WorkspaceLayoutService - Manages workspace layout presets\n * Extracted from electron-app/src/renderer/services/WorkspaceLayoutService.ts\n *\n * This service handles CRUD operations for workspace layouts (panel configuration presets)\n * and provides utilities for comparing layouts and managing built-in workspaces.\n */\n\nimport type { PanelLayout } from '@principal-ade/panels';\nimport type {\n WorkspaceLayout,\n WorkspaceStorageAdapter,\n RepositoryWorkspaceState,\n CreateWorkspaceOptions,\n UpdateWorkspaceOptions,\n} from '../types/workspace.types';\nimport { LocalStorageWorkspaceAdapter } from './LocalStorageWorkspaceAdapter';\n\nexport class WorkspaceLayoutService {\n private static adapter: WorkspaceStorageAdapter =\n new LocalStorageWorkspaceAdapter();\n\n /**\n * Configure a custom storage adapter (for Electron IPC or remote storage)\n */\n static setAdapter(adapter: WorkspaceStorageAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Get all workspace layouts (including built-in)\n */\n static async getWorkspaceLayouts(): Promise<Record<string, WorkspaceLayout>> {\n const builtInWorkspaces = this.getBuiltInWorkspaceLayouts();\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n\n // Merge built-in and user workspaces, built-in takes precedence\n return {\n ...userWorkspaces,\n ...builtInWorkspaces,\n };\n }\n\n /**\n * Get a specific workspace layout by ID\n */\n static async getWorkspaceLayout(id: string): Promise<WorkspaceLayout | null> {\n const workspaces = await this.getWorkspaceLayouts();\n return workspaces[id] || null;\n }\n\n /**\n * Create a new workspace layout\n */\n static async createWorkspaceLayout(\n options: CreateWorkspaceOptions,\n ): Promise<WorkspaceLayout> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n const id = this.generateWorkspaceId(options.name);\n\n const workspace: WorkspaceLayout = {\n id,\n name: options.name,\n description: options.description,\n layout: options.layout,\n defaultSizes: options.defaultSizes,\n defaultCollapsed: options.defaultCollapsed,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isBuiltIn: false,\n };\n\n const updatedPresets = {\n ...userWorkspaces,\n [id]: workspace,\n };\n\n await this.adapter.saveWorkspacePresets(updatedPresets);\n\n return workspace;\n }\n\n /**\n * Update an existing workspace layout\n */\n static async updateWorkspaceLayout(\n id: string,\n updates: UpdateWorkspaceOptions,\n ): Promise<WorkspaceLayout | null> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n const existingWorkspace = userWorkspaces[id];\n\n if (!existingWorkspace) {\n console.error(`Workspace layout ${id} not found`);\n return null;\n }\n\n // Don't allow updating built-in workspaces\n if (existingWorkspace.isBuiltIn) {\n console.error(`Cannot update built-in workspace layout ${id}`);\n return null;\n }\n\n const updatedWorkspace: WorkspaceLayout = {\n ...existingWorkspace,\n ...updates,\n id, // Preserve ID\n createdAt: existingWorkspace.createdAt, // Preserve creation time\n updatedAt: Date.now(),\n };\n\n const updatedPresets = {\n ...userWorkspaces,\n [id]: updatedWorkspace,\n };\n\n await this.adapter.saveWorkspacePresets(updatedPresets);\n\n return updatedWorkspace;\n }\n\n /**\n * Delete a workspace layout\n */\n static async deleteWorkspaceLayout(id: string): Promise<boolean> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n const workspace = userWorkspaces[id];\n\n if (!workspace) {\n console.error(`Workspace layout ${id} not found`);\n return false;\n }\n\n // Don't allow deleting built-in workspaces\n if (workspace.isBuiltIn) {\n console.error(`Cannot delete built-in workspace layout ${id}`);\n return false;\n }\n\n const updatedPresets = { ...userWorkspaces };\n delete updatedPresets[id];\n\n await this.adapter.saveWorkspacePresets(updatedPresets);\n\n return true;\n }\n\n /**\n * Get repository state (which workspace + current sizes/collapsed)\n */\n static async getRepositoryState(\n repositoryKey: string,\n ): Promise<RepositoryWorkspaceState | null> {\n return await this.adapter.loadRepositoryState(repositoryKey);\n }\n\n /**\n * Set repository state (which workspace + current sizes/collapsed/layout)\n */\n static async setRepositoryState(\n repositoryKey: string,\n state: RepositoryWorkspaceState,\n ): Promise<void> {\n await this.adapter.saveRepositoryState(repositoryKey, state);\n }\n\n /**\n * Update only sizes in repository state\n */\n static async updateRepositorySizes(\n repositoryKey: string,\n sizes: { left: number; middle: number; right: number },\n ): Promise<void> {\n const currentState = await this.getRepositoryState(repositoryKey);\n if (!currentState) return;\n\n await this.setRepositoryState(repositoryKey, {\n ...currentState,\n sizes,\n });\n }\n\n /**\n * Update only collapsed state in repository state\n */\n static async updateRepositoryCollapsed(\n repositoryKey: string,\n collapsed: { left?: boolean; right?: boolean },\n ): Promise<void> {\n const currentState = await this.getRepositoryState(repositoryKey);\n if (!currentState) return;\n\n await this.setRepositoryState(repositoryKey, {\n ...currentState,\n collapsed,\n });\n }\n\n /**\n * Check if repository state differs from workspace defaults\n */\n static hasStateDeviation(\n repoState: {\n workspaceId: string | null;\n sizes: { left: number; middle: number; right: number };\n collapsed: { left?: boolean; right?: boolean };\n },\n workspace: WorkspaceLayout,\n ): {\n hasSizeDeviation: boolean;\n hasCollapsedDeviation: boolean;\n } {\n const hasSizeDeviation = workspace.defaultSizes\n ? JSON.stringify(repoState.sizes) !==\n JSON.stringify(workspace.defaultSizes)\n : false;\n\n const hasCollapsedDeviation = workspace.defaultCollapsed\n ? JSON.stringify(repoState.collapsed) !==\n JSON.stringify(workspace.defaultCollapsed)\n : false;\n\n return { hasSizeDeviation, hasCollapsedDeviation };\n }\n\n /**\n * Update workspace defaults from repository state\n */\n static async updateWorkspaceFromRepositoryState(\n workspaceId: string,\n repositoryKey: string,\n ): Promise<void> {\n const workspace = await this.getWorkspaceLayout(workspaceId);\n const repoState = await this.getRepositoryState(repositoryKey);\n\n if (!workspace || !repoState || workspace.isBuiltIn) {\n console.error(\n 'Cannot update built-in workspace or workspace/state not found',\n );\n return;\n }\n\n await this.updateWorkspaceLayout(workspaceId, {\n defaultSizes: repoState.sizes,\n defaultCollapsed: repoState.collapsed,\n });\n }\n\n /**\n * Reset repository state to workspace defaults\n */\n static async resetRepositoryToWorkspaceDefaults(\n repositoryKey: string,\n workspaceId: string,\n ): Promise<void> {\n const workspace = await this.getWorkspaceLayout(workspaceId);\n if (!workspace) {\n console.error(`Workspace ${workspaceId} not found`);\n return;\n }\n\n const currentState = await this.getRepositoryState(repositoryKey);\n if (!currentState) return;\n\n await this.setRepositoryState(repositoryKey, {\n ...currentState,\n sizes: workspace.defaultSizes || { left: 20, middle: 45, right: 35 },\n collapsed: workspace.defaultCollapsed || { left: false, right: false },\n });\n }\n\n /**\n * Check if a layout matches a workspace layout\n */\n static isLayoutMatchingWorkspace(\n layout: PanelLayout,\n workspace: WorkspaceLayout,\n ): boolean {\n return this.areLayoutsEqual(layout, workspace.layout);\n }\n\n /**\n * Find workspace ID that matches the given layout\n */\n static async findMatchingWorkspace(\n layout: PanelLayout,\n ): Promise<string | null> {\n const workspaces = await this.getWorkspaceLayouts();\n\n for (const [id, workspace] of Object.entries(workspaces)) {\n if (this.isLayoutMatchingWorkspace(layout, workspace)) {\n return id;\n }\n }\n\n return null;\n }\n\n /**\n * Deep comparison of two panel layouts\n */\n private static areLayoutsEqual(\n layout1: PanelLayout,\n layout2: PanelLayout,\n ): boolean {\n return JSON.stringify(layout1) === JSON.stringify(layout2);\n }\n\n /**\n * Generate a unique ID from a workspace name\n */\n private static generateWorkspaceId(name: string): string {\n const base = name.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n return `${base}-${Date.now()}`;\n }\n\n /**\n * Get built-in workspace layouts\n */\n static getBuiltInWorkspaceLayouts(): Record<string, WorkspaceLayout> {\n const now = Date.now();\n\n return {\n 'project-management': {\n id: 'project-management',\n name: 'Project Management',\n description:\n 'Tasks, dependencies, issues, file tree, docs, drawings, multi terminal, city visualization, code viewer, markdown slides, and excalidraw',\n layout: {\n left: {\n type: 'tabs',\n panels: [\n 'tasks',\n 'dependencies',\n 'gitIssues',\n 'fileTree',\n 'docs',\n 'drawings',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'multiTerminal',\n right: {\n type: 'tabs',\n panels: [\n 'cityVisualization',\n 'codeViewer',\n 'markdownViewer',\n 'excalidrawDiagram',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 45, right: 35 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'code-review': {\n id: 'code-review',\n name: 'Code Review',\n description:\n 'Git changes, pull requests, and file tree on left, git diff and code viewer in middle, city map on right',\n layout: {\n left: {\n type: 'tabs',\n panels: ['gitChanges', 'gitPullRequests', 'fileTree'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: {\n type: 'tabs',\n panels: ['gitDiff', 'codeViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n right: 'cityVisualization',\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n documentation: {\n id: 'documentation',\n name: 'Documentation',\n description: 'Docs, markdown viewer, and code viewer',\n layout: {\n left: 'docs',\n middle: 'markdownViewer',\n right: 'codeViewer',\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'agent-work': {\n id: 'agent-work',\n name: 'Agent Work',\n description:\n 'Tasks, agent sessions, file tree, agent context, git changes, docs, multi terminal, city map, agent events, code viewer, and markdown slides',\n layout: {\n left: {\n type: 'tabs',\n panels: [\n 'tasks',\n 'agentSessions',\n 'fileTree',\n 'agentContext',\n 'gitChanges',\n 'docs',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'multiTerminal',\n right: {\n type: 'tabs',\n panels: [\n 'cityVisualization',\n 'agentEvents',\n 'codeViewer',\n 'markdownViewer',\n ],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 45, right: 35 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'quality-check': {\n id: 'quality-check',\n name: 'Quality Check',\n description:\n 'Package information, tools, and dependencies on left; city visualization map in middle; multi terminal and code viewer on right (collapsed)',\n layout: {\n left: {\n type: 'tabs',\n panels: ['packageInfo', 'tools', 'dependencies'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'cityVisualization',\n right: {\n type: 'tabs',\n panels: ['multiTerminal', 'codeViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 45, right: 35 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n drawing: {\n id: 'drawing',\n name: 'Drawing',\n description:\n 'Drawings and docs, excalidraw diagram, multi terminal and markdown viewer',\n layout: {\n left: {\n type: 'tabs',\n panels: ['drawings', 'docs'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: 'excalidrawDiagram',\n right: {\n type: 'tabs',\n panels: ['multiTerminal', 'markdownViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'old-school': {\n id: 'old-school',\n name: 'Old School',\n description:\n 'File tree, search, git changes, and docs on left; code viewer and markdown viewer in middle; multi terminal and city map on right (collapsed)',\n layout: {\n left: {\n type: 'tabs',\n panels: ['fileTree', 'search', 'gitChanges', 'docs'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n middle: {\n type: 'tabs',\n panels: ['codeViewer', 'markdownViewer'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n right: {\n type: 'tabs',\n panels: ['multiTerminal', 'cityVisualization'],\n config: { defaultActiveTab: 0, tabPosition: 'top' },\n },\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: true },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n 'principal-office': {\n id: 'principal-office',\n name: 'Principal Office',\n description:\n 'Alexandria docs on left, MDX editor in middle, multi terminal on right',\n layout: {\n left: 'docs',\n middle: 'mdxEditor',\n right: 'multiTerminal',\n },\n defaultSizes: { left: 20, middle: 50, right: 30 },\n defaultCollapsed: { left: false, right: false },\n createdAt: now,\n updatedAt: now,\n isBuiltIn: true,\n },\n };\n }\n\n /**\n * Initialize workspace layouts with built-in defaults if none exist\n */\n static async initializeWorkspaceLayouts(): Promise<void> {\n const userWorkspaces = await this.adapter.loadWorkspacePresets();\n\n // Only initialize if there are no user workspaces yet\n // Built-in workspaces are always available via getBuiltInWorkspaceLayouts()\n if (Object.keys(userWorkspaces).length === 0) {\n // Nothing to do - built-in workspaces are always available\n // This method exists for compatibility with electron-app\n }\n }\n}\n","/**\n * useWorkspace - React hook for workspace management\n * Provides easy access to workspace operations and state\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { WorkspaceLayoutService } from '../services/WorkspaceLayoutService';\nimport type {\n WorkspaceLayout,\n RepositoryWorkspaceState,\n CreateWorkspaceOptions,\n UpdateWorkspaceOptions,\n} from '../types/workspace.types';\n\nexport interface UseWorkspaceOptions {\n /**\n * Optional repository key for repository-specific state\n * If provided, the hook will manage repository state\n */\n repositoryKey?: string;\n\n /**\n * Auto-initialize repository state if it doesn't exist\n */\n autoInitialize?: boolean;\n\n /**\n * Default workspace to use for auto-initialization\n */\n defaultWorkspaceId?: string;\n}\n\nexport interface UseWorkspaceReturn {\n /**\n * All available workspaces (built-in + user-created)\n */\n workspaces: Record<string, WorkspaceLayout>;\n\n /**\n * Current repository state (if repositoryKey provided)\n */\n repositoryState: RepositoryWorkspaceState | null;\n\n /**\n * Current active workspace (if repositoryKey provided)\n */\n activeWorkspace: WorkspaceLayout | null;\n\n /**\n * Loading state\n */\n loading: boolean;\n\n /**\n * Error state\n */\n error: Error | null;\n\n /**\n * Get a specific workspace by ID\n */\n getWorkspace: (id: string) => Promise<WorkspaceLayout | null>;\n\n /**\n * Create a new workspace\n */\n createWorkspace: (options: CreateWorkspaceOptions) => Promise<WorkspaceLayout>;\n\n /**\n * Update an existing workspace\n */\n updateWorkspace: (\n id: string,\n updates: UpdateWorkspaceOptions,\n ) => Promise<WorkspaceLayout | null>;\n\n /**\n * Delete a workspace\n */\n deleteWorkspace: (id: string) => Promise<boolean>;\n\n /**\n * Apply a workspace to the current repository\n */\n applyWorkspace: (workspaceId: string) => Promise<void>;\n\n /**\n * Update repository sizes\n */\n updateSizes: (sizes: {\n left: number;\n middle: number;\n right: number;\n }) => Promise<void>;\n\n /**\n * Update repository collapsed state\n */\n updateCollapsed: (collapsed: {\n left?: boolean;\n right?: boolean;\n }) => Promise<void>;\n\n /**\n * Reset repository to workspace defaults\n */\n resetToDefaults: () => Promise<void>;\n\n /**\n * Refresh workspace data\n */\n refresh: () => Promise<void>;\n}\n\nexport function useWorkspace(\n options: UseWorkspaceOptions = {},\n): UseWorkspaceReturn {\n const { repositoryKey, autoInitialize = false, defaultWorkspaceId } = options;\n\n const [workspaces, setWorkspaces] = useState<Record<string, WorkspaceLayout>>(\n {},\n );\n const [repositoryState, setRepositoryState] =\n useState<RepositoryWorkspaceState | null>(null);\n const [activeWorkspace, setActiveWorkspace] =\n useState<WorkspaceLayout | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Load all workspaces and repository state\n */\n const loadData = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n\n // Load all workspaces\n const allWorkspaces =\n await WorkspaceLayoutService.getWorkspaceLayouts();\n setWorkspaces(allWorkspaces);\n\n // Load repository state if repositoryKey provided\n if (repositoryKey) {\n let repoState =\n await WorkspaceLayoutService.getRepositoryState(repositoryKey);\n\n // Auto-initialize if requested and state doesn't exist\n if (!repoState && autoInitialize) {\n const workspaceId =\n defaultWorkspaceId || 'project-management'; // Default to project-management\n const workspace =\n await WorkspaceLayoutService.getWorkspaceLayout(workspaceId);\n\n if (workspace) {\n repoState = {\n workspaceId,\n sizes: workspace.defaultSizes || {\n left: 20,\n middle: 45,\n right: 35,\n },\n collapsed: workspace.defaultCollapsed || {\n left: false,\n right: false,\n },\n };\n\n await WorkspaceLayoutService.setRepositoryState(\n repositoryKey,\n repoState,\n );\n }\n }\n\n setRepositoryState(repoState);\n\n // Load active workspace if repository has one\n if (repoState?.workspaceId) {\n const workspace = await WorkspaceLayoutService.getWorkspaceLayout(\n repoState.workspaceId,\n );\n setActiveWorkspace(workspace);\n } else {\n setActiveWorkspace(null);\n }\n }\n } catch (err) {\n setError(err as Error);\n console.error('Failed to load workspace data:', err);\n } finally {\n setLoading(false);\n }\n }, [repositoryKey, autoInitialize, defaultWorkspaceId]);\n\n /**\n * Initial load\n */\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n /**\n * Get a specific workspace\n */\n const getWorkspace = useCallback(\n async (id: string) => {\n return await WorkspaceLayoutService.getWorkspaceLayout(id);\n },\n [],\n );\n\n /**\n * Create a new workspace\n */\n const createWorkspace = useCallback(\n async (createOptions: CreateWorkspaceOptions) => {\n const workspace =\n await WorkspaceLayoutService.createWorkspaceLayout(createOptions);\n await loadData(); // Refresh\n return workspace;\n },\n [loadData],\n );\n\n /**\n * Update an existing workspace\n */\n const updateWorkspace = useCallback(\n async (id: string, updates: UpdateWorkspaceOptions) => {\n const workspace =\n await WorkspaceLayoutService.updateWorkspaceLayout(id, updates);\n await loadData(); // Refresh\n return workspace;\n },\n [loadData],\n );\n\n /**\n * Delete a workspace\n */\n const deleteWorkspace = useCallback(\n async (id: string) => {\n const success = await WorkspaceLayoutService.deleteWorkspaceLayout(id);\n if (success) {\n await loadData(); // Refresh\n }\n return success;\n },\n [loadData],\n );\n\n /**\n * Apply a workspace to the current repository\n */\n const applyWorkspace = useCallback(\n async (workspaceId: string) => {\n if (!repositoryKey) {\n console.error('Cannot apply workspace without repositoryKey');\n return;\n }\n\n const workspace =\n await WorkspaceLayoutService.getWorkspaceLayout(workspaceId);\n if (!workspace) {\n console.error(`Workspace ${workspaceId} not found`);\n return;\n }\n\n const newState: RepositoryWorkspaceState = {\n workspaceId,\n sizes: workspace.defaultSizes || { left: 20, middle: 45, right: 35 },\n collapsed: workspace.defaultCollapsed || {\n left: false,\n right: false,\n },\n };\n\n await WorkspaceLayoutService.setRepositoryState(repositoryKey, newState);\n await loadData(); // Refresh\n },\n [repositoryKey, loadData],\n );\n\n /**\n * Update repository sizes\n */\n const updateSizes = useCallback(\n async (sizes: { left: number; middle: number; right: number }) => {\n if (!repositoryKey) {\n console.error('Cannot update sizes without repositoryKey');\n return;\n }\n\n await WorkspaceLayoutService.updateRepositorySizes(repositoryKey, sizes);\n await loadData(); // Refresh\n },\n [repositoryKey, loadData],\n );\n\n /**\n * Update repository collapsed state\n */\n const updateCollapsed = useCallback(\n async (collapsed: { left?: boolean; right?: boolean }) => {\n if (!repositoryKey) {\n console.error('Cannot update collapsed without repositoryKey');\n return;\n }\n\n await WorkspaceLayoutService.updateRepositoryCollapsed(\n repositoryKey,\n collapsed,\n );\n await loadData(); // Refresh\n },\n [repositoryKey, loadData],\n );\n\n /**\n * Reset repository to workspace defaults\n */\n const resetToDefaults = useCallback(async () => {\n if (!repositoryKey || !repositoryState?.workspaceId) {\n console.error('Cannot reset without repositoryKey and active workspace');\n return;\n }\n\n await WorkspaceLayoutService.resetRepositoryToWorkspaceDefaults(\n repositoryKey,\n repositoryState.workspaceId,\n );\n await loadData(); // Refresh\n }, [repositoryKey, repositoryState?.workspaceId, loadData]);\n\n /**\n * Refresh workspace data\n */\n const refresh = useCallback(async () => {\n await loadData();\n }, [loadData]);\n\n return {\n workspaces,\n repositoryState,\n activeWorkspace,\n loading,\n error,\n getWorkspace,\n createWorkspace,\n updateWorkspace,\n deleteWorkspace,\n applyWorkspace,\n updateSizes,\n updateCollapsed,\n resetToDefaults,\n refresh,\n };\n}\n","/**\n * usePanelFocus - Hook for managing panel focus state\n */\n\nimport { useState, useCallback } from 'react';\nimport type {\n PanelEventEmitter,\n PanelFocusEventPayload,\n PanelBlurEventPayload,\n} from '@principal-ade/panel-framework-core';\nimport type { PanelSlotId, PanelFocusState, PanelFocusActions } from '../types';\nimport type { PanelCollapsed } from '../../types/persistence.types';\n\nexport interface UsePanelFocusOptions {\n /** Initial focused panel (optional) */\n initialFocus?: PanelSlotId | null;\n\n /** Collapsed state to determine which panels are visible */\n collapsed?: PanelCollapsed;\n\n /** Whether this is a two-panel or three-panel layout */\n panelType?: 'two-panel' | 'three-panel';\n\n /** Callback when focus changes */\n onFocusChange?: (panel: PanelSlotId | null) => void;\n\n /** Event emitter from panel framework (optional, for focus events) */\n events?: PanelEventEmitter;\n\n /** Function to map panel slot to panel ID (optional, required for event emission) */\n getPanelId?: (slot: PanelSlotId) => string | undefined;\n}\n\nexport interface UsePanelFocusReturn extends PanelFocusState, PanelFocusActions {\n /** Check if a specific panel is focused */\n isFocused: (panel: PanelSlotId) => boolean;\n}\n\n/**\n * Hook for managing panel focus state with keyboard shortcuts\n */\nexport function usePanelFocus(\n options: UsePanelFocusOptions = {}\n): UsePanelFocusReturn {\n const {\n initialFocus = null,\n collapsed = {},\n panelType = 'three-panel',\n onFocusChange,\n events,\n getPanelId,\n } = options;\n\n const [focusedPanel, setFocusedPanelState] = useState<PanelSlotId | null>(\n initialFocus\n );\n\n const setFocus = useCallback(\n (panel: PanelSlotId) => {\n const previousPanel = focusedPanel;\n setFocusedPanelState(panel);\n onFocusChange?.(panel);\n\n // Emit framework events if event emitter is provided\n if (events && getPanelId) {\n // Emit blur event for previous panel\n if (previousPanel) {\n const prevPanelId = getPanelId(previousPanel);\n if (prevPanelId) {\n events.emit<PanelBlurEventPayload>({\n type: 'panel:blur',\n source: 'panel-layouts',\n timestamp: Date.now(),\n payload: {\n panelId: prevPanelId,\n panelSlot: previousPanel,\n nextPanelId: getPanelId(panel),\n },\n });\n }\n }\n\n // Emit focus event for new panel\n const panelId = getPanelId(panel);\n if (panelId) {\n events.emit<PanelFocusEventPayload>({\n type: 'panel:focus',\n source: 'panel-layouts',\n timestamp: Date.now(),\n payload: {\n panelId,\n panelSlot: panel,\n source: 'keyboard-shortcut',\n },\n });\n }\n }\n },\n [focusedPanel, onFocusChange, events, getPanelId]\n );\n\n const clearFocus = useCallback(() => {\n const previousPanel = focusedPanel;\n setFocusedPanelState(null);\n onFocusChange?.(null);\n\n // Emit blur event when clearing focus\n if (events && getPanelId && previousPanel) {\n const prevPanelId = getPanelId(previousPanel);\n if (prevPanelId) {\n events.emit<PanelBlurEventPayload>({\n type: 'panel:blur',\n source: 'panel-layouts',\n timestamp: Date.now(),\n payload: {\n panelId: prevPanelId,\n panelSlot: previousPanel,\n },\n });\n }\n }\n }, [focusedPanel, onFocusChange, events, getPanelId]);\n\n const getVisiblePanels = useCallback((): PanelSlotId[] => {\n const panels: PanelSlotId[] = [];\n\n if (!collapsed.left) {\n panels.push('left');\n }\n panels.push('middle'); // Middle is always visible\n if (panelType === 'three-panel' && !collapsed.right) {\n panels.push('right');\n }\n\n return panels;\n }, [collapsed, panelType]);\n\n const focusNext = useCallback(() => {\n const visiblePanels = getVisiblePanels();\n if (visiblePanels.length === 0) return;\n\n if (focusedPanel === null) {\n // No panel focused, focus first visible panel\n setFocus(visiblePanels[0]);\n return;\n }\n\n const currentIndex = visiblePanels.indexOf(focusedPanel);\n if (currentIndex === -1) {\n // Current panel is not visible, focus first visible panel\n setFocus(visiblePanels[0]);\n return;\n }\n\n // Move to next panel (wrap around)\n const nextIndex = (currentIndex + 1) % visiblePanels.length;\n setFocus(visiblePanels[nextIndex]);\n }, [focusedPanel, getVisiblePanels, setFocus]);\n\n const focusPrevious = useCallback(() => {\n const visiblePanels = getVisiblePanels();\n if (visiblePanels.length === 0) return;\n\n if (focusedPanel === null) {\n // No panel focused, focus last visible panel\n setFocus(visiblePanels[visiblePanels.length - 1]);\n return;\n }\n\n const currentIndex = visiblePanels.indexOf(focusedPanel);\n if (currentIndex === -1) {\n // Current panel is not visible, focus last visible panel\n setFocus(visiblePanels[visiblePanels.length - 1]);\n return;\n }\n\n // Move to previous panel (wrap around)\n const prevIndex =\n currentIndex === 0 ? visiblePanels.length - 1 : currentIndex - 1;\n setFocus(visiblePanels[prevIndex]);\n }, [focusedPanel, getVisiblePanels, setFocus]);\n\n const isFocused = useCallback(\n (panel: PanelSlotId) => focusedPanel === panel,\n [focusedPanel]\n );\n\n return {\n focusedPanel,\n setFocus,\n clearFocus,\n focusNext,\n focusPrevious,\n isFocused,\n };\n}\n","/**\n * usePanelKeyboardShortcuts - Hook for keyboard shortcuts to control panel focus and collapse\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PanelSlotId } from '../types';\nimport type { PanelCollapsed } from '../../types/persistence.types';\n\nexport interface UsePanelKeyboardShortcutsOptions {\n /** Whether keyboard shortcuts are enabled */\n enabled?: boolean;\n\n /** Current focused panel */\n focusedPanel: PanelSlotId | null;\n\n /** Current collapsed state */\n collapsed: PanelCollapsed;\n\n /** Panel type (two-panel or three-panel) */\n panelType: 'two-panel' | 'three-panel';\n\n /** Set focus to a specific panel */\n setFocus: (panel: PanelSlotId) => void;\n\n /** Callback to expand a panel */\n onExpand: (panel: 'left' | 'right') => void | Promise<void>;\n\n /** Callback to collapse a panel */\n onCollapse: (panel: 'left' | 'right') => void | Promise<void>;\n}\n\n/**\n * Hook for handling Alt+1/2/3 keyboard shortcuts for panel toggle and focus\n *\n * Behavior:\n * - Alt+1 (Left Panel):\n * 1. If collapsed: expand (no focus change)\n * 2. If expanded but not focused: focus it\n * 3. If focused: collapse and focus middle\n *\n * - Alt+2 (Middle Panel):\n * - Always focus middle (never collapses)\n *\n * - Alt+3 (Right Panel):\n * 1. If collapsed: expand (no focus change)\n * 2. If expanded but not focused: focus it\n * 3. If focused: collapse and focus middle\n */\nexport function usePanelKeyboardShortcuts(\n options: UsePanelKeyboardShortcutsOptions\n): void {\n const {\n enabled = true,\n focusedPanel,\n collapsed,\n panelType,\n setFocus,\n onExpand,\n onCollapse,\n } = options;\n\n // Use refs to avoid recreating event listener on every render\n const focusedPanelRef = useRef(focusedPanel);\n const collapsedRef = useRef(collapsed);\n const panelTypeRef = useRef(panelType);\n\n useEffect(() => {\n focusedPanelRef.current = focusedPanel;\n }, [focusedPanel]);\n\n useEffect(() => {\n collapsedRef.current = collapsed;\n }, [collapsed]);\n\n useEffect(() => {\n panelTypeRef.current = panelType;\n }, [panelType]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Only handle Alt+Number shortcuts\n if (!event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // Use event.code instead of event.key to handle international keyboards\n // event.code gives us 'Digit1', 'Digit2', etc. regardless of keyboard layout\n const code = event.code;\n const currentFocused = focusedPanelRef.current;\n const currentCollapsed = collapsedRef.current;\n const currentPanelType = panelTypeRef.current;\n\n // Alt+1: Toggle left panel\n if (code === 'Digit1' || code === 'Numpad1') {\n event.preventDefault();\n\n if (currentCollapsed.left) {\n // State 1: Collapsed -> Expand (no focus change)\n onExpand('left');\n } else if (currentFocused !== 'left') {\n // State 2: Expanded but not focused -> Focus\n setFocus('left');\n } else {\n // State 3: Focused -> Collapse and focus middle\n onCollapse('left');\n setFocus('middle');\n }\n }\n // Alt+2: Focus middle panel\n else if (code === 'Digit2' || code === 'Numpad2') {\n event.preventDefault();\n setFocus('middle');\n }\n // Alt+3: Toggle right panel (only for three-panel layouts)\n else if ((code === 'Digit3' || code === 'Numpad3') && currentPanelType === 'three-panel') {\n event.preventDefault();\n\n if (currentCollapsed.right) {\n // State 1: Collapsed -> Expand (no focus change)\n onExpand('right');\n } else if (currentFocused !== 'right') {\n // State 2: Expanded but not focused -> Focus\n setFocus('right');\n } else {\n // State 3: Focused -> Collapse and focus middle\n onCollapse('right');\n setFocus('middle');\n }\n }\n },\n [setFocus, onExpand, onCollapse]\n );\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [enabled, handleKeyDown]);\n}\n","/**\n * usePanelFocusListener - Helper hook for panels to listen to focus events\n */\n\nimport { useEffect } from 'react';\nimport type {\n PanelEventEmitter,\n PanelFocusEventPayload,\n PanelBlurEventPayload,\n} from '@principal-ade/panel-framework-core';\n\n/**\n * Hook for panels to listen to focus events from the framework\n *\n * This is a convenience hook that panels can use to respond to focus changes\n * from keyboard shortcuts, mouse clicks, or programmatic navigation.\n *\n * @param panelId - The ID of this panel (from panel metadata)\n * @param events - Event emitter from PanelComponentProps\n * @param onFocus - Callback when this panel receives focus\n * @param onBlur - Optional callback when this panel loses focus\n *\n * @example\n * ```typescript\n * function TerminalPanel({ context, actions, events }: PanelComponentProps) {\n * const xtermRef = useRef<Terminal>();\n *\n * usePanelFocusListener(\n * 'terminal',\n * events,\n * () => xtermRef.current?.focus(),\n * () => xtermRef.current?.blur()\n * );\n *\n * return <div id=\"xterm-container\" />;\n * }\n * ```\n */\nexport function usePanelFocusListener(\n panelId: string,\n events: PanelEventEmitter,\n onFocus: () => void,\n onBlur?: () => void\n): void {\n useEffect(() => {\n // Listen for focus events\n const unsubscribeFocus = events.on<PanelFocusEventPayload>(\n 'panel:focus',\n (event) => {\n if (event.payload.panelId === panelId) {\n onFocus();\n }\n }\n );\n\n // Listen for blur events (optional)\n let unsubscribeBlur: (() => void) | undefined;\n if (onBlur) {\n unsubscribeBlur = events.on<PanelBlurEventPayload>(\n 'panel:blur',\n (event) => {\n if (event.payload.panelId === panelId) {\n onBlur();\n }\n }\n );\n }\n\n return () => {\n unsubscribeFocus();\n unsubscribeBlur?.();\n };\n }, [panelId, events, onFocus, onBlur]);\n}\n","/**\n * FocusIndicator - Visual indicator for focused panel\n */\n\nimport React from 'react';\n\nexport interface FocusIndicatorProps {\n /** Whether this panel is currently focused */\n isFocused: boolean;\n\n /** Custom class name */\n className?: string;\n\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Visual indicator that highlights the focused panel\n *\n * Renders a subtle border/glow around the focused panel for keyboard navigation feedback\n */\nexport const FocusIndicator: React.FC<FocusIndicatorProps> = ({\n isFocused,\n className = '',\n style = {},\n}) => {\n if (!isFocused) {\n return null;\n }\n\n const defaultStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n border: '2px solid var(--panel-focus-border-color, #0066cc)',\n borderRadius: '4px',\n boxShadow: '0 0 0 1px var(--panel-focus-shadow-color, rgba(0, 102, 204, 0.2))',\n zIndex: 1000,\n transition: 'opacity 0.15s ease-in-out',\n ...style,\n };\n\n return (\n <div\n className={`panel-focus-indicator ${className}`}\n style={defaultStyles}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n );\n};\n","/**\n * FocusModeOverlay - Calming overlay animations for focus mode\n *\n * Visual styles to dim/hide non-focused panels\n */\n\nimport React, { useEffect, useState } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\nexport type OverlayVariant = 'soft-fade' | 'cascading-fade';\n\nexport type OverlayEffect = 'vignette-drift' | 'radial-breathing' | 'snowfall';\n\nexport interface FocusModeOverlayProps {\n /** Whether the overlay is active/visible */\n active: boolean;\n\n /** Visual style variant */\n variant?: OverlayVariant;\n\n /** Optional subtle animation effects (can combine multiple) */\n effects?: OverlayEffect[];\n\n /** Base opacity when fully visible (0-1), default 0.95 */\n opacity?: number;\n\n /** Animation duration in ms */\n animationDuration?: number;\n\n /** For cascading-fade: delay before this overlay starts (ms) */\n cascadeDelay?: number;\n\n /** Custom overlay color (overrides theme color) */\n color?: string;\n\n /** Custom class name */\n className?: string;\n\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n// CSS keyframes as a style element (injected once)\nconst KEYFRAMES_ID = 'focus-mode-overlay-keyframes';\n\nconst injectKeyframes = () => {\n if (typeof document === 'undefined') return;\n if (document.getElementById(KEYFRAMES_ID)) return;\n\n const style = document.createElement('style');\n style.id = KEYFRAMES_ID;\n style.textContent = `\n @keyframes focus-overlay-vignette-drift {\n 0%, 100% {\n background-position: 50% 50%;\n transform: scale(1);\n }\n 25% {\n background-position: 20% 30%;\n transform: scale(1.1);\n }\n 50% {\n background-position: 80% 70%;\n transform: scale(1.05);\n }\n 75% {\n background-position: 70% 20%;\n transform: scale(1.15);\n }\n }\n\n @keyframes focus-overlay-radial-breathing {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.4;\n transform: scale(1.3);\n }\n }\n\n @keyframes focus-overlay-snowfall-1 {\n from { background-position: 0px 0px; }\n to { background-position: 0px 150px; }\n }\n @keyframes focus-overlay-snowfall-2 {\n from { background-position: 0px 0px; }\n to { background-position: 0px 150px; }\n }\n @keyframes focus-overlay-snowfall-3 {\n from { background-position: 0px 0px; }\n to { background-position: 0px 150px; }\n }\n\n `;\n document.head.appendChild(style);\n};\n\n/**\n * Overlay component that dims panels during focus mode\n *\n * Supports multiple calming animation styles:\n * - soft-fade: Simple opacity transition\n * - cascading-fade: Staggered fade-in timing\n *\n * Optional effects (can be combined):\n * - noise: Subtle film grain texture\n * - vignette-drift: Slow-moving darker edges\n * - radial-breathing: Gentle center-to-edge pulse\n */\nexport const FocusModeOverlay: React.FC<FocusModeOverlayProps> = ({\n active,\n variant = 'soft-fade',\n effects = [],\n opacity = 0.95,\n animationDuration = 300,\n cascadeDelay = 0,\n color,\n className = '',\n style = {},\n}) => {\n const { theme } = useTheme();\n const [isVisible, setIsVisible] = useState(false);\n\n // Inject keyframes on mount\n useEffect(() => {\n injectKeyframes();\n }, []);\n\n // Handle mount/unmount animation\n useEffect(() => {\n if (active) {\n const timer = setTimeout(() => setIsVisible(true), cascadeDelay);\n return () => clearTimeout(timer);\n } else {\n setIsVisible(false);\n }\n }, [active, cascadeDelay]);\n\n // Use theme background color, fallback to dark color if no theme\n const baseColor = color || theme.colors.background;\n\n const getVariantStyles = (): React.CSSProperties => {\n switch (variant) {\n case 'soft-fade':\n return {\n backgroundColor: baseColor,\n opacity: isVisible ? opacity : 0,\n transition: `opacity ${animationDuration}ms ease-out`,\n };\n\n case 'cascading-fade':\n return {\n backgroundColor: baseColor,\n opacity: isVisible ? opacity : 0,\n transition: `opacity ${animationDuration}ms ease-out`,\n transitionDelay: isVisible ? '0ms' : `${cascadeDelay}ms`,\n };\n\n default:\n return {\n backgroundColor: baseColor,\n opacity: isVisible ? opacity : 0,\n transition: `opacity ${animationDuration}ms ease-out`,\n };\n }\n };\n\n const baseStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n zIndex: 999,\n overflow: 'hidden',\n ...getVariantStyles(),\n ...style,\n };\n\n // Effect layer styles\n const hasVignetteDrift = effects.includes('vignette-drift');\n const hasRadialBreathing = effects.includes('radial-breathing');\n const hasSnowfall = effects.includes('snowfall');\n\n // Helper to convert hex to rgba\n const hexToRgba = (hex: string, alpha: number): string => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return `rgba(255, 255, 255, ${alpha})`;\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n };\n\n // Use theme's primary color for effects\n const effectColor = theme.colors.primary;\n\n // Vignette drift - visible moving circular glow using theme primary color\n const vignetteDriftStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n opacity: isVisible ? 1 : 0,\n transition: `opacity ${animationDuration}ms ease-out`,\n background: `radial-gradient(circle at 50% 50%, ${hexToRgba(effectColor, 0.12)} 0%, ${hexToRgba(effectColor, 0.06)} 25%, transparent 50%)`,\n backgroundSize: '150% 150%',\n animation: isVisible ? 'focus-overlay-vignette-drift 12s ease-in-out infinite' : 'none',\n };\n\n // Radial breathing - visible pulsing circular glow using theme primary color\n const radialBreathingStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n opacity: isVisible ? 1 : 0,\n transition: `opacity ${animationDuration}ms ease-out`,\n background: `radial-gradient(circle at center, ${hexToRgba(effectColor, 0.15)} 0%, ${hexToRgba(effectColor, 0.06)} 30%, transparent 55%)`,\n animation: isVisible ? 'focus-overlay-radial-breathing 4s ease-in-out infinite' : 'none',\n };\n\n // Snowfall - gentle falling particles using theme primary color\n // Uses 3 layers at different speeds for depth, background-position animation for seamless loop\n const snowflakeColor = hexToRgba(effectColor, 0.6);\n const snowflakeColorMid = hexToRgba(effectColor, 0.4);\n const snowflakeColorFaint = hexToRgba(effectColor, 0.25);\n\n const snowfallBaseStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n opacity: isVisible ? 1 : 0,\n transition: `opacity ${animationDuration}ms ease-out`,\n };\n\n // Layer 1 - closest/fastest (larger particles)\n const snowfallLayer1Styles: React.CSSProperties = {\n ...snowfallBaseStyles,\n background: `\n radial-gradient(circle, ${snowflakeColor} 0%, ${snowflakeColor} 3px, transparent 3px),\n radial-gradient(circle, ${snowflakeColor} 0%, ${snowflakeColor} 3px, transparent 3px),\n radial-gradient(circle, ${snowflakeColor} 0%, ${snowflakeColor} 3px, transparent 3px),\n radial-gradient(circle, ${snowflakeColor} 0%, ${snowflakeColor} 3px, transparent 3px)\n `,\n backgroundSize: '150px 150px',\n backgroundPosition: '10px 20px, 60px 80px, 110px 40px, 40px 120px',\n animation: isVisible ? 'focus-overlay-snowfall-1 4s linear infinite' : 'none',\n };\n\n // Layer 2 - middle depth\n const snowfallLayer2Styles: React.CSSProperties = {\n ...snowfallBaseStyles,\n background: `\n radial-gradient(circle, ${snowflakeColorMid} 0%, ${snowflakeColorMid} 2px, transparent 2px),\n radial-gradient(circle, ${snowflakeColorMid} 0%, ${snowflakeColorMid} 2px, transparent 2px),\n radial-gradient(circle, ${snowflakeColorMid} 0%, ${snowflakeColorMid} 2px, transparent 2px),\n radial-gradient(circle, ${snowflakeColorMid} 0%, ${snowflakeColorMid} 2px, transparent 2px),\n radial-gradient(circle, ${snowflakeColorMid} 0%, ${snowflakeColorMid} 2px, transparent 2px)\n `,\n backgroundSize: '150px 150px',\n backgroundPosition: '30px 10px, 90px 60px, 15px 100px, 120px 30px, 70px 130px',\n animation: isVisible ? 'focus-overlay-snowfall-2 7s linear infinite' : 'none',\n };\n\n // Layer 3 - furthest/slowest (smallest particles)\n const snowfallLayer3Styles: React.CSSProperties = {\n ...snowfallBaseStyles,\n background: `\n radial-gradient(circle, ${snowflakeColorFaint} 0%, ${snowflakeColorFaint} 1.5px, transparent 1.5px),\n radial-gradient(circle, ${snowflakeColorFaint} 0%, ${snowflakeColorFaint} 1.5px, transparent 1.5px),\n radial-gradient(circle, ${snowflakeColorFaint} 0%, ${snowflakeColorFaint} 1.5px, transparent 1.5px),\n radial-gradient(circle, ${snowflakeColorFaint} 0%, ${snowflakeColorFaint} 1.5px, transparent 1.5px),\n radial-gradient(circle, ${snowflakeColorFaint} 0%, ${snowflakeColorFaint} 1.5px, transparent 1.5px),\n radial-gradient(circle, ${snowflakeColorFaint} 0%, ${snowflakeColorFaint} 1.5px, transparent 1.5px)\n `,\n backgroundSize: '150px 150px',\n backgroundPosition: '20px 5px, 80px 45px, 45px 90px, 130px 20px, 5px 70px, 100px 110px',\n animation: isVisible ? 'focus-overlay-snowfall-3 12s linear infinite' : 'none',\n };\n\n return (\n <div\n className={`focus-mode-overlay focus-mode-overlay--${variant} ${className}`}\n style={baseStyles}\n role=\"presentation\"\n aria-hidden=\"true\"\n data-active={active}\n data-variant={variant}\n >\n {/* Effect layers */}\n {hasVignetteDrift && (\n <div\n className=\"focus-mode-overlay__vignette-drift\"\n style={vignetteDriftStyles}\n />\n )}\n {hasRadialBreathing && (\n <div\n className=\"focus-mode-overlay__radial-breathing\"\n style={radialBreathingStyles}\n />\n )}\n {hasSnowfall && (\n <>\n <div\n className=\"focus-mode-overlay__snowfall-layer-3\"\n style={snowfallLayer3Styles}\n />\n <div\n className=\"focus-mode-overlay__snowfall-layer-2\"\n style={snowfallLayer2Styles}\n />\n <div\n className=\"focus-mode-overlay__snowfall-layer-1\"\n style={snowfallLayer1Styles}\n />\n </>\n )}\n </div>\n );\n};\n\nexport default FocusModeOverlay;\n","import React, { useRef, useEffect } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { AgentCommandInputProps } from '../types';\n\n/**\n * AgentCommandInput - Input field for the Agent Command Palette\n * Supports natural language mode and quick command mode (/ prefix)\n */\nexport const AgentCommandInput: React.FC<AgentCommandInputProps> = ({\n value,\n onChange,\n onSubmit,\n onClose,\n onHistoryPrevious,\n onHistoryNext,\n mode,\n status,\n placeholder = 'What would you like to do?',\n disabled = false,\n autoFocus = true,\n agentAvailable = true,\n showAutocomplete = false,\n onAutocompleteNext,\n onAutocompletePrevious,\n onAutocompleteAccept,\n}) => {\n const { theme } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto-focus on mount\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus();\n }\n }, [autoFocus]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Stop propagation to prevent Storybook/parent shortcuts from interfering\n e.stopPropagation();\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault();\n onSubmit();\n break;\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'Tab':\n // Tab accepts autocomplete selection\n if (showAutocomplete && onAutocompleteAccept) {\n e.preventDefault();\n onAutocompleteAccept();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n // Use autocomplete navigation when dropdown is showing\n if (showAutocomplete && onAutocompletePrevious) {\n onAutocompletePrevious();\n } else {\n onHistoryPrevious();\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n // Use autocomplete navigation when dropdown is showing\n if (showAutocomplete && onAutocompleteNext) {\n onAutocompleteNext();\n } else {\n onHistoryNext();\n }\n break;\n }\n };\n\n const isProcessing = status === 'thinking' || status === 'executing';\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: theme.colors.background,\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n {/* Mode indicator */}\n <span\n style={{\n color: mode === 'quick-command'\n ? theme.colors.info\n : agentAvailable\n ? theme.colors.primary\n : theme.colors.textMuted,\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {mode === 'quick-command' ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Terminal icon */}\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n ) : agentAvailable ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Bot icon */}\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\" />\n <circle cx=\"12\" cy=\"5\" r=\"2\" />\n <path d=\"M12 7v4\" />\n <line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"16\" />\n <line x1=\"16\" y1=\"16\" x2=\"16\" y2=\"16\" />\n </svg>\n ) : (\n '>'\n )}\n </span>\n\n {/* Input field */}\n <input\n ref={inputRef}\n data-agent-command-palette-input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isProcessing}\n style={{\n flex: 1,\n backgroundColor: 'transparent',\n border: 'none',\n outline: 'none',\n color: theme.colors.text,\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n caretColor: theme.colors.primary,\n }}\n />\n\n {/* Status indicator */}\n {isProcessing && (\n <span\n style={{\n color: theme.colors.info,\n fontSize: theme.fontSizes[0],\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <span\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: theme.colors.info,\n animation: 'pulse 1s ease-in-out infinite',\n }}\n />\n {status === 'thinking' ? 'Thinking...' : 'Executing...'}\n </span>\n )}\n\n {/* Keyboard hint */}\n {!isProcessing && (\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n }}\n >\n Alt+P\n </kbd>\n )}\n </div>\n );\n};\n\nAgentCommandInput.displayName = 'AgentCommandInput';\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { ToolExecutionListProps, ToolExecution } from '../types';\n\n/**\n * Status icon for tool execution\n */\nconst StatusIcon: React.FC<{ status: ToolExecution['status'] }> = ({ status }) => {\n const { theme } = useTheme();\n\n const iconStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n fontSize: theme.fontSizes[0],\n };\n\n switch (status) {\n case 'pending':\n return (\n <span style={{ ...iconStyle, color: theme.colors.textMuted }}>○</span>\n );\n case 'running':\n return (\n <span\n style={{\n ...iconStyle,\n color: theme.colors.info,\n animation: 'spin 1s linear infinite',\n }}\n >\n ◐\n </span>\n );\n case 'success':\n return (\n <span style={{ ...iconStyle, color: theme.colors.success }}>✓</span>\n );\n case 'error':\n return (\n <span style={{ ...iconStyle, color: theme.colors.error }}>✗</span>\n );\n }\n};\n\n/**\n * Format tool arguments for display\n */\nconst formatArgs = (args: Record<string, unknown>): string => {\n const entries = Object.entries(args);\n if (entries.length === 0) return '';\n\n return entries\n .map(([key, value]) => {\n if (key === 'args' && Array.isArray(value)) {\n return value.join(', ');\n }\n if (typeof value === 'string') {\n return `\"${value}\"`;\n }\n return JSON.stringify(value);\n })\n .join(', ');\n};\n\n/**\n * Single tool execution item\n */\nconst ToolExecutionItem: React.FC<{\n tool: ToolExecution;\n compact?: boolean;\n}> = ({ tool, compact }) => {\n const { theme } = useTheme();\n\n const args = formatArgs(tool.args);\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: compact ? '4px 0' : '8px 0',\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n }}\n >\n <StatusIcon status={tool.status} />\n\n <span style={{ color: theme.colors.text }}>\n {tool.name}\n {args && (\n <span style={{ color: theme.colors.textMuted }}>({args})</span>\n )}\n </span>\n\n {tool.status === 'running' && (\n <span\n style={{\n marginLeft: 'auto',\n color: theme.colors.info,\n fontSize: theme.fontSizes[0],\n }}\n >\n [running]\n </span>\n )}\n\n {tool.status === 'success' && (\n <span\n style={{\n marginLeft: 'auto',\n color: theme.colors.success,\n fontSize: theme.fontSizes[0],\n }}\n >\n [done]\n </span>\n )}\n\n {tool.status === 'error' && (\n <span\n style={{\n marginLeft: 'auto',\n color: theme.colors.error,\n fontSize: theme.fontSizes[0],\n }}\n title={tool.error}\n >\n [error]\n </span>\n )}\n </div>\n );\n};\n\n/**\n * ToolExecutionList - Displays the list of tools being executed\n */\nexport const ToolExecutionList: React.FC<ToolExecutionListProps> = ({\n tools,\n compact = false,\n}) => {\n const { theme } = useTheme();\n\n if (tools.length === 0) {\n return null;\n }\n\n return (\n <div\n style={{\n padding: compact ? '8px 16px' : '12px 16px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '4px',\n margin: '8px 16px',\n }}\n >\n {tools.map((tool) => (\n <ToolExecutionItem key={tool.id} tool={tool} compact={compact} />\n ))}\n </div>\n );\n};\n\nToolExecutionList.displayName = 'ToolExecutionList';\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { AgentResponseDisplayProps } from '../types';\n\n/**\n * AgentResponseDisplay - Shows the agent's text response\n */\nexport const AgentResponseDisplay: React.FC<AgentResponseDisplayProps> = ({\n response,\n streaming = false,\n}) => {\n const { theme } = useTheme();\n\n if (!response) {\n return null;\n }\n\n // Determine if this is a success or error message\n const isError = response.toLowerCase().startsWith('error');\n const isSuccess = response.toLowerCase().startsWith('done') ||\n response.toLowerCase().startsWith('executed');\n\n return (\n <div\n style={{\n padding: '12px 16px',\n color: isError\n ? theme.colors.error\n : isSuccess\n ? theme.colors.success\n : theme.colors.text,\n fontSize: theme.fontSizes[1],\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}\n >\n {isSuccess && <span>✓</span>}\n {isError && <span>✗</span>}\n\n <span>\n {response}\n {streaming && (\n <span\n style={{\n display: 'inline-block',\n width: '2px',\n height: '14px',\n backgroundColor: theme.colors.primary,\n marginLeft: '2px',\n animation: 'blink 1s step-end infinite',\n }}\n />\n )}\n </span>\n </div>\n );\n};\n\nAgentResponseDisplay.displayName = 'AgentResponseDisplay';\n","import React, { useEffect, useRef } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { QuickCommandMatch, QuickCommandArg, ArgumentOptionMatch } from '../types';\n\nexport interface QuickCommandAutocompleteProps {\n /** Matched commands to display */\n matches: QuickCommandMatch[];\n /** Matched argument options to display (when entering args) */\n argumentMatches?: ArgumentOptionMatch[];\n /** Current argument definition (when entering args) */\n currentArg?: QuickCommandArg | null;\n /** Whether we're in argument entry mode */\n isEnteringArgs?: boolean;\n /** Currently selected index */\n selectedIndex: number;\n /** Called when a command is clicked */\n onSelect: (index: number) => void;\n /** Maximum number of visible items before scrolling */\n maxVisible?: number;\n}\n\n/**\n * Renders highlighted text based on matched indices\n */\nfunction HighlightedText({\n text,\n matchedIndices,\n highlightColor,\n}: {\n text: string;\n matchedIndices: number[];\n highlightColor: string;\n}) {\n if (!matchedIndices.length) {\n return <>{text}</>;\n }\n\n const matchSet = new Set(matchedIndices);\n const chars = text.split('');\n\n return (\n <>\n {chars.map((char, i) => (\n <span\n key={i}\n style={{\n color: matchSet.has(i) ? highlightColor : 'inherit',\n fontWeight: matchSet.has(i) ? 600 : 'inherit',\n }}\n >\n {char}\n </span>\n ))}\n </>\n );\n}\n\n/**\n * QuickCommandAutocomplete - Dropdown showing fuzzy-matched quick commands or argument options\n */\nexport const QuickCommandAutocomplete: React.FC<QuickCommandAutocompleteProps> = ({\n matches,\n argumentMatches = [],\n currentArg,\n isEnteringArgs = false,\n selectedIndex,\n onSelect,\n maxVisible = 6,\n}) => {\n const { theme } = useTheme();\n const listRef = useRef<HTMLDivElement>(null);\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Scroll selected item into view\n useEffect(() => {\n if (selectedRef.current && listRef.current) {\n selectedRef.current.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n }, [selectedIndex]);\n\n // Render argument options mode\n if (isEnteringArgs && argumentMatches.length > 0) {\n const itemHeight = 40;\n const maxHeight = itemHeight * maxVisible;\n\n return (\n <div\n ref={listRef}\n style={{\n maxHeight: `${maxHeight}px`,\n overflowY: 'auto',\n borderTop: `1px solid ${theme.colors.border}`,\n }}\n >\n {/* Header showing which argument we're entering */}\n {currentArg && (\n <div\n style={{\n padding: '8px 16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.backgroundSecondary,\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n <span style={{ color: theme.colors.textSecondary }}>\n {currentArg.name}\n </span>\n {currentArg.description && (\n <span style={{ marginLeft: '8px' }}>\n — {currentArg.description}\n </span>\n )}\n </div>\n )}\n\n {argumentMatches.map((match, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <div\n key={`${match.option}-${index}`}\n ref={isSelected ? selectedRef : undefined}\n onClick={() => onSelect(index)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n cursor: 'pointer',\n backgroundColor: isSelected\n ? theme.colors.backgroundSecondary\n : 'transparent',\n borderLeft: isSelected\n ? `2px solid ${theme.colors.primary}`\n : '2px solid transparent',\n transition: 'background-color 100ms ease',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundSecondary;\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {/* Option value with highlighting */}\n <span\n style={{\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n color: theme.colors.text,\n flex: 1,\n }}\n >\n <HighlightedText\n text={match.option}\n matchedIndices={match.matchedIndices}\n highlightColor={theme.colors.primary}\n />\n </span>\n\n {/* Keyboard hint for selected */}\n {isSelected && (\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundTertiary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n flexShrink: 0,\n }}\n >\n Tab\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n\n // Render command matches mode\n if (matches.length === 0) {\n return null;\n }\n\n const itemHeight = 48; // Approximate height per item\n const maxHeight = itemHeight * maxVisible;\n\n return (\n <div\n ref={listRef}\n style={{\n maxHeight: `${maxHeight}px`,\n overflowY: 'auto',\n borderTop: `1px solid ${theme.colors.border}`,\n }}\n >\n {matches.map((match, index) => {\n const isSelected = index === selectedIndex;\n const command = match.command;\n\n return (\n <div\n key={`${command.name}-${index}`}\n ref={isSelected ? selectedRef : undefined}\n onClick={() => onSelect(index)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 16px',\n cursor: 'pointer',\n backgroundColor: isSelected\n ? theme.colors.backgroundSecondary\n : 'transparent',\n borderLeft: isSelected\n ? `2px solid ${theme.colors.primary}`\n : '2px solid transparent',\n transition: 'background-color 100ms ease',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundSecondary;\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {/* Command indicator */}\n <span\n style={{\n color: theme.colors.info,\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n flexShrink: 0,\n }}\n >\n /\n </span>\n\n {/* Command name with highlighting */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontFamily: theme.fonts.monospace,\n fontSize: theme.fontSizes[1],\n color: theme.colors.text,\n }}\n >\n <HighlightedText\n text={command.name}\n matchedIndices={match.matchedOn === command.name ? match.matchedIndices : []}\n highlightColor={theme.colors.primary}\n />\n {/* Show alias if matched on alias */}\n {match.matchedOn !== command.name && (\n <span\n style={{\n color: theme.colors.textMuted,\n marginLeft: '8px',\n fontSize: theme.fontSizes[0],\n }}\n >\n (alias: {match.matchedOn})\n </span>\n )}\n </div>\n <div\n style={{\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n marginTop: '2px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {command.description}\n </div>\n </div>\n\n {/* Args hint */}\n {command.args && command.args.length > 0 && (\n <div\n style={{\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n fontFamily: theme.fonts.monospace,\n flexShrink: 0,\n }}\n >\n {command.args.map((arg: QuickCommandArg, i: number) => (\n <span key={arg.name}>\n {i > 0 && ' '}\n <span\n style={{\n color: arg.required\n ? theme.colors.warning\n : theme.colors.textMuted,\n }}\n >\n {arg.required ? `<${arg.name}>` : `[${arg.name}]`}\n </span>\n </span>\n ))}\n </div>\n )}\n\n {/* Keyboard hint for selected */}\n {isSelected && (\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundTertiary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n flexShrink: 0,\n }}\n >\n Tab\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nQuickCommandAutocomplete.displayName = 'QuickCommandAutocomplete';\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { AgentCommandPaletteProps } from '../types';\nimport { AgentCommandInput } from './AgentCommandInput';\nimport { ToolExecutionList } from './ToolExecutionList';\nimport { AgentResponseDisplay } from './AgentResponseDisplay';\nimport { QuickCommandAutocomplete } from './QuickCommandAutocomplete';\n\n/**\n * AgentCommandPalette - AI-driven command palette component\n *\n * Displays at the bottom of the screen with an input field.\n * Users can type natural language requests or quick commands (prefixed with /).\n */\nexport const AgentCommandPalette: React.FC<AgentCommandPaletteProps> = ({\n palette,\n config,\n}) => {\n const { theme } = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n isOpen,\n close,\n query,\n setQuery,\n mode,\n status,\n pendingTools,\n completedTools,\n agentResponse,\n submit,\n historyPrevious,\n historyNext,\n suggestions,\n agentAvailable,\n // Autocomplete\n quickCommandMatches,\n argumentOptionMatches,\n parsedQuery,\n currentArgDef,\n selectedAutocompleteIndex,\n autocompleteNext,\n autocompletePrevious,\n autocompleteAccept,\n showAutocomplete,\n } = palette;\n\n // Handle click outside to close\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n close();\n }\n };\n\n // Add a small delay to prevent immediate close on open\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, close]);\n\n // Animation state for slide-up/down effect\n const [isVisible, setIsVisible] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // Mount first, then animate in\n setShouldRender(true);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n });\n } else {\n // Animate out first, then unmount\n setIsVisible(false);\n const timer = setTimeout(() => {\n setShouldRender(false);\n }, 150); // Match transition duration\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n if (!shouldRender) {\n return null;\n }\n\n const placeholder = agentAvailable\n ? (config?.placeholder || 'What would you like to do?')\n : 'Quick command mode (agent unavailable)';\n const allTools = [...completedTools, ...pendingTools];\n const showTools = allTools.length > 0;\n const showResponse = agentResponse && status !== 'idle';\n // Only show natural language suggestions when agent is available\n const showSuggestions = agentAvailable && !query && status === 'idle' && suggestions.length > 0;\n // Show quick command help when in quick-command mode OR when agent is unavailable\n const showQuickCommandHelp = (mode === 'quick-command' || !agentAvailable) && status === 'idle';\n const showAgentUnavailable = !agentAvailable && mode !== 'quick-command' && status === 'idle';\n\n return (\n <>\n {/* Backdrop (invisible, just for click-outside handling) */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999,\n }}\n onClick={close}\n />\n\n {/* Command Palette Container */}\n <div\n ref={containerRef}\n className={config?.className}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n maxHeight: '50vh',\n backgroundColor: theme.colors.background,\n borderTop: `1px solid ${theme.colors.border}`,\n boxShadow: theme.shadows[2],\n zIndex: 1000,\n display: 'flex',\n flexDirection: 'column-reverse',\n overflow: 'hidden',\n transform: isVisible ? 'translateY(0)' : 'translateY(100%)',\n transition: 'transform 150ms ease-out',\n ...config?.style,\n }}\n >\n {/* Input Section (at bottom due to column-reverse) */}\n <div>\n <AgentCommandInput\n value={query}\n onChange={setQuery}\n onSubmit={submit}\n onClose={close}\n onHistoryPrevious={historyPrevious}\n onHistoryNext={historyNext}\n mode={mode}\n status={status}\n placeholder={placeholder}\n agentAvailable={agentAvailable}\n showAutocomplete={showAutocomplete}\n onAutocompleteNext={autocompleteNext}\n onAutocompletePrevious={autocompletePrevious}\n onAutocompleteAccept={autocompleteAccept}\n />\n\n {/* Footer with keyboard hints */}\n <div\n style={{\n padding: '8px 16px',\n borderTop: `1px solid ${theme.colors.border}`,\n display: 'flex',\n gap: '16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.background,\n }}\n >\n <span>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n Enter\n </kbd>{' '}\n Execute\n </span>\n <span>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n Esc\n </kbd>{' '}\n Close\n </span>\n <span>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n ↑↓\n </kbd>{' '}\n History\n </span>\n <span style={{ marginLeft: 'auto' }}>\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n /\n </kbd>{' '}\n Quick command\n </span>\n </div>\n </div>\n\n {/* Content Section (appears above input due to column-reverse) */}\n <div style={{ overflow: 'auto' }}>\n {/* Tool Execution List */}\n {showTools && (\n <ToolExecutionList tools={allTools} compact={allTools.length > 3} />\n )}\n\n {/* Agent Response */}\n {showResponse && (\n <AgentResponseDisplay\n response={agentResponse}\n streaming={status === 'thinking'}\n />\n )}\n\n {/* Suggestions (when idle and no query) */}\n {showSuggestions && (\n <div\n style={{\n padding: '12px 16px',\n display: 'flex',\n gap: '8px',\n flexWrap: 'wrap',\n }}\n >\n <span\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSizes[0],\n marginRight: '4px',\n }}\n >\n Try:\n </span>\n {suggestions.map((suggestion, index) => (\n <button\n key={index}\n onClick={() => {\n setQuery(suggestion);\n }}\n style={{\n padding: '4px 10px',\n backgroundColor: theme.colors.backgroundSecondary,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: '12px',\n color: theme.colors.textSecondary,\n fontSize: theme.fontSizes[0],\n cursor: 'pointer',\n transition: 'background-color 150ms ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundTertiary;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundSecondary;\n }}\n >\n \"{suggestion}\"\n </button>\n ))}\n </div>\n )}\n\n {/* Agent Unavailable Notice */}\n {showAgentUnavailable && (\n <div\n style={{\n padding: '12px 16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.warning,\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}\n >\n <span>Agent unavailable.</span>\n <span style={{ color: theme.colors.textMuted }}>\n Use quick commands (start with <kbd style={{\n padding: '2px 6px',\n backgroundColor: theme.colors.backgroundSecondary,\n borderRadius: '3px',\n border: `1px solid ${theme.colors.border}`,\n }}>/</kbd>)\n </span>\n </div>\n )}\n\n {/* Quick Command Help */}\n {showQuickCommandHelp && (\n <div\n style={{\n padding: '12px 16px',\n fontSize: theme.fontSizes[0],\n color: theme.colors.textMuted,\n fontFamily: theme.fonts.monospace,\n }}\n >\n <div style={{ marginBottom: '8px', color: theme.colors.textSecondary }}>\n Quick commands:\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <div>\n <span style={{ color: theme.colors.info }}>/toggle</span>{' '}\n <span style={{ color: theme.colors.textMuted }}><left|right></span>{' '}\n - Toggle sidebar visibility\n </div>\n <div>\n <span style={{ color: theme.colors.info }}>/switch</span>{' '}\n <span style={{ color: theme.colors.textMuted }}><slot> <panel></span>{' '}\n - Switch panel content\n </div>\n <div>\n <span style={{ color: theme.colors.info }}>/collapse</span>{' '}\n - Collapse all sidebars\n </div>\n <div>\n <span style={{ color: theme.colors.info }}>/expand</span>{' '}\n - Expand all sidebars\n </div>\n </div>\n </div>\n )}\n\n {/* Quick Command Autocomplete */}\n {showAutocomplete && (\n <QuickCommandAutocomplete\n matches={quickCommandMatches}\n argumentMatches={argumentOptionMatches}\n currentArg={currentArgDef}\n isEnteringArgs={parsedQuery.isEnteringArgs}\n selectedIndex={selectedAutocompleteIndex}\n onSelect={(index) => {\n // Handle argument option click\n if (parsedQuery.isEnteringArgs) {\n const match = argumentOptionMatches[index];\n if (match) {\n let newQuery = `/${parsedQuery.commandName}`;\n for (const arg of parsedQuery.enteredArgs) {\n newQuery += ` ${arg}`;\n }\n newQuery += ` ${match.option}`;\n const nextArgIndex = parsedQuery.currentArgIndex + 1;\n const hasMoreArgs = parsedQuery.command?.args && nextArgIndex < parsedQuery.command.args.length;\n if (hasMoreArgs) {\n newQuery += ' ';\n }\n setQuery(newQuery);\n }\n return;\n }\n // Handle command click\n const match = quickCommandMatches[index];\n if (match) {\n const command = match.command;\n let newQuery = `/${command.name}`;\n if (command.args && command.args.length > 0) {\n newQuery += ' ';\n }\n setQuery(newQuery);\n }\n }}\n />\n )}\n </div>\n </div>\n\n {/* CSS animations */}\n <style>\n {`\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n `}\n </style>\n </>\n );\n};\n\nAgentCommandPalette.displayName = 'AgentCommandPalette';\n","import type { QuickCommand, QuickCommandMatch, ArgumentOptionMatch, ParsedCommandQuery } from '../types';\n\n/**\n * Fuzzy match a query against a target string.\n * Returns score and matched indices, or null if no match.\n */\nexport function fuzzyMatch(\n query: string,\n target: string\n): { score: number; matchedIndices: number[] } | null {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Empty query matches everything with low score\n if (!queryLower) {\n return { score: 0, matchedIndices: [] };\n }\n\n const matchedIndices: number[] = [];\n let queryIndex = 0;\n let score = 0;\n let consecutiveMatches = 0;\n let lastMatchIndex = -1;\n\n for (let i = 0; i < targetLower.length && queryIndex < queryLower.length; i++) {\n if (targetLower[i] === queryLower[queryIndex]) {\n matchedIndices.push(i);\n\n // Bonus for consecutive matches\n if (lastMatchIndex === i - 1) {\n consecutiveMatches++;\n score += consecutiveMatches * 2;\n } else {\n consecutiveMatches = 1;\n }\n\n // Bonus for matching at start\n if (i === 0) {\n score += 10;\n }\n\n // Bonus for matching after separator (_, -, space)\n if (i > 0 && /[_\\-\\s]/.test(target[i - 1])) {\n score += 5;\n }\n\n // Base score for match\n score += 1;\n\n lastMatchIndex = i;\n queryIndex++;\n }\n }\n\n // Must match all query characters\n if (queryIndex < queryLower.length) {\n return null;\n }\n\n // Penalty for longer targets (prefer shorter, more specific matches)\n score -= target.length * 0.1;\n\n // Bonus for exact match\n if (queryLower === targetLower) {\n score += 20;\n }\n\n // Bonus for prefix match\n if (targetLower.startsWith(queryLower)) {\n score += 15;\n }\n\n return { score, matchedIndices };\n}\n\n/**\n * Search quick commands using fuzzy matching.\n * Returns sorted matches with scores.\n */\nexport function searchQuickCommands(\n query: string,\n commands: QuickCommand[],\n maxResults: number = 10\n): QuickCommandMatch[] {\n // Remove leading slash if present\n const searchQuery = query.replace(/^\\//, '').trim();\n\n if (!searchQuery) {\n // Return all commands with base score when no query\n return commands.slice(0, maxResults).map((command) => ({\n command,\n score: 0,\n matchedIndices: [],\n matchedOn: command.name,\n }));\n }\n\n const matches: QuickCommandMatch[] = [];\n\n for (const command of commands) {\n // Try matching against name\n const nameMatch = fuzzyMatch(searchQuery, command.name);\n if (nameMatch) {\n matches.push({\n command,\n score: nameMatch.score,\n matchedIndices: nameMatch.matchedIndices,\n matchedOn: command.name,\n });\n continue;\n }\n\n // Try matching against aliases\n if (command.aliases) {\n for (const alias of command.aliases) {\n const aliasMatch = fuzzyMatch(searchQuery, alias);\n if (aliasMatch) {\n matches.push({\n command,\n score: aliasMatch.score - 2, // Slight penalty for alias match\n matchedIndices: aliasMatch.matchedIndices,\n matchedOn: alias,\n });\n break;\n }\n }\n }\n }\n\n // Sort by score (descending) and limit results\n return matches\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n\n/**\n * Parse a command query to determine command and argument state.\n * Examples:\n * \"/tog\" -> { commandName: \"tog\", isEnteringArgs: false, ... }\n * \"/toggle \" -> { commandName: \"toggle\", isEnteringArgs: true, currentArgIndex: 0, ... }\n * \"/toggle left\" -> { commandName: \"toggle\", isEnteringArgs: true, currentArgIndex: 0, currentArgValue: \"left\", ... }\n * \"/toggle left \" -> { commandName: \"toggle\", isEnteringArgs: true, currentArgIndex: 1, enteredArgs: [\"left\"], ... }\n */\nexport function parseCommandQuery(\n query: string,\n commands: QuickCommand[]\n): ParsedCommandQuery {\n // Remove leading slash\n const withoutSlash = query.replace(/^\\//, '');\n\n // Split by whitespace\n const parts = withoutSlash.split(/\\s+/);\n const commandName = parts[0] || '';\n\n // Check if query ends with space (user finished typing current token)\n const endsWithSpace = query.endsWith(' ') && query.trim().length > 0;\n\n // Find matching command (exact match on name or alias)\n const command = commands.find(\n (cmd) =>\n cmd.name.toLowerCase() === commandName.toLowerCase() ||\n cmd.aliases?.some((a) => a.toLowerCase() === commandName.toLowerCase())\n ) || null;\n\n // If no exact command match, we're still typing the command name\n if (!command) {\n return {\n commandName,\n command: null,\n enteredArgs: [],\n currentArgValue: '',\n currentArgIndex: -1,\n isEnteringArgs: false,\n };\n }\n\n // We have a command match - determine argument state\n const argTokens = parts.slice(1);\n\n // If ends with space, we've completed the current token\n if (endsWithSpace) {\n return {\n commandName: command.name,\n command,\n enteredArgs: argTokens,\n currentArgValue: '',\n currentArgIndex: argTokens.length,\n isEnteringArgs: true,\n };\n }\n\n // If we have arg tokens, the last one is partial\n if (argTokens.length > 0) {\n const enteredArgs = argTokens.slice(0, -1);\n const currentArgValue = argTokens[argTokens.length - 1];\n return {\n commandName: command.name,\n command,\n enteredArgs,\n currentArgValue,\n currentArgIndex: enteredArgs.length,\n isEnteringArgs: true,\n };\n }\n\n // Command typed but no space yet - not in arg mode\n return {\n commandName: command.name,\n command,\n enteredArgs: [],\n currentArgValue: '',\n currentArgIndex: -1,\n isEnteringArgs: false,\n };\n}\n\n/**\n * Search argument options using fuzzy matching.\n * Returns sorted matches with scores.\n */\nexport function searchArgumentOptions(\n query: string,\n options: string[],\n maxResults: number = 10\n): ArgumentOptionMatch[] {\n if (!options.length) {\n return [];\n }\n\n // Empty query returns all options\n if (!query) {\n return options.slice(0, maxResults).map((option) => ({\n option,\n score: 0,\n matchedIndices: [],\n }));\n }\n\n const matches: ArgumentOptionMatch[] = [];\n\n for (const option of options) {\n const match = fuzzyMatch(query, option);\n if (match) {\n matches.push({\n option,\n score: match.score,\n matchedIndices: match.matchedIndices,\n });\n }\n }\n\n return matches\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport type {\n AgentCommandPaletteMode,\n AgentCommandPaletteStatus,\n ToolExecution,\n CommandHistoryEntry,\n UseAgentCommandPaletteOptions,\n UseAgentCommandPaletteReturn,\n QuickCommandMatch,\n ArgumentOptionMatch,\n ParsedCommandQuery,\n} from '../types';\nimport { searchQuickCommands, parseCommandQuery, searchArgumentOptions } from '../utils';\n\nconst DEFAULT_SUGGESTIONS = [\n 'hide sidebars',\n 'show terminal',\n 'focus editor',\n];\n\n/**\n * Hook for managing Agent Command Palette state and behavior\n * Handles input, history navigation, tool execution tracking, and keyboard shortcuts\n */\nexport function useAgentCommandPalette({\n events,\n keyboard = { key: 'p', altKey: true },\n config = {},\n onExecuteTool,\n initialSuggestions = DEFAULT_SUGGESTIONS,\n agentAvailable = true,\n quickCommands = [],\n}: UseAgentCommandPaletteOptions = {}): UseAgentCommandPaletteReturn {\n // Visibility state\n const [isOpen, setIsOpen] = useState(false);\n\n // Input state\n const [query, setQueryState] = useState('');\n const [mode, setMode] = useState<AgentCommandPaletteMode>('natural');\n\n // Execution state\n const [status, setStatus] = useState<AgentCommandPaletteStatus>('idle');\n const [pendingTools, setPendingTools] = useState<ToolExecution[]>([]);\n const [completedTools, setCompletedTools] = useState<ToolExecution[]>([]);\n const [agentResponse, setAgentResponse] = useState('');\n\n // History state\n const [history, setHistory] = useState<CommandHistoryEntry[]>([]);\n const [historyIndex, setHistoryIndex] = useState(-1);\n\n // Suggestions\n const suggestions = useMemo(() => initialSuggestions, [initialSuggestions]);\n\n // Autocomplete state\n const [selectedAutocompleteIndex, setSelectedAutocompleteIndex] = useState(-1);\n\n // Parse the current query to determine command and argument state\n const parsedQuery = useMemo<ParsedCommandQuery>(() => {\n if (mode !== 'quick-command' || !quickCommands.length) {\n return {\n commandName: '',\n command: null,\n enteredArgs: [],\n currentArgValue: '',\n currentArgIndex: -1,\n isEnteringArgs: false,\n };\n }\n return parseCommandQuery(query, quickCommands);\n }, [query, mode, quickCommands]);\n\n // Compute quick command matches based on query (only when not entering args)\n const quickCommandMatches = useMemo<QuickCommandMatch[]>(() => {\n if (mode !== 'quick-command' || !quickCommands.length || parsedQuery.isEnteringArgs) {\n return [];\n }\n return searchQuickCommands(query, quickCommands);\n }, [query, mode, quickCommands, parsedQuery.isEnteringArgs]);\n\n // Compute argument option matches when entering args\n const argumentOptionMatches = useMemo<ArgumentOptionMatch[]>(() => {\n if (!parsedQuery.isEnteringArgs || !parsedQuery.command?.args) {\n return [];\n }\n\n const currentArg = parsedQuery.command.args[parsedQuery.currentArgIndex];\n if (!currentArg?.options) {\n return [];\n }\n\n return searchArgumentOptions(parsedQuery.currentArgValue, currentArg.options);\n }, [parsedQuery]);\n\n // Get the current argument definition (for display purposes)\n const currentArgDef = useMemo(() => {\n if (!parsedQuery.isEnteringArgs || !parsedQuery.command?.args) {\n return null;\n }\n return parsedQuery.command.args[parsedQuery.currentArgIndex] || null;\n }, [parsedQuery]);\n\n // Determine if autocomplete should be shown\n const showAutocomplete = useMemo(() => {\n if (mode !== 'quick-command' || status !== 'idle' || query.length === 0) {\n return false;\n }\n // Show command autocomplete OR argument autocomplete\n return quickCommandMatches.length > 0 || argumentOptionMatches.length > 0;\n }, [mode, status, query.length, quickCommandMatches.length, argumentOptionMatches.length]);\n\n // Total autocomplete items (commands or argument options)\n const autocompleteItemCount = useMemo(() => {\n return parsedQuery.isEnteringArgs ? argumentOptionMatches.length : quickCommandMatches.length;\n }, [parsedQuery.isEnteringArgs, argumentOptionMatches.length, quickCommandMatches.length]);\n\n // Reset autocomplete selection when matches change\n useEffect(() => {\n setSelectedAutocompleteIndex(autocompleteItemCount > 0 ? 0 : -1);\n }, [autocompleteItemCount]);\n\n // Detect mode based on query prefix\n const setQuery = useCallback((value: string) => {\n setQueryState(value);\n setMode(value.startsWith('/') ? 'quick-command' : 'natural');\n }, []);\n\n // Open the palette\n const open = useCallback(() => {\n setIsOpen(true);\n // Default to quick-command mode when agent is unavailable\n if (agentAvailable) {\n setQueryState('');\n setMode('natural');\n } else {\n setQueryState('/');\n setMode('quick-command');\n }\n setStatus('idle');\n setPendingTools([]);\n setCompletedTools([]);\n setAgentResponse('');\n setHistoryIndex(-1);\n\n events?.emit({\n type: 'agent-command-palette:opened',\n source: 'agent-command-palette',\n timestamp: Date.now(),\n payload: {},\n });\n }, [events, agentAvailable]);\n\n // Close the palette\n const close = useCallback(() => {\n setIsOpen(false);\n\n events?.emit({\n type: 'agent-command-palette:closed',\n source: 'agent-command-palette',\n timestamp: Date.now(),\n payload: {},\n });\n }, [events]);\n\n // Toggle the palette\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n // Clear current state without closing\n const clear = useCallback(() => {\n setQueryState('');\n setMode('natural');\n setStatus('idle');\n setPendingTools([]);\n setCompletedTools([]);\n setAgentResponse('');\n setHistoryIndex(-1);\n }, []);\n\n // Add a tool to pending list\n const addPendingTool = useCallback((tool: Omit<ToolExecution, 'status'>) => {\n const newTool: ToolExecution = {\n ...tool,\n status: 'pending',\n };\n setPendingTools((prev) => [...prev, newTool]);\n return newTool;\n }, []);\n\n // Update a tool's status\n const updateToolStatus = useCallback(\n (toolId: string, status: ToolExecution['status'], result?: string, error?: string) => {\n setPendingTools((prev) => {\n const tool = prev.find((t) => t.id === toolId);\n if (!tool) return prev;\n\n const updatedTool: ToolExecution = {\n ...tool,\n status,\n result,\n error,\n };\n\n // If completed (success or error), move to completedTools\n if (status === 'success' || status === 'error') {\n setCompletedTools((completed) => [...completed, updatedTool]);\n return prev.filter((t) => t.id !== toolId);\n }\n\n // Otherwise update in place\n return prev.map((t) => (t.id === toolId ? updatedTool : t));\n });\n },\n []\n );\n\n // Execute a quick command directly (bypasses agent)\n const executeQuickCommand = useCallback(\n async (command: string) => {\n // Parse quick command: /toggle left -> { name: 'toggle', args: ['left'] }\n const parts = command.replace(/^\\//, '').trim().split(/\\s+/);\n const toolName = parts[0];\n const toolArgs = parts.slice(1);\n\n if (!toolName) return;\n\n setStatus('executing');\n\n const toolId = `quick-${Date.now()}`;\n addPendingTool({\n id: toolId,\n name: toolName,\n args: { args: toolArgs },\n });\n\n updateToolStatus(toolId, 'running');\n\n try {\n if (onExecuteTool) {\n const result = await onExecuteTool(toolName, { args: toolArgs });\n updateToolStatus(toolId, 'success', String(result));\n } else {\n updateToolStatus(toolId, 'success', 'Tool executed (no handler)');\n }\n\n // Add to history\n setHistory((prev) => [\n {\n query: command,\n timestamp: Date.now(),\n toolsExecuted: [toolName],\n success: true,\n },\n ...prev.slice(0, (config.maxHistoryEntries || 50) - 1),\n ]);\n\n setStatus('complete');\n setAgentResponse(`Executed: ${toolName}`);\n\n // Auto-close after delay\n const delay = config.autoCloseDelay ?? 1000;\n if (delay > 0) {\n setTimeout(() => close(), delay);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n updateToolStatus(toolId, 'error', undefined, errorMessage);\n setStatus('error');\n setAgentResponse(`Error: ${errorMessage}`);\n }\n },\n [onExecuteTool, addPendingTool, updateToolStatus, config.autoCloseDelay, config.maxHistoryEntries, close]\n );\n\n // Submit the current query\n const submit = useCallback(() => {\n if (!query.trim()) return;\n\n if (mode === 'quick-command') {\n executeQuickCommand(query);\n return;\n }\n\n // If agent is unavailable, don't allow natural language submissions\n if (!agentAvailable) {\n setAgentResponse('Agent unavailable. Use quick commands (start with /).');\n setStatus('error');\n return;\n }\n\n // For natural language mode, we emit an event for the agent to handle\n // The actual agent integration will be done externally\n setStatus('thinking');\n\n events?.emit({\n type: 'agent-command-palette:submit',\n source: 'agent-command-palette',\n timestamp: Date.now(),\n payload: { query, mode },\n });\n\n // Add to history (will be updated with actual results by external handler)\n setHistory((prev) => [\n {\n query,\n timestamp: Date.now(),\n toolsExecuted: [],\n success: true,\n },\n ...prev.slice(0, (config.maxHistoryEntries || 50) - 1),\n ]);\n }, [query, mode, executeQuickCommand, events, config.maxHistoryEntries, agentAvailable]);\n\n // Navigate history - previous (up arrow)\n const historyPrevious = useCallback(() => {\n if (history.length === 0) return;\n\n const newIndex = historyIndex < history.length - 1 ? historyIndex + 1 : historyIndex;\n setHistoryIndex(newIndex);\n if (history[newIndex]) {\n setQueryState(history[newIndex].query);\n setMode(history[newIndex].query.startsWith('/') ? 'quick-command' : 'natural');\n }\n }, [history, historyIndex]);\n\n // Navigate history - next (down arrow)\n const historyNext = useCallback(() => {\n if (historyIndex <= 0) {\n setHistoryIndex(-1);\n setQueryState('');\n setMode('natural');\n return;\n }\n\n const newIndex = historyIndex - 1;\n setHistoryIndex(newIndex);\n if (history[newIndex]) {\n setQueryState(history[newIndex].query);\n setMode(history[newIndex].query.startsWith('/') ? 'quick-command' : 'natural');\n }\n }, [history, historyIndex]);\n\n // Handle keyboard shortcut to open palette (Alt+P)\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const {\n key = 'p',\n altKey = true,\n ctrlKey = false,\n metaKey = false,\n shiftKey = false,\n } = keyboard;\n\n // Check if modifiers match\n const modifiersMatch =\n e.altKey === altKey &&\n e.ctrlKey === ctrlKey &&\n e.metaKey === metaKey &&\n e.shiftKey === shiftKey;\n\n // Use e.code for letter keys when Alt is pressed (Mac produces special chars with Alt+letter)\n // e.code gives us \"KeyP\" for the P key regardless of modifiers\n const keyMatches = altKey\n ? e.code === `Key${key.toUpperCase()}`\n : e.key.toLowerCase() === key.toLowerCase();\n\n if (keyMatches && modifiersMatch) {\n // Don't trigger if user is typing in an input field (unless it's our own)\n const target = e.target as HTMLElement;\n const isOurInput = target.closest('[data-agent-command-palette-input]');\n\n if (\n !isOurInput &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.isContentEditable)\n ) {\n return;\n }\n\n e.preventDefault();\n toggle();\n }\n },\n [keyboard, toggle]\n );\n\n // Register keyboard shortcut\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n // Autocomplete navigation\n const autocompleteNext = useCallback(() => {\n if (!showAutocomplete) return;\n setSelectedAutocompleteIndex((prev) =>\n prev < autocompleteItemCount - 1 ? prev + 1 : 0\n );\n }, [showAutocomplete, autocompleteItemCount]);\n\n const autocompletePrevious = useCallback(() => {\n if (!showAutocomplete) return;\n setSelectedAutocompleteIndex((prev) =>\n prev > 0 ? prev - 1 : autocompleteItemCount - 1\n );\n }, [showAutocomplete, autocompleteItemCount]);\n\n const autocompleteAccept = useCallback(() => {\n if (!showAutocomplete || selectedAutocompleteIndex < 0) return;\n\n // Handle argument option selection\n if (parsedQuery.isEnteringArgs) {\n const match = argumentOptionMatches[selectedAutocompleteIndex];\n if (!match) return;\n\n // Build new query: command + previous args + selected option\n let newQuery = `/${parsedQuery.commandName}`;\n for (const arg of parsedQuery.enteredArgs) {\n newQuery += ` ${arg}`;\n }\n newQuery += ` ${match.option}`;\n\n // Check if there are more args to enter\n const nextArgIndex = parsedQuery.currentArgIndex + 1;\n const hasMoreArgs = parsedQuery.command?.args && nextArgIndex < parsedQuery.command.args.length;\n if (hasMoreArgs) {\n newQuery += ' ';\n }\n\n setQueryState(newQuery);\n setSelectedAutocompleteIndex(-1);\n return;\n }\n\n // Handle command selection\n const match = quickCommandMatches[selectedAutocompleteIndex];\n if (!match) return;\n\n // Build the command string with the command name\n const command = match.command;\n let newQuery = `/${command.name}`;\n\n // If command has args, add a space to prompt user to enter args\n if (command.args && command.args.length > 0) {\n newQuery += ' ';\n }\n\n setQueryState(newQuery);\n setSelectedAutocompleteIndex(-1);\n }, [showAutocomplete, selectedAutocompleteIndex, parsedQuery, argumentOptionMatches, quickCommandMatches]);\n\n return {\n // Agent availability\n agentAvailable,\n\n // Visibility\n isOpen,\n open,\n close,\n toggle,\n\n // Input\n query,\n setQuery,\n mode,\n\n // Execution\n status,\n setStatus,\n pendingTools,\n completedTools,\n agentResponse,\n setAgentResponse,\n submit,\n executeQuickCommand,\n\n // Tool management (for external AI integration)\n addPendingTool,\n updateToolStatus,\n\n // History\n history,\n historyPrevious,\n historyNext,\n\n // Suggestions\n suggestions,\n\n // Actions\n clear,\n\n // Quick command autocomplete\n quickCommandMatches,\n argumentOptionMatches,\n parsedQuery,\n currentArgDef,\n selectedAutocompleteIndex,\n autocompleteNext,\n autocompletePrevious,\n autocompleteAccept,\n showAutocomplete,\n };\n}\n","/**\n * Layout Tools\n *\n * UTCP-compatible tools for panel layout operations.\n * These tools emit events that the layout system listens for.\n *\n * These are generic layout operations that any app using panel-layouts can use.\n * App-specific tools (like file operations) should be defined in the app.\n */\n\nimport type {\n PanelTool,\n PanelEventCallTemplate,\n} from '@principal-ade/panel-framework-core';\n\n// ============================================================================\n// State Query Tools\n// ============================================================================\n\n/**\n * Tool: Get Visible Panels\n *\n * Query which panels are currently visible and their state.\n * Returns layout slot info including collapsed state and active panel IDs.\n */\nconst getVisiblePanelsTool: PanelTool = {\n name: 'get_visible_panels',\n description:\n 'Get the current visibility state of all panel slots (left, middle, right). Returns which panels are active in each slot and whether side panels are collapsed.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n left: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description: 'The ID of the panel in the left slot',\n },\n collapsed: {\n type: 'boolean',\n description: 'Whether the left panel is collapsed',\n },\n size: {\n type: 'number',\n description: 'Width percentage of the left panel',\n },\n },\n },\n middle: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description: 'The ID of the panel in the middle slot',\n },\n size: {\n type: 'number',\n description: 'Width percentage of the middle panel',\n },\n },\n },\n right: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description: 'The ID of the panel in the right slot',\n },\n collapsed: {\n type: 'boolean',\n description: 'Whether the right panel is collapsed',\n },\n size: {\n type: 'number',\n description: 'Width percentage of the right panel',\n },\n },\n },\n workspaceId: {\n type: 'string',\n description: 'The ID of the currently active workspace layout',\n },\n },\n },\n tags: ['panel', 'layout', 'visibility', 'state', 'query'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:get-visibility',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Get Panel State\n *\n * Query the current state of a specific panel.\n * Panels must implement a getState function to support this.\n */\nconst getPanelStateTool: PanelTool = {\n name: 'get_panel_state',\n description:\n 'Get the current state of a specific panel. Returns panel-specific state data if the panel supports state queries.',\n inputs: {\n type: 'object',\n properties: {\n panelId: {\n type: 'string',\n description:\n 'The ID of the panel to query state from (e.g., \"file-tree\", \"terminal\")',\n },\n },\n required: ['panelId'],\n },\n outputs: {\n type: 'object',\n properties: {\n panelId: { type: 'string', description: 'The queried panel ID' },\n hasState: {\n type: 'boolean',\n description: 'Whether the panel supports state queries',\n },\n state: {\n type: 'object',\n description: 'The panel state (shape depends on the panel)',\n },\n },\n },\n tags: ['panel', 'state', 'query'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:get-state',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: List Panels With State\n *\n * Get a list of all panels that support state queries.\n */\nconst listPanelsWithStateTool: PanelTool = {\n name: 'list_panels_with_state',\n description:\n 'Get a list of all panels that support state queries. Use this to discover which panels can be queried with get_panel_state.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n panels: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n panelId: { type: 'string', description: 'The panel ID' },\n name: { type: 'string', description: 'The panel display name' },\n description: {\n type: 'string',\n description: 'Description of the state this panel provides',\n },\n },\n },\n description: 'List of panels that support state queries',\n },\n },\n },\n tags: ['panel', 'state', 'query', 'discovery'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:list-state-panels',\n } as PanelEventCallTemplate,\n};\n\n// ============================================================================\n// Layout Action Tools\n// ============================================================================\n\n/**\n * Tool: Toggle Panel\n *\n * Collapse or expand a side panel (left or right).\n */\nconst togglePanelTool: PanelTool = {\n name: 'toggle_panel',\n description: 'Collapse or expand a side panel to give more space to the main content area.',\n inputs: {\n type: 'object',\n properties: {\n panel: {\n type: 'string',\n enum: ['left', 'right'],\n description: 'Which panel to toggle: \"left\" or \"right\"',\n },\n },\n required: ['panel'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n panel: { type: 'string' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'toggle', 'collapse', 'expand', 'sidebar'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:toggle',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Collapse All Panels\n *\n * Collapse both left and right panels to maximize the main content area.\n */\nconst collapseAllPanelsTool: PanelTool = {\n name: 'collapse_all_panels',\n description: 'Collapse both left and right panels to maximize the main content area. Useful for focus mode.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'collapse', 'focus', 'maximize'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:collapse-all',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Expand All Panels\n *\n * Expand both left and right panels to show all content.\n */\nconst expandAllPanelsTool: PanelTool = {\n name: 'expand_all_panels',\n description: 'Expand both left and right panels to show all content. Restores the default layout.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'expand', 'restore', 'show'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:expand-all',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Switch Panel\n *\n * Change which content is displayed in a panel slot.\n * The available panels depend on the application.\n */\nconst switchPanelTool: PanelTool = {\n name: 'switch_panel',\n description: 'Change which content is displayed in a panel slot (left, middle, or right).',\n inputs: {\n type: 'object',\n properties: {\n slot: {\n type: 'string',\n enum: ['left', 'middle', 'right'],\n description: 'Which slot to change: \"left\", \"middle\", or \"right\"',\n },\n panel: {\n type: 'string',\n description: 'The panel ID to display in the slot',\n },\n },\n required: ['slot', 'panel'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n slot: { type: 'string' },\n panel: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'switch', 'navigation', 'view'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:switch',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Focus Panel\n *\n * Set keyboard/logical focus to a specific panel slot.\n */\nconst focusPanelTool: PanelTool = {\n name: 'focus_panel',\n description: 'Set focus to a specific panel slot for keyboard navigation.',\n inputs: {\n type: 'object',\n properties: {\n slot: {\n type: 'string',\n enum: ['left', 'middle', 'right'],\n description: 'Which slot to focus: \"left\", \"middle\", or \"right\"',\n },\n },\n required: ['slot'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n slot: { type: 'string' },\n },\n },\n tags: ['panel', 'focus', 'navigation', 'keyboard'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:focus',\n } as PanelEventCallTemplate,\n};\n\n/**\n * Tool: Reset Layout\n *\n * Reset panel sizes to the default layout.\n */\nconst resetLayoutTool: PanelTool = {\n name: 'reset_layout',\n description: 'Reset panel sizes to the default layout configuration.',\n inputs: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n action: { type: 'string' },\n },\n },\n tags: ['panel', 'layout', 'reset', 'default', 'restore'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'panel:reset-layout',\n } as PanelEventCallTemplate,\n};\n\n/**\n * All layout tools exported as an array.\n *\n * Register these with PanelToolRegistry:\n * ```typescript\n * import { layoutTools } from '@principal-ade/panel-layouts';\n * import { getGlobalToolRegistry } from '@principal-ade/panel-framework-core';\n *\n * const registry = getGlobalToolRegistry();\n * registry.registerPanelTools({\n * id: 'panel-layouts',\n * name: 'Panel Layouts',\n * tools: layoutTools,\n * });\n * ```\n */\nexport const layoutTools: PanelTool[] = [\n // State query tools\n getVisiblePanelsTool,\n getPanelStateTool,\n listPanelsWithStateTool,\n // Layout action tools\n togglePanelTool,\n collapseAllPanelsTool,\n expandAllPanelsTool,\n switchPanelTool,\n focusPanelTool,\n resetLayoutTool,\n];\n\n/**\n * State query tools only (for selective registration).\n */\nexport const stateQueryTools: PanelTool[] = [\n getVisiblePanelsTool,\n getPanelStateTool,\n listPanelsWithStateTool,\n];\n\n/**\n * Layout action tools only (for selective registration).\n */\nexport const layoutActionTools: PanelTool[] = [\n togglePanelTool,\n collapseAllPanelsTool,\n expandAllPanelsTool,\n switchPanelTool,\n focusPanelTool,\n resetLayoutTool,\n];\n\n/**\n * Individual tool exports for selective use.\n */\nexport {\n // State query tools\n getVisiblePanelsTool,\n getPanelStateTool,\n listPanelsWithStateTool,\n // Layout action tools\n togglePanelTool,\n collapseAllPanelsTool,\n expandAllPanelsTool,\n switchPanelTool,\n focusPanelTool,\n resetLayoutTool,\n};\n\n/**\n * Layout tools metadata for registration.\n *\n * Use this with PanelToolRegistry.registerPanelTools():\n * ```typescript\n * registry.registerPanelTools(layoutToolsMetadata);\n * ```\n */\nexport const layoutToolsMetadata = {\n id: 'panel-layouts',\n name: 'Panel Layouts',\n description: 'Generic panel layout and state query operations',\n tools: layoutTools,\n};\n","/**\n * AI Provider Format Converters\n *\n * Utilities to convert UTCP tools to various AI provider formats\n * (Gemini, OpenAI, Anthropic, etc.)\n */\n\nimport type {\n PanelTool,\n JsonSchema,\n AIFunctionDefinition,\n} from '@principal-ade/panel-framework-core';\n\n// ============================================================================\n// Gemini Format\n// ============================================================================\n\n/**\n * Gemini function declaration format\n */\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, GeminiPropertySchema>;\n required: string[];\n };\n}\n\n/**\n * Gemini property schema (simplified)\n */\nexport interface GeminiPropertySchema {\n type: string;\n description?: string;\n enum?: string[];\n}\n\n/**\n * Gemini tools wrapper\n */\nexport interface GeminiTools {\n functionDeclarations: GeminiFunctionDeclaration[];\n}\n\n/**\n * Convert a PanelTool to Gemini function declaration format.\n */\nexport function toolToGeminiFunction(tool: PanelTool): GeminiFunctionDeclaration {\n const properties: Record<string, GeminiPropertySchema> = {};\n\n if (tool.inputs.properties) {\n for (const [key, schema] of Object.entries(tool.inputs.properties)) {\n const propSchema = schema as JsonSchema;\n properties[key] = {\n type: propSchema.type as string || 'string',\n description: propSchema.description,\n ...(propSchema.enum && { enum: propSchema.enum as string[] }),\n };\n }\n }\n\n return {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties,\n required: tool.inputs.required || [],\n },\n };\n}\n\n/**\n * Convert an array of PanelTools to Gemini tools format.\n */\nexport function toolsToGeminiFormat(tools: PanelTool[]): GeminiTools {\n return {\n functionDeclarations: tools.map(toolToGeminiFunction),\n };\n}\n\n// ============================================================================\n// OpenAI Format\n// ============================================================================\n\n/**\n * OpenAI function definition format\n */\nexport interface OpenAIFunction {\n name: string;\n description: string;\n parameters: JsonSchema;\n}\n\n/**\n * OpenAI tool wrapper\n */\nexport interface OpenAITool {\n type: 'function';\n function: OpenAIFunction;\n}\n\n/**\n * Convert a PanelTool to OpenAI function format.\n */\nexport function toolToOpenAIFunction(tool: PanelTool): OpenAITool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputs,\n },\n };\n}\n\n/**\n * Convert an array of PanelTools to OpenAI tools format.\n */\nexport function toolsToOpenAIFormat(tools: PanelTool[]): OpenAITool[] {\n return tools.map(toolToOpenAIFunction);\n}\n\n// ============================================================================\n// Anthropic Format\n// ============================================================================\n\n/**\n * Anthropic tool definition format\n */\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: JsonSchema;\n}\n\n/**\n * Convert a PanelTool to Anthropic tool format.\n */\nexport function toolToAnthropicFormat(tool: PanelTool): AnthropicTool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputs,\n };\n}\n\n/**\n * Convert an array of PanelTools to Anthropic tools format.\n */\nexport function toolsToAnthropicFormat(tools: PanelTool[]): AnthropicTool[] {\n return tools.map(toolToAnthropicFormat);\n}\n\n// ============================================================================\n// Generic AI Function Format (compatible with PanelToolRegistry)\n// ============================================================================\n\n/**\n * Convert a PanelTool to the generic AIFunctionDefinition format.\n * This is the format used by PanelToolRegistry.getToolsAsAIFunctions()\n */\nexport function toolToAIFunction(tool: PanelTool): AIFunctionDefinition {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputs,\n };\n}\n\n/**\n * Convert an array of PanelTools to AIFunctionDefinition format.\n */\nexport function toolsToAIFunctions(tools: PanelTool[]): AIFunctionDefinition[] {\n return tools.map(toolToAIFunction);\n}\n\n// ============================================================================\n// System Prompt Generation\n// ============================================================================\n\n/**\n * Generate a system prompt section describing available tools.\n *\n * @param tools - Array of tools to describe\n * @param options - Formatting options\n */\nexport function generateToolsSystemPrompt(\n tools: PanelTool[],\n options: {\n header?: string;\n includeParameters?: boolean;\n } = {}\n): string {\n const {\n header = 'You have access to the following tools:',\n includeParameters = true,\n } = options;\n\n const toolDescriptions = tools.map((tool) => {\n let desc = `- ${tool.name}: ${tool.description}`;\n\n if (includeParameters && tool.inputs.properties) {\n const params = Object.entries(tool.inputs.properties)\n .map(([name, schema]) => {\n const s = schema as JsonSchema;\n const required = tool.inputs.required?.includes(name) ? ' (required)' : '';\n return ` - ${name}: ${s.description || s.type}${required}`;\n })\n .join('\\n');\n\n if (params) {\n desc += `\\n${params}`;\n }\n }\n\n return desc;\n });\n\n return `${header}\\n\\n${toolDescriptions.join('\\n\\n')}`;\n}\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\n/**\n * SVG icons for panel collapse/expand buttons\n * Using inline SVGs to avoid lucide-react dependency\n */\nconst PanelLeftIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n);\n\nconst PanelLeftCloseIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"m16 15-3-3 3-3\" />\n </svg>\n);\n\nconst PanelRightIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M15 3v18\" />\n </svg>\n);\n\nconst PanelRightCloseIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M15 3v18\" />\n <path d=\"m8 9 3 3-3 3\" />\n </svg>\n);\n\nexport interface PanelCollapseButtonProps {\n /** Whether the panel is currently collapsed */\n isCollapsed: boolean;\n /** Callback when the button is clicked */\n onToggle: () => void;\n /** Which side the panel is on */\n side?: 'left' | 'right';\n /** Icon size in pixels */\n iconSize?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Keyboard shortcut hint to show in tooltip */\n shortcutHint?: string;\n /** Custom title/tooltip */\n title?: string;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * A button component for collapsing/expanding side panels.\n *\n * Shows appropriate icon based on panel state and side:\n * - Left panel collapsed: PanelLeft icon (show panel)\n * - Left panel expanded: PanelLeftClose icon (hide panel)\n * - Right panel collapsed: PanelRight icon (show panel)\n * - Right panel expanded: PanelRightClose icon (hide panel)\n */\nexport const PanelCollapseButton: React.FC<PanelCollapseButtonProps> = ({\n isCollapsed,\n onToggle,\n side = 'left',\n iconSize = 18,\n style,\n shortcutHint = 'Cmd/Ctrl+B',\n title,\n className,\n}) => {\n const { theme } = useTheme();\n\n const getIcon = () => {\n if (side === 'right') {\n return isCollapsed ? (\n <PanelRightIcon size={iconSize} />\n ) : (\n <PanelRightCloseIcon size={iconSize} />\n );\n }\n return isCollapsed ? (\n <PanelLeftIcon size={iconSize} />\n ) : (\n <PanelLeftCloseIcon size={iconSize} />\n );\n };\n\n const getDefaultTitle = () => {\n const action = isCollapsed ? 'Show' : 'Hide';\n const sideLabel = side === 'right' ? 'Right Panel' : 'Sidebar';\n return `${action} ${sideLabel}${shortcutHint ? ` (${shortcutHint})` : ''}`;\n };\n\n return (\n <button\n onClick={onToggle}\n title={title ?? getDefaultTitle()}\n className={className}\n style={{\n background: 'transparent',\n border: 'none',\n color: isCollapsed ? theme.colors.textSecondary : theme.colors.primary,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n width: '32px',\n height: '32px',\n ...style,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;\n e.currentTarget.style.color = theme.colors.primary;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = isCollapsed\n ? theme.colors.textSecondary\n : theme.colors.primary;\n }}\n >\n {getIcon()}\n </button>\n );\n};\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\n/**\n * SVG icons for panel switch buttons\n */\nconst ArrowLeftRightIcon: React.FC<{ size?: number }> = ({ size = 14 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 3 4 7l4 4\" />\n <path d=\"M4 7h16\" />\n <path d=\"m16 21 4-4-4-4\" />\n <path d=\"M20 17H4\" />\n </svg>\n);\n\nconst ArrowRightLeftIcon: React.FC<{ size?: number }> = ({ size = 14 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m16 3 4 4-4 4\" />\n <path d=\"M20 7H4\" />\n <path d=\"m8 21-4-4 4-4\" />\n <path d=\"M4 17h16\" />\n </svg>\n);\n\nexport interface PanelSwitchButtonProps {\n /** Callback when the button is clicked */\n onSwitch: () => void;\n /** Which panels are being switched */\n variant?: 'left-middle' | 'right-middle';\n /** Icon size in pixels */\n iconSize?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom title/tooltip */\n title?: string;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * A button component for switching/swapping panel positions.\n *\n * - left-middle: Shows ArrowLeftRight icon for swapping left and middle panels\n * - right-middle: Shows ArrowRightLeft icon for swapping right and middle panels\n */\nexport const PanelSwitchButton: React.FC<PanelSwitchButtonProps> = ({\n onSwitch,\n variant = 'left-middle',\n iconSize = 14,\n style,\n title,\n className,\n}) => {\n const { theme } = useTheme();\n\n const getDefaultTitle = () => {\n return variant === 'left-middle'\n ? 'Switch left and middle panels'\n : 'Switch right and middle panels';\n };\n\n const Icon = variant === 'left-middle' ? ArrowLeftRightIcon : ArrowRightLeftIcon;\n\n return (\n <button\n onClick={onSwitch}\n title={title ?? getDefaultTitle()}\n className={className}\n style={{\n background: 'transparent',\n border: 'none',\n color: theme.colors.textSecondary,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n width: '32px',\n height: '32px',\n ...style,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;\n e.currentTarget.style.color = theme.colors.text;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = theme.colors.textSecondary;\n }}\n >\n <Icon size={iconSize} />\n </button>\n );\n};\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\n/**\n * Layout icon for panel configuration\n */\nconst LayoutIcon: React.FC<{ size?: number }> = ({ size = 14 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 21V9\" />\n </svg>\n);\n\nexport interface PanelConfigureButtonProps {\n /** Callback when the button is clicked */\n onConfigure: () => void;\n /** Icon size in pixels */\n iconSize?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom title/tooltip */\n title?: string;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * A button component for opening panel configuration/layout settings.\n */\nexport const PanelConfigureButton: React.FC<PanelConfigureButtonProps> = ({\n onConfigure,\n iconSize = 14,\n style,\n title = 'Configure panel layout',\n className,\n}) => {\n const { theme } = useTheme();\n\n return (\n <button\n onClick={onConfigure}\n title={title}\n className={className}\n style={{\n background: 'transparent',\n border: 'none',\n color: theme.colors.textSecondary,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n width: '32px',\n height: '32px',\n ...style,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;\n e.currentTarget.style.color = theme.colors.text;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = theme.colors.textSecondary;\n }}\n >\n <LayoutIcon size={iconSize} />\n </button>\n );\n};\n","import React from 'react';\nimport { PanelCollapseButton, type PanelCollapseButtonProps } from './PanelCollapseButton';\nimport { PanelSwitchButton, type PanelSwitchButtonProps } from './PanelSwitchButton';\nimport { PanelConfigureButton, type PanelConfigureButtonProps } from './PanelConfigureButton';\n\nexport interface PanelControlsProps {\n /** Left sidebar collapsed state */\n leftSidebarCollapsed?: boolean;\n /** Callback when left sidebar toggle is clicked */\n onToggleLeftSidebar?: () => void;\n /** Whether to show the left sidebar control */\n showLeftSidebarControl?: boolean;\n\n /** Right sidebar collapsed state */\n rightSidebarCollapsed?: boolean;\n /** Callback when right sidebar toggle is clicked */\n onToggleRightSidebar?: () => void;\n /** Whether to show the right sidebar control */\n showRightSidebarControl?: boolean;\n\n /** Callback when switch left-middle panels button is clicked */\n onSwitchLeftMiddlePanels?: () => void;\n /** Whether to show the switch left-middle button */\n showSwitchLeftMiddle?: boolean;\n\n /** Callback when switch right-middle panels button is clicked */\n onSwitchRightMiddlePanels?: () => void;\n /** Whether to show the switch right-middle button */\n showSwitchRightMiddle?: boolean;\n\n /** Callback when configure panels button is clicked */\n onConfigurePanels?: () => void;\n /** Whether to show the configure panels button */\n showConfigureButton?: boolean;\n\n /** Gap between buttons in pixels */\n gap?: number;\n /** Additional inline styles for the container */\n style?: React.CSSProperties;\n /** Custom class name for the container */\n className?: string;\n /** Icon size for all buttons */\n iconSize?: number;\n\n /** Props to pass to the left collapse button */\n leftCollapseButtonProps?: Partial<Omit<PanelCollapseButtonProps, 'isCollapsed' | 'onToggle' | 'side'>>;\n /** Props to pass to the right collapse button */\n rightCollapseButtonProps?: Partial<Omit<PanelCollapseButtonProps, 'isCollapsed' | 'onToggle' | 'side'>>;\n /** Props to pass to the left-middle switch button */\n leftMiddleSwitchButtonProps?: Partial<Omit<PanelSwitchButtonProps, 'onSwitch' | 'variant'>>;\n /** Props to pass to the right-middle switch button */\n rightMiddleSwitchButtonProps?: Partial<Omit<PanelSwitchButtonProps, 'onSwitch' | 'variant'>>;\n /** Props to pass to the configure button */\n configureButtonProps?: Partial<Omit<PanelConfigureButtonProps, 'onConfigure'>>;\n}\n\n/**\n * A unified panel controls component that provides buttons for:\n * - Collapsing/expanding left and right sidebars\n * - Switching/swapping panel positions\n * - Opening panel configuration\n *\n * The buttons are rendered in order:\n * 1. Left sidebar collapse button\n * 2. Left-middle switch button\n * 3. Configure panels button\n * 4. Right-middle switch button\n * 5. Right sidebar collapse button\n *\n * @example\n * ```tsx\n * <PanelControls\n * leftSidebarCollapsed={leftCollapsed}\n * onToggleLeftSidebar={() => setLeftCollapsed(!leftCollapsed)}\n * showLeftSidebarControl\n * rightSidebarCollapsed={rightCollapsed}\n * onToggleRightSidebar={() => setRightCollapsed(!rightCollapsed)}\n * showRightSidebarControl\n * onSwitchLeftMiddlePanels={handleSwitchLeftMiddle}\n * showSwitchLeftMiddle\n * onSwitchRightMiddlePanels={handleSwitchRightMiddle}\n * showSwitchRightMiddle\n * onConfigurePanels={() => setShowConfigModal(true)}\n * showConfigureButton\n * />\n * ```\n */\nexport const PanelControls: React.FC<PanelControlsProps> = ({\n leftSidebarCollapsed = false,\n onToggleLeftSidebar,\n showLeftSidebarControl = false,\n rightSidebarCollapsed = false,\n onToggleRightSidebar,\n showRightSidebarControl = false,\n onSwitchLeftMiddlePanels,\n showSwitchLeftMiddle = false,\n onSwitchRightMiddlePanels,\n showSwitchRightMiddle = false,\n onConfigurePanels,\n showConfigureButton = false,\n gap = 4,\n style,\n className,\n iconSize,\n leftCollapseButtonProps,\n rightCollapseButtonProps,\n leftMiddleSwitchButtonProps,\n rightMiddleSwitchButtonProps,\n configureButtonProps,\n}) => {\n // Check if any controls are visible\n const hasVisibleControls =\n (showLeftSidebarControl && onToggleLeftSidebar) ||\n (showSwitchLeftMiddle && onSwitchLeftMiddlePanels) ||\n (showConfigureButton && onConfigurePanels) ||\n (showSwitchRightMiddle && onSwitchRightMiddlePanels) ||\n (showRightSidebarControl && onToggleRightSidebar);\n\n if (!hasVisibleControls) {\n return null;\n }\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${gap}px`,\n ...style,\n }}\n >\n {/* Left sidebar collapse button */}\n {showLeftSidebarControl && onToggleLeftSidebar && (\n <PanelCollapseButton\n isCollapsed={leftSidebarCollapsed}\n onToggle={onToggleLeftSidebar}\n side=\"left\"\n iconSize={iconSize ?? 18}\n {...leftCollapseButtonProps}\n />\n )}\n\n {/* Switch left-middle panels button */}\n {showSwitchLeftMiddle && onSwitchLeftMiddlePanels && (\n <PanelSwitchButton\n onSwitch={onSwitchLeftMiddlePanels}\n variant=\"left-middle\"\n iconSize={iconSize ?? 14}\n {...leftMiddleSwitchButtonProps}\n />\n )}\n\n {/* Configure panels button */}\n {showConfigureButton && onConfigurePanels && (\n <PanelConfigureButton\n onConfigure={onConfigurePanels}\n iconSize={iconSize ?? 14}\n {...configureButtonProps}\n />\n )}\n\n {/* Switch right-middle panels button */}\n {showSwitchRightMiddle && onSwitchRightMiddlePanels && (\n <PanelSwitchButton\n onSwitch={onSwitchRightMiddlePanels}\n variant=\"right-middle\"\n iconSize={iconSize ?? 14}\n {...rightMiddleSwitchButtonProps}\n />\n )}\n\n {/* Right sidebar collapse button */}\n {showRightSidebarControl && onToggleRightSidebar && (\n <PanelCollapseButton\n isCollapsed={rightSidebarCollapsed}\n onToggle={onToggleRightSidebar}\n side=\"right\"\n iconSize={iconSize ?? 18}\n {...rightCollapseButtonProps}\n />\n )}\n </div>\n );\n};\n"],"names":["LocalStoragePersistenceAdapter","__publicField","viewKey","stored","error","state","usePanelPersistence","options","defaultSizes","panelType","adapter","sizes","setSizes","useState","collapsed","setCollapsed","prevCollapsedRef","useRef","lastNonZeroSizesRef","saveTimeoutRef","pendingPersistSizesRef","useEffect","saved","updateLastNonZeroSizes","useCallback","incomingSizes","getFallbackSize","panel","storedSize","prevDefaultSizesRef","leftChanged","rightChanged","savePreferences","newSizes","handlePanelResize","sanitizedSizes","shouldPersist","leftCollapsed","leftSize","fallback","rightCollapsed","rightSize","pendingSizes","handleLeftCollapseComplete","handleLeftExpandComplete","handleRightCollapseComplete","handleRightExpandComplete","LocalStorageWorkspaceAdapter","presets","repositoryKey","key","allStates","i","parseError","WorkspaceLayoutService","builtInWorkspaces","id","userWorkspaces","workspace","updatedPresets","updates","existingWorkspace","updatedWorkspace","currentState","repoState","hasSizeDeviation","hasCollapsedDeviation","workspaceId","layout","workspaces","layout1","layout2","name","now","useWorkspace","autoInitialize","defaultWorkspaceId","setWorkspaces","repositoryState","setRepositoryState","activeWorkspace","setActiveWorkspace","loading","setLoading","setError","loadData","allWorkspaces","err","getWorkspace","createWorkspace","createOptions","updateWorkspace","deleteWorkspace","success","applyWorkspace","newState","updateSizes","updateCollapsed","resetToDefaults","refresh","usePanelFocus","initialFocus","onFocusChange","events","getPanelId","focusedPanel","setFocusedPanelState","setFocus","previousPanel","prevPanelId","panelId","clearFocus","getVisiblePanels","panels","focusNext","visiblePanels","currentIndex","nextIndex","focusPrevious","prevIndex","isFocused","usePanelKeyboardShortcuts","enabled","onExpand","onCollapse","focusedPanelRef","collapsedRef","panelTypeRef","handleKeyDown","event","code","currentFocused","currentCollapsed","currentPanelType","usePanelFocusListener","onFocus","onBlur","unsubscribeFocus","unsubscribeBlur","FocusIndicator","className","style","defaultStyles","jsx","KEYFRAMES_ID","injectKeyframes","FocusModeOverlay","active","variant","effects","opacity","animationDuration","cascadeDelay","color","theme","useTheme","isVisible","setIsVisible","timer","baseColor","baseStyles","hasVignetteDrift","hasRadialBreathing","hasSnowfall","hexToRgba","hex","alpha","result","r","g","b","effectColor","vignetteDriftStyles","radialBreathingStyles","snowflakeColor","snowflakeColorMid","snowflakeColorFaint","snowfallBaseStyles","snowfallLayer1Styles","snowfallLayer2Styles","snowfallLayer3Styles","jsxs","Fragment","AgentCommandInput","value","onChange","onSubmit","onClose","onHistoryPrevious","onHistoryNext","mode","status","placeholder","disabled","autoFocus","agentAvailable","showAutocomplete","onAutocompleteNext","onAutocompletePrevious","onAutocompleteAccept","inputRef","e","isProcessing","StatusIcon","iconStyle","formatArgs","args","entries","ToolExecutionItem","tool","compact","ToolExecutionList","tools","AgentResponseDisplay","response","streaming","isError","isSuccess","HighlightedText","text","matchedIndices","highlightColor","matchSet","chars","char","QuickCommandAutocomplete","matches","argumentMatches","currentArg","isEnteringArgs","selectedIndex","onSelect","maxVisible","listRef","selectedRef","maxHeight","itemHeight","match","index","isSelected","command","arg","AgentCommandPalette","palette","config","containerRef","isOpen","close","query","setQuery","pendingTools","completedTools","agentResponse","submit","historyPrevious","historyNext","suggestions","quickCommandMatches","argumentOptionMatches","parsedQuery","currentArgDef","selectedAutocompleteIndex","autocompleteNext","autocompletePrevious","autocompleteAccept","handleClickOutside","timeoutId","shouldRender","setShouldRender","allTools","showTools","showResponse","showSuggestions","showQuickCommandHelp","showAgentUnavailable","suggestion","newQuery","nextArgIndex","_a","fuzzyMatch","target","queryLower","targetLower","queryIndex","score","consecutiveMatches","lastMatchIndex","searchQuickCommands","commands","maxResults","searchQuery","nameMatch","alias","aliasMatch","a","parseCommandQuery","parts","commandName","endsWithSpace","cmd","argTokens","enteredArgs","currentArgValue","searchArgumentOptions","option","DEFAULT_SUGGESTIONS","useAgentCommandPalette","keyboard","onExecuteTool","initialSuggestions","quickCommands","setIsOpen","setQueryState","setMode","setStatus","setPendingTools","setCompletedTools","setAgentResponse","history","setHistory","historyIndex","setHistoryIndex","useMemo","setSelectedAutocompleteIndex","autocompleteItemCount","open","toggle","clear","addPendingTool","newTool","prev","updateToolStatus","toolId","t","updatedTool","completed","executeQuickCommand","toolName","toolArgs","delay","errorMessage","newIndex","altKey","ctrlKey","metaKey","shiftKey","modifiersMatch","getVisiblePanelsTool","getPanelStateTool","listPanelsWithStateTool","togglePanelTool","collapseAllPanelsTool","expandAllPanelsTool","switchPanelTool","focusPanelTool","resetLayoutTool","layoutTools","stateQueryTools","layoutActionTools","layoutToolsMetadata","toolToGeminiFunction","properties","schema","propSchema","toolsToGeminiFormat","toolToOpenAIFunction","toolsToOpenAIFormat","toolToAnthropicFormat","toolsToAnthropicFormat","toolToAIFunction","toolsToAIFunctions","generateToolsSystemPrompt","header","includeParameters","toolDescriptions","desc","params","s","required","PanelLeftIcon","size","PanelLeftCloseIcon","PanelRightIcon","PanelRightCloseIcon","PanelCollapseButton","isCollapsed","onToggle","side","iconSize","shortcutHint","title","getIcon","ArrowLeftRightIcon","ArrowRightLeftIcon","PanelSwitchButton","onSwitch","getDefaultTitle","Icon","LayoutIcon","PanelConfigureButton","onConfigure","PanelControls","leftSidebarCollapsed","onToggleLeftSidebar","showLeftSidebarControl","rightSidebarCollapsed","onToggleRightSidebar","showRightSidebarControl","onSwitchLeftMiddlePanels","showSwitchLeftMiddle","onSwitchRightMiddlePanels","showSwitchRightMiddle","onConfigurePanels","showConfigureButton","gap","leftCollapseButtonProps","rightCollapseButtonProps","leftMiddleSwitchButtonProps","rightMiddleSwitchButtonProps","configureButtonProps"],"mappings":"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"}
|