dmux 3.1.1 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/dist/DmuxApp.d.ts +2 -2
  2. package/dist/DmuxApp.d.ts.map +1 -1
  3. package/dist/DmuxApp.js +405 -1134
  4. package/dist/DmuxApp.js.map +1 -1
  5. package/dist/actions/implementations/closeAction.d.ts +10 -0
  6. package/dist/actions/implementations/closeAction.d.ts.map +1 -0
  7. package/dist/actions/implementations/closeAction.js +197 -0
  8. package/dist/actions/implementations/closeAction.js.map +1 -0
  9. package/dist/actions/implementations/copyPathAction.d.ts +10 -0
  10. package/dist/actions/implementations/copyPathAction.d.ts.map +1 -0
  11. package/dist/actions/implementations/copyPathAction.js +34 -0
  12. package/dist/actions/implementations/copyPathAction.js.map +1 -0
  13. package/dist/actions/implementations/duplicateAction.d.ts +10 -0
  14. package/dist/actions/implementations/duplicateAction.d.ts.map +1 -0
  15. package/dist/actions/implementations/duplicateAction.js +25 -0
  16. package/dist/actions/implementations/duplicateAction.js.map +1 -0
  17. package/dist/actions/implementations/index.d.ts +14 -0
  18. package/dist/actions/implementations/index.d.ts.map +1 -0
  19. package/dist/actions/implementations/index.js +14 -0
  20. package/dist/actions/implementations/index.js.map +1 -0
  21. package/dist/actions/implementations/mergeAction.d.ts +14 -0
  22. package/dist/actions/implementations/mergeAction.d.ts.map +1 -0
  23. package/dist/actions/implementations/mergeAction.js +84 -0
  24. package/dist/actions/implementations/mergeAction.js.map +1 -0
  25. package/dist/actions/implementations/openInEditorAction.d.ts +12 -0
  26. package/dist/actions/implementations/openInEditorAction.d.ts.map +1 -0
  27. package/dist/actions/implementations/openInEditorAction.js +33 -0
  28. package/dist/actions/implementations/openInEditorAction.js.map +1 -0
  29. package/dist/actions/implementations/renameAction.d.ts +13 -0
  30. package/dist/actions/implementations/renameAction.d.ts.map +1 -0
  31. package/dist/actions/implementations/renameAction.js +18 -0
  32. package/dist/actions/implementations/renameAction.js.map +1 -0
  33. package/dist/actions/implementations/toggleAutopilotAction.d.ts +10 -0
  34. package/dist/actions/implementations/toggleAutopilotAction.d.ts.map +1 -0
  35. package/dist/actions/implementations/toggleAutopilotAction.js +33 -0
  36. package/dist/actions/implementations/toggleAutopilotAction.js.map +1 -0
  37. package/dist/actions/implementations/viewAction.d.ts +10 -0
  38. package/dist/actions/implementations/viewAction.d.ts.map +1 -0
  39. package/dist/actions/implementations/viewAction.js +26 -0
  40. package/dist/actions/implementations/viewAction.js.map +1 -0
  41. package/dist/actions/merge/commitMessageHandler.d.ts +27 -0
  42. package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -0
  43. package/dist/actions/merge/commitMessageHandler.js +131 -0
  44. package/dist/actions/merge/commitMessageHandler.js.map +1 -0
  45. package/dist/actions/merge/conflictResolution.d.ts +13 -0
  46. package/dist/actions/merge/conflictResolution.d.ts.map +1 -0
  47. package/dist/actions/merge/conflictResolution.js +134 -0
  48. package/dist/actions/merge/conflictResolution.js.map +1 -0
  49. package/dist/actions/merge/issueHandlers/index.d.ts +11 -0
  50. package/dist/actions/merge/issueHandlers/index.d.ts.map +1 -0
  51. package/dist/actions/merge/issueHandlers/index.js +8 -0
  52. package/dist/actions/merge/issueHandlers/index.js.map +1 -0
  53. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts +13 -0
  54. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -0
  55. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +72 -0
  56. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -0
  57. package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts +13 -0
  58. package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts.map +1 -0
  59. package/dist/actions/merge/issueHandlers/mergeConflictHandler.js +52 -0
  60. package/dist/actions/merge/issueHandlers/mergeConflictHandler.js.map +1 -0
  61. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts +7 -0
  62. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts.map +1 -0
  63. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js +12 -0
  64. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js.map +1 -0
  65. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +13 -0
  66. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -0
  67. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +49 -0
  68. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -0
  69. package/dist/actions/merge/mergeExecution.d.ts +22 -0
  70. package/dist/actions/merge/mergeExecution.d.ts.map +1 -0
  71. package/dist/actions/merge/mergeExecution.js +180 -0
  72. package/dist/actions/merge/mergeExecution.js.map +1 -0
  73. package/dist/actions/paneActions.d.ts +3 -40
  74. package/dist/actions/paneActions.d.ts.map +1 -1
  75. package/dist/actions/paneActions.js +4 -981
  76. package/dist/actions/paneActions.js.map +1 -1
  77. package/dist/actions/types.d.ts +2 -0
  78. package/dist/actions/types.d.ts.map +1 -1
  79. package/dist/actions/types.js +1 -0
  80. package/dist/actions/types.js.map +1 -1
  81. package/dist/components/{ActionChoiceDialog.d.ts → dialogs/ActionChoiceDialog.d.ts} +1 -1
  82. package/dist/components/dialogs/ActionChoiceDialog.d.ts.map +1 -0
  83. package/dist/components/dialogs/ActionChoiceDialog.js.map +1 -0
  84. package/dist/components/dialogs/ActionConfirmDialog.d.ts.map +1 -0
  85. package/dist/components/dialogs/ActionConfirmDialog.js.map +1 -0
  86. package/dist/components/dialogs/ActionInputDialog.d.ts.map +1 -0
  87. package/dist/components/{ActionInputDialog.js → dialogs/ActionInputDialog.js} +4 -3
  88. package/dist/components/dialogs/ActionInputDialog.js.map +1 -0
  89. package/dist/components/dialogs/ActionProgressDialog.d.ts.map +1 -0
  90. package/dist/components/dialogs/ActionProgressDialog.js.map +1 -0
  91. package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -0
  92. package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -0
  93. package/dist/components/{CloseOptionsDialog.d.ts → dialogs/CloseOptionsDialog.d.ts} +1 -1
  94. package/dist/components/dialogs/CloseOptionsDialog.d.ts.map +1 -0
  95. package/dist/components/dialogs/CloseOptionsDialog.js.map +1 -0
  96. package/dist/components/dialogs/CommandPromptDialog.d.ts.map +1 -0
  97. package/dist/components/{CommandPromptDialog.js → dialogs/CommandPromptDialog.js} +1 -1
  98. package/dist/components/dialogs/CommandPromptDialog.js.map +1 -0
  99. package/dist/components/dialogs/DialogBox.d.ts +16 -0
  100. package/dist/components/dialogs/DialogBox.d.ts.map +1 -0
  101. package/dist/components/dialogs/DialogBox.js +12 -0
  102. package/dist/components/dialogs/DialogBox.js.map +1 -0
  103. package/dist/components/dialogs/HooksDialog.d.ts.map +1 -0
  104. package/dist/components/dialogs/HooksDialog.js.map +1 -0
  105. package/dist/components/{MergeConfirmationDialog.d.ts → dialogs/MergeConfirmationDialog.d.ts} +1 -1
  106. package/dist/components/dialogs/MergeConfirmationDialog.d.ts.map +1 -0
  107. package/dist/components/dialogs/MergeConfirmationDialog.js.map +1 -0
  108. package/dist/components/{SettingsDialog.d.ts → dialogs/SettingsDialog.d.ts} +1 -1
  109. package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -0
  110. package/dist/components/dialogs/SettingsDialog.js.map +1 -0
  111. package/dist/components/dialogs/UpdateDialog.d.ts.map +1 -0
  112. package/dist/components/dialogs/UpdateDialog.js.map +1 -0
  113. package/dist/components/indicators/CreatingIndicator.d.ts.map +1 -0
  114. package/dist/components/indicators/CreatingIndicator.js.map +1 -0
  115. package/dist/components/indicators/LoadingIndicator.d.ts.map +1 -0
  116. package/dist/components/indicators/LoadingIndicator.js.map +1 -0
  117. package/dist/components/indicators/RunningIndicator.d.ts.map +1 -0
  118. package/dist/components/indicators/RunningIndicator.js.map +1 -0
  119. package/dist/components/indicators/Spinner.d.ts.map +1 -0
  120. package/dist/components/indicators/Spinner.js.map +1 -0
  121. package/dist/components/indicators/UpdatingIndicator.d.ts.map +1 -0
  122. package/dist/components/indicators/UpdatingIndicator.js.map +1 -0
  123. package/dist/components/indicators/index.d.ts +6 -0
  124. package/dist/components/indicators/index.d.ts.map +1 -0
  125. package/dist/components/indicators/index.js +6 -0
  126. package/dist/components/indicators/index.js.map +1 -0
  127. package/dist/components/inputs/CleanTextInput.d.ts +19 -0
  128. package/dist/components/inputs/CleanTextInput.d.ts.map +1 -0
  129. package/dist/{CleanTextInput.js → components/inputs/CleanTextInput.js} +98 -160
  130. package/dist/components/inputs/CleanTextInput.js.map +1 -0
  131. package/dist/components/inputs/StyledTextInput.d.ts.map +1 -0
  132. package/dist/components/inputs/StyledTextInput.js.map +1 -0
  133. package/dist/components/inputs/index.d.ts +3 -0
  134. package/dist/components/inputs/index.d.ts.map +1 -0
  135. package/dist/components/inputs/index.js +3 -0
  136. package/dist/components/inputs/index.js.map +1 -0
  137. package/dist/components/{KebabMenu.d.ts → panes/KebabMenu.d.ts} +1 -1
  138. package/dist/components/panes/KebabMenu.d.ts.map +1 -0
  139. package/dist/components/panes/KebabMenu.js.map +1 -0
  140. package/dist/components/panes/MergePane.d.ts.map +1 -0
  141. package/dist/{MergePane.js → components/panes/MergePane.js} +1 -1
  142. package/dist/components/panes/MergePane.js.map +1 -0
  143. package/dist/components/{PaneCard.d.ts → panes/PaneCard.d.ts} +4 -2
  144. package/dist/components/panes/PaneCard.d.ts.map +1 -0
  145. package/dist/components/panes/PaneCard.js +55 -0
  146. package/dist/components/panes/PaneCard.js.map +1 -0
  147. package/dist/components/panes/PanesGrid.d.ts +12 -0
  148. package/dist/components/panes/PanesGrid.d.ts.map +1 -0
  149. package/dist/components/panes/PanesGrid.js +49 -0
  150. package/dist/components/panes/PanesGrid.js.map +1 -0
  151. package/dist/components/panes/index.d.ts +5 -0
  152. package/dist/components/panes/index.d.ts.map +1 -0
  153. package/dist/components/panes/index.js +5 -0
  154. package/dist/components/panes/index.js.map +1 -0
  155. package/dist/components/popups/agentChoicePopup.d.ts +7 -0
  156. package/dist/components/popups/agentChoicePopup.d.ts.map +1 -0
  157. package/dist/components/popups/agentChoicePopup.js +74 -0
  158. package/dist/components/popups/agentChoicePopup.js.map +1 -0
  159. package/dist/components/popups/choicePopup.d.ts +7 -0
  160. package/dist/components/popups/choicePopup.d.ts.map +1 -0
  161. package/dist/components/popups/choicePopup.js +64 -0
  162. package/dist/components/popups/choicePopup.js.map +1 -0
  163. package/dist/components/popups/config.d.ts +40 -0
  164. package/dist/components/popups/config.d.ts.map +1 -0
  165. package/dist/components/popups/config.js +40 -0
  166. package/dist/components/popups/config.js.map +1 -0
  167. package/dist/components/popups/confirmPopup.d.ts +7 -0
  168. package/dist/components/popups/confirmPopup.d.ts.map +1 -0
  169. package/dist/components/popups/confirmPopup.js +71 -0
  170. package/dist/components/popups/confirmPopup.js.map +1 -0
  171. package/dist/components/popups/hooksPopup.d.ts +7 -0
  172. package/dist/components/popups/hooksPopup.d.ts.map +1 -0
  173. package/dist/components/popups/hooksPopup.js +71 -0
  174. package/dist/components/popups/hooksPopup.js.map +1 -0
  175. package/dist/components/popups/inputPopup.d.ts +7 -0
  176. package/dist/components/popups/inputPopup.d.ts.map +1 -0
  177. package/dist/components/popups/inputPopup.js +47 -0
  178. package/dist/components/popups/inputPopup.js.map +1 -0
  179. package/dist/components/popups/kebabMenuPopup.d.ts +7 -0
  180. package/dist/components/popups/kebabMenuPopup.d.ts.map +1 -0
  181. package/dist/components/popups/kebabMenuPopup.js +52 -0
  182. package/dist/components/popups/kebabMenuPopup.js.map +1 -0
  183. package/dist/components/popups/logsPopup.d.ts +12 -0
  184. package/dist/components/popups/logsPopup.d.ts.map +1 -0
  185. package/dist/components/popups/logsPopup.js +372 -0
  186. package/dist/components/popups/logsPopup.js.map +1 -0
  187. package/dist/components/popups/mergePopup.d.ts +7 -0
  188. package/dist/components/popups/mergePopup.d.ts.map +1 -0
  189. package/dist/components/popups/mergePopup.js +310 -0
  190. package/dist/components/popups/mergePopup.js.map +1 -0
  191. package/dist/components/popups/newPanePopup.d.ts +7 -0
  192. package/dist/components/popups/newPanePopup.d.ts.map +1 -0
  193. package/dist/components/popups/newPanePopup.js +234 -0
  194. package/dist/components/popups/newPanePopup.js.map +1 -0
  195. package/dist/components/popups/progressPopup.d.ts +8 -0
  196. package/dist/components/popups/progressPopup.d.ts.map +1 -0
  197. package/dist/components/popups/progressPopup.js +53 -0
  198. package/dist/components/popups/progressPopup.js.map +1 -0
  199. package/dist/components/popups/remotePopup.d.ts +6 -0
  200. package/dist/components/popups/remotePopup.d.ts.map +1 -0
  201. package/dist/components/popups/remotePopup.js +166 -0
  202. package/dist/components/popups/remotePopup.js.map +1 -0
  203. package/dist/components/popups/settingsPopup.d.ts +7 -0
  204. package/dist/components/popups/settingsPopup.d.ts.map +1 -0
  205. package/dist/components/popups/settingsPopup.js +212 -0
  206. package/dist/components/popups/settingsPopup.js.map +1 -0
  207. package/dist/components/popups/shared/FileList.d.ts +13 -0
  208. package/dist/components/popups/shared/FileList.d.ts.map +1 -0
  209. package/dist/components/popups/shared/FileList.js +61 -0
  210. package/dist/components/popups/shared/FileList.js.map +1 -0
  211. package/dist/components/popups/shared/PopupContainer.d.ts +14 -0
  212. package/dist/components/popups/shared/PopupContainer.d.ts.map +1 -0
  213. package/dist/components/popups/shared/PopupContainer.js +15 -0
  214. package/dist/components/popups/shared/PopupContainer.js.map +1 -0
  215. package/dist/components/popups/shared/PopupInputBox.d.ts +11 -0
  216. package/dist/components/popups/shared/PopupInputBox.d.ts.map +1 -0
  217. package/dist/components/popups/shared/PopupInputBox.js +10 -0
  218. package/dist/components/popups/shared/PopupInputBox.js.map +1 -0
  219. package/dist/components/popups/shared/PopupWrapper.d.ts +37 -0
  220. package/dist/components/popups/shared/PopupWrapper.d.ts.map +1 -0
  221. package/dist/components/popups/shared/PopupWrapper.js +88 -0
  222. package/dist/components/popups/shared/PopupWrapper.js.map +1 -0
  223. package/dist/components/popups/shared/index.d.ts +8 -0
  224. package/dist/components/popups/shared/index.d.ts.map +1 -0
  225. package/dist/components/popups/shared/index.js +8 -0
  226. package/dist/components/popups/shared/index.js.map +1 -0
  227. package/dist/components/popups/shortcutsPopup.d.ts +6 -0
  228. package/dist/components/popups/shortcutsPopup.d.ts.map +1 -0
  229. package/dist/components/popups/shortcutsPopup.js +74 -0
  230. package/dist/components/popups/shortcutsPopup.js.map +1 -0
  231. package/dist/components/popups/templates/SimpleInputPopup.d.ts +15 -0
  232. package/dist/components/popups/templates/SimpleInputPopup.d.ts.map +1 -0
  233. package/dist/components/popups/templates/SimpleInputPopup.js +28 -0
  234. package/dist/components/popups/templates/SimpleInputPopup.js.map +1 -0
  235. package/dist/components/ui/FileCopyPrompt.d.ts.map +1 -0
  236. package/dist/components/ui/FileCopyPrompt.js.map +1 -0
  237. package/dist/components/ui/FooterHelp.d.ts +19 -0
  238. package/dist/components/ui/FooterHelp.d.ts.map +1 -0
  239. package/dist/components/ui/FooterHelp.js +55 -0
  240. package/dist/components/ui/FooterHelp.js.map +1 -0
  241. package/dist/components/ui/QRCode.d.ts.map +1 -0
  242. package/dist/components/ui/QRCode.js.map +1 -0
  243. package/dist/components/ui/index.d.ts +4 -0
  244. package/dist/components/ui/index.d.ts.map +1 -0
  245. package/dist/components/ui/index.js +4 -0
  246. package/dist/components/ui/index.js.map +1 -0
  247. package/dist/constants/timing.d.ts +22 -0
  248. package/dist/constants/timing.d.ts.map +1 -0
  249. package/dist/constants/timing.js +26 -0
  250. package/dist/constants/timing.js.map +1 -0
  251. package/dist/dashboard.js +1 -1
  252. package/dist/hooks/useActionSystem.d.ts +18 -4
  253. package/dist/hooks/useActionSystem.d.ts.map +1 -1
  254. package/dist/hooks/useActionSystem.js +125 -30
  255. package/dist/hooks/useActionSystem.js.map +1 -1
  256. package/dist/hooks/useDebugInfo.d.ts +11 -0
  257. package/dist/hooks/useDebugInfo.d.ts.map +1 -0
  258. package/dist/hooks/useDebugInfo.js +34 -0
  259. package/dist/hooks/useDebugInfo.js.map +1 -0
  260. package/dist/hooks/useDialogState.d.ts +22 -0
  261. package/dist/hooks/useDialogState.d.ts.map +1 -0
  262. package/dist/hooks/useDialogState.js +62 -0
  263. package/dist/hooks/useDialogState.js.map +1 -0
  264. package/dist/hooks/useInputHandling.d.ts +60 -0
  265. package/dist/hooks/useInputHandling.d.ts.map +1 -0
  266. package/dist/hooks/useInputHandling.js +280 -0
  267. package/dist/hooks/useInputHandling.js.map +1 -0
  268. package/dist/hooks/useLayoutManagement.d.ts +12 -0
  269. package/dist/hooks/useLayoutManagement.d.ts.map +1 -0
  270. package/dist/hooks/useLayoutManagement.js +58 -0
  271. package/dist/hooks/useLayoutManagement.js.map +1 -0
  272. package/dist/hooks/useNavigation.js +1 -1
  273. package/dist/hooks/useNavigation.js.map +1 -1
  274. package/dist/hooks/usePaneCreation.d.ts +1 -2
  275. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  276. package/dist/hooks/usePaneCreation.js +17 -36
  277. package/dist/hooks/usePaneCreation.js.map +1 -1
  278. package/dist/hooks/usePaneLoading.d.ts +45 -0
  279. package/dist/hooks/usePaneLoading.d.ts.map +1 -0
  280. package/dist/hooks/usePaneLoading.js +188 -0
  281. package/dist/hooks/usePaneLoading.js.map +1 -0
  282. package/dist/hooks/usePaneRunner.d.ts.map +1 -1
  283. package/dist/hooks/usePaneRunner.js +16 -8
  284. package/dist/hooks/usePaneRunner.js.map +1 -1
  285. package/dist/hooks/usePaneSync.d.ts +34 -0
  286. package/dist/hooks/usePaneSync.d.ts.map +1 -0
  287. package/dist/hooks/usePaneSync.js +182 -0
  288. package/dist/hooks/usePaneSync.js.map +1 -0
  289. package/dist/hooks/usePanes.d.ts.map +1 -1
  290. package/dist/hooks/usePanes.js +81 -258
  291. package/dist/hooks/usePanes.js.map +1 -1
  292. package/dist/hooks/useServices.d.ts +24 -0
  293. package/dist/hooks/useServices.d.ts.map +1 -0
  294. package/dist/hooks/useServices.js +39 -0
  295. package/dist/hooks/useServices.js.map +1 -0
  296. package/dist/hooks/useShellDetection.d.ts +10 -0
  297. package/dist/hooks/useShellDetection.d.ts.map +1 -0
  298. package/dist/hooks/useShellDetection.js +53 -0
  299. package/dist/hooks/useShellDetection.js.map +1 -0
  300. package/dist/hooks/useStatusMessages.d.ts +11 -0
  301. package/dist/hooks/useStatusMessages.d.ts.map +1 -0
  302. package/dist/hooks/useStatusMessages.js +32 -0
  303. package/dist/hooks/useStatusMessages.js.map +1 -0
  304. package/dist/hooks/useTemporaryStatus.d.ts +13 -0
  305. package/dist/hooks/useTemporaryStatus.d.ts.map +1 -0
  306. package/dist/hooks/useTemporaryStatus.js +30 -0
  307. package/dist/hooks/useTemporaryStatus.js.map +1 -0
  308. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  309. package/dist/hooks/useTerminalWidth.js +7 -12
  310. package/dist/hooks/useTerminalWidth.js.map +1 -1
  311. package/dist/hooks/useTunnelManagement.d.ts +18 -0
  312. package/dist/hooks/useTunnelManagement.d.ts.map +1 -0
  313. package/dist/hooks/useTunnelManagement.js +55 -0
  314. package/dist/hooks/useTunnelManagement.js.map +1 -0
  315. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  316. package/dist/hooks/useWorktreeActions.js +23 -24
  317. package/dist/hooks/useWorktreeActions.js.map +1 -1
  318. package/dist/index.js +279 -73
  319. package/dist/index.js.map +1 -1
  320. package/dist/layout/LayoutCalculator.d.ts +62 -0
  321. package/dist/layout/LayoutCalculator.d.ts.map +1 -0
  322. package/dist/layout/LayoutCalculator.js +143 -0
  323. package/dist/layout/LayoutCalculator.js.map +1 -0
  324. package/dist/layout/SpacerManager.d.ts +64 -0
  325. package/dist/layout/SpacerManager.d.ts.map +1 -0
  326. package/dist/layout/SpacerManager.js +148 -0
  327. package/dist/layout/SpacerManager.js.map +1 -0
  328. package/dist/layout/TmuxLayoutApplier.d.ts +59 -0
  329. package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -0
  330. package/dist/layout/TmuxLayoutApplier.js +135 -0
  331. package/dist/layout/TmuxLayoutApplier.js.map +1 -0
  332. package/dist/panes/decorative-pane.d.ts +3 -0
  333. package/dist/panes/decorative-pane.d.ts.map +1 -0
  334. package/dist/panes/decorative-pane.js +136 -0
  335. package/dist/panes/decorative-pane.js.map +1 -0
  336. package/dist/panes/spacer-pane.d.ts +8 -0
  337. package/dist/panes/spacer-pane.d.ts.map +1 -0
  338. package/dist/panes/spacer-pane.js +40 -0
  339. package/dist/panes/spacer-pane.js.map +1 -0
  340. package/dist/server/embedded-assets.d.ts.map +1 -1
  341. package/dist/server/embedded-assets.js +849 -4752
  342. package/dist/server/embedded-assets.js.map +1 -1
  343. package/dist/server/index.js +1 -1
  344. package/dist/server/index.js.map +1 -1
  345. package/dist/server/routes/actionsRoutes.d.ts +2 -0
  346. package/dist/server/routes/actionsRoutes.d.ts.map +1 -0
  347. package/dist/server/routes/actionsRoutes.js +110 -0
  348. package/dist/server/routes/actionsRoutes.js.map +1 -0
  349. package/dist/server/routes/healthRoutes.d.ts +13 -0
  350. package/dist/server/routes/healthRoutes.d.ts.map +1 -0
  351. package/dist/server/routes/healthRoutes.js +70 -0
  352. package/dist/server/routes/healthRoutes.js.map +1 -0
  353. package/dist/server/routes/index.d.ts +8 -0
  354. package/dist/server/routes/index.d.ts.map +1 -0
  355. package/dist/server/routes/index.js +67 -0
  356. package/dist/server/routes/index.js.map +1 -0
  357. package/dist/server/routes/keysRoutes.d.ts +20 -0
  358. package/dist/server/routes/keysRoutes.d.ts.map +1 -0
  359. package/dist/server/routes/keysRoutes.js +111 -0
  360. package/dist/server/routes/keysRoutes.js.map +1 -0
  361. package/dist/server/routes/panesRoutes.d.ts +2 -0
  362. package/dist/server/routes/panesRoutes.d.ts.map +1 -0
  363. package/dist/server/routes/panesRoutes.js +373 -0
  364. package/dist/server/routes/panesRoutes.js.map +1 -0
  365. package/dist/server/routes/settingsRoutes.d.ts +94 -0
  366. package/dist/server/routes/settingsRoutes.d.ts.map +1 -0
  367. package/dist/server/routes/settingsRoutes.js +159 -0
  368. package/dist/server/routes/settingsRoutes.js.map +1 -0
  369. package/dist/server/routes/streamRoutes.d.ts +18 -0
  370. package/dist/server/routes/streamRoutes.d.ts.map +1 -0
  371. package/dist/server/routes/streamRoutes.js +87 -0
  372. package/dist/server/routes/streamRoutes.js.map +1 -0
  373. package/dist/server/routes/tunnelRoutes.d.ts +11 -0
  374. package/dist/server/routes/tunnelRoutes.d.ts.map +1 -0
  375. package/dist/server/routes/tunnelRoutes.js +28 -0
  376. package/dist/server/routes/tunnelRoutes.js.map +1 -0
  377. package/dist/server/routes.d.ts +16 -2
  378. package/dist/server/routes.d.ts.map +1 -1
  379. package/dist/server/routes.js +16 -811
  380. package/dist/server/routes.js.map +1 -1
  381. package/dist/{AutoUpdater.d.ts → services/AutoUpdater.d.ts} +1 -0
  382. package/dist/services/AutoUpdater.d.ts.map +1 -0
  383. package/dist/{AutoUpdater.js → services/AutoUpdater.js} +42 -9
  384. package/dist/services/AutoUpdater.js.map +1 -0
  385. package/dist/services/ConfigWatcher.d.ts.map +1 -1
  386. package/dist/services/ConfigWatcher.js +10 -3
  387. package/dist/services/ConfigWatcher.js.map +1 -1
  388. package/dist/services/LogService.d.ts +112 -0
  389. package/dist/services/LogService.d.ts.map +1 -0
  390. package/dist/services/LogService.js +252 -0
  391. package/dist/services/LogService.js.map +1 -0
  392. package/dist/services/PaneAnalyzer.d.ts.map +1 -0
  393. package/dist/{PaneAnalyzer.js → services/PaneAnalyzer.js} +1 -1
  394. package/dist/services/PaneAnalyzer.js.map +1 -0
  395. package/dist/services/PaneLifecycleManager.d.ts +60 -0
  396. package/dist/services/PaneLifecycleManager.d.ts.map +1 -0
  397. package/dist/services/PaneLifecycleManager.js +119 -0
  398. package/dist/services/PaneLifecycleManager.js.map +1 -0
  399. package/dist/services/PaneWorkerManager.d.ts.map +1 -1
  400. package/dist/services/PaneWorkerManager.js +41 -12
  401. package/dist/services/PaneWorkerManager.js.map +1 -1
  402. package/dist/services/PopupManager.d.ts +68 -0
  403. package/dist/services/PopupManager.d.ts.map +1 -0
  404. package/dist/services/PopupManager.js +415 -0
  405. package/dist/services/PopupManager.js.map +1 -0
  406. package/dist/services/StatusDetector.js +1 -1
  407. package/dist/services/StatusDetector.js.map +1 -1
  408. package/dist/services/TerminalStreamer.d.ts +1 -0
  409. package/dist/services/TerminalStreamer.d.ts.map +1 -1
  410. package/dist/services/TerminalStreamer.js +22 -16
  411. package/dist/services/TerminalStreamer.js.map +1 -1
  412. package/dist/services/TmuxService.d.ts +298 -0
  413. package/dist/services/TmuxService.d.ts.map +1 -0
  414. package/dist/services/TmuxService.js +768 -0
  415. package/dist/services/TmuxService.js.map +1 -0
  416. package/dist/services/TunnelService.d.ts +1 -0
  417. package/dist/services/TunnelService.d.ts.map +1 -1
  418. package/dist/services/TunnelService.js +57 -15
  419. package/dist/services/TunnelService.js.map +1 -1
  420. package/dist/shared/StateManager.d.ts +49 -1
  421. package/dist/shared/StateManager.d.ts.map +1 -1
  422. package/dist/shared/StateManager.js +97 -2
  423. package/dist/shared/StateManager.js.map +1 -1
  424. package/dist/theme/colors.d.ts +25 -0
  425. package/dist/theme/colors.d.ts.map +1 -0
  426. package/dist/theme/colors.js +33 -0
  427. package/dist/theme/colors.js.map +1 -0
  428. package/dist/types.d.ts +18 -0
  429. package/dist/types.d.ts.map +1 -1
  430. package/dist/utils/asciiArt.d.ts +26 -0
  431. package/dist/utils/asciiArt.d.ts.map +1 -0
  432. package/dist/utils/asciiArt.js +75 -0
  433. package/dist/utils/asciiArt.js.map +1 -0
  434. package/dist/utils/conflictMonitor.d.ts +20 -0
  435. package/dist/utils/conflictMonitor.d.ts.map +1 -0
  436. package/dist/utils/conflictMonitor.js +113 -0
  437. package/dist/utils/conflictMonitor.js.map +1 -0
  438. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  439. package/dist/utils/conflictResolutionPane.js +75 -80
  440. package/dist/utils/conflictResolutionPane.js.map +1 -1
  441. package/dist/utils/errorHandling.d.ts +37 -0
  442. package/dist/utils/errorHandling.d.ts.map +1 -0
  443. package/dist/utils/errorHandling.js +112 -0
  444. package/dist/utils/errorHandling.js.map +1 -0
  445. package/dist/utils/fileScanner.d.ts +23 -0
  446. package/dist/utils/fileScanner.d.ts.map +1 -0
  447. package/dist/utils/fileScanner.js +123 -0
  448. package/dist/utils/fileScanner.js.map +1 -0
  449. package/dist/utils/generated-agents-doc.d.ts +1 -1
  450. package/dist/utils/generated-agents-doc.js +1 -1
  451. package/dist/utils/git.d.ts +4 -0
  452. package/dist/utils/git.d.ts.map +1 -1
  453. package/dist/utils/git.js +15 -0
  454. package/dist/utils/git.js.map +1 -1
  455. package/dist/utils/hooks.d.ts.map +1 -1
  456. package/dist/utils/hooks.js +65 -36
  457. package/dist/utils/hooks.js.map +1 -1
  458. package/dist/utils/hooksDocs.d.ts +1 -1
  459. package/dist/utils/layoutManager.d.ts +49 -0
  460. package/dist/utils/layoutManager.d.ts.map +1 -0
  461. package/dist/utils/layoutManager.js +249 -0
  462. package/dist/utils/layoutManager.js.map +1 -0
  463. package/dist/utils/mergeExecution.d.ts.map +1 -1
  464. package/dist/utils/mergeExecution.js +8 -1
  465. package/dist/utils/mergeExecution.js.map +1 -1
  466. package/dist/utils/mergeValidation.d.ts.map +1 -1
  467. package/dist/utils/mergeValidation.js +42 -13
  468. package/dist/utils/mergeValidation.js.map +1 -1
  469. package/dist/utils/paneCreation.d.ts.map +1 -1
  470. package/dist/utils/paneCreation.js +210 -88
  471. package/dist/utils/paneCreation.js.map +1 -1
  472. package/dist/utils/paneRebinding.d.ts +14 -0
  473. package/dist/utils/paneRebinding.d.ts.map +1 -0
  474. package/dist/utils/paneRebinding.js +28 -0
  475. package/dist/utils/paneRebinding.js.map +1 -0
  476. package/dist/utils/popup.d.ts +97 -0
  477. package/dist/utils/popup.d.ts.map +1 -0
  478. package/dist/utils/popup.js +503 -0
  479. package/dist/utils/popup.js.map +1 -0
  480. package/dist/utils/postPaneCleanup.d.ts +12 -0
  481. package/dist/utils/postPaneCleanup.d.ts.map +1 -0
  482. package/dist/utils/postPaneCleanup.js +54 -0
  483. package/dist/utils/postPaneCleanup.js.map +1 -0
  484. package/dist/utils/shellPaneDetection.d.ts +44 -0
  485. package/dist/utils/shellPaneDetection.d.ts.map +1 -0
  486. package/dist/utils/shellPaneDetection.js +179 -0
  487. package/dist/utils/shellPaneDetection.js.map +1 -0
  488. package/dist/utils/systemCheck.d.ts +19 -0
  489. package/dist/utils/systemCheck.d.ts.map +1 -0
  490. package/dist/utils/systemCheck.js +160 -0
  491. package/dist/utils/systemCheck.js.map +1 -0
  492. package/dist/utils/tmux.d.ts +72 -1
  493. package/dist/utils/tmux.d.ts.map +1 -1
  494. package/dist/utils/tmux.js +369 -99
  495. package/dist/utils/tmux.js.map +1 -1
  496. package/dist/utils/welcomePane.d.ts +22 -0
  497. package/dist/utils/welcomePane.d.ts.map +1 -0
  498. package/dist/utils/welcomePane.js +111 -0
  499. package/dist/utils/welcomePane.js.map +1 -0
  500. package/dist/utils/welcomePaneManager.d.ts +36 -0
  501. package/dist/utils/welcomePaneManager.d.ts.map +1 -0
  502. package/dist/utils/welcomePaneManager.js +160 -0
  503. package/dist/utils/welcomePaneManager.js.map +1 -0
  504. package/dist/workers/PaneWorker.js +8 -8
  505. package/dist/workers/PaneWorker.js.map +1 -1
  506. package/dist/workers/updateChecker.js +1 -1
  507. package/dist/workers/updateChecker.js.map +1 -1
  508. package/package.json +7 -2
  509. package/dist/AutoUpdater.d.ts.map +0 -1
  510. package/dist/AutoUpdater.js.map +0 -1
  511. package/dist/BetterTextInput.d.ts +0 -10
  512. package/dist/BetterTextInput.d.ts.map +0 -1
  513. package/dist/BetterTextInput.js +0 -177
  514. package/dist/BetterTextInput.js.map +0 -1
  515. package/dist/CleanTextInput.d.ts +0 -10
  516. package/dist/CleanTextInput.d.ts.map +0 -1
  517. package/dist/CleanTextInput.js.map +0 -1
  518. package/dist/EnhancedTextInput.d.ts +0 -13
  519. package/dist/EnhancedTextInput.d.ts.map +0 -1
  520. package/dist/EnhancedTextInput.js +0 -443
  521. package/dist/EnhancedTextInput.js.map +0 -1
  522. package/dist/GeminiTextInput.d.ts +0 -12
  523. package/dist/GeminiTextInput.d.ts.map +0 -1
  524. package/dist/GeminiTextInput.js +0 -210
  525. package/dist/GeminiTextInput.js.map +0 -1
  526. package/dist/MergePane.d.ts.map +0 -1
  527. package/dist/MergePane.js.map +0 -1
  528. package/dist/MultilineTextInput.d.ts +0 -10
  529. package/dist/MultilineTextInput.d.ts.map +0 -1
  530. package/dist/MultilineTextInput.js +0 -184
  531. package/dist/MultilineTextInput.js.map +0 -1
  532. package/dist/PaneAnalyzer.d.ts.map +0 -1
  533. package/dist/PaneAnalyzer.js.map +0 -1
  534. package/dist/SimpleEnhancedInput.d.ts +0 -13
  535. package/dist/SimpleEnhancedInput.d.ts.map +0 -1
  536. package/dist/SimpleEnhancedInput.js +0 -639
  537. package/dist/SimpleEnhancedInput.js.map +0 -1
  538. package/dist/SimpleGeminiInput.d.ts +0 -12
  539. package/dist/SimpleGeminiInput.d.ts.map +0 -1
  540. package/dist/SimpleGeminiInput.js +0 -223
  541. package/dist/SimpleGeminiInput.js.map +0 -1
  542. package/dist/StyledTextInput.d.ts.map +0 -1
  543. package/dist/StyledTextInput.js.map +0 -1
  544. package/dist/components/ActionChoiceDialog.d.ts.map +0 -1
  545. package/dist/components/ActionChoiceDialog.js.map +0 -1
  546. package/dist/components/ActionConfirmDialog.d.ts.map +0 -1
  547. package/dist/components/ActionConfirmDialog.js.map +0 -1
  548. package/dist/components/ActionInputDialog.d.ts.map +0 -1
  549. package/dist/components/ActionInputDialog.js.map +0 -1
  550. package/dist/components/ActionProgressDialog.d.ts.map +0 -1
  551. package/dist/components/ActionProgressDialog.js.map +0 -1
  552. package/dist/components/AgentChoiceDialog.d.ts.map +0 -1
  553. package/dist/components/AgentChoiceDialog.js.map +0 -1
  554. package/dist/components/CloseOptionsDialog.d.ts.map +0 -1
  555. package/dist/components/CloseOptionsDialog.js.map +0 -1
  556. package/dist/components/CommandPromptDialog.d.ts.map +0 -1
  557. package/dist/components/CommandPromptDialog.js.map +0 -1
  558. package/dist/components/CreatingIndicator.d.ts.map +0 -1
  559. package/dist/components/CreatingIndicator.js.map +0 -1
  560. package/dist/components/FileCopyPrompt.d.ts.map +0 -1
  561. package/dist/components/FileCopyPrompt.js.map +0 -1
  562. package/dist/components/FooterHelp.d.ts +0 -10
  563. package/dist/components/FooterHelp.d.ts.map +0 -1
  564. package/dist/components/FooterHelp.js +0 -19
  565. package/dist/components/FooterHelp.js.map +0 -1
  566. package/dist/components/HooksDialog.d.ts.map +0 -1
  567. package/dist/components/HooksDialog.js.map +0 -1
  568. package/dist/components/KebabMenu.d.ts.map +0 -1
  569. package/dist/components/KebabMenu.js.map +0 -1
  570. package/dist/components/LoadingIndicator.d.ts.map +0 -1
  571. package/dist/components/LoadingIndicator.js.map +0 -1
  572. package/dist/components/MergeConfirmationDialog.d.ts.map +0 -1
  573. package/dist/components/MergeConfirmationDialog.js.map +0 -1
  574. package/dist/components/NewPaneDialog.d.ts +0 -9
  575. package/dist/components/NewPaneDialog.d.ts.map +0 -1
  576. package/dist/components/NewPaneDialog.js +0 -11
  577. package/dist/components/NewPaneDialog.js.map +0 -1
  578. package/dist/components/PaneCard.d.ts.map +0 -1
  579. package/dist/components/PaneCard.js +0 -38
  580. package/dist/components/PaneCard.js.map +0 -1
  581. package/dist/components/PanesGrid.d.ts +0 -14
  582. package/dist/components/PanesGrid.d.ts.map +0 -1
  583. package/dist/components/PanesGrid.js +0 -19
  584. package/dist/components/PanesGrid.js.map +0 -1
  585. package/dist/components/QRCode.d.ts.map +0 -1
  586. package/dist/components/QRCode.js.map +0 -1
  587. package/dist/components/RunningIndicator.d.ts.map +0 -1
  588. package/dist/components/RunningIndicator.js.map +0 -1
  589. package/dist/components/SettingsDialog.d.ts.map +0 -1
  590. package/dist/components/SettingsDialog.js.map +0 -1
  591. package/dist/components/Spinner.d.ts.map +0 -1
  592. package/dist/components/Spinner.js.map +0 -1
  593. package/dist/components/UpdateDialog.d.ts.map +0 -1
  594. package/dist/components/UpdateDialog.js.map +0 -1
  595. package/dist/components/UpdatingIndicator.d.ts.map +0 -1
  596. package/dist/components/UpdatingIndicator.js.map +0 -1
  597. package/dist/server/static.d.ts +0 -6
  598. package/dist/server/static.d.ts.map +0 -1
  599. package/dist/server/static.js +0 -3040
  600. package/dist/server/static.js.map +0 -1
  601. /package/dist/components/{ActionChoiceDialog.js → dialogs/ActionChoiceDialog.js} +0 -0
  602. /package/dist/components/{ActionConfirmDialog.d.ts → dialogs/ActionConfirmDialog.d.ts} +0 -0
  603. /package/dist/components/{ActionConfirmDialog.js → dialogs/ActionConfirmDialog.js} +0 -0
  604. /package/dist/components/{ActionInputDialog.d.ts → dialogs/ActionInputDialog.d.ts} +0 -0
  605. /package/dist/components/{ActionProgressDialog.d.ts → dialogs/ActionProgressDialog.d.ts} +0 -0
  606. /package/dist/components/{ActionProgressDialog.js → dialogs/ActionProgressDialog.js} +0 -0
  607. /package/dist/components/{AgentChoiceDialog.d.ts → dialogs/AgentChoiceDialog.d.ts} +0 -0
  608. /package/dist/components/{AgentChoiceDialog.js → dialogs/AgentChoiceDialog.js} +0 -0
  609. /package/dist/components/{CloseOptionsDialog.js → dialogs/CloseOptionsDialog.js} +0 -0
  610. /package/dist/components/{CommandPromptDialog.d.ts → dialogs/CommandPromptDialog.d.ts} +0 -0
  611. /package/dist/components/{HooksDialog.d.ts → dialogs/HooksDialog.d.ts} +0 -0
  612. /package/dist/components/{HooksDialog.js → dialogs/HooksDialog.js} +0 -0
  613. /package/dist/components/{MergeConfirmationDialog.js → dialogs/MergeConfirmationDialog.js} +0 -0
  614. /package/dist/components/{SettingsDialog.js → dialogs/SettingsDialog.js} +0 -0
  615. /package/dist/components/{UpdateDialog.d.ts → dialogs/UpdateDialog.d.ts} +0 -0
  616. /package/dist/components/{UpdateDialog.js → dialogs/UpdateDialog.js} +0 -0
  617. /package/dist/components/{CreatingIndicator.d.ts → indicators/CreatingIndicator.d.ts} +0 -0
  618. /package/dist/components/{CreatingIndicator.js → indicators/CreatingIndicator.js} +0 -0
  619. /package/dist/components/{LoadingIndicator.d.ts → indicators/LoadingIndicator.d.ts} +0 -0
  620. /package/dist/components/{LoadingIndicator.js → indicators/LoadingIndicator.js} +0 -0
  621. /package/dist/components/{RunningIndicator.d.ts → indicators/RunningIndicator.d.ts} +0 -0
  622. /package/dist/components/{RunningIndicator.js → indicators/RunningIndicator.js} +0 -0
  623. /package/dist/components/{Spinner.d.ts → indicators/Spinner.d.ts} +0 -0
  624. /package/dist/components/{Spinner.js → indicators/Spinner.js} +0 -0
  625. /package/dist/components/{UpdatingIndicator.d.ts → indicators/UpdatingIndicator.d.ts} +0 -0
  626. /package/dist/components/{UpdatingIndicator.js → indicators/UpdatingIndicator.js} +0 -0
  627. /package/dist/{StyledTextInput.d.ts → components/inputs/StyledTextInput.d.ts} +0 -0
  628. /package/dist/{StyledTextInput.js → components/inputs/StyledTextInput.js} +0 -0
  629. /package/dist/components/{KebabMenu.js → panes/KebabMenu.js} +0 -0
  630. /package/dist/{MergePane.d.ts → components/panes/MergePane.d.ts} +0 -0
  631. /package/dist/components/{FileCopyPrompt.d.ts → ui/FileCopyPrompt.d.ts} +0 -0
  632. /package/dist/components/{FileCopyPrompt.js → ui/FileCopyPrompt.js} +0 -0
  633. /package/dist/components/{QRCode.d.ts → ui/QRCode.d.ts} +0 -0
  634. /package/dist/components/{QRCode.js → ui/QRCode.js} +0 -0
  635. /package/dist/{PaneAnalyzer.d.ts → services/PaneAnalyzer.d.ts} +0 -0
