dmux 3.0.2 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/DmuxApp.d.ts.map +1 -1
  2. package/dist/DmuxApp.js +242 -23
  3. package/dist/DmuxApp.js.map +1 -1
  4. package/dist/PaneAnalyzer.d.ts +0 -4
  5. package/dist/PaneAnalyzer.d.ts.map +1 -1
  6. package/dist/PaneAnalyzer.js +2 -17
  7. package/dist/PaneAnalyzer.js.map +1 -1
  8. package/dist/_plugin-vue_export-helper.css +1 -1
  9. package/dist/actions/paneActions.d.ts.map +1 -1
  10. package/dist/actions/paneActions.js +94 -40
  11. package/dist/actions/paneActions.js.map +1 -1
  12. package/dist/components/ActionConfirmDialog.js +1 -1
  13. package/dist/components/ActionConfirmDialog.js.map +1 -1
  14. package/dist/components/CloseOptionsDialog.d.ts.map +1 -1
  15. package/dist/components/CloseOptionsDialog.js +9 -7
  16. package/dist/components/CloseOptionsDialog.js.map +1 -1
  17. package/dist/components/FooterHelp.js +1 -1
  18. package/dist/components/FooterHelp.js.map +1 -1
  19. package/dist/components/HooksDialog.d.ts +12 -0
  20. package/dist/components/HooksDialog.d.ts.map +1 -0
  21. package/dist/components/HooksDialog.js +52 -0
  22. package/dist/components/HooksDialog.js.map +1 -0
  23. package/dist/components/MergeConfirmationDialog.d.ts.map +1 -1
  24. package/dist/components/MergeConfirmationDialog.js +2 -1
  25. package/dist/components/MergeConfirmationDialog.js.map +1 -1
  26. package/dist/components/NewPaneDialog.d.ts.map +1 -1
  27. package/dist/components/NewPaneDialog.js +1 -3
  28. package/dist/components/NewPaneDialog.js.map +1 -1
  29. package/dist/components/SettingsDialog.d.ts +16 -0
  30. package/dist/components/SettingsDialog.d.ts.map +1 -0
  31. package/dist/components/SettingsDialog.js +95 -0
  32. package/dist/components/SettingsDialog.js.map +1 -0
  33. package/dist/dashboard.js +2 -2
  34. package/dist/hooks/useAutoUpdater.js +2 -2
  35. package/dist/hooks/useAutoUpdater.js.map +1 -1
  36. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  37. package/dist/hooks/usePaneCreation.js +22 -3
  38. package/dist/hooks/usePaneCreation.js.map +1 -1
  39. package/dist/hooks/usePanes.js +2 -2
  40. package/dist/hooks/usePanes.js.map +1 -1
  41. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  42. package/dist/hooks/useTerminalWidth.js +5 -0
  43. package/dist/hooks/useTerminalWidth.js.map +1 -1
  44. package/dist/hooks/useWorktreeActions.js +4 -4
  45. package/dist/hooks/useWorktreeActions.js.map +1 -1
  46. package/dist/server/embedded-assets.d.ts.map +1 -1
  47. package/dist/server/embedded-assets.js +251 -47
  48. package/dist/server/embedded-assets.js.map +1 -1
  49. package/dist/server/index.d.ts.map +1 -1
  50. package/dist/server/index.js +2 -1
  51. package/dist/server/index.js.map +1 -1
  52. package/dist/server/routes.d.ts.map +1 -1
  53. package/dist/server/routes.js +195 -55
  54. package/dist/server/routes.js.map +1 -1
  55. package/dist/services/ConfigWatcher.d.ts +9 -0
  56. package/dist/services/ConfigWatcher.d.ts.map +1 -1
  57. package/dist/services/ConfigWatcher.js +17 -0
  58. package/dist/services/ConfigWatcher.js.map +1 -1
  59. package/dist/services/StatusDetector.js +7 -7
  60. package/dist/services/StatusDetector.js.map +1 -1
  61. package/dist/services/TunnelService.d.ts.map +1 -1
  62. package/dist/services/TunnelService.js +25 -3
  63. package/dist/services/TunnelService.js.map +1 -1
  64. package/dist/shared/StateManager.d.ts +11 -0
  65. package/dist/shared/StateManager.d.ts.map +1 -1
  66. package/dist/shared/StateManager.js +26 -0
  67. package/dist/shared/StateManager.js.map +1 -1
  68. package/dist/types.d.ts +16 -0
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  71. package/dist/utils/conflictResolutionPane.js +3 -2
  72. package/dist/utils/conflictResolutionPane.js.map +1 -1
  73. package/dist/utils/generated-agents-doc.d.ts +6 -0
  74. package/dist/utils/generated-agents-doc.d.ts.map +1 -0
  75. package/dist/utils/generated-agents-doc.js +430 -0
  76. package/dist/utils/generated-agents-doc.js.map +1 -0
  77. package/dist/utils/hooks.d.ts +70 -0
  78. package/dist/utils/hooks.d.ts.map +1 -0
  79. package/dist/utils/hooks.js +216 -0
  80. package/dist/utils/hooks.js.map +1 -0
  81. package/dist/utils/hooksDocs.d.ts +42 -0
  82. package/dist/utils/hooksDocs.d.ts.map +1 -0
  83. package/dist/utils/hooksDocs.js +325 -0
  84. package/dist/utils/hooksDocs.js.map +1 -0
  85. package/dist/utils/paneCapture.d.ts +21 -0
  86. package/dist/utils/paneCapture.d.ts.map +1 -0
  87. package/dist/utils/paneCapture.js +96 -0
  88. package/dist/utils/paneCapture.js.map +1 -0
  89. package/dist/utils/paneCreation.d.ts +1 -0
  90. package/dist/utils/paneCreation.d.ts.map +1 -1
  91. package/dist/utils/paneCreation.js +90 -18
  92. package/dist/utils/paneCreation.js.map +1 -1
  93. package/dist/utils/settingsManager.d.ts +49 -0
  94. package/dist/utils/settingsManager.d.ts.map +1 -0
  95. package/dist/utils/settingsManager.js +172 -0
  96. package/dist/utils/settingsManager.js.map +1 -0
  97. package/dist/utils/tmux.d.ts.map +1 -1
  98. package/dist/utils/tmux.js +79 -20
  99. package/dist/utils/tmux.js.map +1 -1
  100. package/dist/workers/PaneWorker.js +3 -6
  101. package/dist/workers/PaneWorker.js.map +1 -1
  102. package/package.json +4 -3
@@ -1102,9 +1102,11 @@ import { applySmartLayout } from './utils/tmux.js';
1102
1102
  import { suggestCommand } from './utils/commands.js';
1103
1103
  import { generateSlug } from './utils/slug.js';
1104
1104
  import { getMainBranch } from './utils/git.js';
1105
+ import { capturePaneContent } from './utils/paneCapture.js';
1105
1106
  import { StateManager } from './shared/StateManager.js';
1106
1107
  import { getStatusDetector } from './services/StatusDetector.js';
1107
1108
  import { PaneAction, getAvailableActions } from './actions/index.js';
1109
+ import { SettingsManager, SETTING_DEFINITIONS } from './utils/settingsManager.js';
1108
1110
  const require = createRequire(import.meta.url);
1109
1111
  const packageJson = require('../package.json');
1110
1112
  import PanesGrid from './components/PanesGrid.js';
@@ -1123,7 +1125,9 @@ import ActionChoiceDialog from './components/ActionChoiceDialog.js';
1123
1125
  import ActionConfirmDialog from './components/ActionConfirmDialog.js';
1124
1126
  import ActionInputDialog from './components/ActionInputDialog.js';
1125
1127
  import ActionProgressDialog from './components/ActionProgressDialog.js';
1126
- const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdater, serverPort, server }) => {
1128
+ import SettingsDialog from './components/SettingsDialog.js';
1129
+ import HooksDialog from './components/HooksDialog.js';
1130
+ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, projectRoot, autoUpdater, serverPort, server }) => {
1127
1131
  /* panes state moved to usePanes */
1128
1132
  const [selectedIndex, setSelectedIndex] = useState(0);
1129
1133
  const [showNewPaneDialog, setShowNewPaneDialog] = useState(false);
@@ -1133,9 +1137,23 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1133
1137
  const [showQRCode, setShowQRCode] = useState(false);
1134
1138
  const [tunnelUrl, setTunnelUrl] = useState(null);
1135
1139
  const [isCreatingTunnel, setIsCreatingTunnel] = useState(false);
1140
+ // Settings state
1141
+ const [settingsManager] = useState(() => new SettingsManager(projectRoot));
1142
+ const [showSettingsDialog, setShowSettingsDialog] = useState(false);
1143
+ const [settingsMode, setSettingsMode] = useState('list');
1144
+ const [settingsSelectedIndex, setSettingsSelectedIndex] = useState(0);
1145
+ const [settingsEditingKey, setSettingsEditingKey] = useState();
1146
+ const [settingsEditingValueIndex, setSettingsEditingValueIndex] = useState(0);
1147
+ const [settingsScopeIndex, setSettingsScopeIndex] = useState(0);
1136
1148
  // Force repaint trigger - incrementing this causes Ink to re-render
1137
1149
  const [forceRepaintTrigger, setForceRepaintTrigger] = useState(0);
1150
+ // Spinner state - shows for a few frames to force render
1151
+ const [showRepaintSpinner, setShowRepaintSpinner] = useState(false);
1138
1152
  const { projectSettings, saveSettings } = useProjectSettings(settingsFile);
1153
+ // Hooks management state
1154
+ const [showHooksDialog, setShowHooksDialog] = useState(false);
1155
+ const [hooksSelectedIndex, setHooksSelectedIndex] = useState(0);
1156
+ const [hooksData, setHooksData] = useState([]);
1139
1157
  const [showCommandPrompt, setShowCommandPrompt] = useState(null);
1140
1158
  const [commandInput, setCommandInput] = useState('');
1141
1159
  const [showFileCopyPrompt, setShowFileCopyPrompt] = useState(false);
@@ -1146,6 +1164,8 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1146
1164
  const [kebabMenuPaneIndex, setKebabMenuPaneIndex] = useState(null);
1147
1165
  const [kebabMenuOption, setKebabMenuOption] = useState(0);
1148
1166
  const [kebabMenuActions, setKebabMenuActions] = useState([]);
1167
+ // Debug message state - for temporary logging messages
1168
+ const [debugMessage, setDebugMessage] = useState('');
1149
1169
  // Update state handled by hook
1150
1170
  const { updateInfo, showUpdateDialog, isUpdating, performUpdate, skipUpdate, dismissUpdate, updateAvailable } = useAutoUpdater(autoUpdater, setStatusMessage);
1151
1171
  const { exit } = useApp();
@@ -1187,8 +1207,13 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1187
1207
  setStatusMessage,
1188
1208
  setRunningCommand,
1189
1209
  });
1190
- // Force repaint helper
1191
- const forceRepaint = () => setForceRepaintTrigger(prev => prev + 1);
1210
+ // Force repaint helper - shows spinner for a few frames to force full re-render
1211
+ const forceRepaint = () => {
1212
+ setForceRepaintTrigger(prev => prev + 1);
1213
+ setShowRepaintSpinner(true);
1214
+ // Hide spinner after a few frames (enough to trigger multiple renders)
1215
+ setTimeout(() => setShowRepaintSpinner(false), 100);
1216
+ };
1192
1217
  // Force repaint effect - ensures Ink re-renders when trigger changes
1193
1218
  useEffect(() => {
1194
1219
  if (forceRepaintTrigger > 0) {
@@ -1203,7 +1228,7 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1203
1228
  }
1204
1229
  }, [forceRepaintTrigger]);
1205
1230
  // Pane creation
