dmux 1.6.0 → 2.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 (139) hide show
  1. package/README.md +12 -8
  2. package/dist/AutoUpdater.d.ts +2 -2
  3. package/dist/AutoUpdater.d.ts.map +1 -1
  4. package/dist/AutoUpdater.js +18 -7
  5. package/dist/AutoUpdater.js.map +1 -1
  6. package/dist/CleanTextInput.d.ts.map +1 -1
  7. package/dist/CleanTextInput.js +12 -4
  8. package/dist/CleanTextInput.js.map +1 -1
  9. package/dist/DmuxApp.d.ts +1 -10
  10. package/dist/DmuxApp.d.ts.map +1 -1
  11. package/dist/DmuxApp.js +146 -1483
  12. package/dist/DmuxApp.js.map +1 -1
  13. package/dist/components/AgentChoiceDialog.d.ts +7 -0
  14. package/dist/components/AgentChoiceDialog.d.ts.map +1 -0
  15. package/dist/components/AgentChoiceDialog.js +12 -0
  16. package/dist/components/AgentChoiceDialog.js.map +1 -0
  17. package/dist/components/CloseOptionsDialog.d.ts +9 -0
  18. package/dist/components/CloseOptionsDialog.d.ts.map +1 -0
  19. package/dist/components/CloseOptionsDialog.js +30 -0
  20. package/dist/components/CloseOptionsDialog.js.map +1 -0
  21. package/dist/components/CommandPromptDialog.d.ts +9 -0
  22. package/dist/components/CommandPromptDialog.d.ts.map +1 -0
  23. package/dist/components/CommandPromptDialog.js +20 -0
  24. package/dist/components/CommandPromptDialog.js.map +1 -0
  25. package/dist/components/CreatingIndicator.d.ts +7 -0
  26. package/dist/components/CreatingIndicator.d.ts.map +1 -0
  27. package/dist/components/CreatingIndicator.js +10 -0
  28. package/dist/components/CreatingIndicator.js.map +1 -0
  29. package/dist/components/FileCopyPrompt.d.ts +4 -0
  30. package/dist/components/FileCopyPrompt.d.ts.map +1 -0
  31. package/dist/components/FileCopyPrompt.js +13 -0
  32. package/dist/components/FileCopyPrompt.js.map +1 -0
  33. package/dist/components/FooterHelp.d.ts +8 -0
  34. package/dist/components/FooterHelp.d.ts.map +1 -0
  35. package/dist/components/FooterHelp.js +12 -0
  36. package/dist/components/FooterHelp.js.map +1 -0
  37. package/dist/components/LoadingIndicator.d.ts +4 -0
  38. package/dist/components/LoadingIndicator.d.ts.map +1 -0
  39. package/dist/components/LoadingIndicator.js +10 -0
  40. package/dist/components/LoadingIndicator.js.map +1 -0
  41. package/dist/components/MergeConfirmationDialog.d.ts +8 -0
  42. package/dist/components/MergeConfirmationDialog.d.ts.map +1 -0
  43. package/dist/components/MergeConfirmationDialog.js +13 -0
  44. package/dist/components/MergeConfirmationDialog.js.map +1 -0
  45. package/dist/components/NewPaneDialog.d.ts +9 -0
  46. package/dist/components/NewPaneDialog.d.ts.map +1 -0
  47. package/dist/components/NewPaneDialog.js +13 -0
  48. package/dist/components/NewPaneDialog.js.map +1 -0
  49. package/dist/components/PaneCard.d.ts +9 -0
  50. package/dist/components/PaneCard.d.ts.map +1 -0
  51. package/dist/components/PaneCard.js +37 -0
  52. package/dist/components/PaneCard.js.map +1 -0
  53. package/dist/components/PanesGrid.d.ts +11 -0
  54. package/dist/components/PanesGrid.d.ts.map +1 -0
  55. package/dist/components/PanesGrid.js +11 -0
  56. package/dist/components/PanesGrid.js.map +1 -0
  57. package/dist/components/RunningIndicator.d.ts +4 -0
  58. package/dist/components/RunningIndicator.d.ts.map +1 -0
  59. package/dist/components/RunningIndicator.js +9 -0
  60. package/dist/components/RunningIndicator.js.map +1 -0
  61. package/dist/components/UpdateDialog.d.ts +7 -0
  62. package/dist/components/UpdateDialog.d.ts.map +1 -0
  63. package/dist/components/UpdateDialog.js +27 -0
  64. package/dist/components/UpdateDialog.js.map +1 -0
  65. package/dist/components/UpdatingIndicator.d.ts +4 -0
  66. package/dist/components/UpdatingIndicator.d.ts.map +1 -0
  67. package/dist/components/UpdatingIndicator.js +9 -0
  68. package/dist/components/UpdatingIndicator.js.map +1 -0
  69. package/dist/hooks/useAgentDetection.d.ts +4 -0
  70. package/dist/hooks/useAgentDetection.d.ts.map +1 -0
  71. package/dist/hooks/useAgentDetection.js +71 -0
  72. package/dist/hooks/useAgentDetection.js.map +1 -0
  73. package/dist/hooks/useAgentStatus.d.ts +11 -0
  74. package/dist/hooks/useAgentStatus.d.ts.map +1 -0
  75. package/dist/hooks/useAgentStatus.js +172 -0
  76. package/dist/hooks/useAgentStatus.js.map +1 -0
  77. package/dist/hooks/useAutoUpdater.d.ts +20 -0
  78. package/dist/hooks/useAutoUpdater.d.ts.map +1 -0
  79. package/dist/hooks/useAutoUpdater.js +100 -0
  80. package/dist/hooks/useAutoUpdater.js.map +1 -0
  81. package/dist/hooks/useCommandRunner.d.ts +18 -0
  82. package/dist/hooks/useCommandRunner.d.ts.map +1 -0
  83. package/dist/hooks/useCommandRunner.js +44 -0
  84. package/dist/hooks/useCommandRunner.js.map +1 -0
  85. package/dist/hooks/useNavigation.d.ts +8 -0
  86. package/dist/hooks/useNavigation.d.ts.map +1 -0
  87. package/dist/hooks/useNavigation.js +62 -0
  88. package/dist/hooks/useNavigation.js.map +1 -0
  89. package/dist/hooks/usePaneCreation.d.ts +16 -0
  90. package/dist/hooks/usePaneCreation.d.ts.map +1 -0
  91. package/dist/hooks/usePaneCreation.js +133 -0
  92. package/dist/hooks/usePaneCreation.js.map +1 -0
  93. package/dist/hooks/usePaneRunner.d.ts +17 -0
  94. package/dist/hooks/usePaneRunner.d.ts.map +1 -0
  95. package/dist/hooks/usePaneRunner.js +149 -0
  96. package/dist/hooks/usePaneRunner.js.map +1 -0
  97. package/dist/hooks/usePanes.d.ts +9 -0
  98. package/dist/hooks/usePanes.d.ts.map +1 -0
  99. package/dist/hooks/usePanes.js +222 -0
  100. package/dist/hooks/usePanes.js.map +1 -0
  101. package/dist/hooks/useProjectSettings.d.ts +6 -0
  102. package/dist/hooks/useProjectSettings.d.ts.map +1 -0
  103. package/dist/hooks/useProjectSettings.js +46 -0
  104. package/dist/hooks/useProjectSettings.js.map +1 -0
  105. package/dist/hooks/useTerminalWidth.d.ts +2 -0
  106. package/dist/hooks/useTerminalWidth.d.ts.map +1 -0
  107. package/dist/hooks/useTerminalWidth.js +13 -0
  108. package/dist/hooks/useTerminalWidth.js.map +1 -0
  109. package/dist/hooks/useWorktreeActions.d.ts +17 -0
  110. package/dist/hooks/useWorktreeActions.d.ts.map +1 -0
  111. package/dist/hooks/useWorktreeActions.js +190 -0
  112. package/dist/hooks/useWorktreeActions.js.map +1 -0
  113. package/dist/index.js +86 -11
  114. package/dist/index.js.map +1 -1
  115. package/dist/types.d.ts +38 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +2 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/utils/commands.d.ts +6 -0
  120. package/dist/utils/commands.d.ts.map +1 -0
  121. package/dist/utils/commands.js +35 -0
  122. package/dist/utils/commands.js.map +1 -0
  123. package/dist/utils/input.d.ts +13 -0
  124. package/dist/utils/input.d.ts.map +1 -0
  125. package/dist/utils/input.js +100 -0
  126. package/dist/utils/input.js.map +1 -0
  127. package/dist/utils/slug.d.ts +3 -0
  128. package/dist/utils/slug.d.ts.map +1 -0
  129. package/dist/utils/slug.js +58 -0
  130. package/dist/utils/slug.js.map +1 -0
  131. package/dist/utils/tmux.d.ts +4 -0
  132. package/dist/utils/tmux.d.ts.map +1 -0
  133. package/dist/utils/tmux.js +62 -0
  134. package/dist/utils/tmux.js.map +1 -0
  135. package/dist/workers/updateChecker.d.ts +2 -0
  136. package/dist/workers/updateChecker.d.ts.map +1 -0
  137. package/dist/workers/updateChecker.js +33 -0
  138. package/dist/workers/updateChecker.js.map +1 -0
  139. package/package.json +6 -2
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ const PaneCard = ({ pane, selected }) => {
4
+ let borderColor = 'gray';
5
+ if (selected)
6
+ borderColor = 'cyan';
7
+ else if (pane.devStatus === 'running')
8
+ borderColor = 'green';
9
+ else if (pane.testStatus === 'running')
10
+ borderColor = 'yellow';
11
+ else if (pane.testStatus === 'failed')
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
+ ")"))),
22
+ React.createElement(Text, { color: "gray", dimColor: true, wrap: "truncate" }, pane.prompt.substring(0, 30)),
23
+ pane.agentStatus && (React.createElement(Box, null,
24
+ 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))))))))));
35
+ };
36
+ export default PaneCard;
37
+ //# sourceMappingURL=PaneCard.js.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { DmuxPane } from '../types.js';
3
+ interface PanesGridProps {
4
+ panes: DmuxPane[];
5
+ selectedIndex: number;
6
+ isLoading: boolean;
7
+ showNewPaneDialog: boolean;
8
+ }
9
+ declare const PanesGrid: React.FC<PanesGridProps>;
10
+ export default PanesGrid;
11
+ //# sourceMappingURL=PanesGrid.d.ts.map
@@ -0,0 +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;AAG5C,UAAU,cAAc;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAsBvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ import PaneCard from './PaneCard.js';
4
+ const PanesGrid = ({ panes, selectedIndex, isLoading, showNewPaneDialog }) => {
5
+ return (React.createElement(Box, { flexDirection: "row", flexWrap: "wrap", gap: 1 },
6
+ panes.map((pane, index) => (React.createElement(PaneCard, { key: pane.id, pane: pane, selected: selectedIndex === index }))),
7
+ !isLoading && !showNewPaneDialog && (React.createElement(Box, { paddingX: 1, borderStyle: "single", borderColor: selectedIndex === panes.length ? 'green' : 'gray', width: 35, flexShrink: 0 },
8
+ React.createElement(Text, { color: selectedIndex === panes.length ? 'green' : 'white' }, "+ New dmux pane")))));
9
+ };
10
+ export default PanesGrid;
11
+ //# sourceMappingURL=PanesGrid.js.map
@@ -0,0 +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;AAEhC,OAAO,QAAQ,MAAM,eAAe,CAAC;AASrC,MAAM,SAAS,GAA6B,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;IACrG,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,CAAC,CAC1B,oBAAC,QAAQ,IAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,KAAK,KAAK,GAAI,CAC1E,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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ declare const RunningIndicator: React.FC;
3
+ export default RunningIndicator;
4
+ //# sourceMappingURL=RunningIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunningIndicator.d.ts","sourceRoot":"","sources":["../../src/components/RunningIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAQ7B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ const RunningIndicator = () => {
4
+ return (React.createElement(Box, { borderStyle: "single", borderColor: "blue", paddingX: 1, marginTop: 1 },
5
+ React.createElement(Text, { color: "blue" },
6
+ React.createElement(Text, { bold: true }, "\u25B6 Running command..."))));
7
+ };
8
+ export default RunningIndicator;
9
+ //# sourceMappingURL=RunningIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunningIndicator.js","sourceRoot":"","sources":["../../src/components/RunningIndicator.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,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QACpE,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;YAChB,oBAAC,IAAI,IAAC,IAAI,sCAA4B,CACjC,CACH,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface UpdateDialogProps {
3
+ updateInfo: any;
4
+ }
5
+ declare const UpdateDialog: React.FC<UpdateDialogProps>;
6
+ export default UpdateDialog;
7
+ //# sourceMappingURL=UpdateDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateDialog.d.ts","sourceRoot":"","sources":["../../src/components/UpdateDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,iBAAiB;IACzB,UAAU,EAAE,GAAG,CAAC;CACjB;AAED,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgC7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ const UpdateDialog = ({ updateInfo }) => {
4
+ if (!updateInfo)
5
+ return null;
6
+ return (React.createElement(Box, { borderStyle: "double", borderColor: "green", paddingX: 1, marginTop: 1 },
7
+ React.createElement(Box, { flexDirection: "column" },
8
+ React.createElement(Text, { color: "green", bold: true }, "\uD83C\uDF89 dmux Update Available!"),
9
+ React.createElement(Text, null,
10
+ "Current version: ",
11
+ React.createElement(Text, { color: "cyan" }, updateInfo.currentVersion)),
12
+ React.createElement(Text, null,
13
+ "Latest version: ",
14
+ React.createElement(Text, { color: "green" }, updateInfo.latestVersion)),
15
+ updateInfo.installMethod === 'global' && updateInfo.packageManager && (React.createElement(Text, null,
16
+ "Detected global install via: ",
17
+ React.createElement(Text, { color: "yellow" }, updateInfo.packageManager))),
18
+ React.createElement(Box, { marginTop: 1 }, updateInfo.installMethod === 'global' && updateInfo.packageManager ? (React.createElement(Text, null, "[U]pdate now \u2022 [S]kip this version \u2022 [L]ater")) : (React.createElement(Text, null,
19
+ "Manual update required: ",
20
+ React.createElement(Text, { color: "cyan" },
21
+ updateInfo.packageManager || 'npm',
22
+ " update -g dmux"),
23
+ '\n',
24
+ "[S]kip this version \u2022 [L]ater"))))));
25
+ };
26
+ export default UpdateDialog;
27
+ //# sourceMappingURL=UpdateDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateDialog.js","sourceRoot":"","sources":["../../src/components/UpdateDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,YAAY,GAAgC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;IACnE,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QACrE,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,gDAAiC;YACzD,oBAAC,IAAI;;gBACc,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,IAAE,UAAU,CAAC,cAAc,CAAQ,CACjE;YACP,oBAAC,IAAI;;gBACa,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,UAAU,CAAC,aAAa,CAAQ,CAChE;YACN,UAAU,CAAC,aAAa,KAAK,QAAQ,IAAI,UAAU,CAAC,cAAc,IAAI,CACrE,oBAAC,IAAI;;gBAC0B,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,IAAE,UAAU,CAAC,cAAc,CAAQ,CAC/E,CACR;YACD,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,IACd,UAAU,CAAC,aAAa,KAAK,QAAQ,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CACpE,oBAAC,IAAI,iEAEE,CACR,CAAC,CAAC,CAAC,CACF,oBAAC,IAAI;;gBACqB,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;oBAAE,UAAU,CAAC,cAAc,IAAI,KAAK;sCAAuB;gBACpG,IAAI;qDACA,CACR,CACG,CACF,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ declare const UpdatingIndicator: React.FC;
3
+ export default UpdatingIndicator;
4
+ //# sourceMappingURL=UpdatingIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdatingIndicator.d.ts","sourceRoot":"","sources":["../../src/components/UpdatingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAQ9B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ const UpdatingIndicator = () => {
4
+ return (React.createElement(Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginTop: 1 },
5
+ React.createElement(Text, { color: "yellow" },
6
+ React.createElement(Text, { bold: true }, "\u2B07 Updating dmux..."))));
7
+ };
8
+ export default UpdatingIndicator;
9
+ //# sourceMappingURL=UpdatingIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdatingIndicator.js","sourceRoot":"","sources":["../../src/components/UpdatingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,iBAAiB,GAAa,GAAG,EAAE;IACvC,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QACtE,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;YAClB,oBAAC,IAAI,IAAC,IAAI,oCAA0B,CAC/B,CACH,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export default function useAgentDetection(): {
2
+ availableAgents: ("claude" | "opencode")[];
3
+ };
4
+ //# sourceMappingURL=useAgentDetection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgentDetection.d.ts","sourceRoot":"","sources":["../../src/hooks/useAgentDetection.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,iBAAiB;;EAiBxC"}
@@ -0,0 +1,71 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { execSync } from 'child_process';
3
+ import fs from 'fs/promises';
4
+ export default function useAgentDetection() {
5
+ const [availableAgents, setAvailableAgents] = useState([]);
6
+ useEffect(() => {
7
+ (async () => {
8
+ try {
9
+ const agents = [];
10
+ const hasClaude = await findClaudeCommand();
11
+ if (hasClaude)
12
+ agents.push('claude');
13
+ const hasopencode = await findopencodeCommand();
14
+ if (hasopencode)
15
+ agents.push('opencode');
16
+ setAvailableAgents(agents);
17
+ }
18
+ catch { }
19
+ })();
20
+ }, []);
21
+ return { availableAgents };
22
+ }
23
+ const findClaudeCommand = async () => {
24
+ try {
25
+ const userShell = process.env.SHELL || '/bin/bash';
26
+ const result = execSync(`${userShell} -i -c "command -v claude 2>/dev/null || which claude 2>/dev/null"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
27
+ if (result)
28
+ return result.split('\n')[0];
29
+ }
30
+ catch { }
31
+ const commonPaths = [
32
+ `${process.env.HOME}/.claude/local/claude`,
33
+ `${process.env.HOME}/.local/bin/claude`,
34
+ '/usr/local/bin/claude',
35
+ '/opt/homebrew/bin/claude',
36
+ '/usr/bin/claude',
37
+ `${process.env.HOME}/bin/claude`,
38
+ ];
39
+ for (const p of commonPaths) {
40
+ try {
41
+ await fs.access(p);
42
+ return p;
43
+ }
44
+ catch { }
45
+ }
46
+ return null;
47
+ };
48
+ const findopencodeCommand = async () => {
49
+ try {
50
+ const userShell = process.env.SHELL || '/bin/bash';
51
+ const result = execSync(`${userShell} -i -c "command -v opencode 2>/dev/null || which opencode 2>/dev/null"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
52
+ if (result)
53
+ return result.split('\n')[0];
54
+ }
55
+ catch { }
56
+ const commonPaths = [
57
+ '/opt/homebrew/bin/opencode',
58
+ '/usr/local/bin/opencode',
59
+ `${process.env.HOME}/.local/bin/opencode`,
60
+ `${process.env.HOME}/bin/opencode`,
61
+ ];
62
+ for (const p of commonPaths) {
63
+ try {
64
+ await fs.access(p);
65
+ return p;
66
+ }
67
+ catch { }
68
+ }
69
+ return null;
70
+ };
71
+ //# sourceMappingURL=useAgentDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgentDetection.js","sourceRoot":"","sources":["../../src/hooks/useAgentDetection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DmuxPane } from '../types.js';
2
+ interface UseAgentStatusParams {
3
+ panes: DmuxPane[];
4
+ setPanes: (p: DmuxPane[]) => void;
5
+ panesFile: string;
6
+ suspend: boolean;
7
+ loadPanes: () => Promise<void>;
8
+ }
9
+ export default function useAgentStatus({ panes, setPanes, panesFile, suspend, loadPanes }: UseAgentStatusParams): void;
10
+ export {};
11
+ //# sourceMappingURL=useAgentStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgentStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useAgentStatus.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,UAAU,oBAAoB;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,QAiL9G"}
@@ -0,0 +1,172 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { execSync } from 'child_process';
3
+ import fs from 'fs/promises';
4
+ export default function useAgentStatus({ panes, setPanes, panesFile, suspend, loadPanes }) {
5
+ // Track last check times separately from pane state to avoid re-renders
6
+ const lastCheckTimes = useRef(new Map());
7
+ useEffect(() => {
8
+ if (panes.length === 0)
9
+ return;
10
+ const startupDelay = setTimeout(() => {
11
+ const monitorAgentStatus = async () => {
12
+ if (suspend)
13
+ return;
14
+ const updatedPanesWithNulls = await Promise.all(panes.map(async (pane) => {
15
+ try {
16
+ // Check against our ref instead of pane state
17
+ const lastCheck = lastCheckTimes.current.get(pane.id) || 0;
18
+ if (Date.now() - lastCheck < 500) {
19
+ return pane;
20
+ }
21
+ // Update check time in ref
22
+ lastCheckTimes.current.set(pane.id, Date.now());
23
+ let effectivePaneId = pane.paneId;
24
+ let paneExists = false;
25
+ try {
26
+ const paneIds = execSync(`tmux list-panes -s -F '#{pane_id}'`, {
27
+ encoding: 'utf-8',
28
+ stdio: 'pipe',
29
+ timeout: 500,
30
+ }).trim().split('\n').filter(id => id && id.startsWith('%'));
31
+ paneExists = paneIds.includes(effectivePaneId);
32
+ if (!paneExists) {
33
+ try {
34
+ const out = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
35
+ encoding: 'utf-8',
36
+ stdio: 'pipe',
37
+ timeout: 500,
38
+ }).trim();
39
+ if (out) {
40
+ const titleToId = new Map();
41
+ out.split('\n').forEach(line => {
42
+ const [id, title] = line.split('::');
43
+ if (id && title)
44
+ titleToId.set(title.trim(), id);
45
+ });
46
+ const remappedId = titleToId.get(pane.slug);
47
+ if (remappedId) {
48
+ effectivePaneId = remappedId;
49
+ paneExists = true;
50
+ }
51
+ }
52
+ }
53
+ catch { }
54
+ }
55
+ }
56
+ catch {
57
+ paneExists = true;
58
+ }
59
+ if (!paneExists)
60
+ return null;
61
+ const captureOutput = execSync(`tmux capture-pane -t '${effectivePaneId}' -p -S -30`, { encoding: 'utf-8', stdio: 'pipe' });
62
+ const lines = captureOutput.split('\n');
63
+ const lastLines = lines.slice(-10).join('\n');
64
+ let isWorking = false;
65
+ if (pane.agent === 'opencode') {
66
+ const workingPatterns = [
67
+ /esc\s+(to\s+)?interrupt/i,
68
+ /working(\.|\.{2}|\.{3})/i,
69
+ ];
70
+ isWorking = workingPatterns.some(pattern => pattern.test(lastLines));
71
+ }
72
+ else {
73
+ const workingPatterns = [/esc to interrupt/i];
74
+ isWorking = workingPatterns.some(pattern => pattern.test(captureOutput));
75
+ }
76
+ const attentionPatterns = [
77
+ /\?\s*$/m,
78
+ /y\/n/i,
79
+ /yes.*no/i,
80
+ /\ballow\b.*\?/i,
81
+ /\bapprove\b.*\?/i,
82
+ /\bgrant\b.*\?/i,
83
+ /\btrust\b.*\?/i,
84
+ /\baccept\b.*\?/i,
85
+ /\bcontinue\b.*\?/i,
86
+ /\bproceed\b.*\?/i,
87
+ /permission/i,
88
+ /confirmation/i,
89
+ /press.*enter/i,
90
+ /waiting for/i,
91
+ /are you sure/i,
92
+ /would you like/i,
93
+ /do you want/i,
94
+ /please confirm/i,
95
+ /requires.*approval/i,
96
+ /needs.*input/i,
97
+ /⏵⏵\s*accept edits/i,
98
+ /shift\+tab to cycle/i,
99
+ ];
100
+ const hasClaudeInputBox = /╭─+╮/.test(lastLines) && /╰─+╯/.test(lastLines) && /│\s+>\s+.*│/.test(lastLines);
101
+ const needsAttention = attentionPatterns.some(pattern => pattern.test(captureOutput)) || (pane.agent !== 'opencode' && hasClaudeInputBox);
102
+ let newStatus = 'idle';
103
+ if (isWorking)
104
+ newStatus = 'working';
105
+ else if (needsAttention && !isWorking)
106
+ newStatus = 'waiting';
107
+ if (pane.agent !== 'opencode') {
108
+ if (/accept edits/i.test(captureOutput) && !/esc to interrupt/i.test(captureOutput)) {
109
+ newStatus = 'waiting';
110
+ }
111
+ if (hasClaudeInputBox && !isWorking)
112
+ newStatus = 'waiting';
113
+ const claudeQuestionPatterns = [
114
+ /I (can|could|should|would|will|may|might)/i,
115
+ /Let me know/i,
116
+ /Please (tell|let|inform|advise)/i,
117
+ /Would you prefer/i,
118
+ /Should I (proceed|continue|go ahead)/i,
119
+ ];
120
+ if (claudeQuestionPatterns.some(pattern => pattern.test(lastLines)) && !isWorking) {
121
+ newStatus = 'waiting';
122
+ }
123
+ }
124
+ // Only return updated pane if status actually changed
125
+ if (pane.agentStatus !== newStatus || pane.paneId !== effectivePaneId) {
126
+ return { ...pane, paneId: effectivePaneId, agentStatus: newStatus };
127
+ }
128
+ // No changes, return original pane
129
+ return pane;
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }));
135
+ const updatedPanes = updatedPanesWithNulls.filter((pane) => pane !== null);
136
+ const panesRemoved = updatedPanes.length < panes.length;
137
+ const idsChanged = updatedPanes.some((pane, index) => pane.paneId !== panes[index]?.paneId);
138
+ if (panesRemoved || idsChanged) {
139
+ // Save in config format
140
+ let config = { panes: [] };
141
+ try {
142
+ const content = await fs.readFile(panesFile, 'utf-8');
143
+ const parsed = JSON.parse(content);
144
+ if (!Array.isArray(parsed)) {
145
+ config = parsed;
146
+ }
147
+ }
148
+ catch { }
149
+ config.panes = updatedPanes;
150
+ config.lastUpdated = new Date().toISOString();
151
+ await fs.writeFile(panesFile, JSON.stringify(config, null, 2));
152
+ await loadPanes();
153
+ }
154
+ else {
155
+ const hasStatusChanges = updatedPanes.some((pane, index) => {
156
+ const oldPane = panes[index];
157
+ return oldPane && (pane.agentStatus !== oldPane.agentStatus || pane.paneId !== oldPane.paneId);
158
+ });
159
+ if (hasStatusChanges)
160
+ setPanes(updatedPanes);
161
+ }
162
+ };
163
+ monitorAgentStatus();
164
+ const agentInterval = setInterval(monitorAgentStatus, 2000);
165
+ return () => clearInterval(agentInterval);
166
+ }, 500);
167
+ return () => {
168
+ clearTimeout(startupDelay);
169
+ };
170
+ }, [JSON.stringify(panes.map(p => ({ id: p.id, paneId: p.paneId, agent: p.agent }))), suspend, panesFile]);
171
+ }
172
+ //# sourceMappingURL=useAgentStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgentStatus.js","sourceRoot":"","sources":["../../src/hooks/useAgentStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface UpdateInfo {
2
+ currentVersion: string;
3
+ latestVersion: string;
4
+ hasUpdate: boolean;
5
+ packageManager: 'npm' | 'pnpm' | 'yarn' | null;
6
+ installMethod: 'global' | 'local' | 'unknown';
7
+ }
8
+ export default function useAutoUpdater(autoUpdater: any | undefined, setStatusMessage: (msg: string) => void): {
9
+ updateInfo: UpdateInfo | null;
10
+ showUpdateDialog: boolean;
11
+ isUpdating: boolean;
12
+ performUpdate: () => Promise<void>;
13
+ skipUpdate: () => Promise<void>;
14
+ dismissUpdate: () => void;
15
+ setShowUpdateDialog: import("react").Dispatch<import("react").SetStateAction<boolean>>;
16
+ setUpdateInfo: import("react").Dispatch<import("react").SetStateAction<UpdateInfo | null>>;
17
+ updateAvailable: boolean;
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=useAutoUpdater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoUpdater.d.ts","sourceRoot":"","sources":["../../src/hooks/useAutoUpdater.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,WAAW,EAAE,GAAG,GAAG,SAAS,EAAE,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;;;;;;;;;;EAsG3G"}
@@ -0,0 +1,100 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { Worker } from 'worker_threads';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ export default function useAutoUpdater(autoUpdater, setStatusMessage) {
7
+ const [updateInfo, setUpdateInfo] = useState(null);
8
+ const [showUpdateDialog, setShowUpdateDialog] = useState(false);
9
+ const [isUpdating, setIsUpdating] = useState(false);
10
+ const [updateAvailable, setUpdateAvailable] = useState(false);
11
+ useEffect(() => {
12
+ // Only run the worker check, not the old blocking check
13
+ let worker = null;
14
+ let updateInterval = null;
15
+ const runWorkerCheck = () => {
16
+ try {
17
+ // Create a new worker thread for update checking
18
+ const workerPath = path.join(__dirname, '../workers/updateChecker.js');
19
+ // Check if worker file exists first
20
+ if (!require('fs').existsSync(workerPath)) {
21
+ return;
22
+ }
23
+ worker = new Worker(workerPath);
24
+ worker.on('message', (message) => {
25
+ if (message.type === 'update-available') {
26
+ setUpdateInfo(message.updateInfo);
27
+ setUpdateAvailable(true);
28
+ }
29
+ // Clean up the worker after it's done
30
+ worker?.terminate();
31
+ worker = null;
32
+ });
33
+ worker.on('error', () => {
34
+ // Silently ignore errors
35
+ worker?.terminate();
36
+ worker = null;
37
+ });
38
+ }
39
+ catch {
40
+ // Silently ignore any errors creating the worker
41
+ }
42
+ };
43
+ // Initial check after a short delay
44
+ const initialCheckTimer = setTimeout(() => {
45
+ runWorkerCheck();
46
+ }, 3000);
47
+ // Periodic checks every 6 hours
48
+ updateInterval = setInterval(() => {
49
+ runWorkerCheck();
50
+ }, 6 * 60 * 60 * 1000);
51
+ return () => {
52
+ clearTimeout(initialCheckTimer);
53
+ if (updateInterval)
54
+ clearInterval(updateInterval);
55
+ if (worker) {
56
+ worker.terminate();
57
+ }
58
+ };
59
+ }, []);
60
+ const performUpdate = async () => {
61
+ if (!autoUpdater || !updateInfo)
62
+ return;
63
+ try {
64
+ setIsUpdating(true);
65
+ setStatusMessage('Updating dmux...');
66
+ const success = await autoUpdater.performUpdate(updateInfo);
67
+ if (success) {
68
+ setStatusMessage('Update completed successfully! Please restart dmux.');
69
+ setTimeout(() => {
70
+ process.exit(0);
71
+ }, 3000);
72
+ }
73
+ else {
74
+ setStatusMessage('Update failed. Please update manually.');
75
+ setTimeout(() => setStatusMessage(''), 3000);
76
+ }
77
+ }
78
+ catch (error) {
79
+ setStatusMessage('Update failed. Please update manually.');
80
+ setTimeout(() => setStatusMessage(''), 3000);
81
+ }
82
+ finally {
83
+ setIsUpdating(false);
84
+ setShowUpdateDialog(false);
85
+ }
86
+ };
87
+ const skipUpdate = async () => {
88
+ if (!autoUpdater || !updateInfo)
89
+ return;
90
+ await autoUpdater.skipVersion(updateInfo.latestVersion);
91
+ setShowUpdateDialog(false);
92
+ setUpdateInfo(null);
93
+ };
94
+ const dismissUpdate = () => {
95
+ setShowUpdateDialog(false);
96
+ setUpdateInfo(null);
97
+ };
98
+ return { updateInfo, showUpdateDialog, isUpdating, performUpdate, skipUpdate, dismissUpdate, setShowUpdateDialog, setUpdateInfo, updateAvailable };
99
+ }
100
+ //# sourceMappingURL=useAutoUpdater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoUpdater.js","sourceRoot":"","sources":["../../src/hooks/useAutoUpdater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DmuxPane, ProjectSettings } from '../types.js';
2
+ interface Params {
3
+ panes: DmuxPane[];
4
+ savePanes: (p: DmuxPane[]) => Promise<void>;
5
+ projectSettings: ProjectSettings;
6
+ saveSettings: (s: ProjectSettings) => Promise<void>;
7
+ setShowCommandPrompt: (v: 'test' | 'dev' | null) => void;
8
+ setShowFileCopyPrompt: (v: boolean) => void;
9
+ setCurrentCommandType: (v: 'test' | 'dev' | null) => void;
10
+ setStatusMessage: (msg: string) => void;
11
+ setRunningCommand: (v: boolean) => void;
12
+ }
13
+ export default function useCommandRunner({ panes, savePanes, projectSettings, saveSettings, setShowCommandPrompt, setShowFileCopyPrompt, setCurrentCommandType, setStatusMessage, setRunningCommand, }: Params): {
14
+ readonly runCommand: (type: "test" | "dev", pane: DmuxPane) => Promise<void>;
15
+ readonly handleFirstRunResponse: (accepted: boolean, type: "test" | "dev", pane: DmuxPane) => Promise<void>;
16
+ };
17
+ export {};
18
+ //# sourceMappingURL=useCommandRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCommandRunner.d.ts","sourceRoot":"","sources":["../../src/hooks/useCommandRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,UAAU,MAAM;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,oBAAoB,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,qBAAqB,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,KAAK,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE,MAAM;gCASyB,MAAM,GAAG,KAAK,QAAQ,QAAQ;gDAyBd,OAAO,QAAQ,MAAM,GAAG,KAAK,QAAQ,QAAQ;EAc9F"}