dmux 2.2.0 → 3.0.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 (197) hide show
  1. package/dist/DmuxApp.d.ts.map +1 -1
  2. package/dist/DmuxApp.js +412 -179
  3. package/dist/DmuxApp.js.map +1 -1
  4. package/dist/MergePane.d.ts.map +1 -1
  5. package/dist/MergePane.js +4 -15
  6. package/dist/MergePane.js.map +1 -1
  7. package/dist/PaneAnalyzer.d.ts +45 -0
  8. package/dist/PaneAnalyzer.d.ts.map +1 -0
  9. package/dist/PaneAnalyzer.js +278 -0
  10. package/dist/PaneAnalyzer.js.map +1 -0
  11. package/dist/_plugin-vue_export-helper.css +1 -0
  12. package/dist/actions/index.d.ts +19 -0
  13. package/dist/actions/index.d.ts.map +1 -0
  14. package/dist/actions/index.js +54 -0
  15. package/dist/actions/index.js.map +1 -0
  16. package/dist/actions/paneActions.d.ts +45 -0
  17. package/dist/actions/paneActions.d.ts.map +1 -0
  18. package/dist/actions/paneActions.js +932 -0
  19. package/dist/actions/paneActions.js.map +1 -0
  20. package/dist/actions/types.d.ts +101 -0
  21. package/dist/actions/types.d.ts.map +1 -0
  22. package/dist/actions/types.js +129 -0
  23. package/dist/actions/types.js.map +1 -0
  24. package/dist/adapters/apiActionHandler.d.ts +64 -0
  25. package/dist/adapters/apiActionHandler.d.ts.map +1 -0
  26. package/dist/adapters/apiActionHandler.js +170 -0
  27. package/dist/adapters/apiActionHandler.js.map +1 -0
  28. package/dist/adapters/tuiActionHandler.d.ts +57 -0
  29. package/dist/adapters/tuiActionHandler.d.ts.map +1 -0
  30. package/dist/adapters/tuiActionHandler.js +152 -0
  31. package/dist/adapters/tuiActionHandler.js.map +1 -0
  32. package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +28 -0
  33. package/dist/components/ActionChoiceDialog.d.ts +16 -0
  34. package/dist/components/ActionChoiceDialog.d.ts.map +1 -0
  35. package/dist/components/ActionChoiceDialog.js +29 -0
  36. package/dist/components/ActionChoiceDialog.js.map +1 -0
  37. package/dist/components/ActionConfirmDialog.d.ts +16 -0
  38. package/dist/components/ActionConfirmDialog.d.ts.map +1 -0
  39. package/dist/components/ActionConfirmDialog.js +31 -0
  40. package/dist/components/ActionConfirmDialog.js.map +1 -0
  41. package/dist/components/ActionInputDialog.d.ts +16 -0
  42. package/dist/components/ActionInputDialog.d.ts.map +1 -0
  43. package/dist/components/ActionInputDialog.js +49 -0
  44. package/dist/components/ActionInputDialog.js.map +1 -0
  45. package/dist/components/ActionProgressDialog.d.ts +13 -0
  46. package/dist/components/ActionProgressDialog.d.ts.map +1 -0
  47. package/dist/components/ActionProgressDialog.js +20 -0
  48. package/dist/components/ActionProgressDialog.js.map +1 -0
  49. package/dist/components/FooterHelp.d.ts +2 -0
  50. package/dist/components/FooterHelp.d.ts.map +1 -1
  51. package/dist/components/FooterHelp.js +9 -2
  52. package/dist/components/FooterHelp.js.map +1 -1
  53. package/dist/components/KebabMenu.d.ts +10 -0
  54. package/dist/components/KebabMenu.d.ts.map +1 -0
  55. package/dist/components/KebabMenu.js +18 -0
  56. package/dist/components/KebabMenu.js.map +1 -0
  57. package/dist/components/LoadingIndicator.d.ts.map +1 -1
  58. package/dist/components/LoadingIndicator.js +5 -5
  59. package/dist/components/LoadingIndicator.js.map +1 -1
  60. package/dist/components/PaneCard.d.ts +1 -0
  61. package/dist/components/PaneCard.d.ts.map +1 -1
  62. package/dist/components/PaneCard.js +21 -20
  63. package/dist/components/PaneCard.js.map +1 -1
  64. package/dist/components/PanesGrid.d.ts +1 -0
  65. package/dist/components/PanesGrid.d.ts.map +1 -1
  66. package/dist/components/PanesGrid.js +5 -4
  67. package/dist/components/PanesGrid.js.map +1 -1
  68. package/dist/components/QRCode.d.ts +7 -0
  69. package/dist/components/QRCode.d.ts.map +1 -0
  70. package/dist/components/QRCode.js +19 -0
  71. package/dist/components/QRCode.js.map +1 -0
  72. package/dist/components/Spinner.d.ts +10 -0
  73. package/dist/components/Spinner.d.ts.map +1 -0
  74. package/dist/components/Spinner.js +15 -0
  75. package/dist/components/Spinner.js.map +1 -0
  76. package/dist/dashboard.html +14 -0
  77. package/dist/dashboard.js +2 -0
  78. package/dist/hooks/useActionSystem.d.ts +31 -0
  79. package/dist/hooks/useActionSystem.d.ts.map +1 -0
  80. package/dist/hooks/useActionSystem.js +95 -0
  81. package/dist/hooks/useActionSystem.js.map +1 -0
  82. package/dist/hooks/useAgentStatus.d.ts +4 -3
  83. package/dist/hooks/useAgentStatus.d.ts.map +1 -1
  84. package/dist/hooks/useAgentStatus.js +45 -194
  85. package/dist/hooks/useAgentStatus.js.map +1 -1
  86. package/dist/hooks/usePaneCreation.d.ts +2 -1
  87. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  88. package/dist/hooks/usePaneCreation.js +46 -100
  89. package/dist/hooks/usePaneCreation.js.map +1 -1
  90. package/dist/hooks/usePanes.d.ts.map +1 -1
  91. package/dist/hooks/usePanes.js +5 -3
  92. package/dist/hooks/usePanes.js.map +1 -1
  93. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  94. package/dist/hooks/useTerminalWidth.js +18 -1
  95. package/dist/hooks/useTerminalWidth.js.map +1 -1
  96. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  97. package/dist/hooks/useWorktreeActions.js +4 -0
  98. package/dist/hooks/useWorktreeActions.js.map +1 -1
  99. package/dist/index.js +43 -6
  100. package/dist/index.js.map +1 -1
  101. package/dist/server/actionsApi.d.ts +37 -0
  102. package/dist/server/actionsApi.d.ts.map +1 -0
  103. package/dist/server/actionsApi.js +256 -0
  104. package/dist/server/actionsApi.js.map +1 -0
  105. package/dist/server/embedded-assets.d.ts +13 -0
  106. package/dist/server/embedded-assets.d.ts.map +1 -0
  107. package/dist/server/embedded-assets.js +5012 -0
  108. package/dist/server/embedded-assets.js.map +1 -0
  109. package/dist/server/index.d.ts +21 -0
  110. package/dist/server/index.d.ts.map +1 -0
  111. package/dist/server/index.js +99 -0
  112. package/dist/server/index.js.map +1 -0
  113. package/dist/server/routes.d.ts +3 -0
  114. package/dist/server/routes.d.ts.map +1 -0
  115. package/dist/server/routes.js +672 -0
  116. package/dist/server/routes.js.map +1 -0
  117. package/dist/server/static.d.ts +6 -0
  118. package/dist/server/static.d.ts.map +1 -0
  119. package/dist/server/static.js +3040 -0
  120. package/dist/server/static.js.map +1 -0
  121. package/dist/services/ConfigWatcher.d.ts +20 -0
  122. package/dist/services/ConfigWatcher.d.ts.map +1 -0
  123. package/dist/services/ConfigWatcher.js +75 -0
  124. package/dist/services/ConfigWatcher.js.map +1 -0
  125. package/dist/services/PaneWorkerManager.d.ts +69 -0
  126. package/dist/services/PaneWorkerManager.d.ts.map +1 -0
  127. package/dist/services/PaneWorkerManager.js +272 -0
  128. package/dist/services/PaneWorkerManager.js.map +1 -0
  129. package/dist/services/StatusDetector.d.ts +87 -0
  130. package/dist/services/StatusDetector.d.ts.map +1 -0
  131. package/dist/services/StatusDetector.js +387 -0
  132. package/dist/services/StatusDetector.js.map +1 -0
  133. package/dist/services/TerminalDiffer.d.ts +85 -0
  134. package/dist/services/TerminalDiffer.d.ts.map +1 -0
  135. package/dist/services/TerminalDiffer.js +499 -0
  136. package/dist/services/TerminalDiffer.js.map +1 -0
  137. package/dist/services/TerminalStreamer.d.ts +80 -0
  138. package/dist/services/TerminalStreamer.d.ts.map +1 -0
  139. package/dist/services/TerminalStreamer.js +490 -0
  140. package/dist/services/TerminalStreamer.js.map +1 -0
  141. package/dist/services/TunnelService.d.ts +9 -0
  142. package/dist/services/TunnelService.d.ts.map +1 -0
  143. package/dist/services/TunnelService.js +34 -0
  144. package/dist/services/TunnelService.js.map +1 -0
  145. package/dist/services/WorkerMessageBus.d.ts +48 -0
  146. package/dist/services/WorkerMessageBus.d.ts.map +1 -0
  147. package/dist/services/WorkerMessageBus.js +120 -0
  148. package/dist/services/WorkerMessageBus.js.map +1 -0
  149. package/dist/shared/StateManager.d.ts +34 -0
  150. package/dist/shared/StateManager.d.ts.map +1 -0
  151. package/dist/shared/StateManager.js +108 -0
  152. package/dist/shared/StateManager.js.map +1 -0
  153. package/dist/shared/StreamProtocol.d.ts +75 -0
  154. package/dist/shared/StreamProtocol.d.ts.map +1 -0
  155. package/dist/shared/StreamProtocol.js +37 -0
  156. package/dist/shared/StreamProtocol.js.map +1 -0
  157. package/dist/terminal.html +17 -0
  158. package/dist/terminal.js +3 -0
  159. package/dist/types.d.ts +21 -1
  160. package/dist/types.d.ts.map +1 -1
  161. package/dist/utils/agentDetection.d.ts +18 -0
  162. package/dist/utils/agentDetection.d.ts.map +1 -0
  163. package/dist/utils/agentDetection.js +73 -0
  164. package/dist/utils/agentDetection.js.map +1 -0
  165. package/dist/utils/aiMerge.d.ts +35 -0
  166. package/dist/utils/aiMerge.d.ts.map +1 -0
  167. package/dist/utils/aiMerge.js +298 -0
  168. package/dist/utils/aiMerge.js.map +1 -0
  169. package/dist/utils/conflictResolutionPane.d.ts +19 -0
  170. package/dist/utils/conflictResolutionPane.d.ts.map +1 -0
  171. package/dist/utils/conflictResolutionPane.js +214 -0
  172. package/dist/utils/conflictResolutionPane.js.map +1 -0
  173. package/dist/utils/mergeExecution.d.ts +52 -0
  174. package/dist/utils/mergeExecution.d.ts.map +1 -0
  175. package/dist/utils/mergeExecution.js +192 -0
  176. package/dist/utils/mergeExecution.js.map +1 -0
  177. package/dist/utils/mergeValidation.d.ts +67 -0
  178. package/dist/utils/mergeValidation.d.ts.map +1 -0
  179. package/dist/utils/mergeValidation.js +213 -0
  180. package/dist/utils/mergeValidation.js.map +1 -0
  181. package/dist/utils/paneCreation.d.ts +17 -0
  182. package/dist/utils/paneCreation.d.ts.map +1 -0
  183. package/dist/utils/paneCreation.js +274 -0
  184. package/dist/utils/paneCreation.js.map +1 -0
  185. package/dist/utils/port.d.ts +5 -0
  186. package/dist/utils/port.d.ts.map +1 -0
  187. package/dist/utils/port.js +54 -0
  188. package/dist/utils/port.js.map +1 -0
  189. package/dist/workers/PaneWorker.d.ts +2 -0
  190. package/dist/workers/PaneWorker.d.ts.map +1 -0
  191. package/dist/workers/PaneWorker.js +362 -0
  192. package/dist/workers/PaneWorker.js.map +1 -0
  193. package/dist/workers/WorkerMessages.d.ts +36 -0
  194. package/dist/workers/WorkerMessages.d.ts.map +1 -0
  195. package/dist/workers/WorkerMessages.js +9 -0
  196. package/dist/workers/WorkerMessages.js.map +1 -0
  197. package/package.json +19 -5
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Action Progress Dialog
3
+ *
4
+ * Renders a progress/loading indicator from the action system
5
+ */
6
+ import React from 'react';
7
+ interface ActionProgressDialogProps {
8
+ message: string;
9
+ percent?: number;
10
+ }
11
+ declare const ActionProgressDialog: React.FC<ActionProgressDialogProps>;
12
+ export default ActionProgressDialog;
13
+ //# sourceMappingURL=ActionProgressDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionProgressDialog.d.ts","sourceRoot":"","sources":["../../src/components/ActionProgressDialog.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,yBAAyB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA2B7D,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Action Progress Dialog
3
+ *
4
+ * Renders a progress/loading indicator from the action system
5
+ */
6
+ import React from 'react';
7
+ import { Box, Text } from 'ink';
8
+ const ActionProgressDialog = ({ message, percent }) => {
9
+ return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 1 },
10
+ React.createElement(Box, { marginBottom: 1 },
11
+ React.createElement(Text, { bold: true, color: "cyan" },
12
+ "\u23F3 ",
13
+ message)),
14
+ percent !== undefined && (React.createElement(Box, { marginBottom: 1 },
15
+ React.createElement(Text, null, `Progress: ${Math.round(percent)}%`))),
16
+ React.createElement(Box, null,
17
+ React.createElement(Text, { dimColor: true }, "Please wait..."))));
18
+ };
19
+ export default ActionProgressDialog;
20
+ //# sourceMappingURL=ActionProgressDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionProgressDialog.js","sourceRoot":"","sources":["../../src/components/ActionProgressDialog.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,oBAAoB,GAAwC,CAAC,EACjE,OAAO,EACP,OAAO,EACR,EAAE,EAAE;IACH,OAAO,CACL,oBAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC;QAEZ,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM;;gBAAI,OAAO,CAAQ,CACtC;QAEL,OAAO,KAAK,SAAS,IAAI,CACxB,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,QAAE,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAQ,CAC9C,CACP;QAED,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,QAAQ,2BAAsB,CAChC,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -2,6 +2,8 @@ import React from 'react';
2
2
  interface FooterHelpProps {
3
3
  show: boolean;
4
4
  gridInfo?: string;
5
+ showRemoteKey?: boolean;
6
+ quitConfirmMode?: boolean;
5
7
  }