1206
- const { openInEditor: openEditor2, createNewPane: createNewPaneHook } = usePaneCreation({
1231
+ const { createNewPane: createNewPaneHook } = usePaneCreation({
1207
1232
  panes,
1208
1233
  savePanes,
1209
1234
  projectName,
@@ -1287,6 +1312,14 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1287
1312
  const stateManager = StateManager.getInstance();
1288
1313
  stateManager.updateSettings(projectSettings);
1289
1314
  }, [projectSettings]);
1315
+ // Expose debug message setter via StateManager
1316
+ useEffect(() => {
1317
+ const stateManager = StateManager.getInstance();
1318
+ stateManager.setDebugMessageCallback(setDebugMessage);
1319
+ return () => {
1320
+ stateManager.setDebugMessageCallback(undefined);
1321
+ };
1322
+ }, []);
1290
1323
  // Load panes and settings on mount and refresh periodically
1291
1324
  useEffect(() => {
1292
1325
  // SIGTERM should quit immediately (for process management)
@@ -1294,6 +1327,11 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1294
1327
  cleanExit();
1295
1328
  };
1296
1329
  process.on('SIGTERM', handleTermination);
1330
+ // Test debug message on mount
1331
+ StateManager.getInstance().setDebugMessage('Debug logging initialized - watching for AI activity...');
1332
+ setTimeout(() => {
1333
+ StateManager.getInstance().setDebugMessage('');
1334
+ }, 3000);
1297
1335
  return () => {
1298
1336
  process.removeListener('SIGTERM', handleTermination);
1299
1337
  };
@@ -1515,8 +1553,7 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1515
1553
  await new Promise(resolve => setTimeout(resolve, checkInterval));
1516
1554
  try {
1517
1555
  // Capture the pane content
1518
- const paneContent = execSync(\`tmux capture-pane -t '\${paneInfo}' -p -S -30\`, // Capture last 30 lines
1519
- { encoding: 'utf-8', stdio: 'pipe' });
1556
+ const paneContent = capturePaneContent(paneInfo, 30);
1520
1557
  if (i % 10 === 0) { // Log every 10 checks (every second)
1521
1558
  }
1522
1559
  // Check if content has stabilized (same for 3 checks = prompt is waiting)
@@ -1560,7 +1597,7 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1560
1597
  // Wait and check if prompt is gone
1561
1598
  await new Promise(resolve => setTimeout(resolve, 500));
1562
1599
  // Verify the prompt is gone
1563
- const updatedContent = execSync(\`tmux capture-pane -t '\${paneInfo}' -p -S -10\`, { encoding: 'utf-8', stdio: 'pipe' });
1600
+ const updatedContent = capturePaneContent(paneInfo, 10);
1564
1601
  // If trust prompt is gone, check if we need to resend the Claude command
1565
1602
  const promptGone = !trustPromptPatterns.some(p => p.test(updatedContent));
1566
1603
  if (promptGone) {
@@ -1634,6 +1671,8 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1634
1671
  // Ignore if already set or fails
1635
1672
  }
1636
1673
  execSync(\`tmux select-pane -t '\${paneId}'\`, { stdio: 'pipe' });
1674
+ // Clear screen after jump to remove artifacts
1675
+ clearScreen();
1637
1676
  setStatusMessage('Jumped to pane');
1638
1677
  setTimeout(() => setStatusMessage(''), 2000);
1639
1678
  }
@@ -1717,6 +1756,9 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1717
1756
  // Update handling moved to useAutoUpdater
1718
1757
  // Helper function to clear screen artifacts
1719
1758
  const clearScreen = () => {
1759
+ // CRITICAL: Force Ink to re-render FIRST, before clearing
1760
+ // This prevents blank screen by ensuring React starts rendering immediately
1761
+ setForceRepaintTrigger(prev => prev + 1);
1720
1762
  // Multiple clearing strategies to prevent artifacts
1721
1763
  // 1. Clear screen with ANSI codes
1722
1764
  process.stdout.write('\\x1b[2J\\x1b[H');
@@ -1730,12 +1772,6 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1730
1772
  execSync('tmux refresh-client', { stdio: 'pipe' });
1731
1773
  }
1732
1774
  catch { }
1733
- // 4. Force Ink to repaint after clearing with a delay
1734
- // This prevents the blank screen bug by ensuring Ink re-renders
1735
- // after the terminal has processed the clear operations
1736
- setTimeout(() => {
1737
- setForceRepaintTrigger(prev => prev + 1);
1738
- }, 200);
1739
1775
  };
1740
1776
  // Cleanup function for exit
1741
1777
  const cleanExit = () => {
@@ -1793,7 +1829,6 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1793
1829
  setKebabMenuPaneIndex(null);
1794
1830
  setKebabMenuOption(0);
1795
1831
  setKebabMenuActions([]);
1796
- clearScreen();
1797
1832
  return;
1798
1833
  }
1799
1834
  else if (key.upArrow) {
@@ -1807,7 +1842,6 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1807
1842
  else if (key.return) {
1808
1843
  // Execute the selected menu action
1809
1844
  setShowKebabMenu(false);
1810
- clearScreen();
1811
1845
  const selectedAction = availableActions[kebabMenuOption];
1812
1846
  if (selectedAction) {
1813
1847
  // Use the action system to execute
@@ -1836,6 +1870,173 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1836
1870
  }
1837
1871
  return;
1838
1872
  }
1873
+ // Handle hooks dialog
1874
+ if (showHooksDialog) {
1875
+ if (key.escape) {
1876
+ setShowHooksDialog(false);
1877
+ setHooksSelectedIndex(0);
1878
+ // Go back to settings dialog
1879
+ setShowSettingsDialog(true);
1880
+ setSettingsMode('list');
1881
+ return;
1882
+ }
1883
+ else if (key.upArrow) {
1884
+ setHooksSelectedIndex(Math.max(0, hooksSelectedIndex - 1));
1885
+ return;
1886
+ }
1887
+ else if (key.downArrow) {
1888
+ setHooksSelectedIndex(Math.min(hooksData.length - 1, hooksSelectedIndex + 1));
1889
+ return;
1890
+ }
1891
+ else if (input === 'e') {
1892
+ // Edit hooks using an agent
1893
+ setShowHooksDialog(false);
1894
+ setHooksSelectedIndex(0);
1895
+ const prompt = "I would like to edit my dmux hooks in .dmux-hooks, please read the instructions in there and ask me what I want to edit";
1896
+ setPendingPrompt(prompt);
1897
+ setNewPanePrompt(prompt);
1898
+ // Choose agent
1899
+ const agents = availableAgents;
1900
+ if (agents.length === 0) {
1901
+ createNewPaneHook(prompt);
1902
+ }
1903
+ else if (agents.length === 1) {
1904
+ createNewPaneHook(prompt, agents[0]);
1905
+ }
1906
+ else {
1907
+ setShowAgentChoiceDialog(true);
1908
+ setAgentChoice(agentChoice || 'claude');
1909
+ }
1910
+ return;
1911
+ }
1912
+ return;
1913
+ }
1914
+ // Handle settings dialog
1915
+ if (showSettingsDialog) {
1916
+ if (key.escape) {
1917
+ if (settingsMode === 'list') {
1918
+ // Close settings dialog
1919
+ setShowSettingsDialog(false);
1920
+ setSettingsMode('list');
1921
+ setSettingsSelectedIndex(0);
1922
+ setSettingsEditingKey(undefined);
1923
+ }
1924
+ else {
1925
+ // Go back to list
1926
+ setSettingsMode('list');
1927
+ setSettingsEditingKey(undefined);
1928
+ setSettingsEditingValueIndex(0);
1929
+ setSettingsScopeIndex(0);
1930
+ }
1931
+ return;
1932
+ }
1933
+ else if (key.upArrow) {
1934
+ if (settingsMode === 'list') {
1935
+ setSettingsSelectedIndex(Math.max(0, settingsSelectedIndex - 1));
1936
+ }
1937
+ else if (settingsMode === 'edit') {
1938
+ const currentDef = SETTING_DEFINITIONS[settingsSelectedIndex];
1939
+ const maxIndex = currentDef.type === 'boolean' ? 1 : (currentDef.options?.length || 1) - 1;
1940
+ setSettingsEditingValueIndex(Math.max(0, settingsEditingValueIndex - 1));
1941
+ }
1942
+ else if (settingsMode === 'scope') {
1943
+ setSettingsScopeIndex(Math.max(0, settingsScopeIndex - 1));
1944
+ }
1945
+ return;
1946
+ }
1947
+ else if (key.downArrow) {
1948
+ if (settingsMode === 'list') {
1949
+ setSettingsSelectedIndex(Math.min(SETTING_DEFINITIONS.length - 1, settingsSelectedIndex + 1));
1950
+ }
1951
+ else if (settingsMode === 'edit') {
1952
+ const currentDef = SETTING_DEFINITIONS[settingsSelectedIndex];
1953
+ const maxIndex = currentDef.type === 'boolean' ? 1 : (currentDef.options?.length || 1) - 1;
1954
+ setSettingsEditingValueIndex(Math.min(maxIndex, settingsEditingValueIndex + 1));
1955
+ }
1956
+ else if (settingsMode === 'scope') {
1957
+ setSettingsScopeIndex(Math.min(1, settingsScopeIndex + 1));
1958
+ }
1959
+ return;
1960
+ }
1961
+ else if (key.return) {
1962
+ if (settingsMode === 'list') {
1963
+ const currentDef = SETTING_DEFINITIONS[settingsSelectedIndex];
1964
+ // Handle action type - trigger the action instead of editing
1965
+ if (currentDef.type === 'action') {
1966
+ if (currentDef.key === 'hooks') {
1967
+ // Show hooks dialog
1968
+ setShowSettingsDialog(false);
1969
+ const { hasHook } = await import('./utils/hooks.js');
1970
+ const allHookTypes = [
1971
+ 'before_pane_create',
1972
+ 'pane_created',
1973
+ 'worktree_created',
1974
+ 'before_pane_close',
1975
+ 'pane_closed',
1976
+ 'before_worktree_remove',
1977
+ 'worktree_removed',
1978
+ 'pre_merge',
1979
+ 'post_merge',
1980
+ 'run_test',
1981
+ 'run_dev',
1982
+ ];
1983
+ const hooks = allHookTypes.map(hookName => ({
1984
+ name: hookName,
1985
+ active: hasHook(projectRoot || process.cwd(), hookName)
1986
+ }));
1987
+ setHooksData(hooks);
1988
+ setShowHooksDialog(true);
1989
+ setHooksSelectedIndex(0);
1990
+ }
1991
+ return;
1992
+ }
1993
+ // Enter edit mode for regular settings
1994
+ setSettingsEditingKey(currentDef.key);
1995
+ setSettingsMode('edit');
1996
+ // Set initial value index based on current setting
1997
+ const currentValue = settingsManager.getSetting(currentDef.key);
1998
+ if (currentDef.type === 'boolean') {
1999
+ setSettingsEditingValueIndex(currentValue ? 0 : 1);
2000
+ }
2001
+ else if (currentDef.type === 'select' && currentDef.options) {
2002
+ const optIndex = currentDef.options.findIndex(o => o.value === currentValue);
2003
+ setSettingsEditingValueIndex(Math.max(0, optIndex));
2004
+ }
2005
+ }
2006
+ else if (settingsMode === 'edit') {
2007
+ // Go to scope selection
2008
+ setSettingsMode('scope');
2009
+ setSettingsScopeIndex(0);
2010
+ }
2011
+ else if (settingsMode === 'scope') {
2012
+ // Save the setting
2013
+ const currentDef = SETTING_DEFINITIONS[settingsSelectedIndex];
2014
+ const scope = settingsScopeIndex === 0 ? 'global' : 'project';
2015
+ // Only save if this is not an action type (actions don't have values)
2016
+ if (currentDef.type !== 'action') {
2017
+ // Calculate the new value
2018
+ let newValue;
2019
+ if (currentDef.type === 'boolean') {
2020
+ newValue = settingsEditingValueIndex === 0;
2021
+ }
2022
+ else if (currentDef.type === 'select' && currentDef.options) {
2023
+ newValue = currentDef.options[settingsEditingValueIndex]?.value || '';
2024
+ }
2025
+ // Update the setting - cast key to proper type since we know it's not an action
2026
+ settingsManager.updateSetting(currentDef.key, newValue, scope);
2027
+ }
2028
+ // Reset to list view
2029
+ setSettingsMode('list');
2030
+ setSettingsEditingKey(undefined);
2031
+ setSettingsEditingValueIndex(0);
2032
+ setSettingsScopeIndex(0);
2033
+ setStatusMessage(\`Setting saved (\${scope})\`);
2034
+ setTimeout(() => setStatusMessage(''), 2000);
2035
+ }
2036
+ return;
2037
+ }
2038
+ return;
2039
+ }
1839
2040
  // Handle action system confirm dialog
1840
2041
  if (actionSystem.actionState.showConfirmDialog) {
1841
2042
  if (key.escape) {
@@ -1994,7 +2195,7 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
1994
2195
  const promptValue = pendingPrompt;
1995
2196
  setShowAgentChoiceDialog(false);
1996
2197
  setPendingPrompt('');
1997
- await createNewPane(promptValue, chosen);
2198
+ await createNewPaneHook(promptValue, chosen);
1998
2199
  setNewPanePrompt('');
1999
2200
  }
2000
2201
  return;
@@ -2047,10 +2248,6 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
2047
2248
  setShowNewPaneDialog(false);
2048
2249
  setNewPanePrompt('');
2049
2250
  }
2050
- else if (key.ctrl && input === 'o') {
2051
- // Open in external editor
2052
- openEditor2(newPanePrompt, setNewPanePrompt);
2053
- }
2054
2251
  // TextInput handles other input events
2055
2252
  return;
2056
2253
  }
@@ -2083,6 +2280,12 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
2083
2280
  setKebabMenuPaneIndex(selectedIndex);
2084
2281
  setKebabMenuOption(0);
2085
2282
  }
2283
+ else if (input === 's') {
2284
+ // Open settings dialog
2285
+ setShowSettingsDialog(true);
2286
+ setSettingsMode('list');
2287
+ setSettingsSelectedIndex(0);
2288
+ }
2086
2289
  else if (input === 'q') {
2087
2290
  cleanExit();
2088
2291
  }
@@ -2118,14 +2321,20 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
2118
2321
  }
2119
2322
  else if (input === 'j' && selectedIndex < panes.length) {
2120
2323
  // Jump to pane (NEW: using action system)
2324
+ StateManager.getInstance().setDebugMessage(\`Jumping to pane: \${panes[selectedIndex].slug}\`);
2325
+ setTimeout(() => StateManager.getInstance().setDebugMessage(''), 2000);
2121
2326
  actionSystem.executeAction(PaneAction.VIEW, panes[selectedIndex]);
2122
2327
  }
2123
2328
  else if (input === 'x' && selectedIndex < panes.length) {
2124
2329
  // Close pane (NEW: using action system)
2330
+ StateManager.getInstance().setDebugMessage(\`Closing pane: \${panes[selectedIndex].slug}\`);
2331
+ setTimeout(() => StateManager.getInstance().setDebugMessage(''), 2000);
2125
2332
  actionSystem.executeAction(PaneAction.CLOSE, panes[selectedIndex]);
2126
2333
  }
2127
2334
  else if (key.return && selectedIndex < panes.length) {
2128
2335
  // Jump to pane (NEW: using action system)
2336
+ StateManager.getInstance().setDebugMessage(\`Jumping to pane: \${panes[selectedIndex].slug}\`);
2337
+ setTimeout(() => StateManager.getInstance().setDebugMessage(''), 2000);
2129
2338
  actionSystem.executeAction(PaneAction.VIEW, panes[selectedIndex]);
2130
2339
  }
2131
2340
  });
@@ -2139,6 +2348,8 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
2139
2348
  React.createElement(Text, { dimColor: true }, "Press ESC to return to pane list"))));
2140
2349
  }
2141
2350
  return (React.createElement(Box, { flexDirection: "column" },
2351
+ showRepaintSpinner && (React.createElement(Box, { marginTop: -10, marginLeft: -100 },
2352
+ React.createElement(Text, null, "\\u27F3"))),
2142
2353
  React.createElement(PanesGrid, { panes: panes, selectedIndex: selectedIndex, isLoading: isLoading, showNewPaneDialog: showNewPaneDialog, agentStatuses: agentStatuses, kebabMenuPaneIndex: kebabMenuPaneIndex ?? undefined }),
2143
2354
  isLoading && (React.createElement(LoadingIndicator, null)),
2144
2355
  showNewPaneDialog && !showAgentChoiceDialog && (React.createElement(NewPaneDialog, { value: newPanePrompt, onChange: setNewPanePrompt, onSubmit: (value) => {
@@ -2167,6 +2378,8 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
2167
2378
  showCommandPrompt && (React.createElement(CommandPromptDialog, { type: showCommandPrompt, value: commandInput, onChange: setCommandInput })),
2168
2379
  showFileCopyPrompt && (React.createElement(FileCopyPrompt, null)),
2169
2380
  showKebabMenu && kebabMenuPaneIndex !== null && panes[kebabMenuPaneIndex] && (React.createElement(KebabMenu, { selectedOption: kebabMenuOption, actions: kebabMenuActions, paneName: panes[kebabMenuPaneIndex].slug })),
2381
+ showSettingsDialog && (React.createElement(SettingsDialog, { settings: settingsManager.getSettings(), globalSettings: settingsManager.getGlobalSettings(), projectSettings: settingsManager.getProjectSettings(), settingDefinitions: SETTING_DEFINITIONS, selectedIndex: settingsSelectedIndex, mode: settingsMode, editingKey: settingsEditingKey, editingValueIndex: settingsEditingValueIndex, scopeIndex: settingsScopeIndex })),
2382
+ showHooksDialog && (React.createElement(HooksDialog, { hooks: hooksData, selectedIndex: hooksSelectedIndex })),
2170
2383
  actionSystem.actionState.showConfirmDialog && (React.createElement(ActionConfirmDialog, { key: "confirm-dialog", title: actionSystem.actionState.confirmTitle, message: actionSystem.actionState.confirmMessage, yesLabel: actionSystem.actionState.confirmYesLabel, noLabel: actionSystem.actionState.confirmNoLabel, selectedIndex: actionSystem.actionState.confirmSelectedIndex })),
2171
2384
  actionSystem.actionState.showChoiceDialog && (React.createElement(ActionChoiceDialog, { key: "choice-dialog", title: actionSystem.actionState.choiceTitle, message: actionSystem.actionState.choiceMessage, options: actionSystem.actionState.choiceOptions, selectedIndex: actionSystem.actionState.choiceSelectedIndex })),
2172
2385
  actionSystem.actionState.showInputDialog && (React.createElement(ActionInputDialog, { key: "input-dialog", title: actionSystem.actionState.inputTitle, message: actionSystem.actionState.inputMessage, placeholder: actionSystem.actionState.inputPlaceholder, value: actionSystem.actionState.inputValue, onValueChange: (value) => {
@@ -2194,16 +2407,22 @@ const DmuxApp = ({ panesFile, projectName, sessionName, settingsFile, autoUpdate
2194
2407
  return \`Grid: \${cols} cols × \${rows} rows | Selected: row \${pos.row}, col \${pos.col} | Terminal: \${terminalWidth}w\`;
2195
2408
  })() }),
2196
2409
  React.createElement(Text, { dimColor: true },
2410
+ updateAvailable && updateInfo && (React.createElement(Text, { color: "red", bold: true }, "Update available: npm i -g dmux@latest ")),
2197
2411
  "v",
2198
2412
  packageJson.version,
2199
- updateAvailable && updateInfo && (React.createElement(Text, { color: "yellow" },
2200
- " \\u2022 Update available: ",
2201
- updateInfo.latestVersion)))));
2413
+ serverPort && serverPort > 0 && (React.createElement(Text, { dimColor: true },
2414
+ " \\u2022 ",
2415
+ React.createElement(Text, { color: "cyan" },
2416
+ "http://127.0.0.1:",
2417
+ serverPort))),
2418
+ debugMessage && (React.createElement(Text, { dimColor: true },
2419
+ " \\u2022 ",
2420
+ debugMessage)))));
2202
2421
  };
2203
2422
  export default DmuxApp;
2204
2423
  //# sourceMappingURL=DmuxApp.js.map`,
2205
2424
  mimeType: 'application/javascript',
2206
- size: 56907
2425
+ size: 68389
2207
2426
  },
2208
2427
  'EnhancedTextInput.js': {
2209
2428
  content: `import React, { useState, useEffect } from 'react';
@@ -3358,7 +3577,7 @@ export default MultilineTextInput;
3358
3577
  size: 7643
3359
3578
  },
3360
3579
  'PaneAnalyzer.js': {
3361
- content: `import { execSync } from 'child_process';
3580
+ content: `import { capturePaneContent } from './utils/paneCapture.js';
3362
3581
  export class PaneAnalyzer {
3363
3582
  apiKey;
3364
3583
  modelStack = [
@@ -3369,21 +3588,6 @@ export class PaneAnalyzer {
3369
3588
  constructor() {
3370
3589
  this.apiKey = process.env.OPENROUTER_API_KEY || '';
3371
3590
  }
3372
- /**
3373
- * Captures the last N lines from a tmux pane
3374
- */
3375
- capturePaneContent(paneId, lines = 50) {
3376
- try {
3377
- // Capture pane content with line history
3378
- // -p prints to stdout, -S -<lines> starts from <lines> lines back
3379
- const content = execSync(\`tmux capture-pane -t '\${paneId}' -p -S -\${lines}\`, { encoding: 'utf8', stdio: 'pipe' });
3380
- return content;
3381
- }
3382
- catch (error) {
3383
- // Failed to capture pane content
3384
- return '';
3385
- }
3386
- }
3387
3591
  /**
3388
3592
  * Makes a request to OpenRouter API with model fallback
3389
3593
  */
@@ -3602,7 +3806,7 @@ If there's no meaningful content or the output is unclear, return an empty summa
3602
3806
  */
3603
3807
  async analyzePane(paneId, signal) {
3604
3808
  // Capture the pane content (50 lines for state detection)
3605
- const content = this.capturePaneContent(paneId, 50);
3809
+ const content = capturePaneContent(paneId, 50);
3606
3810
  if (!content) {
3607
3811
  return { state: 'in_progress' };
3608
3812
  }
@@ -3637,7 +3841,7 @@ If there's no meaningful content or the output is unclear, return an empty summa
3637
3841
  }
3638
3842
  //# sourceMappingURL=PaneAnalyzer.js.map`,
3639
3843
  mimeType: 'application/javascript',
3640
- size: 10767
3844
+ size: 10249
3641
3845
  },
3642
3846
  'SimpleEnhancedInput.js': {
3643
3847
  content: `import React, { useState, useEffect } from 'react';
@@ -4524,10 +4728,10 @@ export default StyledTextInput;
4524
4728
  size: 511
4525
4729
  },
4526
4730
  '_plugin-vue_export-helper.css': {
4527
- content: `*{margin:0;padding:0;box-sizing:border-box}:root{--bg-gradient-start: #0f0f23;--bg-gradient-mid: #1a1a2e;--bg-gradient-end: #16213e;--text-primary: #e0e0e0;--text-secondary: #a0a0a0;--text-tertiary: #808080;--text-dim: #606060;--text-dimmer: #666;--text-bright: #fff;--border-color: rgba(255, 255, 255, .1);--border-accent: rgba(255, 140, 0, .3);--card-bg: rgba(255, 255, 255, .05);--card-border: rgba(255, 255, 255, .1);--header-bg: rgba(255, 255, 255, .05);--input-bg: rgba(255, 255, 255, .05);--input-border: rgba(255, 255, 255, .12);--input-focus-border: rgba(255, 140, 0, .5);--input-focus-bg: rgba(255, 255, 255, .08);--input-focus-shadow: rgba(255, 140, 0, .1);--button-bg: rgba(200, 210, 230, .15);--button-border: rgba(255, 255, 255, .08);--button-hover-bg: rgba(200, 210, 230, .25);--button-hover-border: rgba(255, 255, 255, .15);--tooltip-bg: rgba(20, 20, 30, .98);--tooltip-border: rgba(255, 255, 255, .15);--hint-bg: rgba(255, 255, 255, .05);--agent-bg: rgba(255, 255, 255, .08);--agent-border: rgba(255, 255, 255, .15);--idle-badge-bg: rgba(255, 255, 255, .08);--idle-badge-border: rgba(255, 255, 255, .1)}[data-theme=light]{--bg-gradient-start: #f0f4f8;--bg-gradient-mid: #e6eef5;--bg-gradient-end: #dce7f0;--text-primary: #1a1a2e;--text-secondary: #4a5568;--text-tertiary: #718096;--text-dim: #a0aec0;--text-dimmer: #cbd5e0;--text-bright: #000;--border-color: rgba(0, 0, 0, .1);--border-accent: rgba(255, 140, 0, .4);--card-bg: rgba(255, 255, 255, .8);--card-border: rgba(0, 0, 0, .08);--header-bg: rgba(255, 255, 255, .9);--input-bg: rgba(255, 255, 255, .6);--input-border: rgba(0, 0, 0, .15);--input-focus-border: rgba(255, 140, 0, .6);--input-focus-bg: rgba(255, 255, 255, .9);--input-focus-shadow: rgba(255, 140, 0, .15);--button-bg: rgba(0, 0, 0, .05);--button-border: rgba(0, 0, 0, .1);--button-hover-bg: rgba(0, 0, 0, .1);--button-hover-border: rgba(0, 0, 0, .2);--tooltip-bg: rgba(255, 255, 255, .98);--tooltip-border: rgba(0, 0, 0, .15);--hint-bg: rgba(0, 0, 0, .03);--agent-bg: rgba(0, 0, 0, .05);--agent-border: rgba(0, 0, 0, .12);--idle-badge-bg: rgba(0, 0, 0, .05);--idle-badge-border: rgba(0, 0, 0, .1)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes slideInFromTop{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}body{font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background:linear-gradient(135deg,var(--bg-gradient-start) 0%,var(--bg-gradient-mid) 50%,var(--bg-gradient-end) 100%);background-attachment:fixed;color:var(--text-primary);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:background .3s ease,color .3s ease}.container{max-width:1400px;margin:0 auto;padding:40px 20px;width:100%;flex:1;display:flex;flex-direction:column;animation:fadeIn .5s ease-out}header{display:flex;justify-content:space-between;align-items:center;padding:16px 24px;margin-bottom:0;background:var(--header-bg);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:2px solid var(--border-accent);animation:slideInFromTop .6s ease-out;gap:16px}.logo{height:24px;width:auto;flex-shrink:0}h1{font-size:18px;font-weight:600;letter-spacing:-.5px;color:var(--text-primary);flex:1;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:500px;margin:0 auto}.session-info{display:flex;gap:12px;align-items:center;font-size:13px;color:var(--text-secondary);flex-shrink:0}.theme-toggle{background:transparent;border:none;padding:4px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);flex-shrink:0;width:24px;height:24px}.theme-toggle:hover{color:var(--text-primary);transform:scale(1.1)}.theme-toggle svg{width:20px;height:20px;fill:currentColor}.session-info span{display:flex;align-items:center;gap:6px}.status-indicator{color:#4ade80;font-size:16px;animation:pulse 2s ease-in-out infinite}main{flex:1;padding-top:40px;min-height:0}.panes-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:24px;margin-bottom:40px}.pane-card{background:var(--card-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius:12px;padding:12px;position:relative;animation:fadeIn .5s ease-out backwards;color:inherit;display:block;min-width:0;overflow:hidden}.pane-card:nth-child(1){animation-delay:.1s}.pane-card:nth-child(2){animation-delay:.15s}.pane-card:nth-child(3){animation-delay:.2s}.pane-card:nth-child(4){animation-delay:.25s}.pane-card:nth-child(5){animation-delay:.3s}.pane-card:nth-child(6){animation-delay:.35s}.pane-header{margin-bottom:16px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;position:relative}.pane-header-content{flex:1;display:flex;flex-direction:column;gap:6px}.action-menu-btn{background:transparent;border:none;color:var(--text-tertiary);font-size:20px;padding:4px 8px;cursor:pointer;transition:all .2s ease;line-height:1;flex-shrink:0}.action-menu-btn:hover{color:var(--text-primary);background:var(--button-hover-bg);border-radius:4px}.action-menu-dropdown{position:absolute;top:32px;right:0;background:var(--tooltip-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--tooltip-border);border-radius:8px;padding:4px;z-index:100;min-width:180px;box-shadow:0 8px 24px #0000004d;animation:fadeIn .2s ease-out}.action-menu-item{width:100%;display:flex;align-items:center;gap:8px;padding:8px 12px;background:transparent;border:none;border-radius:4px;color:var(--text-primary);font-size:13px;cursor:pointer;transition:all .15s ease;text-align:left}.action-menu-item:hover:not(:disabled){background:var(--button-hover-bg)}.action-menu-item:disabled{opacity:.5;cursor:not-allowed}.action-icon{font-size:14px;width:16px;text-align:center}.action-label{flex:1}.pane-title-link{display:inline-flex;align-items:center;gap:8px;text-decoration:none;color:inherit;width:fit-content}.pane-title-link:hover .pane-title{text-decoration:underline}.pane-title{font-size:20px;font-weight:600;color:var(--text-bright);letter-spacing:-.3px}.pane-arrow{font-size:16px;color:var(--text-secondary);transition:all .2s ease;opacity:.6}.pane-title-link:hover .pane-arrow{color:#ff8c00;transform:translate(2px);opacity:1}.pane-meta{display:flex;align-items:center;gap:12px}.pane-agent{padding:2px 8px;border-radius:4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;background:var(--agent-bg);border:1px solid var(--agent-border);color:var(--text-tertiary);white-space:nowrap}.pane-agent.claude{background:#d9775726;border-color:#d977574d;color:#d97757}.pane-agent.opencode{background:#667eea26;border-color:#667eea4d;color:#667eea}.pane-prompt-section{margin-bottom:12px}.prompt-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-tertiary);transition:color .2s ease}.pane-prompt-preview{display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:all .2s ease}.pane-prompt-preview:hover .prompt-text{color:var(--text-primary)}.pane-prompt-preview:hover .prompt-label{color:var(--text-secondary)}.prompt-header{display:flex;align-items:center;gap:6px}.prompt-text{color:var(--text-secondary);font-size:13px;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:color .2s ease}.pane-prompt-preview.expanded .prompt-text{white-space:normal;display:none}.expand-icon{font-size:10px;color:var(--text-tertiary);transition:transform .2s ease;flex-shrink:0}.pane-prompt-full{color:var(--text-secondary);font-size:13px;margin-top:4px;line-height:1.6;font-family:SF Mono,Monaco,Courier New,monospace;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;max-width:100%}.agent-summary{color:var(--text-secondary);font-size:13px;margin-bottom:12px;padding:10px 12px;line-height:1.5;background:#60a5fa14;border:1px solid rgba(96,165,250,.2);border-radius:6px;font-style:italic}.analyzer-error{color:#ef4444;font-size:13px;margin-bottom:12px;padding:10px 12px;line-height:1.5;background:#ef444414;border:1px solid rgba(239,68,68,.2);border-radius:6px;font-weight:500}.tooltip{position:absolute;background:var(--tooltip-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--tooltip-border);padding:16px;border-radius:12px;z-index:1000;white-space:pre-wrap;max-width:400px;max-height:200px;overflow-y:auto;box-shadow:0 20px 60px #0000004d,0 0 0 1px var(--border-color);font-size:13px;color:var(--text-primary);pointer-events:none;animation:fadeIn .2s ease-out}.pane-status{display:flex;flex-direction:column;gap:10px}.status-item{display:flex;justify-content:space-between;align-items:center;font-size:13px;padding:8px 0}.status-label{color:var(--text-tertiary);font-weight:500}.status-value{display:flex;align-items:center;gap:6px}.status-badge{padding:4px 10px;border-radius:6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;transition:all .2s ease}.status-badge.working{background:linear-gradient(135deg,#fbbf24,#f59e0b);color:#000;box-shadow:0 2px 8px #fbbf2466}.status-badge.waiting{background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;box-shadow:0 2px 8px #60a5fa66}.status-badge.idle{background:var(--idle-badge-bg);color:var(--text-tertiary);border:1px solid var(--idle-badge-border)}.status-badge.running,.status-badge.passed{background:linear-gradient(135deg,#4ade80,#22c55e);color:#000;box-shadow:0 2px 8px #4ade8066}.status-badge.failed{background:linear-gradient(135deg,#f87171,#ef4444);color:#000;box-shadow:0 2px 8px #f8717166}.status-badge.analyzing{background:linear-gradient(135deg,#a78bfa,#8b5cf6);color:#000;box-shadow:0 2px 8px #a78bfa66;animation:pulse 2s ease-in-out infinite}.pane-id{font-family:SF Mono,Monaco,monospace;font-size:10px;color:var(--text-dimmer);font-weight:500;letter-spacing:.2px}.pane-interactive{margin-top:12px}.options-dialog{display:flex;flex-direction:column;gap:12px}.options-question{font-size:14px;font-weight:500;color:var(--text-primary);line-height:1.4}.options-warning{padding:8px 12px;background:#f871711a;border:1px solid rgba(248,113,113,.3);border-radius:6px;color:#fca5a5;font-size:12px;display:flex;align-items:center;gap:6px}.options-buttons{display:flex;flex-wrap:wrap;gap:8px}.option-button{padding:8px 16px;background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border:none;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px #60a5fa4d}.option-button:hover{transform:translateY(-2px);box-shadow:0 4px 12px #60a5fa66}.option-button:active{transform:translateY(0)}.option-button-danger{background:linear-gradient(135deg,#f87171,#ef4444);box-shadow:0 2px 8px #f871714d}.option-button-danger:hover{box-shadow:0 4px 12px #f8717166}.analyzing-state{display:flex;align-items:center;gap:12px;padding:8px 0;color:#a78bfa;font-size:14px;font-weight:500}.loader-spinner{width:20px;height:20px;border:3px solid rgba(167,139,250,.2);border-top-color:#a78bfa;border-radius:50%;animation:spin 1s linear infinite}.prompt-input-wrapper{display:flex;align-items:flex-start;gap:8px;padding:8px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:8px;transition:all .2s ease}.prompt-input-wrapper:focus-within{border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 3px var(--input-focus-shadow)}.queued-message{margin-top:8px;padding:6px 10px;background:#4ade801a;border:1px solid rgba(74,222,128,.3);border-radius:6px;color:#4ade80;font-size:12px;animation:fadeIn .3s ease-out}.prompt-textarea{flex:1;min-height:20px;max-height:150px;padding:0;background:transparent;border:none;color:var(--text-primary);font-family:SF Mono,Monaco,Courier New,monospace;font-size:13px;line-height:1.4;resize:none;overflow-y:auto}.prompt-textarea:focus{outline:none}.prompt-textarea:disabled{opacity:.5;cursor:not-allowed}.prompt-textarea::placeholder{color:var(--text-dimmer)}.send-button{flex-shrink:0;width:28px;height:28px;padding:6px;background:var(--button-bg);color:var(--text-secondary);border:1px solid var(--button-border);border-radius:50%;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.send-button:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.send-button:active:not(:disabled){transform:scale(.92)}.send-button:disabled{opacity:.3;cursor:not-allowed}.send-button svg{width:100%;height:100%;fill:currentColor}.button-loader{width:14px;height:14px;border:2px solid rgba(0,0,0,.2);border-top-color:#000;border-radius:50%;animation:spin .8s linear infinite}.dev-server-status{margin-top:12px;padding-top:12px;border-top:1px solid rgba(255,255,255,.08);display:flex;align-items:center;gap:8px;font-size:12px}.dev-link{color:#ff8c00;text-decoration:none;font-weight:600;transition:color .2s ease}.dev-link:hover{color:orange}.no-panes{text-align:center;padding:100px 20px;color:var(--text-tertiary);animation:fadeIn .6s ease-out}.no-panes p{margin-bottom:16px;font-size:18px;font-weight:500}.hint{font-size:14px;color:var(--text-dim);background:var(--hint-bg);padding:12px 24px;border-radius:12px;display:inline-block;margin-top:8px}footer{padding:12px 0;margin-top:auto;animation:fadeIn .8s ease-out}.footer-info{display:flex;justify-content:space-between;font-size:11px;color:var(--text-dim);padding:0}.footer-info span{display:flex;align-items:center;gap:8px}@media (max-width: 768px){.container{padding:0 16px 24px}header{padding:12px 18px;gap:8px}.logo{height:20px}h1{font-size:14px;max-width:none}.session-info{font-size:11px;gap:8px}.session-info span:not(.status-indicator){display:none}main{padding-top:24px}.panes-grid{grid-template-columns:1fr;gap:16px}.footer-info{flex-direction:column;gap:6px;font-size:10px}}.term-fg-black{color:#000}.term-fg-red{color:#cd3131}.term-fg-green{color:#0dbc79}.term-fg-yellow{color:#e5e510}.term-fg-blue{color:#2472c8}.term-fg-magenta{color:#bc3fbc}.term-fg-cyan{color:#11a8cd}.term-fg-white{color:#e5e5e5}.term-fg-bright-black{color:#666}.term-fg-bright-red{color:#f14c4c}.term-fg-bright-green{color:#23d18b}.term-fg-bright-yellow{color:#f5f543}.term-fg-bright-blue{color:#3b8eea}.term-fg-bright-magenta{color:#d670d6}.term-fg-bright-cyan{color:#29b8db}.term-fg-bright-white{color:#fff}.term-bg-black{background-color:#000}.term-bg-red{background-color:#cd3131}.term-bg-green{background-color:#0dbc79}.term-bg-yellow{background-color:#e5e510}.term-bg-blue{background-color:#2472c8}.term-bg-magenta{background-color:#bc3fbc}.term-bg-cyan{background-color:#11a8cd}.term-bg-white{background-color:#e5e5e5}.term-bold{font-weight:700}.term-dim{opacity:.7}.term-italic{font-style:italic}.term-underline{text-decoration:underline}.term-strikethrough{text-decoration:line-through}.action-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn .2s ease-out}.action-dialog{background:var(--card-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius:16px;padding:32px;max-width:540px;width:90%;box-shadow:0 20px 60px #0006;animation:slideInFromTop .3s ease-out}.action-dialog h3{margin:0 0 20px;font-size:24px;font-weight:600;color:var(--text-bright);letter-spacing:-.5px}.action-dialog p,.action-dialog .dialog-message{margin:0 0 20px;color:var(--text-secondary);font-size:14px;line-height:1.5;white-space:pre-wrap;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}.action-dialog label{display:block;font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:10px;letter-spacing:-.2px}.action-dialog textarea{width:100%;padding:14px 16px;background:var(--input-bg);border:2px solid var(--input-border);border-radius:10px;color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,Segoe UI,Roboto,sans-serif;font-size:15px;line-height:1.5;resize:vertical;transition:all .2s ease;margin-bottom:20px}.action-dialog textarea:focus{outline:none;border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 4px var(--input-focus-shadow)}.action-dialog textarea::placeholder{color:var(--text-dim);font-style:italic}.dialog-hint{font-size:13px;color:var(--text-tertiary);margin-bottom:16px;display:flex;align-items:center;gap:6px}.dialog-hint kbd{background:var(--button-bg);border:1px solid var(--button-border);border-radius:4px;padding:2px 6px;font-family:SF Mono,Monaco,monospace;font-size:11px;font-weight:600;color:var(--text-primary);box-shadow:0 1px 2px #0000001a}.dialog-loading{display:flex;align-items:center;justify-content:center;gap:12px;padding:24px;color:var(--text-secondary);font-size:15px;font-weight:500}.dialog-loading .loader-spinner{width:24px;height:24px;border:3px solid rgba(96,165,250,.2);border-top-color:#60a5fa;border-radius:50%;animation:spin .8s linear infinite}.dialog-input{width:100%;padding:14px 16px;background:var(--input-bg);border:2px solid var(--input-border);border-radius:10px;color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,Segoe UI,Roboto,sans-serif;font-size:15px;line-height:1.5;transition:all .2s ease;margin-bottom:20px}.dialog-input:focus{outline:none;border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 4px var(--input-focus-shadow)}.dialog-input::placeholder{color:var(--text-dim);font-style:italic}.dialog-buttons{display:flex;gap:12px;justify-content:flex-end}.dialog-btn{padding:12px 24px;border:2px solid var(--button-border);border-radius:10px;background:var(--button-bg);color:var(--text-primary);font-size:15px;font-weight:600;cursor:pointer;transition:all .2s ease}.dialog-btn:hover{background:var(--button-hover-bg);border-color:var(--button-hover-border);transform:translateY(-1px)}.dialog-btn:active{transform:translateY(0)}.dialog-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.dialog-btn-primary{background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border-color:transparent;box-shadow:0 2px 8px #60a5fa4d}.dialog-btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 16px #60a5fa80}.dialog-btn-primary:active{transform:translateY(-1px);box-shadow:0 4px 12px #60a5fa66}.dialog-btn-primary:disabled{opacity:.6;transform:none;box-shadow:0 2px 8px #60a5fa33}.choice-options{display:flex;flex-direction:column;gap:8px}.choice-option-btn{width:100%;padding:12px 16px;background:var(--button-bg);border:1px solid var(--button-border);border-radius:8px;color:var(--text-primary);font-size:14px;text-align:left;cursor:pointer;transition:all .2s ease;display:flex;flex-direction:column;gap:4px}.choice-option-btn:hover{background:var(--button-hover-bg);border-color:var(--button-hover-border);transform:translate(4px)}.choice-option-btn.danger{border-color:#f871714d;background:#f871711a}.choice-option-btn.danger:hover{border-color:#f8717180;background:#f8717133}.agent-choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}.agent-choice-button{padding:16px 20px;background:var(--button-bg);border:2px solid var(--button-border);border-radius:12px;color:var(--text-primary);font-size:15px;font-weight:600;cursor:pointer;transition:all .2s ease;text-align:center;text-transform:capitalize;position:relative;overflow:hidden}.agent-choice-button:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#60a5fa1a,#3b82f61a);opacity:0;transition:opacity .2s ease}.agent-choice-button:hover{background:var(--button-hover-bg);border-color:var(--input-focus-border);transform:translateY(-2px);box-shadow:0 4px 12px #60a5fa33}.agent-choice-button:hover:before{opacity:1}.agent-choice-button:active{transform:translateY(0)}.agent-choice-button:disabled{opacity:.5;cursor:not-allowed;transform:none}.option-description{font-size:12px;color:var(--text-tertiary);font-weight:400}.terminal-page{display:flex;flex-direction:column;height:100vh;background:#000}.back-button{color:#e0e0e0;text-decoration:none;font-size:14px;font-weight:500;transition:color .2s;white-space:nowrap;flex-shrink:0}.back-button:hover{color:#fff}.terminal-content{flex:1;overflow:auto;padding:10px}.terminal-page .terminal-output{font-family:JetBrains Mono,SF Mono,Monaco,Cascadia Code,Roboto Mono,monospace;line-height:1.2;color:#f0f0f0;margin:0;min-height:100%}.terminal-row{white-space:pre;margin:0;padding:0;line-height:1.2}.mobile-toolbar{display:flex;gap:6px;padding:8px;background:#1a1a1a;border-bottom:1px solid #333;overflow-x:auto;flex-wrap:nowrap}.toolbar-key{background:#2d2d2d;border:1px solid #444;border-radius:4px;color:#e0e0e0;padding:8px 12px;font-size:13px;font-family:SF Mono,Monaco,monospace;cursor:pointer;flex-shrink:0;min-width:44px;transition:all .15s;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.toolbar-key:active{background:#3d3d3d;transform:scale(.95)}.toolbar-key.active{background:#667eea;border-color:#667eea;color:#fff}.mobile-input{position:absolute;left:-9999px;width:1px;height:1px;opacity:.01;pointer-events:none}.actions-bar{display:flex;justify-content:flex-end;margin-bottom:20px;padding:0 4px}.create-pane-button{display:flex;align-items:center;gap:8px;padding:10px 20px;background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px #60a5fa4d}.create-pane-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 12px #60a5fa66}.create-pane-button:disabled{opacity:.5;cursor:not-allowed;transform:none}.create-pane-button svg{width:16px;height:16px;fill:none;stroke-width:2.5}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:2000;animation:fadeIn .2s ease-out}.modal-dialog{background:var(--card-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius:16px;width:90%;max-width:600px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px #0006;animation:slideUp .3s ease-out}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--border-color)}.modal-header h2{font-size:20px;font-weight:600;color:var(--text-primary);margin:0}.modal-close{background:none;border:none;color:var(--text-secondary);font-size:32px;line-height:1;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:6px;transition:all .2s ease}.modal-close:hover{background:var(--button-hover-bg);color:var(--text-primary)}.modal-body{padding:24px;overflow-y:auto;flex:1}.form-group{margin-bottom:20px}.form-group:last-child{margin-bottom:0}.form-group label{display:block;font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:8px}.modal-textarea{width:100%;padding:12px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:8px;color:var(--text-primary);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;resize:vertical;min-height:100px;transition:all .2s ease}.modal-textarea:focus{outline:none;border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 3px var(--input-focus-shadow)}.modal-textarea:disabled{opacity:.5;cursor:not-allowed}.input-hint{font-size:12px;color:var(--text-tertiary);margin-top:6px}.agent-selector{display:flex;gap:12px}.agent-option{flex:1;display:flex;align-items:center;gap:12px;padding:12px 20px;background:var(--button-bg);border:2px solid var(--button-border);border-radius:8px;color:var(--text-primary);font-size:14px;font-weight:600;text-transform:capitalize;cursor:pointer;transition:all .2s ease}.agent-logo{width:40px;height:40px;flex-shrink:0}.agent-option:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.agent-option.selected{background:var(--input-focus-bg);border-color:var(--input-focus-border);color:var(--text-bright)}.agent-option:disabled{opacity:.5;cursor:not-allowed}.modal-footer{display:flex;gap:12px;padding:20px 24px;border-top:1px solid var(--border-color);justify-content:flex-end}.modal-button{padding:10px 24px;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;border:none;display:flex;align-items:center;gap:8px}.modal-button-secondary{background:var(--button-bg);color:var(--text-primary);border:1px solid var(--button-border)}.modal-button-secondary:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.modal-button-primary{background:var(--input-focus-bg);color:var(--text-bright);border:1px solid var(--input-focus-border)}.modal-button-primary:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.modal-button:disabled{opacity:.5;cursor:not-allowed}.button-loader{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}
4731
+ content: `*{margin:0;padding:0;box-sizing:border-box}:root{--bg-gradient-start: #0f0f23;--bg-gradient-mid: #1a1a2e;--bg-gradient-end: #16213e;--text-primary: #e0e0e0;--text-secondary: #a0a0a0;--text-tertiary: #808080;--text-dim: #606060;--text-dimmer: #666;--text-bright: #fff;--border-color: rgba(255, 255, 255, .1);--border-accent: rgba(255, 140, 0, .3);--card-bg: rgba(255, 255, 255, .05);--card-border: rgba(255, 255, 255, .1);--header-bg: rgba(255, 255, 255, .05);--input-bg: rgba(255, 255, 255, .05);--input-border: rgba(255, 255, 255, .12);--input-focus-border: rgba(255, 140, 0, .5);--input-focus-bg: rgba(255, 255, 255, .08);--input-focus-shadow: rgba(255, 140, 0, .1);--button-bg: rgba(200, 210, 230, .15);--button-border: rgba(255, 255, 255, .08);--button-hover-bg: rgba(200, 210, 230, .25);--button-hover-border: rgba(255, 255, 255, .15);--tooltip-bg: rgba(20, 20, 30, .98);--tooltip-border: rgba(255, 255, 255, .15);--hint-bg: rgba(255, 255, 255, .05);--agent-bg: rgba(255, 255, 255, .08);--agent-border: rgba(255, 255, 255, .15);--idle-badge-bg: rgba(255, 255, 255, .08);--idle-badge-border: rgba(255, 255, 255, .1)}[data-theme=light]{--bg-gradient-start: #f0f4f8;--bg-gradient-mid: #e6eef5;--bg-gradient-end: #dce7f0;--text-primary: #1a1a2e;--text-secondary: #4a5568;--text-tertiary: #718096;--text-dim: #a0aec0;--text-dimmer: #cbd5e0;--text-bright: #000;--border-color: rgba(0, 0, 0, .1);--border-accent: rgba(255, 140, 0, .4);--card-bg: rgba(255, 255, 255, .8);--card-border: rgba(0, 0, 0, .08);--header-bg: rgba(255, 255, 255, .9);--input-bg: rgba(255, 255, 255, .6);--input-border: rgba(0, 0, 0, .15);--input-focus-border: rgba(255, 140, 0, .6);--input-focus-bg: rgba(255, 255, 255, .9);--input-focus-shadow: rgba(255, 140, 0, .15);--button-bg: rgba(0, 0, 0, .05);--button-border: rgba(0, 0, 0, .1);--button-hover-bg: rgba(0, 0, 0, .1);--button-hover-border: rgba(0, 0, 0, .2);--tooltip-bg: rgba(255, 255, 255, .98);--tooltip-border: rgba(0, 0, 0, .15);--hint-bg: rgba(0, 0, 0, .03);--agent-bg: rgba(0, 0, 0, .05);--agent-border: rgba(0, 0, 0, .12);--idle-badge-bg: rgba(0, 0, 0, .05);--idle-badge-border: rgba(0, 0, 0, .1)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes slideInFromTop{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}body{font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background:linear-gradient(135deg,var(--bg-gradient-start) 0%,var(--bg-gradient-mid) 50%,var(--bg-gradient-end) 100%);background-attachment:fixed;color:var(--text-primary);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:background .3s ease,color .3s ease}.container{max-width:1400px;margin:0 auto;padding:40px 20px;width:100%;flex:1;display:flex;flex-direction:column;animation:fadeIn .5s ease-out}header{display:flex;justify-content:space-between;align-items:center;padding:16px 24px;margin-bottom:0;background:var(--header-bg);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:2px solid var(--border-accent);animation:slideInFromTop .6s ease-out;gap:16px}.logo{height:24px;width:auto;flex-shrink:0}h1{font-size:18px;font-weight:600;letter-spacing:-.5px;color:var(--text-primary);flex:1;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:500px;margin:0 auto}.session-info{display:flex;gap:12px;align-items:center;font-size:13px;color:var(--text-secondary);flex-shrink:0}.theme-toggle{background:transparent;border:none;padding:4px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);flex-shrink:0;width:24px;height:24px}.theme-toggle:hover{color:var(--text-primary);transform:scale(1.1)}.theme-toggle svg{width:20px;height:20px;fill:currentColor}.session-info span{display:flex;align-items:center;gap:6px}.status-indicator{color:#4ade80;font-size:16px;animation:pulse 2s ease-in-out infinite}main{flex:1;padding-top:40px;min-height:0}.panes-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:24px;margin-bottom:40px}.pane-card{background:var(--card-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius:12px;padding:12px;position:relative;animation:fadeIn .5s ease-out backwards;color:inherit;display:block;min-width:0;overflow:hidden}.pane-card:nth-child(1){animation-delay:.1s}.pane-card:nth-child(2){animation-delay:.15s}.pane-card:nth-child(3){animation-delay:.2s}.pane-card:nth-child(4){animation-delay:.25s}.pane-card:nth-child(5){animation-delay:.3s}.pane-card:nth-child(6){animation-delay:.35s}.pane-header{margin-bottom:16px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;position:relative}.pane-header-content{flex:1;display:flex;flex-direction:column;gap:6px}.action-menu-btn{background:transparent;border:none;color:var(--text-tertiary);font-size:20px;padding:4px 8px;cursor:pointer;transition:all .2s ease;line-height:1;flex-shrink:0}.action-menu-btn:hover{color:var(--text-primary);background:var(--button-hover-bg);border-radius:4px}.action-menu-dropdown{position:absolute;top:32px;right:0;background:var(--tooltip-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--tooltip-border);border-radius:8px;padding:4px;z-index:100;min-width:180px;box-shadow:0 8px 24px #0000004d;animation:fadeIn .2s ease-out}.action-menu-item{width:100%;display:flex;align-items:center;gap:8px;padding:8px 12px;background:transparent;border:none;border-radius:4px;color:var(--text-primary);font-size:13px;cursor:pointer;transition:all .15s ease;text-align:left}.action-menu-item:hover:not(:disabled){background:var(--button-hover-bg)}.action-menu-item:disabled{opacity:.5;cursor:not-allowed}.action-icon{font-size:14px;width:16px;text-align:center}.action-label{flex:1}.pane-title-link{display:inline-flex;align-items:center;gap:8px;text-decoration:none;color:inherit;width:fit-content}.pane-title-link:hover .pane-title{text-decoration:underline}.pane-title{font-size:20px;font-weight:600;color:var(--text-bright);letter-spacing:-.3px}.pane-arrow{font-size:16px;color:var(--text-secondary);transition:all .2s ease;opacity:.6}.pane-title-link:hover .pane-arrow{color:#ff8c00;transform:translate(2px);opacity:1}.pane-meta{display:flex;align-items:center;gap:12px}.pane-agent{padding:2px 8px;border-radius:4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;background:var(--agent-bg);border:1px solid var(--agent-border);color:var(--text-tertiary);white-space:nowrap}.pane-agent.claude{background:#d9775726;border-color:#d977574d;color:#d97757}.pane-agent.opencode{background:#667eea26;border-color:#667eea4d;color:#667eea}.pane-prompt-section{margin-bottom:12px}.prompt-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-tertiary);transition:color .2s ease}.pane-prompt-preview{display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:all .2s ease}.pane-prompt-preview:hover .prompt-text{color:var(--text-primary)}.pane-prompt-preview:hover .prompt-label{color:var(--text-secondary)}.prompt-header{display:flex;align-items:center;gap:6px}.prompt-text{color:var(--text-secondary);font-size:13px;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:color .2s ease}.pane-prompt-preview.expanded .prompt-text{white-space:normal;display:none}.expand-icon{font-size:10px;color:var(--text-tertiary);transition:transform .2s ease;flex-shrink:0}.pane-prompt-full{color:var(--text-secondary);font-size:13px;margin-top:4px;line-height:1.6;font-family:SF Mono,Monaco,Courier New,monospace;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;max-width:100%}.agent-summary{color:var(--text-secondary);font-size:13px;margin-bottom:12px;padding:10px 12px;line-height:1.5;background:#60a5fa14;border:1px solid rgba(96,165,250,.2);border-radius:6px;font-style:italic}.analyzer-error{color:#ef4444;font-size:13px;margin-bottom:12px;padding:10px 12px;line-height:1.5;background:#ef444414;border:1px solid rgba(239,68,68,.2);border-radius:6px;font-weight:500}.tooltip{position:absolute;background:var(--tooltip-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--tooltip-border);padding:16px;border-radius:12px;z-index:1000;white-space:pre-wrap;max-width:400px;max-height:200px;overflow-y:auto;box-shadow:0 20px 60px #0000004d,0 0 0 1px var(--border-color);font-size:13px;color:var(--text-primary);pointer-events:none;animation:fadeIn .2s ease-out}.pane-status{display:flex;flex-direction:column;gap:10px}.status-item{display:flex;justify-content:space-between;align-items:center;font-size:13px;padding:8px 0}.status-label{color:var(--text-tertiary);font-weight:500}.status-value{display:flex;align-items:center;gap:6px}.status-badge{padding:4px 10px;border-radius:6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;transition:all .2s ease}.status-badge.working{background:linear-gradient(135deg,#fbbf24,#f59e0b);color:#000;box-shadow:0 2px 8px #fbbf2466}.status-badge.waiting{background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;box-shadow:0 2px 8px #60a5fa66}.status-badge.idle{background:var(--idle-badge-bg);color:var(--text-tertiary);border:1px solid var(--idle-badge-border)}.status-badge.running,.status-badge.passed{background:linear-gradient(135deg,#4ade80,#22c55e);color:#000;box-shadow:0 2px 8px #4ade8066}.status-badge.failed{background:linear-gradient(135deg,#f87171,#ef4444);color:#000;box-shadow:0 2px 8px #f8717166}.status-badge.analyzing{background:linear-gradient(135deg,#a78bfa,#8b5cf6);color:#000;box-shadow:0 2px 8px #a78bfa66;animation:pulse 2s ease-in-out infinite}.pane-id{font-family:SF Mono,Monaco,monospace;font-size:10px;color:var(--text-dimmer);font-weight:500;letter-spacing:.2px}.pane-interactive{margin-top:12px}.options-dialog{display:flex;flex-direction:column;gap:12px}.options-question{font-size:14px;font-weight:500;color:var(--text-primary);line-height:1.4}.options-warning{padding:8px 12px;background:#f871711a;border:1px solid rgba(248,113,113,.3);border-radius:6px;color:#fca5a5;font-size:12px;display:flex;align-items:center;gap:6px}.options-buttons{display:flex;flex-wrap:wrap;gap:8px}.option-button{padding:8px 16px;background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border:none;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px #60a5fa4d}.option-button:hover{transform:translateY(-2px);box-shadow:0 4px 12px #60a5fa66}.option-button:active{transform:translateY(0)}.option-button-danger{background:linear-gradient(135deg,#f87171,#ef4444);box-shadow:0 2px 8px #f871714d}.option-button-danger:hover{box-shadow:0 4px 12px #f8717166}.analyzing-state{display:flex;align-items:center;gap:12px;padding:8px 0;color:#a78bfa;font-size:14px;font-weight:500}.loader-spinner{width:20px;height:20px;border:3px solid rgba(167,139,250,.2);border-top-color:#a78bfa;border-radius:50%;animation:spin 1s linear infinite}.prompt-input-wrapper{display:flex;align-items:flex-start;gap:8px;padding:8px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:8px;transition:all .2s ease}.prompt-input-wrapper:focus-within{border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 3px var(--input-focus-shadow)}.queued-message{margin-top:8px;padding:6px 10px;background:#4ade801a;border:1px solid rgba(74,222,128,.3);border-radius:6px;color:#4ade80;font-size:12px;animation:fadeIn .3s ease-out}.prompt-textarea{flex:1;min-height:20px;max-height:150px;padding:0;background:transparent;border:none;color:var(--text-primary);font-family:SF Mono,Monaco,Courier New,monospace;font-size:13px;line-height:1.4;resize:none;overflow-y:auto}.prompt-textarea:focus{outline:none}.prompt-textarea:disabled{opacity:.5;cursor:not-allowed}.prompt-textarea::placeholder{color:var(--text-dimmer)}.send-button{flex-shrink:0;width:28px;height:28px;padding:6px;background:var(--button-bg);color:var(--text-secondary);border:1px solid var(--button-border);border-radius:50%;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.send-button:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.send-button:active:not(:disabled){transform:scale(.92)}.send-button:disabled{opacity:.3;cursor:not-allowed}.send-button svg{width:100%;height:100%;fill:currentColor}.button-loader{width:14px;height:14px;border:2px solid rgba(0,0,0,.2);border-top-color:#000;border-radius:50%;animation:spin .8s linear infinite}.dev-server-status{margin-top:12px;padding-top:12px;border-top:1px solid rgba(255,255,255,.08);display:flex;align-items:center;gap:8px;font-size:12px}.dev-link{color:#ff8c00;text-decoration:none;font-weight:600;transition:color .2s ease}.dev-link:hover{color:orange}.no-panes{text-align:center;padding:100px 20px;color:var(--text-tertiary);animation:fadeIn .6s ease-out}.no-panes p{margin-bottom:16px;font-size:18px;font-weight:500}.hint{font-size:14px;color:var(--text-dim);background:var(--hint-bg);padding:12px 24px;border-radius:12px;display:inline-block;margin-top:8px}footer{padding:12px 0;margin-top:auto;animation:fadeIn .8s ease-out}.footer-info{display:flex;justify-content:space-between;font-size:11px;color:var(--text-dim);padding:0}.footer-info span{display:flex;align-items:center;gap:8px}@media (max-width: 768px){.container{padding:0 16px 24px}header{padding:12px 18px;gap:8px}.logo{height:20px}h1{font-size:14px;max-width:none}.session-info{font-size:11px;gap:8px}.session-info span:not(.status-indicator){display:none}main{padding-top:24px}.panes-grid{grid-template-columns:1fr;gap:16px}.footer-info{flex-direction:column;gap:6px;font-size:10px}}.term-fg-black{color:#000}.term-fg-red{color:#cd3131}.term-fg-green{color:#0dbc79}.term-fg-yellow{color:#e5e510}.term-fg-blue{color:#2472c8}.term-fg-magenta{color:#bc3fbc}.term-fg-cyan{color:#11a8cd}.term-fg-white{color:#e5e5e5}.term-fg-bright-black{color:#666}.term-fg-bright-red{color:#f14c4c}.term-fg-bright-green{color:#23d18b}.term-fg-bright-yellow{color:#f5f543}.term-fg-bright-blue{color:#3b8eea}.term-fg-bright-magenta{color:#d670d6}.term-fg-bright-cyan{color:#29b8db}.term-fg-bright-white{color:#fff}.term-bg-black{background-color:#000}.term-bg-red{background-color:#cd3131}.term-bg-green{background-color:#0dbc79}.term-bg-yellow{background-color:#e5e510}.term-bg-blue{background-color:#2472c8}.term-bg-magenta{background-color:#bc3fbc}.term-bg-cyan{background-color:#11a8cd}.term-bg-white{background-color:#e5e5e5}.term-bold{font-weight:700}.term-dim{opacity:.7}.term-italic{font-style:italic}.term-underline{text-decoration:underline}.term-strikethrough{text-decoration:line-through}.action-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn .2s ease-out}.action-dialog{background:var(--card-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius:16px;padding:32px;max-width:540px;width:90%;box-shadow:0 20px 60px #0006;animation:slideInFromTop .3s ease-out}.action-dialog h3{margin:0 0 20px;font-size:24px;font-weight:600;color:var(--text-bright);letter-spacing:-.5px}.action-dialog p,.action-dialog .dialog-message{margin:0 0 20px;color:var(--text-secondary);font-size:14px;line-height:1.5;white-space:pre-wrap;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}.action-dialog label{display:block;font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:10px;letter-spacing:-.2px}.action-dialog textarea{width:100%;padding:14px 16px;background:var(--input-bg);border:2px solid var(--input-border);border-radius:10px;color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,Segoe UI,Roboto,sans-serif;font-size:15px;line-height:1.5;resize:vertical;transition:all .2s ease;margin-bottom:20px}.action-dialog textarea:focus{outline:none;border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 4px var(--input-focus-shadow)}.action-dialog textarea::placeholder{color:var(--text-dim);font-style:italic}.dialog-hint{font-size:13px;color:var(--text-tertiary);margin-bottom:16px;display:flex;align-items:center;gap:6px}.dialog-hint kbd{background:var(--button-bg);border:1px solid var(--button-border);border-radius:4px;padding:2px 6px;font-family:SF Mono,Monaco,monospace;font-size:11px;font-weight:600;color:var(--text-primary);box-shadow:0 1px 2px #0000001a}.dialog-loading{display:flex;align-items:center;justify-content:center;gap:12px;padding:24px;color:var(--text-secondary);font-size:15px;font-weight:500}.dialog-loading .loader-spinner{width:24px;height:24px;border:3px solid rgba(96,165,250,.2);border-top-color:#60a5fa;border-radius:50%;animation:spin .8s linear infinite}.dialog-input{width:100%;padding:14px 16px;background:var(--input-bg);border:2px solid var(--input-border);border-radius:10px;color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,Segoe UI,Roboto,sans-serif;font-size:15px;line-height:1.5;transition:all .2s ease;margin-bottom:20px}.dialog-input:focus{outline:none;border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 4px var(--input-focus-shadow)}.dialog-input::placeholder{color:var(--text-dim);font-style:italic}.dialog-buttons{display:flex;gap:12px;justify-content:flex-end}.dialog-btn{padding:12px 24px;border:2px solid var(--button-border);border-radius:10px;background:var(--button-bg);color:var(--text-primary);font-size:15px;font-weight:600;cursor:pointer;transition:all .2s ease}.dialog-btn:hover{background:var(--button-hover-bg);border-color:var(--button-hover-border);transform:translateY(-1px)}.dialog-btn:active{transform:translateY(0)}.dialog-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.dialog-btn-primary{background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border-color:transparent;box-shadow:0 2px 8px #60a5fa4d}.dialog-btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 16px #60a5fa80}.dialog-btn-primary:active{transform:translateY(-1px);box-shadow:0 4px 12px #60a5fa66}.dialog-btn-primary:disabled{opacity:.6;transform:none;box-shadow:0 2px 8px #60a5fa33}.choice-options{display:flex;flex-direction:column;gap:8px}.choice-option-btn{width:100%;padding:12px 16px;background:var(--button-bg);border:1px solid var(--button-border);border-radius:8px;color:var(--text-primary);font-size:14px;text-align:left;cursor:pointer;transition:all .2s ease;display:flex;flex-direction:column;gap:4px}.choice-option-btn:hover{background:var(--button-hover-bg);border-color:var(--button-hover-border);transform:translate(4px)}.choice-option-btn.danger{border-color:#f871714d;background:#f871711a}.choice-option-btn.danger:hover{border-color:#f8717180;background:#f8717133}.agent-choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}.agent-choice-button{padding:16px 20px;background:var(--button-bg);border:2px solid var(--button-border);border-radius:12px;color:var(--text-primary);font-size:15px;font-weight:600;cursor:pointer;transition:all .2s ease;text-align:center;text-transform:capitalize;position:relative;overflow:hidden}.agent-choice-button:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#60a5fa1a,#3b82f61a);opacity:0;transition:opacity .2s ease}.agent-choice-button:hover{background:var(--button-hover-bg);border-color:var(--input-focus-border);transform:translateY(-2px);box-shadow:0 4px 12px #60a5fa33}.agent-choice-button:hover:before{opacity:1}.agent-choice-button:active{transform:translateY(0)}.agent-choice-button:disabled{opacity:.5;cursor:not-allowed;transform:none}.option-description{font-size:12px;color:var(--text-tertiary);font-weight:400}.terminal-page{display:flex;flex-direction:column;height:100vh;background:#000}.back-button{color:#e0e0e0;text-decoration:none;font-size:14px;font-weight:500;transition:color .2s;white-space:nowrap;flex-shrink:0}.back-button:hover{color:#fff}.terminal-content{flex:1;overflow:auto;padding:10px}.terminal-page .terminal-output{font-family:JetBrains Mono,SF Mono,Monaco,Cascadia Code,Roboto Mono,monospace;line-height:1.2;color:#f0f0f0;margin:0;min-height:100%}.terminal-row{white-space:pre;margin:0;padding:0;line-height:1.2}.mobile-toolbar{display:flex;gap:6px;padding:8px;background:#1a1a1a;border-bottom:1px solid #333;overflow-x:auto;flex-wrap:nowrap}.toolbar-key{background:#2d2d2d;border:1px solid #444;border-radius:4px;color:#e0e0e0;padding:8px 12px;font-size:13px;font-family:SF Mono,Monaco,monospace;cursor:pointer;flex-shrink:0;min-width:44px;transition:all .15s;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.toolbar-key:active{background:#3d3d3d;transform:scale(.95)}.toolbar-key.active{background:#667eea;border-color:#667eea;color:#fff}.mobile-input{position:absolute;left:-9999px;width:1px;height:1px;opacity:.01;pointer-events:none}.actions-bar{display:flex;justify-content:flex-end;margin-bottom:20px;padding:0 4px}.create-pane-button{display:flex;align-items:center;gap:8px;padding:10px 20px;background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px #60a5fa4d}.create-pane-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 12px #60a5fa66}.create-pane-button:disabled{opacity:.5;cursor:not-allowed;transform:none}.create-pane-button svg{width:16px;height:16px;fill:none;stroke-width:2.5}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:2000;animation:fadeIn .2s ease-out}.modal-dialog{background:var(--card-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius:16px;width:90%;max-width:600px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px #0006;animation:slideUp .3s ease-out}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--border-color)}.modal-header h2{font-size:20px;font-weight:600;color:var(--text-primary);margin:0}.modal-close{background:none;border:none;color:var(--text-secondary);font-size:32px;line-height:1;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:6px;transition:all .2s ease}.modal-close:hover{background:var(--button-hover-bg);color:var(--text-primary)}.modal-body{padding:24px;overflow-y:auto;flex:1}.form-group{margin-bottom:20px}.form-group:last-child{margin-bottom:0}.form-group label{display:block;font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:8px}.modal-textarea{width:100%;padding:12px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:8px;color:var(--text-primary);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;resize:vertical;min-height:100px;transition:all .2s ease}.modal-textarea:focus{outline:none;border-color:var(--input-focus-border);background:var(--input-focus-bg);box-shadow:0 0 0 3px var(--input-focus-shadow)}.modal-textarea:disabled{opacity:.5;cursor:not-allowed}.input-hint{font-size:12px;color:var(--text-tertiary);margin-top:6px}.agent-selector{display:flex;gap:12px}.agent-option{flex:1;display:flex;align-items:center;gap:12px;padding:12px 20px;background:var(--button-bg);border:2px solid var(--button-border);border-radius:8px;color:var(--text-primary);font-size:14px;font-weight:600;text-transform:capitalize;cursor:pointer;transition:all .2s ease}.agent-logo{width:40px;height:40px;flex-shrink:0}.agent-option:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.agent-option.selected{background:var(--input-focus-bg);border-color:var(--input-focus-border);color:var(--text-bright)}.agent-option:disabled{opacity:.5;cursor:not-allowed}.modal-footer{display:flex;gap:12px;padding:20px 24px;border-top:1px solid var(--border-color);justify-content:flex-end}.modal-button{padding:10px 24px;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;border:none;display:flex;align-items:center;gap:8px}.modal-button-secondary{background:var(--button-bg);color:var(--text-primary);border:1px solid var(--button-border)}.modal-button-secondary:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.modal-button-primary{background:var(--input-focus-bg);color:var(--text-bright);border:1px solid var(--input-focus-border)}.modal-button-primary:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border)}.modal-button:disabled{opacity:.5;cursor:not-allowed}.button-loader{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.settings-button{display:flex;align-items:center;gap:8px;padding:10px 20px;background:var(--button-bg);color:var(--text-primary);border:1px solid var(--button-border);border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;margin-left:12px}.settings-button:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border);transform:translateY(-1px)}.settings-button:disabled{opacity:.5;cursor:not-allowed;transform:none}.settings-button svg{width:16px;height:16px;fill:currentColor}.settings-dialog{max-width:700px}.settings-list{display:flex;flex-direction:column;gap:24px;margin-bottom:24px;max-height:500px;overflow-y:auto}.setting-item{border-bottom:1px solid var(--border-color);padding-bottom:20px}.setting-item:last-child{border-bottom:none;padding-bottom:0}.setting-header{margin-bottom:12px}.setting-info{display:flex;flex-direction:column;gap:4px}.setting-label{font-size:16px;font-weight:600;color:var(--text-primary);letter-spacing:-.2px}.setting-description{font-size:13px;color:var(--text-secondary);line-height:1.5}.setting-control{display:flex;flex-direction:column;gap:12px}.setting-value{font-size:14px;color:var(--text-secondary);display:flex;align-items:center;gap:8px}.setting-value strong{color:var(--text-bright);font-weight:600}.setting-scope{font-size:11px;color:var(--text-tertiary);padding:2px 6px;background:var(--agent-bg);border:1px solid var(--agent-border);border-radius:4px;font-weight:600;text-transform:uppercase;letter-spacing:.3px}.setting-buttons{display:flex;flex-wrap:wrap;gap:8px}.setting-btn{padding:8px 16px;background:var(--button-bg);color:var(--text-primary);border:1px solid var(--button-border);border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s ease}.setting-btn:hover:not(:disabled){background:var(--button-hover-bg);border-color:var(--button-hover-border);transform:translateY(-1px)}.setting-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.setting-select-group{padding-left:16px;border-left:2px solid var(--border-color);display:flex;flex-direction:column;gap:8px}.setting-option-label{font-size:13px;color:var(--text-secondary);font-weight:500}.setting-btn-action{background:linear-gradient(135deg,#60a5fa,#3b82f6);color:#000;border-color:transparent;box-shadow:0 2px 8px #60a5fa4d}.setting-btn-action:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 4px 12px #60a5fa66}.hooks-section{margin-top:24px;padding-top:24px;border-top:1px solid var(--border-color)}.hooks-header{display:flex;align-items:center;gap:16px;margin-bottom:20px}.hooks-header h4{font-size:18px;font-weight:600;color:var(--text-primary);margin:0;flex:1}.back-btn{background:transparent;border:none;color:var(--text-secondary);font-size:14px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:all .2s ease;display:flex;align-items:center;gap:4px}.back-btn:hover{background:var(--button-hover-bg);color:var(--text-primary)}.hooks-list{display:flex;flex-direction:column;gap:12px}.hook-item{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:8px;transition:all .2s ease}.hook-item:hover{background:var(--input-focus-bg);border-color:var(--input-focus-border)}.hook-name{font-family:SF Mono,Monaco,Courier New,monospace;font-size:13px;color:var(--text-primary);font-weight:500}.hook-status{font-size:12px;font-weight:600;color:var(--text-tertiary);padding:4px 10px;background:var(--idle-badge-bg);border:1px solid var(--idle-badge-border);border-radius:6px;text-transform:uppercase;letter-spacing:.3px}.hook-status.hook-active{background:#4ade801a;border-color:#4ade804d;color:#4ade80}.hooks-actions{margin-top:20px;padding-top:20px;border-top:1px solid var(--border-color);display:flex;justify-content:center}
4528
4732
  `,
4529
4733
  mimeType: 'text/css',
4530
- size: 25771
4734
+ size: 29632
4531
4735
  },
4532
4736
  'chunks/_plugin-vue_export-helper-Cvoq67hi.js': {
4533
4737
  content: `(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=n(r);fetch(r.href,o)}})();/**
@@ -4582,11 +4786,11 @@ Expected function or array of functions, received type \${typeof e}.\`),ne)}func
4582
4786
  size: 479
4583
4787
  },
4584
4788
  'dashboard.js': {
4585
- content: `import{d as _e,r as p,o as be,a as ke,n as E,_ as we,c as s,b as t,t as g,e as u,f as Ce,g as F,F as b,h as M,w as N,i as X,v as Y,j as $,k as l,l as O,m as De}from"./chunks/_plugin-vue_export-helper-Cvoq67hi.js";const Se=_e({__name:"Dashboard",setup(ae,{expose:i}){i();const q=p("Loading..."),e=p(""),k=p(!1),z=p([]),o=p(null),m=p("Never"),A=p({}),y=p(new Set),H=p({}),S=p(localStorage.getItem("dmux-theme")||"dark"),P=p(new Set),_=p(new Set),U=p(!1),T=p(""),w=p(null),B=p(!1),j=p([]),I=p(!1),x=p("prompt"),ne=p([]),J=p({}),C=p(null),f=p(null),K=p(!1),D=p(!1);let h=null;const ie=()=>{S.value=S.value==="dark"?"light":"dark",localStorage.setItem("dmux-theme",S.value),document.documentElement.setAttribute("data-theme",S.value)},se=a=>{P.value.has(a)?P.value.delete(a):P.value.add(a),P.value=new Set(P.value)},le=()=>{U.value=!0,T.value="",w.value=null,j.value=[],I.value=!1,x.value="prompt",E(()=>{const n=document.getElementById("pane-prompt");n&&n.focus()});const a=n=>{n.key==="Escape"&&(Q(),document.removeEventListener("keydown",a))};document.addEventListener("keydown",a)},Q=()=>{U.value=!1,T.value="",w.value=null,j.value=[],I.value=!1,x.value="prompt"},ee=async()=>{if(!(x.value==="prompt"&&!T.value.trim())&&!(x.value==="agent"&&!w.value))try{B.value=!0;const a={prompt:T.value.trim()};w.value&&(a.agent=w.value);const r=await(await fetch("/api/panes",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();r.needsAgentChoice?(I.value=!0,j.value=r.availableAgents,x.value="agent"):Q()}catch(a){console.error("Failed to create pane:",a),alert("Failed to create pane")}finally{B.value=!1}},ce=a=>{w.value=a,ee()},R=a=>{q.value=a.projectName||"dmux",e.value=a.sessionName||"",k.value=!0,z.value=a.panes||[],o.value=new Date,m.value="Just now";for(const n of z.value)J.value[n.id]||te(n.id)},L=()=>{h&&h.close();try{h=new EventSource("/api/panes-stream"),h.onmessage=a=>{try{const n=JSON.parse(a.data);n.type==="init"||n.type==="update"?R(n.data):n.type==="heartbeat"&&console.debug("SSE heartbeat received")}catch(n){console.error("Failed to parse SSE message:",n)}},h.onerror=a=>{console.error("SSE connection error:",a),k.value=!1,setTimeout(()=>{(h==null?void 0:h.readyState)===EventSource.CLOSED&&L()},5e3)},h.onopen=()=>{k.value=!0}}catch(a){console.error("Failed to connect to SSE stream:",a),k.value=!1}},re=async()=>{try{const n=await(await fetch("/api/panes")).json();R(n)}catch(a){console.error("Failed to fetch panes:",a),k.value=!1}},te=async a=>{try{const r=await(await fetch(\`/api/panes/\${a}/actions\`)).json();J.value[a]=r.actions||[]}catch(n){console.error(\`Failed to fetch actions for pane \${a}:\`,n)}},de=a=>{C.value===a?C.value=null:C.value=a},ue=async(a,n)=>{var r;try{K.value=!0,C.value=null;const d=await(await fetch(\`/api/panes/\${a.id}/actions/\${n.id}\`,{method:"POST"})).json();if(d.requiresInteraction){let v={};d.interactionType==="confirm"?v={type:"confirm",title:d.title||"Confirm",message:d.message,...d.confirmData}:d.interactionType==="choice"?v={type:"choice",title:d.title||"Choose",message:d.message,...d.choiceData}:d.interactionType==="input"&&(v={type:"input",title:d.title||"Input",message:d.message,...d.inputData,inputValue:((r=d.inputData)==null?void 0:r.defaultValue)||""},E(()=>{const G=document.querySelector(".dialog-input");G&&(G.focus(),G.select())})),v.paneId=a.id,f.value=v}}catch(c){console.error("Failed to execute action:",c),alert("Failed to execute action")}finally{K.value=!1}},V=()=>{f.value=null},ge=async a=>{var n;if(f.value)try{D.value=!0;const c=await(await fetch(\`/api/callbacks/confirm/\${f.value.callbackId}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirmed:a})})).json();if(c.requiresInteraction){let d={};c.interactionType==="confirm"?d={type:"confirm",title:c.title||"Confirm",message:c.message,...c.confirmData}:c.interactionType==="choice"?d={type:"choice",title:c.title||"Choose",message:c.message,...c.choiceData}:c.interactionType==="input"&&(d={type:"input",title:c.title||"Input",message:c.message,...c.inputData,inputValue:((n=c.inputData)==null?void 0:n.defaultValue)||""},E(()=>{const v=document.querySelector(".dialog-input");v&&(v.focus(),v.select())})),f.value=d}else V()}catch(r){console.error("Failed to confirm action:",r),alert("Failed to complete action")}finally{D.value=!1}},pe=async a=>{var n;if(f.value)try{D.value=!0;const c=await(await fetch(\`/api/callbacks/choice/\${f.value.callbackId}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({optionId:a})})).json();if(c.requiresInteraction){let d={};c.interactionType==="confirm"?d={type:"confirm",title:c.title||"Confirm",message:c.message,...c.confirmData}:c.interactionType==="choice"?d={type:"choice",title:c.title||"Choose",message:c.message,...c.choiceData}:c.interactionType==="input"&&(d={type:"input",title:c.title||"Input",message:c.message,...c.inputData,inputValue:((n=c.inputData)==null?void 0:n.defaultValue)||""},E(()=>{const v=document.querySelector(".dialog-input");v&&(v.focus(),v.select())})),f.value=d}else V()}catch(r){console.error("Failed to select choice:",r),alert("Failed to complete action")}finally{D.value=!1}},me=a=>a.split(\`
4586
- \`).map(n=>{if(n.includes("|")){const r=n.split("|");if(r.length===2){const c=r[0],v=r[1].replace(/\\+/g,'<span style="color: #4ade80;">+</span>').replace(/-/g,'<span style="color: #f87171;">-</span>');return c+'<span style="opacity: 0.6;">|</span>'+v}}return n}).join("<br>"),ve=async()=>{var a;if(f.value)try{D.value=!0;const r=await(await fetch(\`/api/callbacks/input/\${f.value.callbackId}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:f.value.inputValue})})).json();if(r.requiresInteraction){let c={};r.interactionType==="confirm"?c={type:"confirm",title:r.title||"Confirm",message:r.message,...r.confirmData}:r.interactionType==="choice"?c={type:"choice",title:r.title||"Choose",message:r.message,...r.choiceData}:r.interactionType==="input"&&(c={type:"input",title:r.title||"Input",message:r.message,...r.inputData,inputValue:((a=r.inputData)==null?void 0:a.defaultValue)||""},E(()=>{const d=document.querySelector(".dialog-input");d&&(d.focus(),d.select())})),f.value=c}else V()}catch(n){console.error("Failed to submit input:",n),alert("Failed to complete action")}finally{D.value=!1}},he=async(a,n)=>{try{_.value.add(a.id),_.value=new Set(_.value);const r=n.keys||[n.action];for(const c of r)await fetch(\`/api/keys/\${a.id}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:c})});setTimeout(()=>{_.value.delete(a.id),_.value=new Set(_.value)},1500)}catch(r){console.error("Failed to select option:",r),_.value.delete(a.id),_.value=new Set(_.value)}},fe=async a=>{const n=A.value[a.id];if(!(!n||!n.trim()))try{y.value.add(a.id),y.value=new Set(y.value);for(const r of n)await fetch(\`/api/keys/\${a.id}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:r})});await fetch(\`/api/keys/\${a.id}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:"Enter"})}),H.value[a.id]=n.substring(0,50)+(n.length>50?"...":""),A.value[a.id]="",setTimeout(()=>{delete H.value[a.id],y.value.delete(a.id),y.value=new Set(y.value)},3e3)}catch(r){console.error("Failed to send prompt:",r),y.value.delete(a.id),y.value=new Set(y.value)}},ye=a=>{const n=a.target;n.style.height="auto",n.style.height=n.scrollHeight+"px"},W=()=>{h&&(h.close(),h=null)},Z=a=>{const n=a.target;C.value&&!n.closest(".action-menu-btn")&&!n.closest(".action-menu-dropdown")&&(C.value=null)};be(()=>{document.documentElement.setAttribute("data-theme",S.value),L(),document.addEventListener("click",Z),document.addEventListener("visibilitychange",()=>{document.hidden?W():L()})}),ke(()=>{W(),document.removeEventListener("click",Z)});const oe={projectName:q,sessionName:e,connected:k,panes:z,lastUpdate:o,timeSinceUpdate:m,promptInputs:A,sendingPrompts:y,queuedMessages:H,theme:S,expandedPrompts:P,loadingOptions:_,showCreateDialog:U,newPanePrompt:T,newPaneAgent:w,creatingPane:B,availableAgents:j,needsAgentChoice:I,createStep:x,actions:ne,paneActions:J,showActionMenu:C,actionDialog:f,executingAction:K,actionDialogLoading:D,get eventSource(){return h},set eventSource(a){h=a},toggleTheme:ie,togglePrompt:se,openCreateDialog:le,closeCreateDialog:Q,createPane:ee,selectAgent:ce,updatePanesFromData:R,connectToStream:L,fetchPanes:re,fetchPaneActions:te,toggleActionMenu:de,executeAction:ue,closeActionDialog:V,confirmAction:ge,selectChoice:pe,colorizeDiffStat:me,submitInput:ve,selectOption:he,sendPrompt:fe,autoExpand:ye,disconnectStream:W,handleClickOutside:Z};return Object.defineProperty(oe,"__isScriptSetup",{enumerable:!1,value:!0}),oe}}),Pe={class:"session-info"},xe=["title"],Ae={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Te={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Ee={key:0},Me={class:"container"},Ne={class:"actions-bar"},Oe=["disabled"],ze={key:0,class:"no-panes"},je={key:1,class:"panes-grid"},Ie={class:"pane-header"},Le={class:"pane-header-content"},Ve=["href"],Fe={class:"pane-title"},qe={class:"pane-meta"},He={key:0,class:"pane-autopilot",title:"Autopilot enabled"},Ue={class:"pane-id"},Be=["onClick"],Je={key:0,class:"action-menu-dropdown"},Ke=["onClick","disabled"],Qe={class:"action-icon"},Re={class:"action-label"},We={class:"pane-prompt-section"},Ze=["onClick"],Ge={class:"prompt-header"},Xe={class:"expand-icon"},Ye={class:"prompt-text"},$e={key:0,class:"pane-prompt-full"},et={key:1,class:"agent-summary"},tt={key:2,class:"analyzer-error"},ot={key:0,class:"options-dialog"},at={class:"options-question"},nt={key:0,class:"options-warning"},it={key:1,class:"analyzing-state"},st={key:2,class:"options-buttons"},lt=["onClick","disabled"],ct={class:"prompt-input-wrapper"},rt=["onUpdate:modelValue","placeholder","disabled"],dt=["onClick","disabled","title"],ut={key:0,class:"button-loader"},gt={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 988.44 1200.05"},pt={key:0,class:"queued-message"},mt={key:3,class:"dev-server-status"},vt=["href"],ht={class:"action-dialog"},ft={key:0},yt=["onKeydown"],_t={class:"dialog-buttons"},bt=["disabled"],kt={key:1},wt={class:"agent-choices"},Ct=["onClick","disabled"],Dt={key:0,class:"action-dialog"},St={key:0,class:"dialog-loading"},Pt={key:1,class:"dialog-buttons"},xt=["disabled"],At=["disabled"],Tt={class:"action-dialog"},Et={key:0},Mt={key:1,class:"dialog-loading"},Nt={key:2},Ot={class:"choice-options"},zt=["onClick","disabled"],jt={class:"choice-label"},It={key:0,class:"choice-description"},Lt={class:"dialog-buttons"},Vt=["disabled"],Ft={class:"action-dialog"},qt=["innerHTML"],Ht={key:1,class:"dialog-loading"},Ut={key:2},Bt=["placeholder"],Jt={class:"dialog-buttons"},Kt=["disabled"],Qt=["disabled"];function Rt(ae,i,q,e,k,z){return l(),s(b,null,[t("header",null,[i[7]||(i[7]=t("img",{src:"https://cdn.formk.it/dmux/dmux.png",alt:"dmux",class:"logo"},null,-1)),t("h1",null,g(e.projectName),1),t("div",Pe,[t("button",{onClick:e.toggleTheme,class:"theme-toggle",title:e.theme==="dark"?"Switch to light mode":"Switch to dark mode"},[e.theme==="dark"?(l(),s("svg",Ae,[...i[5]||(i[5]=[t("path",{d:"M12 2.25a.75.75 0 01.75.75v2.25a.75.75 0 01-1.5 0V3a.75.75 0 01.75-.75zM7.5 12a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM18.894 6.166a.75.75 0 00-1.06-1.06l-1.591 1.59a.75.75 0 101.06 1.061l1.591-1.59zM21.75 12a.75.75 0 01-.75.75h-2.25a.75.75 0 010-1.5H21a.75.75 0 01.75.75zM17.834 18.894a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 10-1.061 1.06l1.59 1.591zM12 18a.75.75 0 01.75.75V21a.75.75 0 01-1.5 0v-2.25A.75.75 0 0112 18zM7.758 17.303a.75.75 0 00-1.061-1.06l-1.591 1.59a.75.75 0 001.06 1.061l1.591-1.59zM6 12a.75.75 0 01-.75.75H3a.75.75 0 010-1.5h2.25A.75.75 0 016 12zM6.697 7.757a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 00-1.061 1.06l1.59 1.591z"},null,-1)])])):(l(),s("svg",Te,[...i[6]||(i[6]=[t("path",{d:"M9.528 1.718a.75.75 0 01.162.819A8.97 8.97 0 009 6.5a9 9 0 009 9 8.97 8.97 0 003.963-.69.75.75 0 01.981.98 10.503 10.503 0 01-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 01.818.162z"},null,-1)])]))],8,xe),e.sessionName?(l(),s("span",Ee,g(e.sessionName),1)):u("v-if",!0),t("span",{class:"status-indicator",style:Ce({color:e.connected?"#4ade80":"#f87171"})},"●",4)])]),t("div",Me,[t("main",null,[t("div",Ne,[t("button",{onClick:e.openCreateDialog,class:"create-pane-button",disabled:e.creatingPane},[...i[8]||(i[8]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},[t("path",{d:"M12 4.5v15m7.5-7.5h-15",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),F(" Create New Pane ",-1)])],8,Oe)]),e.panes.length===0?(l(),s("div",ze,[...i[9]||(i[9]=[t("p",null,"No dmux panes active",-1),t("p",{class:"hint"},\`Click "Create New Pane" above or press 'n' in dmux\`,-1)])])):(l(),s("div",je,[(l(!0),s(b,null,M(e.panes,o=>(l(),s("div",{key:o.id,class:"pane-card"},[t("div",Ie,[t("div",Le,[t("a",{href:"/panes/"+o.id,class:"pane-title-link"},[t("span",Fe,g(o.slug),1),i[10]||(i[10]=t("span",{class:"pane-arrow"},"→",-1))],8,Ve),t("div",qe,[o.autopilot?(l(),s("span",He,"🤖")):u("v-if",!0),t("span",{class:O(["pane-agent",o.agent||""])},g(o.agent||"unknown"),3),t("span",Ue,g(o.paneId),1)])]),t("button",{onClick:m=>e.toggleActionMenu(o.id),class:"action-menu-btn",title:"Actions"},[...i[11]||(i[11]=[t("span",null,"⋮",-1)])],8,Be)]),u(" Action Menu Dropdown "),e.showActionMenu===o.id&&e.paneActions[o.id]?(l(),s("div",Je,[(l(!0),s(b,null,M(e.paneActions[o.id],m=>(l(),s("button",{key:m.id,onClick:A=>e.executeAction(o,m),class:"action-menu-item",disabled:e.executingAction},[t("span",Qe,g(m.icon||"•"),1),t("span",Re,g(m.label),1)],8,Ke))),128))])):u("v-if",!0),t("div",We,[t("div",{class:O(["pane-prompt-preview",{expanded:e.expandedPrompts.has(o.id)}]),onClick:m=>e.togglePrompt(o.id)},[t("div",Ge,[i[12]||(i[12]=t("span",{class:"prompt-label"},"Initial Prompt",-1)),t("span",Xe,g(e.expandedPrompts.has(o.id)?"▼":"▶"),1)]),t("span",Ye,g(o.prompt||"No prompt"),1)],10,Ze),e.expandedPrompts.has(o.id)?(l(),s("div",$e,g(o.prompt||"No prompt"),1)):u("v-if",!0)]),u(" Show agent summary when idle "),o.agentStatus==="idle"&&o.agentSummary?(l(),s("div",et,g(o.agentSummary),1)):u("v-if",!0),u(" Show analyzer error if present "),o.analyzerError?(l(),s("div",tt," ⚠ "+g(o.analyzerError),1)):u("v-if",!0),t("div",{class:"pane-interactive",onClick:i[0]||(i[0]=N(()=>{},["prevent"]))},[u(" Options Dialog (when waiting with options) "),o.agentStatus==="waiting"&&o.options&&o.options.length>0?(l(),s("div",ot,[t("div",at,g(o.optionsQuestion||"Choose an option:"),1),o.potentialHarm&&o.potentialHarm.hasRisk?(l(),s("div",nt," ⚠️ "+g(o.potentialHarm.description),1)):u("v-if",!0),e.loadingOptions.has(o.id)?(l(),s("div",it,[...i[13]||(i[13]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing selection...",-1)])])):(l(),s("div",st,[(l(!0),s(b,null,M(o.options,m=>(l(),s("button",{key:m.action,onClick:A=>e.selectOption(o,m),class:O(["option-button",{"option-button-danger":o.potentialHarm&&o.potentialHarm.hasRisk}]),disabled:e.loadingOptions.has(o.id)},g(m.action),11,lt))),128))]))])):o.agentStatus==="analyzing"?(l(),s(b,{key:1},[u(" Analyzing (show loader) "),i[14]||(i[14]=t("div",{class:"analyzing-state"},[t("div",{class:"loader-spinner"}),t("span",null,"Analyzing...")],-1))],2112)):(l(),s(b,{key:2},[u(" Working/Idle (show prompt input) "),t("div",null,[t("div",ct,[X(t("textarea",{"onUpdate:modelValue":m=>e.promptInputs[o.id]=m,onInput:e.autoExpand,placeholder:o.agentStatus==="working"?"Queue a prompt...":"Send a prompt...",disabled:e.sendingPrompts.has(o.id),class:"prompt-textarea",rows:"1"},null,40,rt),[[Y,e.promptInputs[o.id]]]),t("button",{onClick:m=>e.sendPrompt(o),disabled:!e.promptInputs[o.id]||e.sendingPrompts.has(o.id),class:"send-button",title:o.agentStatus==="working"?"Queue prompt":"Send prompt"},[e.sendingPrompts.has(o.id)?(l(),s("span",ut)):(l(),s("svg",gt,[...i[15]||(i[15]=[t("path",{d:"M425.13,28.37L30.09,423.41C11.19,441.37.34,466.2,0,492.27c-.34,26.07,9.86,51.17,28.29,69.61,18.43,18.45,43.52,28.67,69.59,28.35,26.07-.31,50.91-11.14,68.88-30.02l233.16-233.52v776.64c0,34.56,18.43,66.48,48.36,83.76,29.93,17.28,66.8,17.28,96.72,0,29.93-17.28,48.36-49.21,48.36-83.76V328.85l231.72,231.36c24.63,23.41,59.74,32.18,92.48,23.09,32.74-9.08,58.32-34.68,67.38-67.43,9.05-32.75.25-67.85-23.18-92.46L566.73,28.37C548.63,10.16,524-.04,498.33.05c-.8-.06-1.6-.06-2.4,0-.8-.06-1.6-.06-2.4,0-25.65,0-50.25,10.19-68.4,28.32h0Z"},null,-1)])]))],8,dt)]),e.queuedMessages[o.id]?(l(),s("div",pt," ✓ "+g(e.queuedMessages[o.id]),1)):u("v-if",!0)])],2112))]),o.devStatus&&o.devStatus!=="stopped"?(l(),s("div",mt,[i[16]||(i[16]=t("span",{class:"status-label"},"Dev Server:",-1)),t("span",{class:O(["status-badge",o.devStatus])},g(o.devStatus),3),o.devUrl?(l(),s("a",{key:0,href:o.devUrl,target:"_blank",class:"dev-link"},"↗",8,vt)):u("v-if",!0)])):u("v-if",!0)]))),128))]))]),u(" Create Pane Dialog "),e.showCreateDialog?(l(),s("div",{key:0,class:"action-dialog-overlay",onClick:N(e.closeCreateDialog,["self"])},[t("div",ht,[i[20]||(i[20]=t("h3",null,"Create New Pane",-1)),e.createStep==="prompt"?(l(),s("div",ft,[i[17]||(i[17]=t("label",{for:"pane-prompt"},"Provide an initial prompt for your agent",-1)),X(t("textarea",{id:"pane-prompt","onUpdate:modelValue":i[1]||(i[1]=o=>e.newPanePrompt=o),placeholder:"E.g., Fix the authentication bug, Add dark mode, etc.",rows:"4",onKeydown:[$(N(e.createPane,["meta"]),["enter"]),$(N(e.createPane,["ctrl"]),["enter"])]},null,40,yt),[[Y,e.newPanePrompt]]),i[18]||(i[18]=t("div",{class:"dialog-hint"},[F(" 💡 Press "),t("kbd",null,"⌘ Enter"),F(" or "),t("kbd",null,"Ctrl Enter"),F(" to create ")],-1)),t("div",_t,[t("button",{onClick:e.closeCreateDialog,class:"dialog-btn"},"Cancel"),t("button",{onClick:e.createPane,disabled:!e.newPanePrompt.trim()||e.creatingPane,class:"dialog-btn dialog-btn-primary"},g(e.creatingPane?"Creating...":"Create Pane"),9,bt)])])):e.createStep==="agent"?(l(),s("div",kt,[i[19]||(i[19]=t("p",null,"Multiple agents available. Choose one:",-1)),t("div",wt,[(l(!0),s(b,null,M(e.availableAgents,o=>(l(),s("button",{key:o,onClick:m=>e.selectAgent(o),class:"agent-choice-button",disabled:e.creatingPane},g(o),9,Ct))),128))]),t("div",{class:"dialog-buttons"},[t("button",{onClick:e.closeCreateDialog,class:"dialog-btn"},"Cancel")])])):u("v-if",!0)])])):u("v-if",!0),u(" Action Dialogs "),e.actionDialog?(l(),s("div",{key:1,class:"action-dialog-overlay",onClick:N(e.closeActionDialog,["self"])},[u(" Confirm Dialog "),e.actionDialog.type==="confirm"?(l(),s("div",Dt,[t("h3",null,g(e.actionDialog.title),1),t("p",null,g(e.actionDialog.message),1),e.actionDialogLoading?(l(),s("div",St,[...i[21]||(i[21]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(l(),s("div",Pt,[t("button",{onClick:i[2]||(i[2]=o=>e.confirmAction(!1)),class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,xt),t("button",{onClick:i[3]||(i[3]=o=>e.confirmAction(!0)),class:"dialog-btn dialog-btn-primary",disabled:e.actionDialogLoading},"Confirm",8,At)]))])):e.actionDialog.type==="choice"?(l(),s(b,{key:1},[u(" Choice Dialog "),t("div",Tt,[t("h3",null,g(e.actionDialog.title),1),e.actionDialog.message?(l(),s("p",Et,g(e.actionDialog.message),1)):u("v-if",!0),e.actionDialogLoading?(l(),s("div",Mt,[...i[22]||(i[22]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(l(),s("div",Nt,[t("div",Ot,[(l(!0),s(b,null,M(e.actionDialog.options,o=>(l(),s("button",{key:o.id,onClick:m=>e.selectChoice(o.id),class:O(["choice-option-btn",{danger:o.danger}]),disabled:e.actionDialogLoading},[t("div",jt,g(o.label),1),o.description?(l(),s("div",It,g(o.description),1)):u("v-if",!0)],10,zt))),128))]),t("div",Lt,[t("button",{onClick:e.closeActionDialog,class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,Vt)])]))])],2112)):e.actionDialog.type==="input"?(l(),s(b,{key:2},[u(" Input Dialog "),t("div",Ft,[t("h3",null,g(e.actionDialog.title),1),e.actionDialog.message?(l(),s("div",{key:0,class:"dialog-message",innerHTML:e.colorizeDiffStat(e.actionDialog.message)},null,8,qt)):u("v-if",!0),e.actionDialogLoading?(l(),s("div",Ht,[...i[23]||(i[23]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(l(),s("div",Ut,[X(t("input",{type:"text","onUpdate:modelValue":i[4]||(i[4]=o=>e.actionDialog.inputValue=o),placeholder:e.actionDialog.placeholder,class:"dialog-input",onKeydown:$(e.submitInput,["enter"])},null,40,Bt),[[Y,e.actionDialog.inputValue]]),t("div",Jt,[t("button",{onClick:e.closeActionDialog,class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,Kt),t("button",{onClick:e.submitInput,class:"dialog-btn dialog-btn-primary",disabled:e.actionDialogLoading},"Submit",8,Qt)])]))])],2112)):u("v-if",!0)])):u("v-if",!0)])],64)}const Wt=we(Se,[["render",Rt],["__file","/Users/justinschroeder/Projects/dmux/frontend/src/components/Dashboard.vue"]]),Zt=De(Wt);Zt.mount("#app");
4789
+ content: `import{d as Mt,r as u,o as zt,a as Nt,n as I,_ as Ht,c as n,b as t,t as g,e as r,f as Ot,g as P,F as y,h as w,w as M,i as at,v as it,j as lt,k as a,l as z,m as Ft}from"./chunks/_plugin-vue_export-helper-Cvoq67hi.js";const Et=Mt({__name:"Dashboard",setup(vt,{expose:i}){i();const U=u("Loading..."),e=u(""),O=u(!1),F=u([]),o=u(null),p=u("Never"),h=u({}),f=u(new Set),J=u({}),x=u(localStorage.getItem("dmux-theme")||"dark"),A=u(new Set),b=u(new Set),K=u(!1),T=u(""),C=u(null),Q=u(!1),E=u([]),L=u(!1),j=u("prompt"),pt=u([]),W=u({}),S=u(null),k=u(null),R=u(!1),D=u(!1),Z=u(!1),V=u(null),G=u([]),N=u(!1),H=u(!1),q=u([]),X=u(!1);let _=null;const Y=()=>{_&&clearInterval(_),ot(),_=setInterval(()=>{ot()},2e3)},$=()=>{_&&(clearInterval(_),_=null)},ht=()=>{x.value=x.value==="dark"?"light":"dark",localStorage.setItem("dmux-theme",x.value),document.documentElement.setAttribute("data-theme",x.value)},mt=s=>{A.value.has(s)?A.value.delete(s):A.value.add(s),A.value=new Set(A.value)},yt=()=>{K.value=!0,T.value="",C.value=null,E.value=[],L.value=!1,j.value="prompt",I(()=>{const l=document.getElementById("pane-prompt");l&&l.focus()});const s=l=>{l.key==="Escape"&&(tt(),document.removeEventListener("keydown",s))};document.addEventListener("keydown",s)},tt=()=>{K.value=!1,T.value="",C.value=null,E.value=[],L.value=!1,j.value="prompt"},et=async()=>{if(!(j.value==="prompt"&&!T.value.trim())&&!(j.value==="agent"&&!C.value))try{Q.value=!0;const s={prompt:T.value.trim()};C.value&&(s.agent=C.value);const d=await(await fetch("/api/panes",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();d.needsAgentChoice?(L.value=!0,E.value=d.availableAgents,j.value="agent"):tt()}catch(s){console.error("Failed to create pane:",s),alert("Failed to create pane")}finally{Q.value=!1}},kt=s=>{C.value=s,et()},ct=s=>{U.value=s.projectName||"dmux",e.value=s.sessionName||"",O.value=!0,F.value=s.panes||[],o.value=new Date,p.value="Just now";for(const l of F.value)W.value[l.id]||dt(l.id)},ot=async()=>{try{const l=await(await fetch("/api/panes")).json();ct(l)}catch(s){console.error("Failed to fetch panes:",s),O.value=!1}},dt=async s=>{try{const d=await(await fetch(\`/api/panes/\${s}/actions\`)).json();W.value[s]=d.actions||[]}catch(l){console.error(\`Failed to fetch actions for pane \${s}:\`,l)}},ft=s=>{S.value===s?S.value=null:S.value=s},bt=async(s,l)=>{var d;try{R.value=!0,S.value=null;const v=await(await fetch(\`/api/panes/\${s.id}/actions/\${l.id}\`,{method:"POST"})).json();if(v.requiresInteraction){let m={};v.interactionType==="confirm"?m={type:"confirm",title:v.title||"Confirm",message:v.message,...v.confirmData}:v.interactionType==="choice"?m={type:"choice",title:v.title||"Choose",message:v.message,...v.choiceData}:v.interactionType==="input"&&(m={type:"input",title:v.title||"Input",message:v.message,...v.inputData,inputValue:((d=v.inputData)==null?void 0:d.defaultValue)||""},I(()=>{const nt=document.querySelector(".dialog-input");nt&&(nt.focus(),nt.select())})),m.paneId=s.id,k.value=m}}catch(c){console.error("Failed to execute action:",c),alert("Failed to execute action")}finally{R.value=!1}},B=()=>{k.value=null},_t=async s=>{var l;if(k.value)try{D.value=!0;const c=await(await fetch(\`/api/callbacks/confirm/\${k.value.callbackId}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirmed:s})})).json();if(c.requiresInteraction){let v={};c.interactionType==="confirm"?v={type:"confirm",title:c.title||"Confirm",message:c.message,...c.confirmData}:c.interactionType==="choice"?v={type:"choice",title:c.title||"Choose",message:c.message,...c.choiceData}:c.interactionType==="input"&&(v={type:"input",title:c.title||"Input",message:c.message,...c.inputData,inputValue:((l=c.inputData)==null?void 0:l.defaultValue)||""},I(()=>{const m=document.querySelector(".dialog-input");m&&(m.focus(),m.select())})),k.value=v}else B()}catch(d){console.error("Failed to confirm action:",d),alert("Failed to complete action")}finally{D.value=!1}},wt=async s=>{var l;if(k.value)try{D.value=!0;const c=await(await fetch(\`/api/callbacks/choice/\${k.value.callbackId}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({optionId:s})})).json();if(c.requiresInteraction){let v={};c.interactionType==="confirm"?v={type:"confirm",title:c.title||"Confirm",message:c.message,...c.confirmData}:c.interactionType==="choice"?v={type:"choice",title:c.title||"Choose",message:c.message,...c.choiceData}:c.interactionType==="input"&&(v={type:"input",title:c.title||"Input",message:c.message,...c.inputData,inputValue:((l=c.inputData)==null?void 0:l.defaultValue)||""},I(()=>{const m=document.querySelector(".dialog-input");m&&(m.focus(),m.select())})),k.value=v}else B()}catch(d){console.error("Failed to select choice:",d),alert("Failed to complete action")}finally{D.value=!1}},Ct=s=>s.split(\`
4790
+ \`).map(l=>{if(l.includes("|")){const d=l.split("|");if(d.length===2){const c=d[0],m=d[1].replace(/\\+/g,'<span style="color: #4ade80;">+</span>').replace(/-/g,'<span style="color: #f87171;">-</span>');return c+'<span style="opacity: 0.6;">|</span>'+m}}return l}).join("<br>"),St=async()=>{var s;if(k.value)try{D.value=!0;const d=await(await fetch(\`/api/callbacks/input/\${k.value.callbackId}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:k.value.inputValue})})).json();if(d.requiresInteraction){let c={};d.interactionType==="confirm"?c={type:"confirm",title:d.title||"Confirm",message:d.message,...d.confirmData}:d.interactionType==="choice"?c={type:"choice",title:d.title||"Choose",message:d.message,...d.choiceData}:d.interactionType==="input"&&(c={type:"input",title:d.title||"Input",message:d.message,...d.inputData,inputValue:((s=d.inputData)==null?void 0:s.defaultValue)||""},I(()=>{const v=document.querySelector(".dialog-input");v&&(v.focus(),v.select())})),k.value=c}else B()}catch(l){console.error("Failed to submit input:",l),alert("Failed to complete action")}finally{D.value=!1}},Dt=async(s,l)=>{try{b.value.add(s.id),b.value=new Set(b.value);const d=l.keys||[l.action];for(const c of d)await fetch(\`/api/keys/\${s.id}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:c})});setTimeout(()=>{b.value.delete(s.id),b.value=new Set(b.value)},1500)}catch(d){console.error("Failed to select option:",d),b.value.delete(s.id),b.value=new Set(b.value)}},Pt=async s=>{const l=h.value[s.id];if(!(!l||!l.trim()))try{f.value.add(s.id),f.value=new Set(f.value);for(const d of l)await fetch(\`/api/keys/\${s.id}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:d})});await fetch(\`/api/keys/\${s.id}\`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:"Enter"})}),J.value[s.id]=l.substring(0,50)+(l.length>50?"...":""),h.value[s.id]="",setTimeout(()=>{delete J.value[s.id],f.value.delete(s.id),f.value=new Set(f.value)},3e3)}catch(d){console.error("Failed to send prompt:",d),f.value.delete(s.id),f.value=new Set(f.value)}},xt=s=>{const l=s.target;l.style.height="auto",l.style.height=l.scrollHeight+"px"},At=async()=>{try{N.value=!0;const l=await(await fetch("/api/settings")).json();V.value=l.settings,G.value=l.definitions,Z.value=!0,H.value=!1}catch(s){console.error("Failed to load settings:",s),alert("Failed to load settings")}finally{N.value=!1}},rt=()=>{Z.value=!1,V.value=null,G.value=[],H.value=!1,q.value=[]},Tt=async(s,l,d)=>{try{N.value=!0,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:s,value:l,scope:d})});const v=await(await fetch("/api/settings")).json();V.value=v.settings}catch(c){console.error("Failed to update setting:",c),alert("Failed to update setting")}finally{N.value=!1}},jt=async()=>{try{X.value=!0;const l=await(await fetch("/api/hooks")).json();q.value=l.hooks||[],H.value=!0}catch(s){console.error("Failed to load hooks:",s),alert("Failed to load hooks")}finally{X.value=!1}},gt=()=>{H.value=!1,q.value=[]},It=async()=>{const s="I would like to edit my dmux hooks in .dmux-hooks, please read the instructions in there and ask me what I want to edit";gt(),rt(),T.value=s,await I(),await et()},st=s=>{const l=s.target;S.value&&!l.closest(".action-menu-btn")&&!l.closest(".action-menu-dropdown")&&(S.value=null)};zt(()=>{document.documentElement.setAttribute("data-theme",x.value),Y(),document.addEventListener("click",st),document.addEventListener("visibilitychange",()=>{document.hidden?$():Y()})}),Nt(()=>{$(),document.removeEventListener("click",st)});const ut={projectName:U,sessionName:e,connected:O,panes:F,lastUpdate:o,timeSinceUpdate:p,promptInputs:h,sendingPrompts:f,queuedMessages:J,theme:x,expandedPrompts:A,loadingOptions:b,showCreateDialog:K,newPanePrompt:T,newPaneAgent:C,creatingPane:Q,availableAgents:E,needsAgentChoice:L,createStep:j,actions:pt,paneActions:W,showActionMenu:S,actionDialog:k,executingAction:R,actionDialogLoading:D,showSettingsDialog:Z,settingsData:V,settingDefinitions:G,loadingSettings:N,showHooksSection:H,hooksData:q,loadingHooks:X,get pollingInterval(){return _},set pollingInterval(s){_=s},startPolling:Y,stopPolling:$,toggleTheme:ht,togglePrompt:mt,openCreateDialog:yt,closeCreateDialog:tt,createPane:et,selectAgent:kt,updatePanesFromData:ct,fetchPanes:ot,fetchPaneActions:dt,toggleActionMenu:ft,executeAction:bt,closeActionDialog:B,confirmAction:_t,selectChoice:wt,colorizeDiffStat:Ct,submitInput:St,selectOption:Dt,sendPrompt:Pt,autoExpand:xt,openSettingsDialog:At,closeSettingsDialog:rt,updateSetting:Tt,openHooksSection:jt,closeHooksSection:gt,editHooksWithAgent:It,handleClickOutside:st};return Object.defineProperty(ut,"__isScriptSetup",{enumerable:!1,value:!0}),ut}}),Lt={class:"session-info"},Vt=["title"],qt={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Bt={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Ut={key:0},Jt={class:"container"},Kt={class:"actions-bar"},Qt=["disabled"],Wt=["disabled"],Rt={key:0,class:"no-panes"},Zt={key:1,class:"panes-grid"},Gt={class:"pane-header"},Xt={class:"pane-header-content"},Yt=["href"],$t={class:"pane-title"},te={class:"pane-meta"},ee={key:0,class:"pane-autopilot",title:"Autopilot enabled"},oe={class:"pane-id"},se=["onClick"],ne={key:0,class:"action-menu-dropdown"},ae=["onClick","disabled"],ie={class:"action-icon"},le={class:"action-label"},ce={class:"pane-prompt-section"},de=["onClick"],re={class:"prompt-header"},ge={class:"expand-icon"},ue={class:"prompt-text"},ve={key:0,class:"pane-prompt-full"},pe={key:1,class:"agent-summary"},he={key:2,class:"analyzer-error"},me={key:0,class:"options-dialog"},ye={class:"options-question"},ke={key:0,class:"options-warning"},fe={key:1,class:"analyzing-state"},be={key:2,class:"options-buttons"},_e=["onClick","disabled"],we={class:"prompt-input-wrapper"},Ce=["onUpdate:modelValue","placeholder","disabled"],Se=["onClick","disabled","title"],De={key:0,class:"button-loader"},Pe={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 988.44 1200.05"},xe={key:0,class:"queued-message"},Ae={key:3,class:"dev-server-status"},Te=["href"],je={class:"action-dialog"},Ie={key:0},Me=["onKeydown"],ze={class:"dialog-buttons"},Ne=["disabled"],He={key:1},Oe={class:"agent-choices"},Fe=["onClick","disabled"],Ee={key:0,class:"action-dialog"},Le={key:0,class:"dialog-loading"},Ve={key:1,class:"dialog-buttons"},qe=["disabled"],Be=["disabled"],Ue={class:"action-dialog"},Je={key:0},Ke={key:1,class:"dialog-loading"},Qe={key:2},We={class:"choice-options"},Re=["onClick","disabled"],Ze={class:"choice-label"},Ge={key:0,class:"choice-description"},Xe={class:"dialog-buttons"},Ye=["disabled"],$e={class:"action-dialog"},to=["innerHTML"],eo={key:1,class:"dialog-loading"},oo={key:2},so=["placeholder"],no={class:"dialog-buttons"},ao=["disabled"],io=["disabled"],lo={class:"action-dialog settings-dialog"},co={key:0,class:"dialog-loading"},ro={key:1,class:"settings-list"},go={class:"setting-header"},uo={class:"setting-info"},vo={class:"setting-label"},po={class:"setting-description"},ho={key:0,class:"setting-control"},mo={class:"setting-value"},yo={key:0,class:"setting-scope"},ko={key:1,class:"setting-scope"},fo={class:"setting-buttons"},bo=["onClick","disabled"],_o=["onClick","disabled"],wo=["onClick","disabled"],Co=["onClick","disabled"],So={class:"setting-control"},Do={class:"setting-value"},Po={key:0,class:"setting-scope"},xo={key:1,class:"setting-scope"},Ao={class:"setting-option-label"},To={class:"setting-buttons"},jo=["onClick","disabled"],Io=["onClick","disabled"],Mo={class:"setting-control"},zo={class:"setting-buttons"},No=["disabled"],Ho={key:2,class:"hooks-section"},Oo={key:0,class:"dialog-loading"},Fo={key:1,class:"hooks-list"},Eo={class:"hook-name"};function Lo(vt,i,U,e,O,F){return a(),n(y,null,[t("header",null,[i[7]||(i[7]=t("img",{src:"https://cdn.formk.it/dmux/dmux.png",alt:"dmux",class:"logo"},null,-1)),t("h1",null,g(e.projectName),1),t("div",Lt,[t("button",{onClick:e.toggleTheme,class:"theme-toggle",title:e.theme==="dark"?"Switch to light mode":"Switch to dark mode"},[e.theme==="dark"?(a(),n("svg",qt,[...i[5]||(i[5]=[t("path",{d:"M12 2.25a.75.75 0 01.75.75v2.25a.75.75 0 01-1.5 0V3a.75.75 0 01.75-.75zM7.5 12a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM18.894 6.166a.75.75 0 00-1.06-1.06l-1.591 1.59a.75.75 0 101.06 1.061l1.591-1.59zM21.75 12a.75.75 0 01-.75.75h-2.25a.75.75 0 010-1.5H21a.75.75 0 01.75.75zM17.834 18.894a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 10-1.061 1.06l1.59 1.591zM12 18a.75.75 0 01.75.75V21a.75.75 0 01-1.5 0v-2.25A.75.75 0 0112 18zM7.758 17.303a.75.75 0 00-1.061-1.06l-1.591 1.59a.75.75 0 001.06 1.061l1.591-1.59zM6 12a.75.75 0 01-.75.75H3a.75.75 0 010-1.5h2.25A.75.75 0 016 12zM6.697 7.757a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 00-1.061 1.06l1.59 1.591z"},null,-1)])])):(a(),n("svg",Bt,[...i[6]||(i[6]=[t("path",{d:"M9.528 1.718a.75.75 0 01.162.819A8.97 8.97 0 009 6.5a9 9 0 009 9 8.97 8.97 0 003.963-.69.75.75 0 01.981.98 10.503 10.503 0 01-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 01.818.162z"},null,-1)])]))],8,Vt),e.sessionName?(a(),n("span",Ut,g(e.sessionName),1)):r("v-if",!0),t("span",{class:"status-indicator",style:Ot({color:e.connected?"#4ade80":"#f87171"})},"●",4)])]),t("div",Jt,[t("main",null,[t("div",Kt,[t("button",{onClick:e.openCreateDialog,class:"create-pane-button",disabled:e.creatingPane},[...i[8]||(i[8]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},[t("path",{d:"M12 4.5v15m7.5-7.5h-15",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),P(" Create New Pane ",-1)])],8,Qt),t("button",{onClick:e.openSettingsDialog,class:"settings-button",disabled:e.loadingSettings,title:"Settings"},[...i[9]||(i[9]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},[t("path",{d:"M10.5 1.875a1.125 1.125 0 012.25 0v.563c0 1.018.84 1.843 1.854 1.839a.75.75 0 01.585.217l.4.4a.75.75 0 01.216.585c-.004 1.014.821 1.854 1.839 1.854h.563a1.125 1.125 0 010 2.25h-.563c-1.018 0-1.843.84-1.839 1.854a.75.75 0 01-.217.585l-.4.4a.75.75 0 01-.585.216c-1.014-.004-1.854.821-1.854 1.839v.563a1.125 1.125 0 01-2.25 0v-.563c0-1.018-.84-1.843-1.854-1.839a.75.75 0 01-.585-.217l-.4-.4a.75.75 0 01-.216-.585c.004-1.014-.821-1.854-1.839-1.854H3.75a1.125 1.125 0 010-2.25h.563c1.018 0 1.843-.84 1.839-1.854a.75.75 0 01.217-.585l.4-.4a.75.75 0 01.585-.216c1.014.004 1.854-.821 1.854-1.839V1.875zM12 15a3 3 0 100-6 3 3 0 000 6z"})],-1),P(" Settings ",-1)])],8,Wt)]),e.panes.length===0?(a(),n("div",Rt,[...i[10]||(i[10]=[t("p",null,"No dmux panes active",-1),t("p",{class:"hint"},\`Click "Create New Pane" above or press 'n' in dmux\`,-1)])])):(a(),n("div",Zt,[(a(!0),n(y,null,w(e.panes,o=>(a(),n("div",{key:o.id,class:"pane-card"},[t("div",Gt,[t("div",Xt,[t("a",{href:"/panes/"+o.id,class:"pane-title-link"},[t("span",$t,g(o.slug),1),i[11]||(i[11]=t("span",{class:"pane-arrow"},"→",-1))],8,Yt),t("div",te,[o.autopilot?(a(),n("span",ee,"🤖")):r("v-if",!0),t("span",{class:z(["pane-agent",o.agent||""])},g(o.agent||"unknown"),3),t("span",oe,g(o.paneId),1)])]),t("button",{onClick:p=>e.toggleActionMenu(o.id),class:"action-menu-btn",title:"Actions"},[...i[12]||(i[12]=[t("span",null,"⋮",-1)])],8,se)]),r(" Action Menu Dropdown "),e.showActionMenu===o.id&&e.paneActions[o.id]?(a(),n("div",ne,[(a(!0),n(y,null,w(e.paneActions[o.id],p=>(a(),n("button",{key:p.id,onClick:h=>e.executeAction(o,p),class:"action-menu-item",disabled:e.executingAction},[t("span",ie,g(p.icon||"•"),1),t("span",le,g(p.label),1)],8,ae))),128))])):r("v-if",!0),t("div",ce,[t("div",{class:z(["pane-prompt-preview",{expanded:e.expandedPrompts.has(o.id)}]),onClick:p=>e.togglePrompt(o.id)},[t("div",re,[i[13]||(i[13]=t("span",{class:"prompt-label"},"Initial Prompt",-1)),t("span",ge,g(e.expandedPrompts.has(o.id)?"▼":"▶"),1)]),t("span",ue,g(o.prompt||"No prompt"),1)],10,de),e.expandedPrompts.has(o.id)?(a(),n("div",ve,g(o.prompt||"No prompt"),1)):r("v-if",!0)]),r(" Show agent summary when idle "),o.agentStatus==="idle"&&o.agentSummary?(a(),n("div",pe,g(o.agentSummary),1)):r("v-if",!0),r(" Show analyzer error if present "),o.analyzerError?(a(),n("div",he," ⚠ "+g(o.analyzerError),1)):r("v-if",!0),t("div",{class:"pane-interactive",onClick:i[0]||(i[0]=M(()=>{},["prevent"]))},[r(" Options Dialog (when waiting with options) "),o.agentStatus==="waiting"&&o.options&&o.options.length>0?(a(),n("div",me,[t("div",ye,g(o.optionsQuestion||"Choose an option:"),1),o.potentialHarm&&o.potentialHarm.hasRisk?(a(),n("div",ke," ⚠️ "+g(o.potentialHarm.description),1)):r("v-if",!0),e.loadingOptions.has(o.id)?(a(),n("div",fe,[...i[14]||(i[14]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing selection...",-1)])])):(a(),n("div",be,[(a(!0),n(y,null,w(o.options,p=>(a(),n("button",{key:p.action,onClick:h=>e.selectOption(o,p),class:z(["option-button",{"option-button-danger":o.potentialHarm&&o.potentialHarm.hasRisk}]),disabled:e.loadingOptions.has(o.id)},g(p.action),11,_e))),128))]))])):o.agentStatus==="analyzing"?(a(),n(y,{key:1},[r(" Analyzing (show loader) "),i[15]||(i[15]=t("div",{class:"analyzing-state"},[t("div",{class:"loader-spinner"}),t("span",null,"Analyzing...")],-1))],2112)):(a(),n(y,{key:2},[r(" Working/Idle (show prompt input) "),t("div",null,[t("div",we,[at(t("textarea",{"onUpdate:modelValue":p=>e.promptInputs[o.id]=p,onInput:e.autoExpand,placeholder:o.agentStatus==="working"?"Queue a prompt...":"Send a prompt...",disabled:e.sendingPrompts.has(o.id),class:"prompt-textarea",rows:"1"},null,40,Ce),[[it,e.promptInputs[o.id]]]),t("button",{onClick:p=>e.sendPrompt(o),disabled:!e.promptInputs[o.id]||e.sendingPrompts.has(o.id),class:"send-button",title:o.agentStatus==="working"?"Queue prompt":"Send prompt"},[e.sendingPrompts.has(o.id)?(a(),n("span",De)):(a(),n("svg",Pe,[...i[16]||(i[16]=[t("path",{d:"M425.13,28.37L30.09,423.41C11.19,441.37.34,466.2,0,492.27c-.34,26.07,9.86,51.17,28.29,69.61,18.43,18.45,43.52,28.67,69.59,28.35,26.07-.31,50.91-11.14,68.88-30.02l233.16-233.52v776.64c0,34.56,18.43,66.48,48.36,83.76,29.93,17.28,66.8,17.28,96.72,0,29.93-17.28,48.36-49.21,48.36-83.76V328.85l231.72,231.36c24.63,23.41,59.74,32.18,92.48,23.09,32.74-9.08,58.32-34.68,67.38-67.43,9.05-32.75.25-67.85-23.18-92.46L566.73,28.37C548.63,10.16,524-.04,498.33.05c-.8-.06-1.6-.06-2.4,0-.8-.06-1.6-.06-2.4,0-25.65,0-50.25,10.19-68.4,28.32h0Z"},null,-1)])]))],8,Se)]),e.queuedMessages[o.id]?(a(),n("div",xe," ✓ "+g(e.queuedMessages[o.id]),1)):r("v-if",!0)])],2112))]),o.devStatus&&o.devStatus!=="stopped"?(a(),n("div",Ae,[i[17]||(i[17]=t("span",{class:"status-label"},"Dev Server:",-1)),t("span",{class:z(["status-badge",o.devStatus])},g(o.devStatus),3),o.devUrl?(a(),n("a",{key:0,href:o.devUrl,target:"_blank",class:"dev-link"},"↗",8,Te)):r("v-if",!0)])):r("v-if",!0)]))),128))]))]),r(" Create Pane Dialog "),e.showCreateDialog?(a(),n("div",{key:0,class:"action-dialog-overlay",onClick:M(e.closeCreateDialog,["self"])},[t("div",je,[i[21]||(i[21]=t("h3",null,"Create New Pane",-1)),e.createStep==="prompt"?(a(),n("div",Ie,[i[18]||(i[18]=t("label",{for:"pane-prompt"},"Provide an initial prompt for your agent",-1)),at(t("textarea",{id:"pane-prompt","onUpdate:modelValue":i[1]||(i[1]=o=>e.newPanePrompt=o),placeholder:"E.g., Fix the authentication bug, Add dark mode, etc.",rows:"4",onKeydown:[lt(M(e.createPane,["meta"]),["enter"]),lt(M(e.createPane,["ctrl"]),["enter"])]},null,40,Me),[[it,e.newPanePrompt]]),i[19]||(i[19]=t("div",{class:"dialog-hint"},[P(" 💡 Press "),t("kbd",null,"⌘ Enter"),P(" or "),t("kbd",null,"Ctrl Enter"),P(" to create ")],-1)),t("div",ze,[t("button",{onClick:e.closeCreateDialog,class:"dialog-btn"},"Cancel"),t("button",{onClick:e.createPane,disabled:!e.newPanePrompt.trim()||e.creatingPane,class:"dialog-btn dialog-btn-primary"},g(e.creatingPane?"Creating...":"Create Pane"),9,Ne)])])):e.createStep==="agent"?(a(),n("div",He,[i[20]||(i[20]=t("p",null,"Multiple agents available. Choose one:",-1)),t("div",Oe,[(a(!0),n(y,null,w(e.availableAgents,o=>(a(),n("button",{key:o,onClick:p=>e.selectAgent(o),class:"agent-choice-button",disabled:e.creatingPane},g(o),9,Fe))),128))]),t("div",{class:"dialog-buttons"},[t("button",{onClick:e.closeCreateDialog,class:"dialog-btn"},"Cancel")])])):r("v-if",!0)])])):r("v-if",!0),r(" Action Dialogs "),e.actionDialog?(a(),n("div",{key:1,class:"action-dialog-overlay",onClick:M(e.closeActionDialog,["self"])},[r(" Confirm Dialog "),e.actionDialog.type==="confirm"?(a(),n("div",Ee,[t("h3",null,g(e.actionDialog.title),1),t("p",null,g(e.actionDialog.message),1),e.actionDialogLoading?(a(),n("div",Le,[...i[22]||(i[22]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(a(),n("div",Ve,[t("button",{onClick:i[2]||(i[2]=o=>e.confirmAction(!1)),class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,qe),t("button",{onClick:i[3]||(i[3]=o=>e.confirmAction(!0)),class:"dialog-btn dialog-btn-primary",disabled:e.actionDialogLoading},"Confirm",8,Be)]))])):e.actionDialog.type==="choice"?(a(),n(y,{key:1},[r(" Choice Dialog "),t("div",Ue,[t("h3",null,g(e.actionDialog.title),1),e.actionDialog.message?(a(),n("p",Je,g(e.actionDialog.message),1)):r("v-if",!0),e.actionDialogLoading?(a(),n("div",Ke,[...i[23]||(i[23]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(a(),n("div",Qe,[t("div",We,[(a(!0),n(y,null,w(e.actionDialog.options,o=>(a(),n("button",{key:o.id,onClick:p=>e.selectChoice(o.id),class:z(["choice-option-btn",{danger:o.danger}]),disabled:e.actionDialogLoading},[t("div",Ze,g(o.label),1),o.description?(a(),n("div",Ge,g(o.description),1)):r("v-if",!0)],10,Re))),128))]),t("div",Xe,[t("button",{onClick:e.closeActionDialog,class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,Ye)])]))])],2112)):e.actionDialog.type==="input"?(a(),n(y,{key:2},[r(" Input Dialog "),t("div",$e,[t("h3",null,g(e.actionDialog.title),1),e.actionDialog.message?(a(),n("div",{key:0,class:"dialog-message",innerHTML:e.colorizeDiffStat(e.actionDialog.message)},null,8,to)):r("v-if",!0),e.actionDialogLoading?(a(),n("div",eo,[...i[24]||(i[24]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(a(),n("div",oo,[at(t("input",{type:"text","onUpdate:modelValue":i[4]||(i[4]=o=>e.actionDialog.inputValue=o),placeholder:e.actionDialog.placeholder,class:"dialog-input",onKeydown:lt(e.submitInput,["enter"])},null,40,so),[[it,e.actionDialog.inputValue]]),t("div",no,[t("button",{onClick:e.closeActionDialog,class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,ao),t("button",{onClick:e.submitInput,class:"dialog-btn dialog-btn-primary",disabled:e.actionDialogLoading},"Submit",8,io)])]))])],2112)):r("v-if",!0)])):r("v-if",!0),r(" Settings Dialog "),e.showSettingsDialog&&e.settingsData?(a(),n("div",{key:2,class:"action-dialog-overlay",onClick:M(e.closeSettingsDialog,["self"])},[t("div",lo,[i[30]||(i[30]=t("h3",null,"Settings",-1)),e.loadingSettings?(a(),n("div",co,[...i[25]||(i[25]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Loading...",-1)])])):(a(),n("div",ro,[(a(!0),n(y,null,w(e.settingDefinitions,o=>{var p;return a(),n("div",{key:o.key,class:"setting-item"},[t("div",go,[t("div",uo,[t("div",vo,g(o.label),1),t("div",po,g(o.description),1)])]),r(" Boolean setting "),o.type==="boolean"?(a(),n("div",ho,[t("div",mo,[i[26]||(i[26]=P(" Current: ",-1)),t("strong",null,g(e.settingsData.merged[o.key]?"Enabled":"Disabled"),1),o.key in e.settingsData.project?(a(),n("span",yo,"(project)")):o.key in e.settingsData.global?(a(),n("span",ko,"(global)")):r("v-if",!0)]),t("div",fo,[t("button",{onClick:h=>e.updateSetting(o.key,!0,"global"),class:"setting-btn",disabled:e.loadingSettings}," Enable (global) ",8,bo),t("button",{onClick:h=>e.updateSetting(o.key,!1,"global"),class:"setting-btn",disabled:e.loadingSettings}," Disable (global) ",8,_o),t("button",{onClick:h=>e.updateSetting(o.key,!0,"project"),class:"setting-btn",disabled:e.loadingSettings}," Enable (project) ",8,wo),t("button",{onClick:h=>e.updateSetting(o.key,!1,"project"),class:"setting-btn",disabled:e.loadingSettings}," Disable (project) ",8,Co)])])):o.type==="select"?(a(),n(y,{key:1},[r(" Select setting "),t("div",So,[t("div",Do,[i[27]||(i[27]=P(" Current: ",-1)),t("strong",null,g(((p=o.options.find(h=>h.value===e.settingsData.merged[o.key]))==null?void 0:p.label)||"Not set"),1),o.key in e.settingsData.project?(a(),n("span",Po,"(project)")):o.key in e.settingsData.global?(a(),n("span",xo,"(global)")):r("v-if",!0)]),(a(!0),n(y,null,w(o.options,h=>(a(),n("div",{class:"setting-select-group",key:h.value},[t("div",Ao,g(h.label),1),t("div",To,[t("button",{onClick:f=>e.updateSetting(o.key,h.value,"global"),class:"setting-btn",disabled:e.loadingSettings}," Set global ",8,jo),t("button",{onClick:f=>e.updateSetting(o.key,h.value,"project"),class:"setting-btn",disabled:e.loadingSettings}," Set project ",8,Io)])]))),128))])],2112)):o.type==="action"?(a(),n(y,{key:2},[r(" Action setting "),t("div",Mo,[t("div",zo,[t("button",{onClick:e.openHooksSection,class:"setting-btn setting-btn-action",disabled:e.loadingSettings}," Open ",8,No)])])],2112)):r("v-if",!0)])}),128))])),r(" Hooks Section (shown when hooks action is triggered) "),e.showHooksSection?(a(),n("div",Ho,[t("div",{class:"hooks-header"},[t("button",{onClick:e.closeHooksSection,class:"back-btn",title:"Back to settings"},"← Back"),i[28]||(i[28]=t("h4",null,"Hooks Management",-1))]),e.loadingHooks?(a(),n("div",Oo,[...i[29]||(i[29]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Loading hooks...",-1)])])):(a(),n("div",Fo,[(a(!0),n(y,null,w(e.hooksData,o=>(a(),n("div",{key:o.name,class:"hook-item"},[t("div",Eo,g(o.name),1),t("div",{class:z(["hook-status",{"hook-active":o.active}])},g(o.active?"✓ Active":"Inactive"),3)]))),128)),t("div",{class:"hooks-actions"},[t("button",{onClick:e.editHooksWithAgent,class:"dialog-btn dialog-btn-primary"}," Edit Hooks with Agent ")])]))])):r("v-if",!0),t("div",{class:"dialog-buttons"},[t("button",{onClick:e.closeSettingsDialog,class:"dialog-btn dialog-btn-primary"},"Close")])])])):r("v-if",!0)])],64)}const Vo=Ht(Et,[["render",Lo],["__file","/Users/justinschroeder/Projects/dmux/frontend/src/components/Dashboard.vue"]]),qo=Ft(Vo);qo.mount("#app");
4587
4791
  `,
4588
4792
  mimeType: 'application/javascript',
4589
- size: 21066
4793
+ size: 27228
4590
4794
  },
4591
4795
  'index.js': {
4592
4796
  content: `#!/usr/bin/env node