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.
- package/README.md +12 -8
- package/dist/AutoUpdater.d.ts +2 -2
- package/dist/AutoUpdater.d.ts.map +1 -1
- package/dist/AutoUpdater.js +18 -7
- package/dist/AutoUpdater.js.map +1 -1
- package/dist/CleanTextInput.d.ts.map +1 -1
- package/dist/CleanTextInput.js +12 -4
- package/dist/CleanTextInput.js.map +1 -1
- package/dist/DmuxApp.d.ts +1 -10
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +146 -1483
- package/dist/DmuxApp.js.map +1 -1
- package/dist/components/AgentChoiceDialog.d.ts +7 -0
- package/dist/components/AgentChoiceDialog.d.ts.map +1 -0
- package/dist/components/AgentChoiceDialog.js +12 -0
- package/dist/components/AgentChoiceDialog.js.map +1 -0
- package/dist/components/CloseOptionsDialog.d.ts +9 -0
- package/dist/components/CloseOptionsDialog.d.ts.map +1 -0
- package/dist/components/CloseOptionsDialog.js +30 -0
- package/dist/components/CloseOptionsDialog.js.map +1 -0
- package/dist/components/CommandPromptDialog.d.ts +9 -0
- package/dist/components/CommandPromptDialog.d.ts.map +1 -0
- package/dist/components/CommandPromptDialog.js +20 -0
- package/dist/components/CommandPromptDialog.js.map +1 -0
- package/dist/components/CreatingIndicator.d.ts +7 -0
- package/dist/components/CreatingIndicator.d.ts.map +1 -0
- package/dist/components/CreatingIndicator.js +10 -0
- package/dist/components/CreatingIndicator.js.map +1 -0
- package/dist/components/FileCopyPrompt.d.ts +4 -0
- package/dist/components/FileCopyPrompt.d.ts.map +1 -0
- package/dist/components/FileCopyPrompt.js +13 -0
- package/dist/components/FileCopyPrompt.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +8 -0
- package/dist/components/FooterHelp.d.ts.map +1 -0
- package/dist/components/FooterHelp.js +12 -0
- package/dist/components/FooterHelp.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts +4 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/LoadingIndicator.js +10 -0
- package/dist/components/LoadingIndicator.js.map +1 -0
- package/dist/components/MergeConfirmationDialog.d.ts +8 -0
- package/dist/components/MergeConfirmationDialog.d.ts.map +1 -0
- package/dist/components/MergeConfirmationDialog.js +13 -0
- package/dist/components/MergeConfirmationDialog.js.map +1 -0
- package/dist/components/NewPaneDialog.d.ts +9 -0
- package/dist/components/NewPaneDialog.d.ts.map +1 -0
- package/dist/components/NewPaneDialog.js +13 -0
- package/dist/components/NewPaneDialog.js.map +1 -0
- package/dist/components/PaneCard.d.ts +9 -0
- package/dist/components/PaneCard.d.ts.map +1 -0
- package/dist/components/PaneCard.js +37 -0
- package/dist/components/PaneCard.js.map +1 -0
- package/dist/components/PanesGrid.d.ts +11 -0
- package/dist/components/PanesGrid.d.ts.map +1 -0
- package/dist/components/PanesGrid.js +11 -0
- package/dist/components/PanesGrid.js.map +1 -0
- package/dist/components/RunningIndicator.d.ts +4 -0
- package/dist/components/RunningIndicator.d.ts.map +1 -0
- package/dist/components/RunningIndicator.js +9 -0
- package/dist/components/RunningIndicator.js.map +1 -0
- package/dist/components/UpdateDialog.d.ts +7 -0
- package/dist/components/UpdateDialog.d.ts.map +1 -0
- package/dist/components/UpdateDialog.js +27 -0
- package/dist/components/UpdateDialog.js.map +1 -0
- package/dist/components/UpdatingIndicator.d.ts +4 -0
- package/dist/components/UpdatingIndicator.d.ts.map +1 -0
- package/dist/components/UpdatingIndicator.js +9 -0
- package/dist/components/UpdatingIndicator.js.map +1 -0
- package/dist/hooks/useAgentDetection.d.ts +4 -0
- package/dist/hooks/useAgentDetection.d.ts.map +1 -0
- package/dist/hooks/useAgentDetection.js +71 -0
- package/dist/hooks/useAgentDetection.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +11 -0
- package/dist/hooks/useAgentStatus.d.ts.map +1 -0
- package/dist/hooks/useAgentStatus.js +172 -0
- package/dist/hooks/useAgentStatus.js.map +1 -0
- package/dist/hooks/useAutoUpdater.d.ts +20 -0
- package/dist/hooks/useAutoUpdater.d.ts.map +1 -0
- package/dist/hooks/useAutoUpdater.js +100 -0
- package/dist/hooks/useAutoUpdater.js.map +1 -0
- package/dist/hooks/useCommandRunner.d.ts +18 -0
- package/dist/hooks/useCommandRunner.d.ts.map +1 -0
- package/dist/hooks/useCommandRunner.js +44 -0
- package/dist/hooks/useCommandRunner.js.map +1 -0
- package/dist/hooks/useNavigation.d.ts +8 -0
- package/dist/hooks/useNavigation.d.ts.map +1 -0
- package/dist/hooks/useNavigation.js +62 -0
- package/dist/hooks/useNavigation.js.map +1 -0
- package/dist/hooks/usePaneCreation.d.ts +16 -0
- package/dist/hooks/usePaneCreation.d.ts.map +1 -0
- package/dist/hooks/usePaneCreation.js +133 -0
- package/dist/hooks/usePaneCreation.js.map +1 -0
- package/dist/hooks/usePaneRunner.d.ts +17 -0
- package/dist/hooks/usePaneRunner.d.ts.map +1 -0
- package/dist/hooks/usePaneRunner.js +149 -0
- package/dist/hooks/usePaneRunner.js.map +1 -0
- package/dist/hooks/usePanes.d.ts +9 -0
- package/dist/hooks/usePanes.d.ts.map +1 -0
- package/dist/hooks/usePanes.js +222 -0
- package/dist/hooks/usePanes.js.map +1 -0
- package/dist/hooks/useProjectSettings.d.ts +6 -0
- package/dist/hooks/useProjectSettings.d.ts.map +1 -0
- package/dist/hooks/useProjectSettings.js +46 -0
- package/dist/hooks/useProjectSettings.js.map +1 -0
- package/dist/hooks/useTerminalWidth.d.ts +2 -0
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -0
- package/dist/hooks/useTerminalWidth.js +13 -0
- package/dist/hooks/useTerminalWidth.js.map +1 -0
- package/dist/hooks/useWorktreeActions.d.ts +17 -0
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -0
- package/dist/hooks/useWorktreeActions.js +190 -0
- package/dist/hooks/useWorktreeActions.js.map +1 -0
- package/dist/index.js +86 -11
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/commands.d.ts +6 -0
- package/dist/utils/commands.d.ts.map +1 -0
- package/dist/utils/commands.js +35 -0
- package/dist/utils/commands.js.map +1 -0
- package/dist/utils/input.d.ts +13 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +100 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/slug.d.ts +3 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +58 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/tmux.d.ts +4 -0
- package/dist/utils/tmux.d.ts.map +1 -0
- package/dist/utils/tmux.js +62 -0
- package/dist/utils/tmux.js.map +1 -0
- package/dist/workers/updateChecker.d.ts +2 -0
- package/dist/workers/updateChecker.d.ts.map +1 -0
- package/dist/workers/updateChecker.js +33 -0
- package/dist/workers/updateChecker.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAU/D,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,WAA4B,EAAE,gBAAuC;IAC1G,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACb,wDAAwD;QACxD,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,cAAc,GAA0B,IAAI,CAAC;QAEjD,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC;gBACH,iDAAiD;gBACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;gBAEvE,oCAAoC;gBACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC1C,OAAO;gBACT,CAAC;gBAED,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;gBAEhC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;oBAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBACxC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAClC,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC;oBACD,sCAAsC;oBACtC,MAAM,EAAE,SAAS,EAAE,CAAC;oBACpB,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACtB,yBAAyB;oBACzB,MAAM,EAAE,SAAS,EAAE,CAAC;oBACpB,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;QACH,CAAC,CAAC;QAEF,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;YACxC,cAAc,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,gCAAgC;QAChC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,cAAc,EAAE,CAAC;QACnB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEvB,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAChC,IAAI,cAAc;gBAAE,aAAa,CAAC,cAAc,CAAC,CAAC;YAClD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;YAAE,OAAO;QAExC,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;YAErC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAE5D,IAAI,OAAO,EAAE,CAAC;gBACZ,gBAAgB,CAAC,qDAAqD,CAAC,CAAC;gBACxE,UAAU,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,wCAAwC,CAAC,CAAC;gBAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CAAC,wCAAwC,CAAC,CAAC;YAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;YAAE,OAAO;QACxC,MAAM,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACxD,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3B,aAAa,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3B,aAAa,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;AACrJ,CAAC"}
|
|
@@ -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"}
|