6
8
  declare const FooterHelp: React.FC<FooterHelpProps>;
7
9
  export default FooterHelp;
@@ -1 +1 @@
1
- {"version":3,"file":"FooterHelp.d.ts","sourceRoot":"","sources":["../../src/components/FooterHelp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,eAAe;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAezC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"FooterHelp.d.ts","sourceRoot":"","sources":["../../src/components/FooterHelp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,eAAe;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA0BzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,10 +1,17 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
- const FooterHelp = ({ show, gridInfo }) => {
3
+ const FooterHelp = ({ show, gridInfo, showRemoteKey = false, quitConfirmMode = false }) => {
4
4
  if (!show)
5
5
  return null;
6
+ if (quitConfirmMode) {
7
+ return (React.createElement(Box, { marginTop: 1 },
8
+ React.createElement(Text, { color: "yellow", bold: true }, "Press Ctrl+C again to exit, or ESC to continue")));
9
+ }
6
10
  return (React.createElement(Box, { marginTop: 1, flexDirection: "column" },
7
- React.createElement(Text, { dimColor: true }, "Commands: [j]ump \u2022 [t]est \u2022 [d]ev \u2022 [o]pen \u2022 [x]close \u2022 [m]erge \u2022 [n]ew \u2022 [q]uit"),
11
+ React.createElement(Text, { dimColor: true },
12
+ "Commands: [j]ump \u2022 [m]enu \u2022 [x]close \u2022 [n]ew",
13
+ showRemoteKey && ' • [r]emote',
14
+ " \u2022 [q]uit"),
8
15
  React.createElement(Text, { dimColor: true }, "Use arrow keys (\u2191\u2193\u2190\u2192) for spatial navigation, Enter to select"),
9
16
  gridInfo && (React.createElement(Text, { dimColor: true }, gridInfo))));
10
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"FooterHelp.js","sourceRoot":"","sources":["../../src/components/FooterHelp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,UAAU,GAA8B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CACL,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;QACvC,oBAAC,IAAI,IAAC,QAAQ,gIAEP;QACP,oBAAC,IAAI,IAAC,QAAQ,8FAEP;QACN,QAAQ,IAAI,CACX,oBAAC,IAAI,IAAC,QAAQ,UAAE,QAAQ,CAAQ,CACjC,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"FooterHelp.js","sourceRoot":"","sources":["../../src/components/FooterHelp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,UAAU,GAA8B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,KAAK,EAAE,eAAe,GAAG,KAAK,EAAE,EAAE,EAAE;IACnH,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CACL,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,2DAElB,CACH,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;QACvC,oBAAC,IAAI,IAAC,QAAQ;;YACiC,aAAa,IAAI,aAAa;6BACtE;QACP,oBAAC,IAAI,IAAC,QAAQ,8FAEP;QACN,QAAQ,IAAI,CACX,oBAAC,IAAI,IAAC,QAAQ,UAAE,QAAQ,CAAQ,CACjC,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { ActionMetadata } from '../actions/types.js';
3
+ interface KebabMenuProps {
4
+ selectedOption: number;
5
+ actions: ActionMetadata[];
6
+ paneName: string;
7
+ }
8
+ declare const KebabMenu: React.FC<KebabMenuProps>;
9
+ export default KebabMenu;
10
+ //# sourceMappingURL=KebabMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KebabMenu.d.ts","sourceRoot":"","sources":["../../src/components/KebabMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA2BvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ const KebabMenu = ({ selectedOption, actions, paneName }) => {
4
+ const options = actions;
5
+ return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 1 },
6
+ React.createElement(Box, { marginBottom: 1 },
7
+ React.createElement(Text, { bold: true, color: "cyan" },
8
+ "Menu: ",
9
+ paneName)),
10
+ options.map((option, index) => (React.createElement(Box, { key: option.id },
11
+ React.createElement(Text, { color: selectedOption === index ? 'cyan' : 'white', bold: selectedOption === index },
12
+ selectedOption === index ? '▶ ' : ' ',
13
+ option.label)))),
14
+ React.createElement(Box, { marginTop: 1 },
15
+ React.createElement(Text, { dimColor: true }, "\u2191\u2193 to navigate \u2022 Enter to select \u2022 ESC to cancel"))));
16
+ };
17
+ export default KebabMenu;
18
+ //# sourceMappingURL=KebabMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KebabMenu.js","sourceRoot":"","sources":["../../src/components/KebabMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,SAAS,GAA6B,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;IACpF,MAAM,OAAO,GAAG,OAAO,CAAC;IAExB,OAAO,CACL,oBAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC;QAEZ,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM;;gBAAQ,QAAQ,CAAQ,CAC3C;QACL,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9B,oBAAC,GAAG,IAAC,GAAG,EAAE,MAAM,CAAC,EAAE;YACjB,oBAAC,IAAI,IAAC,KAAK,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,KAAK,KAAK;gBACrF,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;gBACtC,MAAM,CAAC,KAAK,CACR,CACH,CACP,CAAC;QACF,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,QAAQ,iFAAwD,CAClE,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingIndicator.d.ts","sourceRoot":"","sources":["../../src/components/LoadingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAS7B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"LoadingIndicator.d.ts","sourceRoot":"","sources":["../../src/components/LoadingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAM7B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
- import { Box, Text } from 'ink';
2
+ import { Text } from 'ink';
3
+ import Spinner from './Spinner.js';
3
4
  const LoadingIndicator = () => {
4
- return (React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 2, marginTop: 1 },
5
- React.createElement(Box, { flexDirection: "row", gap: 1 },
6
- React.createElement(Text, { color: "cyan" }, "\u23F3"),
7
- React.createElement(Text, null, "Loading dmux sessions..."))));
5
+ return (React.createElement(Text, { color: "gray" },
6
+ React.createElement(Spinner, { color: "gray" }),
7
+ " Loading panes"));
8
8
  };
