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