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.
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +412 -179
- package/dist/DmuxApp.js.map +1 -1
- package/dist/MergePane.d.ts.map +1 -1
- package/dist/MergePane.js +4 -15
- package/dist/MergePane.js.map +1 -1
- package/dist/PaneAnalyzer.d.ts +45 -0
- package/dist/PaneAnalyzer.d.ts.map +1 -0
- package/dist/PaneAnalyzer.js +278 -0
- package/dist/PaneAnalyzer.js.map +1 -0
- package/dist/_plugin-vue_export-helper.css +1 -0
- package/dist/actions/index.d.ts +19 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +54 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/paneActions.d.ts +45 -0
- package/dist/actions/paneActions.d.ts.map +1 -0
- package/dist/actions/paneActions.js +932 -0
- package/dist/actions/paneActions.js.map +1 -0
- package/dist/actions/types.d.ts +101 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +129 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/adapters/apiActionHandler.d.ts +64 -0
- package/dist/adapters/apiActionHandler.d.ts.map +1 -0
- package/dist/adapters/apiActionHandler.js +170 -0
- package/dist/adapters/apiActionHandler.js.map +1 -0
- package/dist/adapters/tuiActionHandler.d.ts +57 -0
- package/dist/adapters/tuiActionHandler.d.ts.map +1 -0
- package/dist/adapters/tuiActionHandler.js +152 -0
- package/dist/adapters/tuiActionHandler.js.map +1 -0
- package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +28 -0
- package/dist/components/ActionChoiceDialog.d.ts +16 -0
- package/dist/components/ActionChoiceDialog.d.ts.map +1 -0
- package/dist/components/ActionChoiceDialog.js +29 -0
- package/dist/components/ActionChoiceDialog.js.map +1 -0
- package/dist/components/ActionConfirmDialog.d.ts +16 -0
- package/dist/components/ActionConfirmDialog.d.ts.map +1 -0
- package/dist/components/ActionConfirmDialog.js +31 -0
- package/dist/components/ActionConfirmDialog.js.map +1 -0
- package/dist/components/ActionInputDialog.d.ts +16 -0
- package/dist/components/ActionInputDialog.d.ts.map +1 -0
- package/dist/components/ActionInputDialog.js +49 -0
- package/dist/components/ActionInputDialog.js.map +1 -0
- package/dist/components/ActionProgressDialog.d.ts +13 -0
- package/dist/components/ActionProgressDialog.d.ts.map +1 -0
- package/dist/components/ActionProgressDialog.js +20 -0
- package/dist/components/ActionProgressDialog.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +2 -0
- package/dist/components/FooterHelp.d.ts.map +1 -1
- package/dist/components/FooterHelp.js +9 -2
- package/dist/components/FooterHelp.js.map +1 -1
- package/dist/components/KebabMenu.d.ts +10 -0
- package/dist/components/KebabMenu.d.ts.map +1 -0
- package/dist/components/KebabMenu.js +18 -0
- package/dist/components/KebabMenu.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -1
- package/dist/components/LoadingIndicator.js +5 -5
- package/dist/components/LoadingIndicator.js.map +1 -1
- package/dist/components/PaneCard.d.ts +1 -0
- package/dist/components/PaneCard.d.ts.map +1 -1
- package/dist/components/PaneCard.js +21 -20
- package/dist/components/PaneCard.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +1 -0
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +5 -4
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/components/QRCode.d.ts +7 -0
- package/dist/components/QRCode.d.ts.map +1 -0
- package/dist/components/QRCode.js +19 -0
- package/dist/components/QRCode.js.map +1 -0
- package/dist/components/Spinner.d.ts +10 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +15 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/dashboard.html +14 -0
- package/dist/dashboard.js +2 -0
- package/dist/hooks/useActionSystem.d.ts +31 -0
- package/dist/hooks/useActionSystem.d.ts.map +1 -0
- package/dist/hooks/useActionSystem.js +95 -0
- package/dist/hooks/useActionSystem.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +4 -3
- package/dist/hooks/useAgentStatus.d.ts.map +1 -1
- package/dist/hooks/useAgentStatus.js +45 -194
- package/dist/hooks/useAgentStatus.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +2 -1
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +46 -100
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +5 -3
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +18 -1
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +4 -0
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +43 -6
- package/dist/index.js.map +1 -1
- package/dist/server/actionsApi.d.ts +37 -0
- package/dist/server/actionsApi.d.ts.map +1 -0
- package/dist/server/actionsApi.js +256 -0
- package/dist/server/actionsApi.js.map +1 -0
- package/dist/server/embedded-assets.d.ts +13 -0
- package/dist/server/embedded-assets.d.ts.map +1 -0
- package/dist/server/embedded-assets.js +5012 -0
- package/dist/server/embedded-assets.js.map +1 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +99 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +672 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/static.d.ts +6 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +3040 -0
- package/dist/server/static.js.map +1 -0
- package/dist/services/ConfigWatcher.d.ts +20 -0
- package/dist/services/ConfigWatcher.d.ts.map +1 -0
- package/dist/services/ConfigWatcher.js +75 -0
- package/dist/services/ConfigWatcher.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts +69 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -0
- package/dist/services/PaneWorkerManager.js +272 -0
- package/dist/services/PaneWorkerManager.js.map +1 -0
- package/dist/services/StatusDetector.d.ts +87 -0
- package/dist/services/StatusDetector.d.ts.map +1 -0
- package/dist/services/StatusDetector.js +387 -0
- package/dist/services/StatusDetector.js.map +1 -0
- package/dist/services/TerminalDiffer.d.ts +85 -0
- package/dist/services/TerminalDiffer.d.ts.map +1 -0
- package/dist/services/TerminalDiffer.js +499 -0
- package/dist/services/TerminalDiffer.js.map +1 -0
- package/dist/services/TerminalStreamer.d.ts +80 -0
- package/dist/services/TerminalStreamer.d.ts.map +1 -0
- package/dist/services/TerminalStreamer.js +490 -0
- package/dist/services/TerminalStreamer.js.map +1 -0
- package/dist/services/TunnelService.d.ts +9 -0
- package/dist/services/TunnelService.d.ts.map +1 -0
- package/dist/services/TunnelService.js +34 -0
- package/dist/services/TunnelService.js.map +1 -0
- package/dist/services/WorkerMessageBus.d.ts +48 -0
- package/dist/services/WorkerMessageBus.d.ts.map +1 -0
- package/dist/services/WorkerMessageBus.js +120 -0
- package/dist/services/WorkerMessageBus.js.map +1 -0
- package/dist/shared/StateManager.d.ts +34 -0
- package/dist/shared/StateManager.d.ts.map +1 -0
- package/dist/shared/StateManager.js +108 -0
- package/dist/shared/StateManager.js.map +1 -0
- package/dist/shared/StreamProtocol.d.ts +75 -0
- package/dist/shared/StreamProtocol.d.ts.map +1 -0
- package/dist/shared/StreamProtocol.js +37 -0
- package/dist/shared/StreamProtocol.js.map +1 -0
- package/dist/terminal.html +17 -0
- package/dist/terminal.js +3 -0
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +18 -0
- package/dist/utils/agentDetection.d.ts.map +1 -0
- package/dist/utils/agentDetection.js +73 -0
- package/dist/utils/agentDetection.js.map +1 -0
- package/dist/utils/aiMerge.d.ts +35 -0
- package/dist/utils/aiMerge.d.ts.map +1 -0
- package/dist/utils/aiMerge.js +298 -0
- package/dist/utils/aiMerge.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts +19 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -0
- package/dist/utils/conflictResolutionPane.js +214 -0
- package/dist/utils/conflictResolutionPane.js.map +1 -0
- package/dist/utils/mergeExecution.d.ts +52 -0
- package/dist/utils/mergeExecution.d.ts.map +1 -0
- package/dist/utils/mergeExecution.js +192 -0
- package/dist/utils/mergeExecution.js.map +1 -0
- package/dist/utils/mergeValidation.d.ts +67 -0
- package/dist/utils/mergeValidation.d.ts.map +1 -0
- package/dist/utils/mergeValidation.js +213 -0
- package/dist/utils/mergeValidation.js.map +1 -0
- package/dist/utils/paneCreation.d.ts +17 -0
- package/dist/utils/paneCreation.d.ts.map +1 -0
- package/dist/utils/paneCreation.js +274 -0
- package/dist/utils/paneCreation.js.map +1 -0
- package/dist/utils/port.d.ts +5 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +54 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/workers/PaneWorker.d.ts +2 -0
- package/dist/workers/PaneWorker.d.ts.map +1 -0
- package/dist/workers/PaneWorker.js +362 -0
- package/dist/workers/PaneWorker.js.map +1 -0
- package/dist/workers/WorkerMessages.d.ts +36 -0
- package/dist/workers/WorkerMessages.d.ts.map +1 -0
- package/dist/workers/WorkerMessages.js +9 -0
- package/dist/workers/WorkerMessages.js.map +1 -0
- 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"}
|
|
@@ -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;
|
|
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 },
|
|
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;
|
|
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;
|
|
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 {
|
|
2
|
+
import { Text } from 'ink';
|
|
3
|
+
import Spinner from './Spinner.js';
|
|
3
4
|
const LoadingIndicator = () => {
|
|
4
|
-
return (React.createElement(
|
|
5
|
-
React.createElement(
|
|
6
|
-
|
|
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,
|
|
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"}
|
|
@@ -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;
|
|
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:
|
|
14
|
-
React.createElement(Box, { flexDirection: "column" },
|
|
15
|
-
React.createElement(Box,
|
|
16
|
-
React.createElement(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
" (
|
|
20
|
-
|
|
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 === '
|
|
26
|
-
|
|
27
|
-
pane.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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;
|
|
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"}
|
|
@@ -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;
|
|
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:
|
|
15
|
-
React.createElement(
|
|
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;
|
|
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 @@
|
|
|
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,
|
|
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
|