9
9
  export default LoadingIndicator;
10
10
  //# sourceMappingURL=LoadingIndicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingIndicator.js","sourceRoot":"","sources":["../../src/components/LoadingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,gBAAgB,GAAa,GAAG,EAAE;IACtC,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QACnE,oBAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC;YAC7B,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aAAS;YAC3B,oBAAC,IAAI,mCAAgC,CACjC,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"LoadingIndicator.js","sourceRoot":"","sources":["../../src/components/LoadingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,gBAAgB,GAAa,GAAG,EAAE;IACtC,OAAO,CACL,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;QAChB,oBAAC,OAAO,IAAC,KAAK,EAAC,MAAM,GAAG;yBACnB,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -3,6 +3,7 @@ import type { DmuxPane } from '../types.js';
3
3
  interface PaneCardProps {
4
4
  pane: DmuxPane;
5
5
  selected: boolean;
6
+ isKebabMenuTarget?: boolean;
6
7
  }
7
8
  declare const PaneCard: React.FC<PaneCardProps>;
8
9
  export default PaneCard;
@@ -1 +1 @@
1
- {"version":3,"file":"PaneCard.d.ts","sourceRoot":"","sources":["../../src/components/PaneCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,UAAU,aAAa;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAkErC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"PaneCard.d.ts","sourceRoot":"","sources":["../../src/components/PaneCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,UAAU,aAAa;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAsFrC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
- const PaneCard = ({ pane, selected }) => {
3
+ const PaneCard = ({ pane, selected, isKebabMenuTarget = false }) => {
4
4
  let borderColor = 'gray';
5
5
  if (selected)
6
6
  borderColor = 'cyan';
@@ -10,28 +10,29 @@ const PaneCard = ({ pane, selected }) => {
10
10
  borderColor = 'yellow';
11
11
  else if (pane.testStatus === 'failed')
12
12
  borderColor = 'red';
13
- return (React.createElement(Box, { paddingX: 1, borderStyle: "single", borderColor: borderColor, width: 35, flexShrink: 0 },
14
- React.createElement(Box, { flexDirection: "column" },
15
- React.createElement(Box, null,
16
- React.createElement(Text, { color: selected ? 'cyan' : 'white', bold: true, wrap: "truncate" }, pane.slug),
17
- pane.worktreePath && (React.createElement(Text, { color: "gray" }, " (wt)")),
18
- pane.agent && (React.createElement(Text, { color: "gray" },
19
- " (",
20
- pane.agent === 'claude' ? 'cc' : 'oc',
21
- ")"))),
13
+ return (React.createElement(Box, { paddingX: 0, paddingY: 0, borderStyle: "single", borderColor: borderColor, width: 35, flexShrink: 0 },
14
+ React.createElement(Box, { flexDirection: "column", paddingX: 1 },
15
+ React.createElement(Box, { justifyContent: "space-between", width: "100%" },
16
+ React.createElement(Box, null,
17
+ React.createElement(Text, { color: isKebabMenuTarget ? 'cyan' : 'gray', bold: isKebabMenuTarget }, "\u22EE"),
18
+ React.createElement(Text, null, " "),
19
+ React.createElement(Text, { color: selected ? 'cyan' : 'white', bold: true, wrap: "truncate-end" }, pane.slug.substring(0, 18))),
20
+ React.createElement(Box, null,
21
+ pane.autopilot && (React.createElement(Text, { color: "green" }, "(ap)")),
22
+ pane.agent && (React.createElement(Text, { color: "gray" },
23
+ " (",
24
+ pane.agent === 'claude' ? 'cc' : 'oc',
25
+ ")")))),
22
26
  React.createElement(Text, { color: "gray", dimColor: true, wrap: "truncate" }, pane.prompt.substring(0, 30)),
23
27
  pane.agentStatus && (React.createElement(Box, null,
24
28
  pane.agentStatus === 'working' && (React.createElement(Text, { color: "cyan" }, "\u273B Working...")),
25
- pane.agentStatus === 'waiting' && (React.createElement(Text, { color: "yellow", bold: true }, "\u26A0 Needs attention")))),
26
- (pane.testStatus || pane.devStatus) && (React.createElement(Box, null,
27
- pane.testStatus === 'running' && (React.createElement(Text, { color: "yellow" }, "\u23F3 Test")),
28
- pane.testStatus === 'passed' && (React.createElement(Text, { color: "green" }, "\u2713 Test")),
29
- pane.testStatus === 'failed' && (React.createElement(Text, { color: "red" }, "\u2717 Test")),
30
- pane.devStatus === 'running' && (React.createElement(Text, { color: "green" },
31
- "\u25B6 Dev",
32
- pane.devUrl && (React.createElement(Text, { color: "cyan", wrap: "truncate" },
33
- " ",
34
- pane.devUrl.replace(/https?:\/\//, '').substring(0, 15))))))))));
29
+ pane.agentStatus === 'analyzing' && (React.createElement(Text, { color: "magenta" }, "\u27F3 Analyzing...")),
30
+ pane.agentStatus === 'waiting' && (React.createElement(Text, { color: "yellow", bold: true }, "\u26A0 Needs attention")),
31
+ pane.agentStatus === 'idle' && (React.createElement(Text, { color: "gray" }, "\u25CC Idle")))),
32
+ pane.analyzerError && (React.createElement(Box, null,
33
+ React.createElement(Text, { color: "red" },
34
+ "\u26A0 ",
35
+ pane.analyzerError))))));
35
36
  };
36
37
  export default PaneCard;
37
38
  //# sourceMappingURL=PaneCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PaneCard.js","sourceRoot":"","sources":["../../src/components/PaneCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC,MAAM,QAAQ,GAA4B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC/D,IAAI,WAAW,GAAQ,MAAM,CAAC;IAC9B,IAAI,QAAQ;QAAE,WAAW,GAAG,MAAM,CAAC;SAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,WAAW,GAAG,OAAO,CAAC;SACxD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,WAAW,GAAG,QAAQ,CAAC;SAC1D,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;QAAE,WAAW,GAAG,KAAK,CAAC;IAE3D,OAAO,CACL,oBAAC,GAAG,IACF,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,EAAE,EACT,UAAU,EAAE,CAAC;QAEb,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,QAAC,IAAI,EAAC,UAAU,IAC3D,IAAI,CAAC,IAAI,CACL;gBACN,IAAI,CAAC,YAAY,IAAI,CACpB,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAa,CAChC;gBACA,IAAI,CAAC,KAAK,IAAI,CACb,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;oBAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;wBAAS,CACrE,CACG;YACN,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,QAAC,IAAI,EAAC,UAAU,IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACxB;YAEN,IAAI,CAAC,WAAW,IAAI,CACnB,oBAAC,GAAG;gBACD,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CACjC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAoB,CACvC;gBACA,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CACjC,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,mCAAyB,CACnD,CACG,CACP;YAEA,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CACtC,oBAAC,GAAG;gBACD,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAChC,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,kBAAc,CACnC;gBACA,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,CAC/B,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,kBAAc,CAClC;gBACA,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,CAC/B,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,kBAAc,CAChC;gBACA,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAC/B,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO;;oBAEhB,IAAI,CAAC,MAAM,IAAI,CACd,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,UAAU;;wBAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAQ,CACrG,CACI,CACR,CACG,CACP,CACG,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"PaneCard.js","sourceRoot":"","sources":["../../src/components/PaneCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,QAAQ,GAA4B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,GAAG,KAAK,EAAE,EAAE,EAAE;IAC1F,IAAI,WAAW,GAAQ,MAAM,CAAC;IAC9B,IAAI,QAAQ;QAAE,WAAW,GAAG,MAAM,CAAC;SAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,WAAW,GAAG,OAAO,CAAC;SACxD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,WAAW,GAAG,QAAQ,CAAC;SAC1D,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;QAAE,WAAW,GAAG,KAAK,CAAC;IAE3D,OAAO,CACL,oBAAC,GAAG,IACF,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,EAAE,EACT,UAAU,EAAE,CAAC;QAEb,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC;YACrC,oBAAC,GAAG,IAAC,cAAc,EAAC,eAAe,EAAC,KAAK,EAAC,MAAM;gBAC9C,oBAAC,GAAG;oBACF,oBAAC,IAAI,IAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,aAAU;oBACnF,oBAAC,IAAI,YAAS;oBACd,oBAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,QAAC,IAAI,EAAC,cAAc,IAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACtB,CACH;gBACN,oBAAC,GAAG;oBACD,IAAI,CAAC,SAAS,IAAI,CACjB,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,WAAY,CAChC;oBACA,IAAI,CAAC,KAAK,IAAI,CACb,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;wBAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;4BAAS,CACrE,CACG,CACF;YACN,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,QAAC,IAAI,EAAC,UAAU,IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACxB;YAEN,IAAI,CAAC,WAAW,IAAI,CACnB,oBAAC,GAAG;gBACD,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CACjC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAoB,CACvC;gBACA,IAAI,CAAC,WAAW,KAAK,WAAW,IAAI,CACnC,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,0BAAsB,CAC5C;gBACA,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CACjC,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,mCAAyB,CACnD;gBACA,IAAI,CAAC,WAAW,KAAK,MAAM,IAAI,CAC9B,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAc,CACjC,CACG,CACP;YAEA,IAAI,CAAC,aAAa,IAAI,CACrB,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK;;oBAAI,IAAI,CAAC,aAAa,CAAQ,CAC3C,CACP,CAwBG,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -7,6 +7,7 @@ interface PanesGridProps {
7
7
  isLoading: boolean;
8
8
  showNewPaneDialog: boolean;
9
9
  agentStatuses?: AgentStatusMap;
10
+ kebabMenuPaneIndex?: number;
10
11
  }
11
12
  declare const PanesGrid: React.FC<PanesGridProps>;
12
13
  export default PanesGrid;
@@ -1 +1 @@
1
- {"version":3,"file":"PanesGrid.d.ts","sourceRoot":"","sources":["../../src/components/PanesGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,UAAU,cAAc;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA6BvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"PanesGrid.d.ts","sourceRoot":"","sources":["../../src/components/PanesGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,UAAU,cAAc;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA4CvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
3
  import PaneCard from './PaneCard.js';
4
- const PanesGrid = ({ panes, selectedIndex, isLoading, showNewPaneDialog, agentStatuses }) => {
4
+ const PanesGrid = ({ panes, selectedIndex, isLoading, showNewPaneDialog, agentStatuses, kebabMenuPaneIndex }) => {
5
5
  return (React.createElement(Box, { flexDirection: "row", flexWrap: "wrap", gap: 1 },
6
6
  panes.map((pane, index) => {
7
7
  // Apply the runtime status to the pane
@@ -9,10 +9,11 @@ const PanesGrid = ({ panes, selectedIndex, isLoading, showNewPaneDialog, agentSt
9
9
  ...pane,
10
10
  agentStatus: agentStatuses?.get(pane.id) || pane.agentStatus
11
11
  };
12
- return (React.createElement(PaneCard, { key: pane.id, pane: paneWithStatus, selected: selectedIndex === index }));
12
+ return (React.createElement(PaneCard, { key: pane.id, pane: paneWithStatus, selected: selectedIndex === index, isKebabMenuTarget: kebabMenuPaneIndex === index }));
13
13
  }),
14
- !isLoading && !showNewPaneDialog && (React.createElement(Box, { paddingX: 1, borderStyle: "single", borderColor: selectedIndex === panes.length ? 'green' : 'gray', width: 35, flexShrink: 0 },
15
- React.createElement(Text, { color: selectedIndex === panes.length ? 'green' : 'white' }, "+ New dmux pane")))));
14
+ !isLoading && !showNewPaneDialog && (React.createElement(Box, { paddingX: 0, paddingY: 0, borderStyle: "single", borderColor: selectedIndex === panes.length ? 'green' : 'gray', width: 35, flexShrink: 0 },
15
+ React.createElement(Box, { paddingX: 1 },
16
+ React.createElement(Text, { color: selectedIndex === panes.length ? 'green' : 'white' }, "+ New dmux pane"))))));
16
17
  };
17
18
  export default PanesGrid;
18
19
  //# sourceMappingURL=PanesGrid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanesGrid.js","sourceRoot":"","sources":["../../src/components/PanesGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC,OAAO,QAAQ,MAAM,eAAe,CAAC;AAUrC,MAAM,SAAS,GAA6B,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,EAAE;IACpH,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,GAAG,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACzB,uCAAuC;YACvC,MAAM,cAAc,GAAG;gBACrB,GAAG,IAAI;gBACP,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW;aAC7D,CAAC;YACF,OAAO,CACL,oBAAC,QAAQ,IAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,KAAK,KAAK,GAAI,CACpF,CAAC;QACJ,CAAC,CAAC;QAED,CAAC,SAAS,IAAI,CAAC,iBAAiB,IAAI,CACnC,oBAAC,GAAG,IACF,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAC9D,KAAK,EAAE,EAAE,EACT,UAAU,EAAE,CAAC;YAEb,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,sBAExD,CACH,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"PanesGrid.js","sourceRoot":"","sources":["../../src/components/PanesGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC,OAAO,QAAQ,MAAM,eAAe,CAAC;AAWrC,MAAM,SAAS,GAA6B,CAAC,EAC3C,KAAK,EACL,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EACnB,EAAE,EAAE;IACH,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,GAAG,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACzB,uCAAuC;YACvC,MAAM,cAAc,GAAG;gBACrB,GAAG,IAAI;gBACP,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW;aAC7D,CAAC;YACF,OAAO,CACL,oBAAC,QAAQ,IACP,GAAG,EAAE,IAAI,CAAC,EAAE,EACZ,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,aAAa,KAAK,KAAK,EACjC,iBAAiB,EAAE,kBAAkB,KAAK,KAAK,GAC/C,CACH,CAAC;QACJ,CAAC,CAAC;QAED,CAAC,SAAS,IAAI,CAAC,iBAAiB,IAAI,CACnC,oBAAC,GAAG,IACF,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAC9D,KAAK,EAAE,EAAE,EACT,UAAU,EAAE,CAAC;YAEb,oBAAC,GAAG,IAAC,QAAQ,EAAE,CAAC;gBACd,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,sBAExD,CACH,CACF,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface QRCodeProps {
3
+ url: string;
4
+ }
5
+ declare const QRCode: React.FC<QRCodeProps>;
6
+ export default QRCode;
7
+ //# sourceMappingURL=QRCode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QRCode.d.ts","sourceRoot":"","sources":["../../src/components/QRCode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAgBjC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,19 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Box, Text } from 'ink';
3
+ // @ts-ignore - No types available for qrcode-terminal
4
+ import qrcode from 'qrcode-terminal';
5
+ const QRCode = ({ url }) => {
6
+ const qrString = useMemo(() => {
7
+ let output = '';
8
+ qrcode.generate(url, { small: true }, (qr) => {
9
+ output = qr;
10
+ });
11
+ return output;
12
+ }, [url]);
13
+ return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
14
+ React.createElement(Text, { dimColor: true }, "Scan to access dashboard:"),
15
+ React.createElement(Text, null, qrString),
16
+ React.createElement(Text, { dimColor: true }, url)));
17
+ };
18
+ export default QRCode;
19
+ //# sourceMappingURL=QRCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QRCode.js","sourceRoot":"","sources":["../../src/components/QRCode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,sDAAsD;AACtD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAMrC,MAAM,MAAM,GAA0B,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAU,EAAE,EAAE;YACnD,MAAM,GAAG,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC;QACtC,oBAAC,IAAI,IAAC,QAAQ,sCAAiC;QAC/C,oBAAC,IAAI,QAAE,QAAQ,CAAQ;QACvB,oBAAC,IAAI,IAAC,QAAQ,UAAE,GAAG,CAAQ,CACvB,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface SpinnerProps {
3
+ /** Optional color for the spinner */
4
+ color?: string;
5
+ /** Frame rate in milliseconds (default: 80ms) */
6
+ interval?: number;
7
+ }
8
+ declare const Spinner: React.FC<SpinnerProps>;
9
+ export default Spinner;
10
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,UAAU,YAAY;IACpB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,QAAA,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAYnC,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Text } from 'ink';
3
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
4
+ const Spinner = ({ color = 'cyan', interval = 80 }) => {
5
+ const [frame, setFrame] = useState(0);
6
+ useEffect(() => {
7
+ const timer = setInterval(() => {
8
+ setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);
9
+ }, interval);
10
+ return () => clearInterval(timer);
11
+ }, [interval]);
12
+ return React.createElement(Text, { color: color }, SPINNER_FRAMES[frame]);
13
+ };
14
+ export default Spinner;
15
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAS1E,MAAM,OAAO,GAA2B,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE;IAC5E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEb,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,cAAc,CAAC,KAAK,CAAC,CAAQ,CAAC;AAC5D,CAAC,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
6
+ <title>dmux Dashboard</title>
7
+ <script type="module" crossorigin src="/dashboard.js"></script>
8
+ <link rel="modulepreload" crossorigin href="/chunks/_plugin-vue_export-helper-Cvoq67hi.js">
9
+ <link rel="stylesheet" crossorigin href="/_plugin-vue_export-helper.css">
10
+ </head>
11
+ <body>
12
+ <div id="app"></div>
13
+ </body>
14
+ </html>
@@ -0,0 +1,2 @@
1
+ import{d as _e,r as p,o as be,a as ke,n as E,_ as we,c as s,b as t,t as g,e as u,f as Ce,g as F,F as b,h as M,w as N,i as X,v as Y,j as $,k as l,l as O,m as De}from"./chunks/_plugin-vue_export-helper-Cvoq67hi.js";const Se=_e({__name:"Dashboard",setup(ae,{expose:i}){i();const q=p("Loading..."),e=p(""),k=p(!1),z=p([]),o=p(null),m=p("Never"),A=p({}),y=p(new Set),H=p({}),S=p(localStorage.getItem("dmux-theme")||"dark"),P=p(new Set),_=p(new Set),U=p(!1),T=p(""),w=p(null),B=p(!1),j=p([]),I=p(!1),x=p("prompt"),ne=p([]),J=p({}),C=p(null),f=p(null),K=p(!1),D=p(!1);let h=null;const ie=()=>{S.value=S.value==="dark"?"light":"dark",localStorage.setItem("dmux-theme",S.value),document.documentElement.setAttribute("data-theme",S.value)},se=a=>{P.value.has(a)?P.value.delete(a):P.value.add(a),P.value=new Set(P.value)},le=()=>{U.value=!0,T.value="",w.value=null,j.value=[],I.value=!1,x.value="prompt",E(()=>{const n=document.getElementById("pane-prompt");n&&n.focus()});const a=n=>{n.key==="Escape"&&(Q(),document.removeEventListener("keydown",a))};document.addEventListener("keydown",a)},Q=()=>{U.value=!1,T.value="",w.value=null,j.value=[],I.value=!1,x.value="prompt"},ee=async()=>{if(!(x.value==="prompt"&&!T.value.trim())&&!(x.value==="agent"&&!w.value))try{B.value=!0;const a={prompt:T.value.trim()};w.value&&(a.agent=w.value);const r=await(await fetch("/api/panes",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();r.needsAgentChoice?(I.value=!0,j.value=r.availableAgents,x.value="agent"):Q()}catch(a){console.error("Failed to create pane:",a),alert("Failed to create pane")}finally{B.value=!1}},ce=a=>{w.value=a,ee()},R=a=>{q.value=a.projectName||"dmux",e.value=a.sessionName||"",k.value=!0,z.value=a.panes||[],o.value=new Date,m.value="Just now";for(const n of z.value)J.value[n.id]||te(n.id)},L=()=>{h&&h.close();try{h=new EventSource("/api/panes-stream"),h.onmessage=a=>{try{const n=JSON.parse(a.data);n.type==="init"||n.type==="update"?R(n.data):n.type==="heartbeat"&&console.debug("SSE heartbeat received")}catch(n){console.error("Failed to parse SSE message:",n)}},h.onerror=a=>{console.error("SSE connection error:",a),k.value=!1,setTimeout(()=>{(h==null?void 0:h.readyState)===EventSource.CLOSED&&L()},5e3)},h.onopen=()=>{k.value=!0}}catch(a){console.error("Failed to connect to SSE stream:",a),k.value=!1}},re=async()=>{try{const n=await(await fetch("/api/panes")).json();R(n)}catch(a){console.error("Failed to fetch panes:",a),k.value=!1}},te=async a=>{try{const r=await(await fetch(`/api/panes/${a}/actions`)).json();J.value[a]=r.actions||[]}catch(n){console.error(`Failed to fetch actions for pane ${a}:`,n)}},de=a=>{C.value===a?C.value=null:C.value=a},ue=async(a,n)=>{var r;try{K.value=!0,C.value=null;const d=await(await fetch(`/api/panes/${a.id}/actions/${n.id}`,{method:"POST"})).json();if(d.requiresInteraction){let v={};d.interactionType==="confirm"?v={type:"confirm",title:d.title||"Confirm",message:d.message,...d.confirmData}:d.interactionType==="choice"?v={type:"choice",title:d.title||"Choose",message:d.message,...d.choiceData}:d.interactionType==="input"&&(v={type:"input",title:d.title||"Input",message:d.message,...d.inputData,inputValue:((r=d.inputData)==null?void 0:r.defaultValue)||""},E(()=>{const G=document.querySelector(".dialog-input");G&&(G.focus(),G.select())})),v.paneId=a.id,f.value=v}}catch(c){console.error("Failed to execute action:",c),alert("Failed to execute action")}finally{K.value=!1}},V=()=>{f.value=null},ge=async a=>{var n;if(f.value)try{D.value=!0;const c=await(await fetch(`/api/callbacks/confirm/${f.value.callbackId}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirmed:a})})).json();if(c.requiresInteraction){let d={};c.interactionType==="confirm"?d={type:"confirm",title:c.title||"Confirm",message:c.message,...c.confirmData}:c.interactionType==="choice"?d={type:"choice",title:c.title||"Choose",message:c.message,...c.choiceData}:c.interactionType==="input"&&(d={type:"input",title:c.title||"Input",message:c.message,...c.inputData,inputValue:((n=c.inputData)==null?void 0:n.defaultValue)||""},E(()=>{const v=document.querySelector(".dialog-input");v&&(v.focus(),v.select())})),f.value=d}else V()}catch(r){console.error("Failed to confirm action:",r),alert("Failed to complete action")}finally{D.value=!1}},pe=async a=>{var n;if(f.value)try{D.value=!0;const c=await(await fetch(`/api/callbacks/choice/${f.value.callbackId}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({optionId:a})})).json();if(c.requiresInteraction){let d={};c.interactionType==="confirm"?d={type:"confirm",title:c.title||"Confirm",message:c.message,...c.confirmData}:c.interactionType==="choice"?d={type:"choice",title:c.title||"Choose",message:c.message,...c.choiceData}:c.interactionType==="input"&&(d={type:"input",title:c.title||"Input",message:c.message,...c.inputData,inputValue:((n=c.inputData)==null?void 0:n.defaultValue)||""},E(()=>{const v=document.querySelector(".dialog-input");v&&(v.focus(),v.select())})),f.value=d}else V()}catch(r){console.error("Failed to select choice:",r),alert("Failed to complete action")}finally{D.value=!1}},me=a=>a.split(`
2
+ `).map(n=>{if(n.includes("|")){const r=n.split("|");if(r.length===2){const c=r[0],v=r[1].replace(/\+/g,'<span style="color: #4ade80;">+</span>').replace(/-/g,'<span style="color: #f87171;">-</span>');return c+'<span style="opacity: 0.6;">|</span>'+v}}return n}).join("<br>"),ve=async()=>{var a;if(f.value)try{D.value=!0;const r=await(await fetch(`/api/callbacks/input/${f.value.callbackId}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:f.value.inputValue})})).json();if(r.requiresInteraction){let c={};r.interactionType==="confirm"?c={type:"confirm",title:r.title||"Confirm",message:r.message,...r.confirmData}:r.interactionType==="choice"?c={type:"choice",title:r.title||"Choose",message:r.message,...r.choiceData}:r.interactionType==="input"&&(c={type:"input",title:r.title||"Input",message:r.message,...r.inputData,inputValue:((a=r.inputData)==null?void 0:a.defaultValue)||""},E(()=>{const d=document.querySelector(".dialog-input");d&&(d.focus(),d.select())})),f.value=c}else V()}catch(n){console.error("Failed to submit input:",n),alert("Failed to complete action")}finally{D.value=!1}},he=async(a,n)=>{try{_.value.add(a.id),_.value=new Set(_.value);const r=n.keys||[n.action];for(const c of r)await fetch(`/api/keys/${a.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:c})});setTimeout(()=>{_.value.delete(a.id),_.value=new Set(_.value)},1500)}catch(r){console.error("Failed to select option:",r),_.value.delete(a.id),_.value=new Set(_.value)}},fe=async a=>{const n=A.value[a.id];if(!(!n||!n.trim()))try{y.value.add(a.id),y.value=new Set(y.value);for(const r of n)await fetch(`/api/keys/${a.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:r})});await fetch(`/api/keys/${a.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:"Enter"})}),H.value[a.id]=n.substring(0,50)+(n.length>50?"...":""),A.value[a.id]="",setTimeout(()=>{delete H.value[a.id],y.value.delete(a.id),y.value=new Set(y.value)},3e3)}catch(r){console.error("Failed to send prompt:",r),y.value.delete(a.id),y.value=new Set(y.value)}},ye=a=>{const n=a.target;n.style.height="auto",n.style.height=n.scrollHeight+"px"},W=()=>{h&&(h.close(),h=null)},Z=a=>{const n=a.target;C.value&&!n.closest(".action-menu-btn")&&!n.closest(".action-menu-dropdown")&&(C.value=null)};be(()=>{document.documentElement.setAttribute("data-theme",S.value),L(),document.addEventListener("click",Z),document.addEventListener("visibilitychange",()=>{document.hidden?W():L()})}),ke(()=>{W(),document.removeEventListener("click",Z)});const oe={projectName:q,sessionName:e,connected:k,panes:z,lastUpdate:o,timeSinceUpdate:m,promptInputs:A,sendingPrompts:y,queuedMessages:H,theme:S,expandedPrompts:P,loadingOptions:_,showCreateDialog:U,newPanePrompt:T,newPaneAgent:w,creatingPane:B,availableAgents:j,needsAgentChoice:I,createStep:x,actions:ne,paneActions:J,showActionMenu:C,actionDialog:f,executingAction:K,actionDialogLoading:D,get eventSource(){return h},set eventSource(a){h=a},toggleTheme:ie,togglePrompt:se,openCreateDialog:le,closeCreateDialog:Q,createPane:ee,selectAgent:ce,updatePanesFromData:R,connectToStream:L,fetchPanes:re,fetchPaneActions:te,toggleActionMenu:de,executeAction:ue,closeActionDialog:V,confirmAction:ge,selectChoice:pe,colorizeDiffStat:me,submitInput:ve,selectOption:he,sendPrompt:fe,autoExpand:ye,disconnectStream:W,handleClickOutside:Z};return Object.defineProperty(oe,"__isScriptSetup",{enumerable:!1,value:!0}),oe}}),Pe={class:"session-info"},xe=["title"],Ae={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Te={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Ee={key:0},Me={class:"container"},Ne={class:"actions-bar"},Oe=["disabled"],ze={key:0,class:"no-panes"},je={key:1,class:"panes-grid"},Ie={class:"pane-header"},Le={class:"pane-header-content"},Ve=["href"],Fe={class:"pane-title"},qe={class:"pane-meta"},He={key:0,class:"pane-autopilot",title:"Autopilot enabled"},Ue={class:"pane-id"},Be=["onClick"],Je={key:0,class:"action-menu-dropdown"},Ke=["onClick","disabled"],Qe={class:"action-icon"},Re={class:"action-label"},We={class:"pane-prompt-section"},Ze=["onClick"],Ge={class:"prompt-header"},Xe={class:"expand-icon"},Ye={class:"prompt-text"},$e={key:0,class:"pane-prompt-full"},et={key:1,class:"agent-summary"},tt={key:2,class:"analyzer-error"},ot={key:0,class:"options-dialog"},at={class:"options-question"},nt={key:0,class:"options-warning"},it={key:1,class:"analyzing-state"},st={key:2,class:"options-buttons"},lt=["onClick","disabled"],ct={class:"prompt-input-wrapper"},rt=["onUpdate:modelValue","placeholder","disabled"],dt=["onClick","disabled","title"],ut={key:0,class:"button-loader"},gt={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 988.44 1200.05"},pt={key:0,class:"queued-message"},mt={key:3,class:"dev-server-status"},vt=["href"],ht={class:"action-dialog"},ft={key:0},yt=["onKeydown"],_t={class:"dialog-buttons"},bt=["disabled"],kt={key:1},wt={class:"agent-choices"},Ct=["onClick","disabled"],Dt={key:0,class:"action-dialog"},St={key:0,class:"dialog-loading"},Pt={key:1,class:"dialog-buttons"},xt=["disabled"],At=["disabled"],Tt={class:"action-dialog"},Et={key:0},Mt={key:1,class:"dialog-loading"},Nt={key:2},Ot={class:"choice-options"},zt=["onClick","disabled"],jt={class:"choice-label"},It={key:0,class:"choice-description"},Lt={class:"dialog-buttons"},Vt=["disabled"],Ft={class:"action-dialog"},qt=["innerHTML"],Ht={key:1,class:"dialog-loading"},Ut={key:2},Bt=["placeholder"],Jt={class:"dialog-buttons"},Kt=["disabled"],Qt=["disabled"];function Rt(ae,i,q,e,k,z){return l(),s(b,null,[t("header",null,[i[7]||(i[7]=t("img",{src:"https://cdn.formk.it/dmux/dmux.png",alt:"dmux",class:"logo"},null,-1)),t("h1",null,g(e.projectName),1),t("div",Pe,[t("button",{onClick:e.toggleTheme,class:"theme-toggle",title:e.theme==="dark"?"Switch to light mode":"Switch to dark mode"},[e.theme==="dark"?(l(),s("svg",Ae,[...i[5]||(i[5]=[t("path",{d:"M12 2.25a.75.75 0 01.75.75v2.25a.75.75 0 01-1.5 0V3a.75.75 0 01.75-.75zM7.5 12a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM18.894 6.166a.75.75 0 00-1.06-1.06l-1.591 1.59a.75.75 0 101.06 1.061l1.591-1.59zM21.75 12a.75.75 0 01-.75.75h-2.25a.75.75 0 010-1.5H21a.75.75 0 01.75.75zM17.834 18.894a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 10-1.061 1.06l1.59 1.591zM12 18a.75.75 0 01.75.75V21a.75.75 0 01-1.5 0v-2.25A.75.75 0 0112 18zM7.758 17.303a.75.75 0 00-1.061-1.06l-1.591 1.59a.75.75 0 001.06 1.061l1.591-1.59zM6 12a.75.75 0 01-.75.75H3a.75.75 0 010-1.5h2.25A.75.75 0 016 12zM6.697 7.757a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 00-1.061 1.06l1.59 1.591z"},null,-1)])])):(l(),s("svg",Te,[...i[6]||(i[6]=[t("path",{d:"M9.528 1.718a.75.75 0 01.162.819A8.97 8.97 0 009 6.5a9 9 0 009 9 8.97 8.97 0 003.963-.69.75.75 0 01.981.98 10.503 10.503 0 01-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 01.818.162z"},null,-1)])]))],8,xe),e.sessionName?(l(),s("span",Ee,g(e.sessionName),1)):u("v-if",!0),t("span",{class:"status-indicator",style:Ce({color:e.connected?"#4ade80":"#f87171"})},"●",4)])]),t("div",Me,[t("main",null,[t("div",Ne,[t("button",{onClick:e.openCreateDialog,class:"create-pane-button",disabled:e.creatingPane},[...i[8]||(i[8]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},[t("path",{d:"M12 4.5v15m7.5-7.5h-15",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),F(" Create New Pane ",-1)])],8,Oe)]),e.panes.length===0?(l(),s("div",ze,[...i[9]||(i[9]=[t("p",null,"No dmux panes active",-1),t("p",{class:"hint"},`Click "Create New Pane" above or press 'n' in dmux`,-1)])])):(l(),s("div",je,[(l(!0),s(b,null,M(e.panes,o=>(l(),s("div",{key:o.id,class:"pane-card"},[t("div",Ie,[t("div",Le,[t("a",{href:"/panes/"+o.id,class:"pane-title-link"},[t("span",Fe,g(o.slug),1),i[10]||(i[10]=t("span",{class:"pane-arrow"},"→",-1))],8,Ve),t("div",qe,[o.autopilot?(l(),s("span",He,"🤖")):u("v-if",!0),t("span",{class:O(["pane-agent",o.agent||""])},g(o.agent||"unknown"),3),t("span",Ue,g(o.paneId),1)])]),t("button",{onClick:m=>e.toggleActionMenu(o.id),class:"action-menu-btn",title:"Actions"},[...i[11]||(i[11]=[t("span",null,"⋮",-1)])],8,Be)]),u(" Action Menu Dropdown "),e.showActionMenu===o.id&&e.paneActions[o.id]?(l(),s("div",Je,[(l(!0),s(b,null,M(e.paneActions[o.id],m=>(l(),s("button",{key:m.id,onClick:A=>e.executeAction(o,m),class:"action-menu-item",disabled:e.executingAction},[t("span",Qe,g(m.icon||"•"),1),t("span",Re,g(m.label),1)],8,Ke))),128))])):u("v-if",!0),t("div",We,[t("div",{class:O(["pane-prompt-preview",{expanded:e.expandedPrompts.has(o.id)}]),onClick:m=>e.togglePrompt(o.id)},[t("div",Ge,[i[12]||(i[12]=t("span",{class:"prompt-label"},"Initial Prompt",-1)),t("span",Xe,g(e.expandedPrompts.has(o.id)?"▼":"▶"),1)]),t("span",Ye,g(o.prompt||"No prompt"),1)],10,Ze),e.expandedPrompts.has(o.id)?(l(),s("div",$e,g(o.prompt||"No prompt"),1)):u("v-if",!0)]),u(" Show agent summary when idle "),o.agentStatus==="idle"&&o.agentSummary?(l(),s("div",et,g(o.agentSummary),1)):u("v-if",!0),u(" Show analyzer error if present "),o.analyzerError?(l(),s("div",tt," ⚠ "+g(o.analyzerError),1)):u("v-if",!0),t("div",{class:"pane-interactive",onClick:i[0]||(i[0]=N(()=>{},["prevent"]))},[u(" Options Dialog (when waiting with options) "),o.agentStatus==="waiting"&&o.options&&o.options.length>0?(l(),s("div",ot,[t("div",at,g(o.optionsQuestion||"Choose an option:"),1),o.potentialHarm&&o.potentialHarm.hasRisk?(l(),s("div",nt," ⚠️ "+g(o.potentialHarm.description),1)):u("v-if",!0),e.loadingOptions.has(o.id)?(l(),s("div",it,[...i[13]||(i[13]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing selection...",-1)])])):(l(),s("div",st,[(l(!0),s(b,null,M(o.options,m=>(l(),s("button",{key:m.action,onClick:A=>e.selectOption(o,m),class:O(["option-button",{"option-button-danger":o.potentialHarm&&o.potentialHarm.hasRisk}]),disabled:e.loadingOptions.has(o.id)},g(m.action),11,lt))),128))]))])):o.agentStatus==="analyzing"?(l(),s(b,{key:1},[u(" Analyzing (show loader) "),i[14]||(i[14]=t("div",{class:"analyzing-state"},[t("div",{class:"loader-spinner"}),t("span",null,"Analyzing...")],-1))],2112)):(l(),s(b,{key:2},[u(" Working/Idle (show prompt input) "),t("div",null,[t("div",ct,[X(t("textarea",{"onUpdate:modelValue":m=>e.promptInputs[o.id]=m,onInput:e.autoExpand,placeholder:o.agentStatus==="working"?"Queue a prompt...":"Send a prompt...",disabled:e.sendingPrompts.has(o.id),class:"prompt-textarea",rows:"1"},null,40,rt),[[Y,e.promptInputs[o.id]]]),t("button",{onClick:m=>e.sendPrompt(o),disabled:!e.promptInputs[o.id]||e.sendingPrompts.has(o.id),class:"send-button",title:o.agentStatus==="working"?"Queue prompt":"Send prompt"},[e.sendingPrompts.has(o.id)?(l(),s("span",ut)):(l(),s("svg",gt,[...i[15]||(i[15]=[t("path",{d:"M425.13,28.37L30.09,423.41C11.19,441.37.34,466.2,0,492.27c-.34,26.07,9.86,51.17,28.29,69.61,18.43,18.45,43.52,28.67,69.59,28.35,26.07-.31,50.91-11.14,68.88-30.02l233.16-233.52v776.64c0,34.56,18.43,66.48,48.36,83.76,29.93,17.28,66.8,17.28,96.72,0,29.93-17.28,48.36-49.21,48.36-83.76V328.85l231.72,231.36c24.63,23.41,59.74,32.18,92.48,23.09,32.74-9.08,58.32-34.68,67.38-67.43,9.05-32.75.25-67.85-23.18-92.46L566.73,28.37C548.63,10.16,524-.04,498.33.05c-.8-.06-1.6-.06-2.4,0-.8-.06-1.6-.06-2.4,0-25.65,0-50.25,10.19-68.4,28.32h0Z"},null,-1)])]))],8,dt)]),e.queuedMessages[o.id]?(l(),s("div",pt," ✓ "+g(e.queuedMessages[o.id]),1)):u("v-if",!0)])],2112))]),o.devStatus&&o.devStatus!=="stopped"?(l(),s("div",mt,[i[16]||(i[16]=t("span",{class:"status-label"},"Dev Server:",-1)),t("span",{class:O(["status-badge",o.devStatus])},g(o.devStatus),3),o.devUrl?(l(),s("a",{key:0,href:o.devUrl,target:"_blank",class:"dev-link"},"↗",8,vt)):u("v-if",!0)])):u("v-if",!0)]))),128))]))]),u(" Create Pane Dialog "),e.showCreateDialog?(l(),s("div",{key:0,class:"action-dialog-overlay",onClick:N(e.closeCreateDialog,["self"])},[t("div",ht,[i[20]||(i[20]=t("h3",null,"Create New Pane",-1)),e.createStep==="prompt"?(l(),s("div",ft,[i[17]||(i[17]=t("label",{for:"pane-prompt"},"Provide an initial prompt for your agent",-1)),X(t("textarea",{id:"pane-prompt","onUpdate:modelValue":i[1]||(i[1]=o=>e.newPanePrompt=o),placeholder:"E.g., Fix the authentication bug, Add dark mode, etc.",rows:"4",onKeydown:[$(N(e.createPane,["meta"]),["enter"]),$(N(e.createPane,["ctrl"]),["enter"])]},null,40,yt),[[Y,e.newPanePrompt]]),i[18]||(i[18]=t("div",{class:"dialog-hint"},[F(" 💡 Press "),t("kbd",null,"⌘ Enter"),F(" or "),t("kbd",null,"Ctrl Enter"),F(" to create ")],-1)),t("div",_t,[t("button",{onClick:e.closeCreateDialog,class:"dialog-btn"},"Cancel"),t("button",{onClick:e.createPane,disabled:!e.newPanePrompt.trim()||e.creatingPane,class:"dialog-btn dialog-btn-primary"},g(e.creatingPane?"Creating...":"Create Pane"),9,bt)])])):e.createStep==="agent"?(l(),s("div",kt,[i[19]||(i[19]=t("p",null,"Multiple agents available. Choose one:",-1)),t("div",wt,[(l(!0),s(b,null,M(e.availableAgents,o=>(l(),s("button",{key:o,onClick:m=>e.selectAgent(o),class:"agent-choice-button",disabled:e.creatingPane},g(o),9,Ct))),128))]),t("div",{class:"dialog-buttons"},[t("button",{onClick:e.closeCreateDialog,class:"dialog-btn"},"Cancel")])])):u("v-if",!0)])])):u("v-if",!0),u(" Action Dialogs "),e.actionDialog?(l(),s("div",{key:1,class:"action-dialog-overlay",onClick:N(e.closeActionDialog,["self"])},[u(" Confirm Dialog "),e.actionDialog.type==="confirm"?(l(),s("div",Dt,[t("h3",null,g(e.actionDialog.title),1),t("p",null,g(e.actionDialog.message),1),e.actionDialogLoading?(l(),s("div",St,[...i[21]||(i[21]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(l(),s("div",Pt,[t("button",{onClick:i[2]||(i[2]=o=>e.confirmAction(!1)),class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,xt),t("button",{onClick:i[3]||(i[3]=o=>e.confirmAction(!0)),class:"dialog-btn dialog-btn-primary",disabled:e.actionDialogLoading},"Confirm",8,At)]))])):e.actionDialog.type==="choice"?(l(),s(b,{key:1},[u(" Choice Dialog "),t("div",Tt,[t("h3",null,g(e.actionDialog.title),1),e.actionDialog.message?(l(),s("p",Et,g(e.actionDialog.message),1)):u("v-if",!0),e.actionDialogLoading?(l(),s("div",Mt,[...i[22]||(i[22]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(l(),s("div",Nt,[t("div",Ot,[(l(!0),s(b,null,M(e.actionDialog.options,o=>(l(),s("button",{key:o.id,onClick:m=>e.selectChoice(o.id),class:O(["choice-option-btn",{danger:o.danger}]),disabled:e.actionDialogLoading},[t("div",jt,g(o.label),1),o.description?(l(),s("div",It,g(o.description),1)):u("v-if",!0)],10,zt))),128))]),t("div",Lt,[t("button",{onClick:e.closeActionDialog,class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,Vt)])]))])],2112)):e.actionDialog.type==="input"?(l(),s(b,{key:2},[u(" Input Dialog "),t("div",Ft,[t("h3",null,g(e.actionDialog.title),1),e.actionDialog.message?(l(),s("div",{key:0,class:"dialog-message",innerHTML:e.colorizeDiffStat(e.actionDialog.message)},null,8,qt)):u("v-if",!0),e.actionDialogLoading?(l(),s("div",Ht,[...i[23]||(i[23]=[t("div",{class:"loader-spinner"},null,-1),t("span",null,"Processing...",-1)])])):(l(),s("div",Ut,[X(t("input",{type:"text","onUpdate:modelValue":i[4]||(i[4]=o=>e.actionDialog.inputValue=o),placeholder:e.actionDialog.placeholder,class:"dialog-input",onKeydown:$(e.submitInput,["enter"])},null,40,Bt),[[Y,e.actionDialog.inputValue]]),t("div",Jt,[t("button",{onClick:e.closeActionDialog,class:"dialog-btn",disabled:e.actionDialogLoading},"Cancel",8,Kt),t("button",{onClick:e.submitInput,class:"dialog-btn dialog-btn-primary",disabled:e.actionDialogLoading},"Submit",8,Qt)])]))])],2112)):u("v-if",!0)])):u("v-if",!0)])],64)}const Wt=we(Se,[["render",Rt],["__file","/Users/justinschroeder/Projects/dmux/frontend/src/components/Dashboard.vue"]]),Zt=De(Wt);Zt.mount("#app");
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Hook for using the standardized action system in the TUI
3
+ *
4
+ * This hook provides a bridge between the pure action functions
5
+ * and the React state management of the TUI.
6
+ */
7
+ import { PaneAction } from '../actions/index.js';
8
+ import type { ActionResult } from '../actions/types.js';
9
+ import { type TUIActionState } from '../adapters/tuiActionHandler.js';
10
+ import type { DmuxPane } from '../types.js';
11
+ interface UseActionSystemParams {
12
+ panes: DmuxPane[];
13
+ savePanes: (panes: DmuxPane[]) => Promise<void>;
14
+ sessionName: string;
15
+ projectName: string;
16
+ onPaneUpdate?: (pane: DmuxPane) => void;
17
+ onPaneRemove?: (paneId: string) => void;
18
+ }
19
+ export default function useActionSystem({ panes, savePanes, sessionName, projectName, onPaneUpdate, onPaneRemove, }: UseActionSystemParams): {
20
+ actionState: TUIActionState;
21
+ setActionState: import("react").Dispatch<import("react").SetStateAction<TUIActionState>>;
22
+ executeAction: (actionId: PaneAction, pane: DmuxPane, params?: any) => Promise<void>;
23
+ executeCallback: (callback: (() => Promise<ActionResult>) | null, options?: {
24
+ showProgress?: boolean;
25
+ progressMessage?: string;
26
+ }) => Promise<void>;
27
+ clearStatusMessage: (timeout?: number) => void;
28
+ isDialogOpen: boolean;
29
+ };
30
+ export {};
31
+ //# sourceMappingURL=useActionSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActionSystem.d.ts","sourceRoot":"","sources":["../../src/hooks/useActionSystem.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAiB,UAAU,EAAsB,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,UAAU,qBAAqB;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,KAAK,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,GACb,EAAE,qBAAqB;;;8BAgBV,UAAU,QACd,QAAQ,WACL,GAAG;gCAqBF,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,YACpC;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;;;EA4DjE"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Hook for using the standardized action system in the TUI
3
+ *
4
+ * This hook provides a bridge between the pure action functions
5
+ * and the React state management of the TUI.
6
+ */
7
+ import { useState, useCallback, useMemo } from 'react';
8
+ import { executeAction } from '../actions/index.js';
9
+ import { handleActionResult, createInitialTUIState } from '../adapters/tuiActionHandler.js';
10
+ export default function useActionSystem({ panes, savePanes, sessionName, projectName, onPaneUpdate, onPaneRemove, }) {
11
+ // TUI state for rendering dialogs
12
+ const [actionState, setActionState] = useState(createInitialTUIState());
13
+ // Create action context
14
+ const context = useMemo(() => ({
15
+ panes,
16
+ sessionName,
17
+ projectName,
18
+ savePanes,
19
+ onPaneUpdate,
20
+ onPaneRemove,
21
+ }), [panes, sessionName, projectName, savePanes, onPaneUpdate, onPaneRemove]);
22
+ // Execute an action and handle the result
23
+ const executeActionWithHandling = useCallback(async (actionId, pane, params) => {
24
+ try {
25
+ const result = await executeAction(actionId, pane, context, params);
26
+ // Convert result to TUI state updates
27
+ handleActionResult(result, actionState, (updates) => {
28
+ setActionState(prev => ({ ...prev, ...updates }));
29
+ });
30
+ }
31
+ catch (error) {
32
+ // Handle execution errors
33
+ setActionState(prev => ({
34
+ ...prev,
35
+ statusMessage: `Action failed: ${error}`,
36
+ statusType: 'error',
37
+ }));
38
+ }
39
+ }, [context, actionState]);
40
+ // Handle callback execution (for multi-step actions)
41
+ const executeCallback = useCallback(async (callback, options) => {
42
+ if (!callback)
43
+ return;
44
+ const showProgress = options?.showProgress !== false; // default true
45
+ const progressMessage = options?.progressMessage || 'Processing...';
46
+ try {
47
+ // Show progress indicator while executing
48
+ if (showProgress) {
49
+ setActionState(prev => ({
50
+ ...prev,
51
+ showProgressDialog: true,
52
+ progressMessage,
53
+ progressPercent: undefined,
54
+ }));
55
+ }
56
+ const result = await callback();
57
+ handleActionResult(result, actionState, (updates) => {
58
+ setActionState(prev => ({ ...prev, ...updates }));
59
+ });
60
+ }
61
+ catch (error) {
62
+ setActionState(prev => ({
63
+ ...prev,
64
+ showProgressDialog: false,
65
+ statusMessage: `Action failed: ${error}`,
66
+ statusType: 'error',
67
+ }));
68
+ }
69
+ }, [actionState]);
70
+ // Clear status message after timeout
71
+ const clearStatusMessage = useCallback((timeout = 3000) => {
72
+ setTimeout(() => {
73
+ setActionState(prev => ({
74
+ ...prev,
75
+ statusMessage: '',
76
+ }));
77
+ }, timeout);
78
+ }, []);
79
+ return {
80
+ // State for rendering
81
+ actionState,
82
+ setActionState,
83
+ // Execute actions
84
+ executeAction: executeActionWithHandling,
85
+ executeCallback,
86
+ // Utilities
87
+ clearStatusMessage,
88
+ // Check if any dialog is open
89
+ isDialogOpen: actionState.showConfirmDialog ||
90
+ actionState.showChoiceDialog ||
91
+ actionState.showInputDialog ||
92
+ actionState.showProgressDialog,
93
+ };
94
+ }
95
+ //# sourceMappingURL=useActionSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActionSystem.js","sourceRoot":"","sources":["../../src/hooks/useActionSystem.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,aAAa,EAAkC,MAAM,qBAAqB,CAAC;AAEpF,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,iCAAiC,CAAC;AAYzC,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,KAAK,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,GACU;IACtB,kCAAkC;IAClC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAiB,qBAAqB,EAAE,CAAC,CAAC;IAExF,wBAAwB;IACxB,MAAM,OAAO,GAAkB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,KAAK;QACL,WAAW;QACX,WAAW;QACX,SAAS;QACT,YAAY;QACZ,YAAY;KACb,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9E,0CAA0C;IAC1C,MAAM,yBAAyB,GAAG,WAAW,CAAC,KAAK,EACjD,QAAoB,EACpB,IAAc,EACd,MAAY,EACZ,EAAE;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAEpE,sCAAsC;YACtC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;gBAClD,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0BAA0B;YAC1B,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtB,GAAG,IAAI;gBACP,aAAa,EAAE,kBAAkB,KAAK,EAAE;gBACxC,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3B,qDAAqD;IACrD,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,EACvC,QAA8C,EAC9C,OAA8D,EAC9D,EAAE;QACF,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,KAAK,KAAK,CAAC,CAAC,eAAe;QACrE,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,eAAe,CAAC;QAEpE,IAAI,CAAC;YACH,0CAA0C;YAC1C,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtB,GAAG,IAAI;oBACP,kBAAkB,EAAE,IAAI;oBACxB,eAAe;oBACf,eAAe,EAAE,SAAS;iBAC3B,CAAC,CAAC,CAAC;YACN,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;YAChC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;gBAClD,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtB,GAAG,IAAI;gBACP,kBAAkB,EAAE,KAAK;gBACzB,aAAa,EAAE,kBAAkB,KAAK,EAAE;gBACxC,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,qCAAqC;IACrC,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;QACxD,UAAU,CAAC,GAAG,EAAE;YACd,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtB,GAAG,IAAI;gBACP,aAAa,EAAE,EAAE;aAClB,CAAC,CAAC,CAAC;QACN,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,sBAAsB;QACtB,WAAW;QACX,cAAc;QAEd,kBAAkB;QAClB,aAAa,EAAE,yBAAyB;QACxC,eAAe;QAEf,YAAY;QACZ,kBAAkB;QAElB,8BAA8B;QAC9B,YAAY,EAAE,WAAW,CAAC,iBAAiB;YAC7B,WAAW,CAAC,gBAAgB;YAC5B,WAAW,CAAC,eAAe;YAC3B,WAAW,CAAC,kBAAkB;KAC7C,CAAC;AACJ,CAAC"}
@@ -1,9 +1,10 @@
1
- import type { DmuxPane } from '../types.js';
1
+ import type { DmuxPane, AgentStatus } from '../types.js';
2
2
  interface UseAgentStatusParams {
3
3
  panes: DmuxPane[];
4
4
  suspend: boolean;
5
+ onPaneRemoved?: (paneId: string) => void;
5
6
  }
6
- export type AgentStatusMap = Map<string, 'working' | 'waiting' | 'idle' | undefined>;
7
- export default function useAgentStatus({ panes, suspend }: UseAgentStatusParams): AgentStatusMap;
7
+ export type AgentStatusMap = Map<string, AgentStatus | undefined>;
8
+ export default function useAgentStatus({ panes, suspend, onPaneRemoved }: UseAgentStatusParams): AgentStatusMap;
8
9
  export {};
9
10
  //# sourceMappingURL=useAgentStatus.d.ts.map