@@ -1,812 +1,17 @@
1
- import { eventHandler, getRouterParams, readBody, setHeader, createRouter } from 'h3';
2
- import { StateManager } from '../shared/StateManager.js';
3
- import { getEmbeddedAsset } from './embedded-assets.js';
4
- function serveEmbeddedAsset(filename) {
5
- const asset = getEmbeddedAsset(filename);
6
- if (!asset) {
7
- throw new Error(`Embedded asset not found: ${filename}`);
8
- }
9
- return asset.content;
10
- }
11
- import { getTerminalStreamer } from '../services/TerminalStreamer.js';
12
- import { formatStreamMessage } from '../shared/StreamProtocol.js';
13
- import { handleListActions, handleGetPaneActions, handleExecuteAction, handleConfirmCallback, handleChoiceCallback, handleInputCallback } from './actionsApi.js';
14
- const stateManager = StateManager.getInstance();
15
- export function setupRoutes(app) {
16
- // CORS middleware for all routes
17
- app.use('/', eventHandler(async (event) => {
18
- // Get the origin from the request
19
- const origin = event.node.req.headers.origin;
20
- // Allow any origin (including tunnel URLs) for SSE and API requests
21
- if (origin) {
22
- setHeader(event, 'Access-Control-Allow-Origin', origin);
23
- setHeader(event, 'Access-Control-Allow-Credentials', 'true');
24
- }
25
- else {
26
- setHeader(event, 'Access-Control-Allow-Origin', '*');
27
- }
28
- setHeader(event, 'Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS');
29
- setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Cache-Control');
30
- setHeader(event, 'Access-Control-Max-Age', 86400); // 24 hours
31
- if (event.node.req.method === 'OPTIONS') {
32
- event.node.res.statusCode = 204;
33
- return '';
34
- }
35
- }));
36
- // GET /api/health - Health check
37
- app.use('/api/health', eventHandler(async () => {
38
- return { status: 'ok', timestamp: Date.now() };
39
- }));
40
- // GET /api/session - Get session info
41
- app.use('/api/session', eventHandler(async () => {
42
- const state = stateManager.getState();
43
- return {
44
- projectName: state.projectName,
45
- sessionName: state.sessionName,
46
- projectRoot: state.projectRoot,
47
- serverUrl: state.serverUrl,
48
- settings: state.settings,
49
- paneCount: state.panes.length,
50
- timestamp: Date.now()
51
- };
52
- }));
53
- // GET /api/settings - Get current settings (merged, global, and project)
54
- app.use('/api/settings', eventHandler(async (event) => {
55
- if (event.node.req.method === 'GET') {
56
- const { SettingsManager, SETTING_DEFINITIONS } = await import('../utils/settingsManager.js');
57
- const state = stateManager.getState();
58
- const projectRoot = state.projectRoot || process.cwd();
59
- const manager = new SettingsManager(projectRoot);
60
- return {
61
- settings: {
62
- merged: manager.getSettings(),
63
- global: manager.getGlobalSettings(),
64
- project: manager.getProjectSettings()
65
- },
66
- definitions: SETTING_DEFINITIONS
67
- };
68
- }
69
- // PATCH /api/settings - Update a setting
70
- if (event.node.req.method === 'PATCH') {
71
- try {
72
- const body = await readBody(event);
73
- const { key, value, scope } = body;
74
- if (!key || scope === undefined) {
75
- event.node.res.statusCode = 400;
76
- return { error: 'Missing key or scope' };
77
- }
78
- if (scope !== 'global' && scope !== 'project') {
79
- event.node.res.statusCode = 400;
80
- return { error: 'Invalid scope. Must be "global" or "project"' };
81
- }
82
- const { SettingsManager } = await import('../utils/settingsManager.js');
83
- const state = stateManager.getState();
84
- const projectRoot = state.projectRoot || process.cwd();
85
- const manager = new SettingsManager(projectRoot);
86
- manager.updateSetting(key, value, scope);
87
- return {
88
- success: true,
89
- message: `Setting "${key}" updated at ${scope} level`
90
- };
91
- }
92
- catch (err) {
93
- console.error('Failed to update setting:', err);
94
- event.node.res.statusCode = 500;
95
- return { error: 'Failed to update setting', details: err.message };
96
- }
97
- }
98
- event.node.res.statusCode = 405;
99
- return { error: 'Method not allowed' };
100
- }));
101
- // GET /api/hooks - Get hooks status
102
- app.use('/api/hooks', eventHandler(async (event) => {
103
- if (event.node.req.method === 'GET') {
104
- const { listAvailableHooks, hasHook } = await import('../utils/hooks.js');
105
- const state = stateManager.getState();
106
- const projectRoot = state.projectRoot || process.cwd();
107
- // All possible hooks
108
- const allHookTypes = [
109
- 'before_pane_create',
110
- 'pane_created',
111
- 'worktree_created',
112
- 'before_pane_close',
113
- 'pane_closed',
114
- 'before_worktree_remove',
115
- 'worktree_removed',
116
- 'pre_merge',
117
- 'post_merge',
118
- 'run_test',
119
- 'run_dev',
120
- ];
121
- // Check status of each hook
122
- const hooks = allHookTypes.map(hookName => ({
123
- name: hookName,
124
- active: hasHook(projectRoot, hookName)
125
- }));
126
- return {
127
- hooks,
128
- activeCount: hooks.filter(h => h.active).length,
129
- totalCount: hooks.length
130
- };
131
- }
132
- event.node.res.statusCode = 405;
133
- return { error: 'Method not allowed' };
134
- }));
135
- // ===== Action System Routes =====
136
- // Create a router for exact route matching
137
- const apiRouter = createRouter();
138
- // GET /api/actions - List all actions
139
- apiRouter.get('/api/actions', eventHandler(async (event) => {
140
- return new Promise((resolve, reject) => {
141
- handleListActions(event.node.req, {
142
- writeHead: (code, headers) => {
143
- event.node.res.statusCode = code;
144
- Object.entries(headers).forEach(([k, v]) => setHeader(event, k, v));
145
- },
146
- end: (data) => resolve(JSON.parse(data))
147
- });
148
- });
149
- }));
150
- // GET /api/panes/:id/actions - Get available actions for pane
151
- apiRouter.get('/api/panes/:id/actions', eventHandler(async (event) => {
152
- const params = getRouterParams(event);
153
- const paneId = params?.id;
154
- if (!paneId) {
155
- event.node.res.statusCode = 400;
156
- return { error: 'Missing pane ID' };
157
- }
158
- return new Promise((resolve, reject) => {
159
- handleGetPaneActions(event.node.req, {
160
- writeHead: (code, headers) => {
161
- event.node.res.statusCode = code;
162
- Object.entries(headers).forEach(([k, v]) => setHeader(event, k, v));
163
- },
164
- end: (data) => resolve(JSON.parse(data))
165
- }, decodeURIComponent(paneId));
166
- });
167
- }));
168
- // POST /api/panes/:id/actions/:actionId - Execute action
169
- apiRouter.post('/api/panes/:paneId/actions/:actionId', eventHandler(async (event) => {
170
- const params = getRouterParams(event);
171
- const paneId = params?.paneId;
172
- const actionId = params?.actionId;
173
- if (!paneId || !actionId) {
174
- event.node.res.statusCode = 400;
175
- return { error: 'Missing pane ID or action ID' };
176
- }
177
- return new Promise((resolve, reject) => {
178
- handleExecuteAction(event.node.req, {
179
- writeHead: (code, headers) => {
180
- event.node.res.statusCode = code;
181
- Object.entries(headers).forEach(([k, v]) => setHeader(event, k, v));
182
- },
183
- end: (data) => resolve(JSON.parse(data))
184
- }, decodeURIComponent(paneId), decodeURIComponent(actionId));
185
- });
186
- }));
187
- // POST /api/callbacks/confirm/:callbackId - Respond to confirm dialog
188
- apiRouter.post('/api/callbacks/confirm/:callbackId', eventHandler(async (event) => {
189
- const params = getRouterParams(event);
190
- const callbackId = params?.callbackId;
191
- if (!callbackId) {
192
- event.node.res.statusCode = 400;
193
- return { error: 'Missing callback ID' };
194
- }
195
- return new Promise((resolve, reject) => {
196
- handleConfirmCallback(event.node.req, {
197
- writeHead: (code, headers) => {
198
- event.node.res.statusCode = code;
199
- Object.entries(headers).forEach(([k, v]) => setHeader(event, k, v));
200
- },
201
- end: (data) => resolve(JSON.parse(data))
202
- }, decodeURIComponent(callbackId));
203
- });
204
- }));
205
- // POST /api/callbacks/choice/:callbackId - Respond to choice dialog
206
- apiRouter.post('/api/callbacks/choice/:callbackId', eventHandler(async (event) => {
207
- const params = getRouterParams(event);
208
- const callbackId = params?.callbackId;
209
- if (!callbackId) {
210
- event.node.res.statusCode = 400;
211
- return { error: 'Missing callback ID' };
212
- }
213
- return new Promise((resolve, reject) => {
214
- handleChoiceCallback(event.node.req, {
215
- writeHead: (code, headers) => {
216
- event.node.res.statusCode = code;
217
- Object.entries(headers).forEach(([k, v]) => setHeader(event, k, v));
218
- },
219
- end: (data) => resolve(JSON.parse(data))
220
- }, decodeURIComponent(callbackId));
221
- });
222
- }));
223
- // POST /api/callbacks/input/:callbackId - Respond to input dialog
224
- apiRouter.post('/api/callbacks/input/:callbackId', eventHandler(async (event) => {
225
- const params = getRouterParams(event);
226
- const callbackId = params?.callbackId;
227
- if (!callbackId) {
228
- event.node.res.statusCode = 400;
229
- return { error: 'Missing callback ID' };
230
- }
231
- return new Promise((resolve, reject) => {
232
- handleInputCallback(event.node.req, {
233
- writeHead: (code, headers) => {
234
- event.node.res.statusCode = code;
235
- Object.entries(headers).forEach(([k, v]) => setHeader(event, k, v));
236
- },
237
- end: (data) => resolve(JSON.parse(data))
238
- }, decodeURIComponent(callbackId));
239
- });
240
- }));
241
- // GET /api/panes/:id/snapshot - Get current pane snapshot
242
- apiRouter.get('/api/panes/:id/snapshot', eventHandler(async (event) => {
243
- const params = getRouterParams(event);
244
- const paneId = params?.id;
245
- if (!paneId) {
246
- event.node.res.statusCode = 400;
247
- return { error: 'Missing pane ID' };
248
- }
249
- const pane = stateManager.getPaneById(decodeURIComponent(paneId));
250
- if (!pane) {
251
- event.node.res.statusCode = 404;
252
- return { error: 'Pane not found' };
253
- }
254
- // Capture current pane state from tmux
255
- const { execSync } = await import('child_process');
256
- try {
257
- // Get dimensions
258
- const dimensionsOutput = execSync(`tmux display-message -p -t ${pane.paneId} -F "#{pane_width},#{pane_height}"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
259
- const [width, height] = dimensionsOutput.split(',').map(Number);
260
- // Get content
261
- const content = execSync(`tmux capture-pane -epJ -t ${pane.paneId}`, { encoding: 'utf-8', stdio: 'pipe' });
262
- // Get cursor position
263
- const cursorOutput = execSync(`tmux display-message -p -t ${pane.paneId} -F "#{cursor_y},#{cursor_x}"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
264
- const [cursorRow, cursorCol] = cursorOutput.split(',').map(Number);
265
- return {
266
- width: width || 80,
267
- height: height || 24,
268
- content,
269
- cursorRow: cursorRow || 0,
270
- cursorCol: cursorCol || 0
271
- };
272
- }
273
- catch (error) {
274
- event.node.res.statusCode = 500;
275
- return { error: 'Failed to capture pane state' };
276
- }
277
- }));
278
- // PUT /api/panes/:id/test - Update test status (called by run_test hook)
279
- apiRouter.put('/api/panes/:id/test', eventHandler(async (event) => {
280
- const params = getRouterParams(event);
281
- const paneId = params?.id;
282
- if (!paneId) {
283
- event.node.res.statusCode = 400;
284
- return { error: 'Missing pane ID' };
285
- }
286
- const pane = stateManager.getPaneById(decodeURIComponent(paneId));
287
- if (!pane) {
288
- event.node.res.statusCode = 404;
289
- return { error: 'Pane not found' };
290
- }
291
- try {
292
- const body = await readBody(event);
293
- const { status, output } = body;
294
- if (!status || !['running', 'passed', 'failed'].includes(status)) {
295
- event.node.res.statusCode = 400;
296
- return { error: 'Invalid or missing status. Must be: running, passed, or failed' };
297
- }
298
- // Update pane with test status
299
- const updatedPane = {
300
- ...pane,
301
- testStatus: status,
302
- testOutput: output || pane.testOutput,
303
- };
304
- // Update in StateManager
305
- const state = stateManager.getState();
306
- const updatedPanes = state.panes.map(p => p.id === pane.id ? updatedPane : p);
307
- stateManager.updatePanes(updatedPanes);
308
- // Persist to config file
309
- const fs = await import('fs/promises');
310
- const path = await import('path');
311
- const projectRoot = state.projectRoot || process.cwd();
312
- const panesFile = path.join(projectRoot, '.dmux', 'dmux.config.json');
313
- await fs.writeFile(panesFile, JSON.stringify({ panes: updatedPanes }, null, 2));
314
- return {
315
- success: true,
316
- paneId: pane.id,
317
- testStatus: status,
318
- message: `Test status updated to ${status}`,
319
- };
320
- }
321
- catch (err) {
322
- console.error('Failed to update test status:', err);
323
- event.node.res.statusCode = 500;
324
- return { error: 'Failed to update test status', details: err.message };
325
- }
326
- }));
327
- // PUT /api/panes/:id/dev - Update dev server status (called by run_dev hook)
328
- apiRouter.put('/api/panes/:id/dev', eventHandler(async (event) => {
329
- const params = getRouterParams(event);
330
- const paneId = params?.id;
331
- if (!paneId) {
332
- event.node.res.statusCode = 400;
333
- return { error: 'Missing pane ID' };
334
- }
335
- const pane = stateManager.getPaneById(decodeURIComponent(paneId));
336
- if (!pane) {
337
- event.node.res.statusCode = 404;
338
- return { error: 'Pane not found' };
339
- }
340
- try {
341
- const body = await readBody(event);
342
- const { url, status } = body;
343
- if (!status || !['running', 'stopped'].includes(status)) {
344
- event.node.res.statusCode = 400;
345
- return { error: 'Invalid or missing status. Must be: running or stopped' };
346
- }
347
- // Update pane with dev server info
348
- const updatedPane = {
349
- ...pane,
350
- devStatus: status,
351
- devUrl: url || pane.devUrl,
352
- };
353
- // Update in StateManager
354
- const state = stateManager.getState();
355
- const updatedPanes = state.panes.map(p => p.id === pane.id ? updatedPane : p);
356
- stateManager.updatePanes(updatedPanes);
357
- // Persist to config file
358
- const fs = await import('fs/promises');
359
- const path = await import('path');
360
- const projectRoot = state.projectRoot || process.cwd();
361
- const panesFile = path.join(projectRoot, '.dmux', 'dmux.config.json');
362
- await fs.writeFile(panesFile, JSON.stringify({ panes: updatedPanes }, null, 2));
363
- return {
364
- success: true,
365
- paneId: pane.id,
366
- devStatus: status,
367
- devUrl: url,
368
- message: `Dev server ${status === 'running' ? 'started' : 'stopped'}${url ? ` at ${url}` : ''}`,
369
- };
370
- }
371
- catch (err) {
372
- console.error('Failed to update dev status:', err);
373
- event.node.res.statusCode = 500;
374
- return { error: 'Failed to update dev status', details: err.message };
375
- }
376
- }));
377
- // POST /api/panes/:id/actions - Execute action on pane
378
- apiRouter.post('/api/panes/:id/actions', eventHandler(async (event) => {
379
- const params = getRouterParams(event);
380
- const paneId = params?.id;
381
- if (!paneId) {
382
- event.node.res.statusCode = 400;
383
- return { error: 'Missing pane ID' };
384
- }
385
- const pane = stateManager.getPaneById(decodeURIComponent(paneId));
386
- if (!pane) {
387
- event.node.res.statusCode = 404;
388
- return { error: 'Pane not found' };
389
- }
390
- try {
391
- const action = await readBody(event);
392
- // For now, just acknowledge the action
393
- // Future: Implement actual pane actions (sendKeys, resize, etc.)
394
- return {
395
- status: 'acknowledged',
396
- paneId,
397
- action,
398
- message: 'Action endpoints will be implemented in future versions'
399
- };
400
- }
401
- catch (err) {
402
- event.node.res.statusCode = 400;
403
- return { error: 'Invalid request body' };
404
- }
405
- }));
406
- // GET /api/panes/:id - Get specific pane
407
- apiRouter.get('/api/panes/:id', eventHandler(async (event) => {
408
- const params = getRouterParams(event);
409
- const paneId = params?.id;
410
- if (!paneId) {
411
- event.node.res.statusCode = 400;
412
- return { error: 'Missing pane ID' };
413
- }
414
- const pane = stateManager.getPaneById(decodeURIComponent(paneId));
415
- if (!pane) {
416
- event.node.res.statusCode = 404;
417
- return { error: 'Pane not found' };
418
- }
419
- return formatPaneResponse(pane);
420
- }));
421
- // GET /api/panes - List all panes
422
- apiRouter.get('/api/panes', eventHandler(async (event) => {
423
- const state = stateManager.getState();
424
- return {
425
- panes: state.panes.map(formatPaneResponse),
426
- projectName: state.projectName,
427
- sessionName: state.sessionName,
428
- timestamp: Date.now()
429
- };
430
- }));
431
- // POST /api/panes - Create a new pane
432
- apiRouter.post('/api/panes', eventHandler(async (event) => {
433
- try {
434
- const body = await readBody(event);
435
- let { prompt, agent } = body;
436
- console.error('[API] POST /api/panes called with:', { prompt, agent, body });
437
- if (!prompt || typeof prompt !== 'string') {
438
- event.node.res.statusCode = 400;
439
- return { error: 'Missing or invalid prompt' };
440
- }
441
- // Normalize agent to undefined if not provided or empty
442
- if (!agent || agent === '') {
443
- agent = undefined;
444
- }
445
- console.error('[API] After normalization, agent =', agent);
446
- if (agent && agent !== 'claude' && agent !== 'opencode') {
447
- event.node.res.statusCode = 400;
448
- return { error: 'Invalid agent. Must be "claude" or "opencode"' };
449
- }
450
- // Get available agents using robust detection (same as TUI)
451
- const { execSync } = await import('child_process');
452
- const fsPromises = await import('fs/promises');
453
- const availableAgents = [];
454
- // Check for Claude
455
- const hasClaude = await (async () => {
456
- try {
457
- const userShell = process.env.SHELL || '/bin/bash';
458
- const result = execSync(`${userShell} -i -c "command -v claude 2>/dev/null || which claude 2>/dev/null"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
459
- if (result)
460
- return true;
461
- }
462
- catch { }
463
- const claudePaths = [
464
- `${process.env.HOME}/.claude/local/claude`,
465
- `${process.env.HOME}/.local/bin/claude`,
466
- '/usr/local/bin/claude',
467
- '/opt/homebrew/bin/claude',
468
- '/usr/bin/claude',
469
- `${process.env.HOME}/bin/claude`,
470
- ];
471
- for (const p of claudePaths) {
472
- try {
473
- await fsPromises.access(p);
474
- return true;
475
- }
476
- catch { }
477
- }
478
- return false;
479
- })();
480
- if (hasClaude)
481
- availableAgents.push('claude');
482
- // Check for opencode
483
- const hasOpencode = await (async () => {
484
- try {
485
- const userShell = process.env.SHELL || '/bin/bash';
486
- const result = execSync(`${userShell} -i -c "command -v opencode 2>/dev/null || which opencode 2>/dev/null"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
487
- if (result)
488
- return true;
489
- }
490
- catch { }
491
- const opencodePaths = [
492
- '/opt/homebrew/bin/opencode',
493
- '/usr/local/bin/opencode',
494
- `${process.env.HOME}/.local/bin/opencode`,
495
- `${process.env.HOME}/bin/opencode`,
496
- ];
497
- for (const p of opencodePaths) {
498
- try {
499
- await fsPromises.access(p);
500
- return true;
501
- }
502
- catch { }
503
- }
504
- return false;
505
- })();
506
- if (hasOpencode)
507
- availableAgents.push('opencode');
508
- console.error('[API] Available agents:', availableAgents);
509
- if (availableAgents.length === 0) {
510
- event.node.res.statusCode = 500;
511
- return { error: 'No agents available. Install claude or opencode.' };
512
- }
513
- // If no agent specified and multiple available, return agent choice needed
514
- if (!agent && availableAgents.length > 1) {
515
- console.error('[API] Returning needsAgentChoice');
516
- return {
517
- needsAgentChoice: true,
518
- availableAgents,
519
- message: 'Please specify an agent (claude or opencode) in the request body',
520
- };
521
- }
522
- console.error('[API] Proceeding to create pane with agent:', agent);
523
- // Import pane creation utility
524
- const { createPane } = await import('../utils/paneCreation.js');
525
- const state = stateManager.getState();
526
- // Create the pane
527
- const result = await createPane({
528
- prompt,
529
- agent: agent || (availableAgents.length === 1 ? availableAgents[0] : undefined),
530
- projectName: state.projectName || 'unknown',
531
- existingPanes: state.panes,
532
- }, availableAgents);
533
- // Check if agent choice is needed
534
- if (result.needsAgentChoice) {
535
- return {
536
- needsAgentChoice: true,
537
- availableAgents,
538
- message: 'Please specify an agent (claude or opencode) in the request body',
539
- };
540
- }
541
- // Save the new pane to the panes file
542
- const fs = await import('fs/promises');
543
- const path = await import('path');
544
- // Get panes file path from state
545
- const projectRoot = state.projectRoot || process.cwd();
546
- const panesFile = path.join(projectRoot, '.dmux', `dmux.config.json`);
547
- // Read existing panes
548
- let existingPanes = [];
549
- try {
550
- const configContent = await fs.readFile(panesFile, 'utf-8');
551
- const config = JSON.parse(configContent);
552
- existingPanes = Array.isArray(config) ? config : config.panes || [];
553
- }
554
- catch {
555
- // File doesn't exist yet, start with empty array
556
- }
557
- // Add new pane
558
- const updatedPanes = [...existingPanes, result.pane];
559
- // Write back to file - ConfigWatcher will update StateManager
560
- await fs.writeFile(panesFile, JSON.stringify({ panes: updatedPanes }, null, 2));
561
- return {
562
- success: true,
563
- pane: formatPaneResponse(result.pane),
564
- message: 'Pane created successfully',
565
- };
566
- }
567
- catch (err) {
568
- console.error('Failed to create pane:', err);
569
- event.node.res.statusCode = 500;
570
- return { error: 'Failed to create pane', details: err.message };
571
- }
572
- }));
573
- // Mount the API router
574
- app.use(apiRouter);
575
- // GET /api/stream/:paneId - Stream terminal output
576
- // MUST be before the catch-all route
577
- app.use('/api/stream', eventHandler(async (event) => {
578
- const url = event.node.req.url || '';
579
- // When using app.use('/api/stream'), the URL is already stripped
580
- // So we just need to remove the leading slash
581
- const dmuxId = url.startsWith('/') ? url.substring(1) : url;
582
- if (!dmuxId || dmuxId.includes('/')) {
583
- event.node.res.statusCode = 404;
584
- return { error: 'Invalid pane ID' };
585
- }
586
- // Find the pane by dmux ID
587
- const pane = stateManager.getPaneById(decodeURIComponent(dmuxId));
588
- if (!pane || !pane.paneId) {
589
- event.node.res.statusCode = 404;
590
- return { error: 'Pane not found' };
591
- }
592
- // Create a readable stream
593
- const { Readable } = await import('stream');
594
- const stream = new Readable({
595
- read() { } // No-op, we'll push data as it arrives
596
- });
597
- const streamer = getTerminalStreamer();
598
- // Start streaming - pass the stream object
599
- await streamer.startStream(pane.id, pane.paneId, stream);
600
- // Handle client disconnect
601
- event.node.req.on('close', () => {
602
- streamer.stopStream(pane.id, stream);
603
- stream.destroy();
604
- });
605
- // Send heartbeat every 30 seconds to keep connection alive
606
- const heartbeat = setInterval(() => {
607
- try {
608
- const heartbeatMessage = {
609
- type: 'heartbeat',
610
- timestamp: Date.now()
611
- };
612
- stream.push(formatStreamMessage(heartbeatMessage));
613
- }
614
- catch {
615
- clearInterval(heartbeat);
616
- }
617
- }, 30000);
618
- // Cleanup heartbeat on disconnect
619
- event.node.req.on('close', () => {
620
- clearInterval(heartbeat);
621
- stream.destroy();
622
- });
623
- // Return the readable stream - h3 will pipe it to the response
624
- return stream;
625
- }));
626
- // POST /api/keys/:paneId - Send keystrokes to pane
627
- app.use('/api/keys', eventHandler(async (event) => {
628
- // Only accept POST requests
629
- if (event.node.req.method !== 'POST') {
630
- event.node.res.statusCode = 405;
631
- return { error: 'Method not allowed' };
632
- }
633
- const url = event.node.req.url || '';
634
- const dmuxId = url.startsWith('/') ? url.substring(1) : url;
635
- if (!dmuxId || dmuxId.includes('/')) {
636
- event.node.res.statusCode = 404;
637
- return { error: 'Invalid pane ID' };
638
- }
639
- // Find the pane by dmux ID
640
- const pane = stateManager.getPaneById(decodeURIComponent(dmuxId));
641
- if (!pane || !pane.paneId) {
642
- event.node.res.statusCode = 404;
643
- return { error: 'Pane not found' };
644
- }
645
- // Read the keystroke data from the request body
646
- const body = await readBody(event);
647
- if (!body || typeof body.key !== 'string') {
648
- event.node.res.statusCode = 400;
649
- return { error: 'Missing or invalid key data' };
650
- }
651
- try {
652
- const { execSync } = await import('child_process');
653
- // Map special keys to tmux send-keys format
654
- const key = body.key;
655
- let tmuxKey = key;
656
- // Handle special keys
657
- const specialKeys = {
658
- 'Enter': 'Enter',
659
- 'Tab': 'Tab',
660
- 'Backspace': 'BSpace',
661
- 'Delete': 'DC', // Delete Character
662
- 'Escape': 'Escape',
663
- 'ArrowUp': 'Up',
664
- 'ArrowDown': 'Down',
665
- 'ArrowLeft': 'Left',
666
- 'ArrowRight': 'Right',
667
- 'Home': 'Home',
668
- 'End': 'End',
669
- 'PageUp': 'PageUp',
670
- 'PageDown': 'PageDown',
671
- 'Space': 'Space'
672
- };
673
- // Priority order: Ctrl/Alt combinations first, then special keys, then regular
674
- // Handle Ctrl+ combinations with regular characters
675
- if (body.ctrlKey && key.length === 1 && !specialKeys[key]) {
676
- tmuxKey = `C-${key.toLowerCase()}`;
677
- }
678
- // Handle Alt+ combinations with regular characters
679
- else if (body.altKey && key.length === 1 && !specialKeys[key]) {
680
- tmuxKey = `M-${key.toLowerCase()}`;
681
- }
682
- // Handle Shift+Tab
683
- else if (body.shiftKey && key === 'Tab') {
684
- tmuxKey = 'BTab';
685
- }
686
- // Handle Shift+Enter - send the escape sequence using printf to handle escape character
687
- else if (body.shiftKey && key === 'Enter') {
688
- // Send ESC[13;2~ which is the standard Shift+Enter sequence
689
- execSync(`printf '\\033[13;2~' | tmux load-buffer - && tmux paste-buffer -t ${pane.paneId}`, {
690
- stdio: 'pipe',
691
- shell: '/bin/bash'
692
- });
693
- return { success: true, key: 'Shift+Enter (CSI sequence)' };
694
- }
695
- // Handle Ctrl+ with special keys
696
- else if (body.ctrlKey && specialKeys[key]) {
697
- tmuxKey = `C-${specialKeys[key]}`;
698
- }
699
- // Handle Alt+ with special keys
700
- else if (body.altKey && specialKeys[key]) {
701
- tmuxKey = `M-${specialKeys[key]}`;
702
- }
703
- // Handle special keys alone
704
- else if (specialKeys[key]) {
705
- tmuxKey = specialKeys[key];
706
- }
707
- // Regular character - use -l flag to send literally
708
- else if (key.length === 1) {
709
- execSync(`tmux send-keys -t ${pane.paneId} -l ${JSON.stringify(key)}`, {
710
- stdio: 'pipe'
711
- });
712
- return { success: true, key: key };
713
- }
714
- // Send the key to tmux (for all non-literal keys)
715
- execSync(`tmux send-keys -t ${pane.paneId} ${tmuxKey}`, {
716
- stdio: 'pipe'
717
- });
718
- return { success: true, key: tmuxKey };
719
- }
720
- catch (error) {
721
- console.error('Failed to send keys to pane:', error);
722
- event.node.res.statusCode = 500;
723
- return { error: 'Failed to send keys', details: error.message };
724
- }
725
- }));
726
- // GET /api/stream-stats - Get streaming statistics
727
- app.use('/api/stream-stats', eventHandler(async () => {
728
- const streamer = getTerminalStreamer();
729
- return streamer.getStats();
730
- }));
731
- // GET /api/test-stream - Simple test stream
732
- app.use('/api/test-stream', eventHandler(async (event) => {
733
- const { Readable } = await import('stream');
734
- const stream = new Readable({
735
- read() { }
736
- });
737
- // Send some test data
738
- stream.push('TEST:First message\n');
739
- setTimeout(() => stream.push('TEST:Second message\n'), 100);
740
- setTimeout(() => stream.push('TEST:Third message\n'), 200);
741
- setTimeout(() => stream.push(null), 300); // End stream
742
- return stream;
743
- }));
744
- // Static files - Dashboard HTML
745
- // IMPORTANT: This must be last to avoid catching API routes
746
- app.use('/', eventHandler(async (event) => {
747
- const path = event.node.req.url || '/';
748
- // Skip API routes - let them 404 naturally
749
- if (path.startsWith('/api/')) {
750
- event.node.res.statusCode = 404;
751
- return { error: 'API endpoint not found' };
752
- }
753
- if (path === '/' || path === '/index.html') {
754
- setHeader(event, 'Content-Type', 'text/html');
755
- return serveEmbeddedAsset('dashboard.html');
756
- }
757
- // Terminal viewer page
758
- if (path.startsWith('/panes/')) {
759
- setHeader(event, 'Content-Type', 'text/html');
760
- return serveEmbeddedAsset('terminal.html');
761
- }
762
- // Serve any CSS file from root of dist/
763
- if (path.endsWith('.css')) {
764
- const filename = path.substring(1); // Remove leading /
765
- const asset = getEmbeddedAsset(filename);
766
- if (asset) {
767
- setHeader(event, 'Content-Type', 'text/css');
768
- return asset.content;
769
- }
770
- }
771
- // Serve any JS file from root of dist/ (not in subdirectories)
772
- if (path.endsWith('.js') && path.lastIndexOf('/') === 0) {
773
- const filename = path.substring(1); // Remove leading /
774
- const asset = getEmbeddedAsset(filename);
775
- if (asset) {
776
- setHeader(event, 'Content-Type', 'application/javascript');
777
- return asset.content;
778
- }
779
- }
780
- // Serve chunk files
781
- if (path.startsWith('/chunks/')) {
782
- setHeader(event, 'Content-Type', 'application/javascript');
783
- const filename = path.substring(1); // Remove leading /
784
- return serveEmbeddedAsset(filename);
785
- }
786
- // 404 for unknown routes
787
- event.node.res.statusCode = 404;
788
- return 'Not Found';
789
- }));
790
- }
791
- function formatPaneResponse(pane) {
792
- return {
793
- id: pane.id,
794
- slug: pane.slug,
795
- prompt: pane.prompt,
796
- paneId: pane.paneId,
797
- worktreePath: pane.worktreePath,
798
- agent: pane.agent || 'unknown',
799
- agentStatus: pane.agentStatus || 'idle',
800
- testStatus: pane.testStatus,
801
- testWindowId: pane.testWindowId,
802
- devStatus: pane.devStatus,
803
- devUrl: pane.devUrl,
804
- devWindowId: pane.devWindowId,
805
- lastAgentCheck: pane.lastAgentCheck,
806
- optionsQuestion: pane.optionsQuestion,
807
- options: pane.options,
808
- potentialHarm: pane.potentialHarm,
809
- agentSummary: pane.agentSummary
810
- };
811
- }
1
+ /**
2
+ * Legacy routes.ts - Re-exports from modular route structure
3
+ *
4
+ * This file maintains backward compatibility while delegating to the new
5
+ * modular route system in src/server/routes/
6
+ *
7
+ * Route organization:
8
+ * - panesRoutes.ts - Pane CRUD, snapshot, test/dev status
9
+ * - streamRoutes.ts - SSE streaming endpoints
10
+ * - keysRoutes.ts - Keystroke input endpoints
11
+ * - actionsRoutes.ts - Action system endpoints
12
+ * - settingsRoutes.ts - Settings, session, hooks, logs
13
+ * - tunnelRoutes.ts - Remote tunnel creation
14
+ * - healthRoutes.ts - Health check + static file serving
15
+ */
16
+ export { setupRoutes } from './routes/index.js';
812
17
  //# sourceMappingURL=routes.js.map