dmux 5.1.0 → 5.3.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 +46 -143
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +99 -56
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.d.ts.map +1 -1
- package/dist/actions/implementations/closeAction.js +55 -21
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/implementations/index.d.ts +1 -0
- package/dist/actions/implementations/index.d.ts.map +1 -1
- package/dist/actions/implementations/index.js +3 -0
- package/dist/actions/implementations/index.js.map +1 -1
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
- package/dist/actions/implementations/mergeAction.js +61 -20
- package/dist/actions/implementations/mergeAction.js.map +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +6 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
- package/dist/actions/merge/conflictResolution.js +19 -13
- package/dist/actions/merge/conflictResolution.js.map +1 -1
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -1
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +8 -6
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -1
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +1 -1
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -1
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +9 -2
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -1
- package/dist/actions/merge/mergeExecution.d.ts.map +1 -1
- package/dist/actions/merge/mergeExecution.js +2 -1
- package/dist/actions/merge/mergeExecution.js.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.js +33 -14
- package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -1
- package/dist/actions/types.d.ts +4 -2
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +19 -1
- package/dist/actions/types.js.map +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.d.ts +2 -1
- package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.js +4 -5
- package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -1
- package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -1
- package/dist/components/dialogs/SettingsDialog.js +3 -1
- package/dist/components/dialogs/SettingsDialog.js.map +1 -1
- package/dist/components/panes/MergePane.d.ts +1 -0
- package/dist/components/panes/MergePane.d.ts.map +1 -1
- package/dist/components/panes/MergePane.js +14 -3
- package/dist/components/panes/MergePane.js.map +1 -1
- package/dist/components/panes/PaneCard.d.ts +1 -3
- package/dist/components/panes/PaneCard.d.ts.map +1 -1
- package/dist/components/panes/PaneCard.js +54 -37
- package/dist/components/panes/PaneCard.js.map +1 -1
- package/dist/components/panes/PanesGrid.d.ts +1 -0
- package/dist/components/panes/PanesGrid.d.ts.map +1 -1
- package/dist/components/panes/PanesGrid.js +60 -78
- package/dist/components/panes/PanesGrid.js.map +1 -1
- package/dist/components/popups/agentChoicePopup.d.ts +2 -2
- package/dist/components/popups/agentChoicePopup.js +85 -56
- package/dist/components/popups/agentChoicePopup.js.map +1 -1
- package/dist/components/popups/diffPeekPopup.d.ts +7 -0
- package/dist/components/popups/diffPeekPopup.d.ts.map +1 -0
- package/dist/components/popups/diffPeekPopup.js +99 -0
- package/dist/components/popups/diffPeekPopup.js.map +1 -0
- package/dist/components/popups/enabledAgentsPopup.d.ts +7 -0
- package/dist/components/popups/enabledAgentsPopup.d.ts.map +1 -0
- package/dist/components/popups/enabledAgentsPopup.js +196 -0
- package/dist/components/popups/enabledAgentsPopup.js.map +1 -0
- package/dist/components/popups/kebabMenuPopup.js +2 -2
- package/dist/components/popups/kebabMenuPopup.js.map +1 -1
- package/dist/components/popups/mergeUncommittedChoicePopup.d.ts +7 -0
- package/dist/components/popups/mergeUncommittedChoicePopup.d.ts.map +1 -0
- package/dist/components/popups/mergeUncommittedChoicePopup.js +289 -0
- package/dist/components/popups/mergeUncommittedChoicePopup.js.map +1 -0
- package/dist/components/popups/newPanePopup.js +8 -0
- package/dist/components/popups/newPanePopup.js.map +1 -1
- package/dist/components/popups/projectSelectPopup.d.ts +7 -0
- package/dist/components/popups/projectSelectPopup.d.ts.map +1 -0
- package/dist/components/popups/projectSelectPopup.js +124 -0
- package/dist/components/popups/projectSelectPopup.js.map +1 -0
- package/dist/components/popups/reopenWorktreePopup.js +33 -3
- package/dist/components/popups/reopenWorktreePopup.js.map +1 -1
- package/dist/components/popups/settingsPopup.js +25 -8
- package/dist/components/popups/settingsPopup.js.map +1 -1
- package/dist/components/popups/shared/DirectoryList.d.ts +14 -0
- package/dist/components/popups/shared/DirectoryList.d.ts.map +1 -0
- package/dist/components/popups/shared/DirectoryList.js +46 -0
- package/dist/components/popups/shared/DirectoryList.js.map +1 -0
- package/dist/components/popups/shared/index.d.ts +1 -0
- package/dist/components/popups/shared/index.d.ts.map +1 -1
- package/dist/components/popups/shared/index.js +1 -0
- package/dist/components/popups/shared/index.js.map +1 -1
- package/dist/components/popups/shortcutsPopup.js +15 -12
- package/dist/components/popups/shortcutsPopup.js.map +1 -1
- package/dist/components/popups/singleAgentChoicePopup.d.ts +7 -0
- package/dist/components/popups/singleAgentChoicePopup.d.ts.map +1 -0
- package/dist/components/popups/singleAgentChoicePopup.js +95 -0
- package/dist/components/popups/singleAgentChoicePopup.js.map +1 -0
- package/dist/components/ui/FooterHelp.js +1 -1
- package/dist/components/ui/FooterHelp.js.map +1 -1
- package/dist/hooks/useActionSystem.d.ts +1 -1
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +1 -1
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useAgentDetection.d.ts +2 -2
- package/dist/hooks/useAgentDetection.d.ts.map +1 -1
- package/dist/hooks/useAgentDetection.js +18 -88
- package/dist/hooks/useAgentDetection.js.map +1 -1
- package/dist/hooks/useAutoUpdater.d.ts.map +1 -1
- package/dist/hooks/useAutoUpdater.js +43 -26
- package/dist/hooks/useAutoUpdater.js.map +1 -1
- package/dist/hooks/useInputHandling.d.ts +5 -0
- package/dist/hooks/useInputHandling.d.ts.map +1 -1
- package/dist/hooks/useInputHandling.js +89 -16
- package/dist/hooks/useInputHandling.js.map +1 -1
- package/dist/hooks/useNavigation.d.ts +1 -1
- package/dist/hooks/useNavigation.d.ts.map +1 -1
- package/dist/hooks/useNavigation.js +26 -4
- package/dist/hooks/useNavigation.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +5 -2
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +123 -23
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +1 -1
- package/dist/hooks/usePaneSync.d.ts.map +1 -1
- package/dist/hooks/usePaneSync.js +14 -1
- package/dist/hooks/usePaneSync.js.map +1 -1
- package/dist/hooks/usePanes.js +1 -1
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useServices.d.ts +1 -1
- package/dist/hooks/useServices.d.ts.map +1 -1
- package/dist/hooks/useServices.js +2 -2
- package/dist/hooks/useServices.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +16 -8
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +199 -18
- package/dist/index.js.map +1 -1
- package/dist/layout/SpacerManager.d.ts.map +1 -1
- package/dist/layout/SpacerManager.js +2 -1
- package/dist/layout/SpacerManager.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +37 -26
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/services/AutoUpdater.d.ts +4 -0
- package/dist/services/AutoUpdater.d.ts.map +1 -1
- package/dist/services/AutoUpdater.js +23 -0
- package/dist/services/AutoUpdater.js.map +1 -1
- package/dist/services/PaneEventService.d.ts.map +1 -1
- package/dist/services/PaneEventService.js +2 -5
- package/dist/services/PaneEventService.js.map +1 -1
- package/dist/services/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +2 -14
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/PopupManager.d.ts +8 -2
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +149 -27
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/TmuxService.d.ts +15 -1
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +29 -3
- package/dist/services/TmuxService.js.map +1 -1
- package/dist/services/WorktreeCleanupService.d.ts +22 -0
- package/dist/services/WorktreeCleanupService.d.ts.map +1 -0
- package/dist/services/WorktreeCleanupService.js +80 -0
- package/dist/services/WorktreeCleanupService.js.map +1 -0
- package/dist/types.d.ts +9 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +15 -8
- package/dist/utils/agentDetection.d.ts.map +1 -1
- package/dist/utils/agentDetection.js +49 -73
- package/dist/utils/agentDetection.js.map +1 -1
- package/dist/utils/agentLaunch.d.ts +63 -1
- package/dist/utils/agentLaunch.d.ts.map +1 -1
- package/dist/utils/agentLaunch.js +497 -24
- package/dist/utils/agentLaunch.js.map +1 -1
- package/dist/utils/agentPromptDispatch.d.ts +33 -0
- package/dist/utils/agentPromptDispatch.d.ts.map +1 -0
- package/dist/utils/agentPromptDispatch.js +99 -0
- package/dist/utils/agentPromptDispatch.js.map +1 -0
- package/dist/utils/asciiArt.d.ts.map +1 -1
- package/dist/utils/asciiArt.js +6 -7
- package/dist/utils/asciiArt.js.map +1 -1
- package/dist/utils/attachAgent.d.ts +21 -0
- package/dist/utils/attachAgent.d.ts.map +1 -0
- package/dist/utils/attachAgent.js +128 -0
- package/dist/utils/attachAgent.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts +2 -1
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +69 -36
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/devSource.d.ts +7 -0
- package/dist/utils/devSource.d.ts.map +1 -0
- package/dist/utils/devSource.js +19 -0
- package/dist/utils/devSource.js.map +1 -0
- package/dist/utils/devWatchCommand.d.ts +8 -0
- package/dist/utils/devWatchCommand.d.ts.map +1 -0
- package/dist/utils/devWatchCommand.js +14 -0
- package/dist/utils/devWatchCommand.js.map +1 -0
- package/dist/utils/dirScanner.d.ts +30 -0
- package/dist/utils/dirScanner.d.ts.map +1 -0
- package/dist/utils/dirScanner.js +99 -0
- package/dist/utils/dirScanner.js.map +1 -0
- package/dist/utils/geminiTrust.d.ts +8 -0
- package/dist/utils/geminiTrust.d.ts.map +1 -0
- package/dist/utils/geminiTrust.js +67 -0
- package/dist/utils/geminiTrust.js.map +1 -0
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +3 -3
- package/dist/utils/git.d.ts +13 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +20 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/hooks.js +1 -1
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +2 -9
- package/dist/utils/hooksDocs.d.ts.map +1 -1
- package/dist/utils/hooksDocs.js +26 -6
- package/dist/utils/hooksDocs.js.map +1 -1
- package/dist/utils/mergeExecution.d.ts.map +1 -1
- package/dist/utils/mergeExecution.js +6 -3
- package/dist/utils/mergeExecution.js.map +1 -1
- package/dist/utils/paneCreation.d.ts +8 -2
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +129 -80
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/paneGrouping.d.ts.map +1 -1
- package/dist/utils/paneGrouping.js +30 -0
- package/dist/utils/paneGrouping.js.map +1 -1
- package/dist/utils/projectActions.d.ts +5 -0
- package/dist/utils/projectActions.d.ts.map +1 -1
- package/dist/utils/projectActions.js +15 -4
- package/dist/utils/projectActions.js.map +1 -1
- package/dist/utils/promptStore.d.ts +7 -0
- package/dist/utils/promptStore.d.ts.map +1 -0
- package/dist/utils/promptStore.js +75 -0
- package/dist/utils/promptStore.js.map +1 -0
- package/dist/utils/reopenWorktree.d.ts +1 -1
- package/dist/utils/reopenWorktree.d.ts.map +1 -1
- package/dist/utils/reopenWorktree.js +26 -27
- package/dist/utils/reopenWorktree.js.map +1 -1
- package/dist/utils/runtimePaths.d.ts +2 -0
- package/dist/utils/runtimePaths.d.ts.map +1 -0
- package/dist/utils/runtimePaths.js +8 -0
- package/dist/utils/runtimePaths.js.map +1 -0
- package/dist/utils/settingsManager.d.ts.map +1 -1
- package/dist/utils/settingsManager.js +96 -4
- package/dist/utils/settingsManager.js.map +1 -1
- package/dist/utils/systemCheck.d.ts.map +1 -1
- package/dist/utils/systemCheck.js +0 -13
- package/dist/utils/systemCheck.js.map +1 -1
- package/dist/utils/welcomePane.d.ts +2 -1
- package/dist/utils/welcomePane.d.ts.map +1 -1
- package/dist/utils/welcomePane.js +3 -2
- package/dist/utils/welcomePane.js.map +1 -1
- package/dist/utils/welcomePaneManager.js +1 -1
- package/dist/utils/welcomePaneManager.js.map +1 -1
- package/dist/workers/PaneWorker.js.map +1 -1
- package/dist/workers/WorkerMessages.d.ts +2 -1
- package/dist/workers/WorkerMessages.d.ts.map +1 -1
- package/dist/workers/WorkerMessages.js.map +1 -1
- package/dist/workers/updateChecker.js +21 -6
- package/dist/workers/updateChecker.js.map +1 -1
- package/package.json +14 -12
- package/dist/components/popups/remotePopup.d.ts +0 -6
- package/dist/components/popups/remotePopup.d.ts.map +0 -1
- package/dist/components/popups/remotePopup.js +0 -166
- package/dist/components/popups/remotePopup.js.map +0 -1
- package/dist/hooks/useTunnelManagement.d.ts +0 -18
- package/dist/hooks/useTunnelManagement.d.ts.map +0 -1
- package/dist/hooks/useTunnelManagement.js +0 -55
- package/dist/hooks/useTunnelManagement.js.map +0 -1
- package/dist/server/actionsApi.d.ts +0 -37
- package/dist/server/actionsApi.d.ts.map +0 -1
- package/dist/server/actionsApi.js +0 -256
- package/dist/server/actionsApi.js.map +0 -1
- package/dist/server/index.d.ts +0 -21
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -100
- package/dist/server/index.js.map +0 -1
- package/dist/server/routes/actionsRoutes.d.ts +0 -2
- package/dist/server/routes/actionsRoutes.d.ts.map +0 -1
- package/dist/server/routes/actionsRoutes.js +0 -110
- package/dist/server/routes/actionsRoutes.js.map +0 -1
- package/dist/server/routes/healthRoutes.d.ts +0 -13
- package/dist/server/routes/healthRoutes.d.ts.map +0 -1
- package/dist/server/routes/healthRoutes.js +0 -70
- package/dist/server/routes/healthRoutes.js.map +0 -1
- package/dist/server/routes/index.d.ts +0 -8
- package/dist/server/routes/index.d.ts.map +0 -1
- package/dist/server/routes/index.js +0 -67
- package/dist/server/routes/index.js.map +0 -1
- package/dist/server/routes/keysRoutes.d.ts +0 -33
- package/dist/server/routes/keysRoutes.d.ts.map +0 -1
- package/dist/server/routes/keysRoutes.js +0 -128
- package/dist/server/routes/keysRoutes.js.map +0 -1
- package/dist/server/routes/panesRoutes.d.ts +0 -2
- package/dist/server/routes/panesRoutes.d.ts.map +0 -1
- package/dist/server/routes/panesRoutes.js +0 -414
- package/dist/server/routes/panesRoutes.js.map +0 -1
- package/dist/server/routes/settingsRoutes.d.ts +0 -94
- package/dist/server/routes/settingsRoutes.d.ts.map +0 -1
- package/dist/server/routes/settingsRoutes.js +0 -159
- package/dist/server/routes/settingsRoutes.js.map +0 -1
- package/dist/server/routes/streamRoutes.d.ts +0 -18
- package/dist/server/routes/streamRoutes.d.ts.map +0 -1
- package/dist/server/routes/streamRoutes.js +0 -87
- package/dist/server/routes/streamRoutes.js.map +0 -1
- package/dist/server/routes/tunnelRoutes.d.ts +0 -11
- package/dist/server/routes/tunnelRoutes.d.ts.map +0 -1
- package/dist/server/routes/tunnelRoutes.js +0 -28
- package/dist/server/routes/tunnelRoutes.js.map +0 -1
- package/dist/server/routes.d.ts +0 -17
- package/dist/server/routes.d.ts.map +0 -1
- package/dist/server/routes.js +0 -17
- package/dist/server/routes.js.map +0 -1
- package/dist/services/TunnelService.d.ts +0 -10
- package/dist/services/TunnelService.d.ts.map +0 -1
- package/dist/services/TunnelService.js +0 -98
- package/dist/services/TunnelService.js.map +0 -1
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { eventHandler, readBody } from 'h3';
|
|
2
|
-
import { StateManager } from '../../shared/StateManager.js';
|
|
3
|
-
import { LogService } from '../../services/LogService.js';
|
|
4
|
-
const stateManager = StateManager.getInstance();
|
|
5
|
-
export function createSettingsRoutes() {
|
|
6
|
-
return [
|
|
7
|
-
// GET /api/session - Get session info
|
|
8
|
-
{
|
|
9
|
-
path: '/api/session',
|
|
10
|
-
handler: eventHandler(async () => {
|
|
11
|
-
const state = stateManager.getState();
|
|
12
|
-
return {
|
|
13
|
-
projectName: state.projectName,
|
|
14
|
-
sessionName: state.sessionName,
|
|
15
|
-
projectRoot: state.projectRoot,
|
|
16
|
-
serverUrl: state.serverUrl,
|
|
17
|
-
settings: state.settings,
|
|
18
|
-
paneCount: state.panes.length,
|
|
19
|
-
timestamp: Date.now()
|
|
20
|
-
};
|
|
21
|
-
})
|
|
22
|
-
},
|
|
23
|
-
// GET /api/settings - Get current settings (merged, global, and project)
|
|
24
|
-
// PATCH /api/settings - Update a setting
|
|
25
|
-
{
|
|
26
|
-
path: '/api/settings',
|
|
27
|
-
handler: eventHandler(async (event) => {
|
|
28
|
-
if (event.node.req.method === 'GET') {
|
|
29
|
-
const { SettingsManager, SETTING_DEFINITIONS } = await import('../../utils/settingsManager.js');
|
|
30
|
-
const state = stateManager.getState();
|
|
31
|
-
const projectRoot = state.projectRoot || process.cwd();
|
|
32
|
-
const manager = new SettingsManager(projectRoot);
|
|
33
|
-
return {
|
|
34
|
-
settings: {
|
|
35
|
-
merged: manager.getSettings(),
|
|
36
|
-
global: manager.getGlobalSettings(),
|
|
37
|
-
project: manager.getProjectSettings()
|
|
38
|
-
},
|
|
39
|
-
definitions: SETTING_DEFINITIONS
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
// PATCH /api/settings - Update a setting
|
|
43
|
-
if (event.node.req.method === 'PATCH') {
|
|
44
|
-
try {
|
|
45
|
-
const body = await readBody(event);
|
|
46
|
-
const { key, value, scope } = body;
|
|
47
|
-
if (!key || scope === undefined) {
|
|
48
|
-
event.node.res.statusCode = 400;
|
|
49
|
-
return { error: 'Missing key or scope' };
|
|
50
|
-
}
|
|
51
|
-
if (scope !== 'global' && scope !== 'project') {
|
|
52
|
-
event.node.res.statusCode = 400;
|
|
53
|
-
return { error: 'Invalid scope. Must be "global" or "project"' };
|
|
54
|
-
}
|
|
55
|
-
const { SettingsManager } = await import('../../utils/settingsManager.js');
|
|
56
|
-
const state = stateManager.getState();
|
|
57
|
-
const projectRoot = state.projectRoot || process.cwd();
|
|
58
|
-
const manager = new SettingsManager(projectRoot);
|
|
59
|
-
manager.updateSetting(key, value, scope);
|
|
60
|
-
return {
|
|
61
|
-
success: true,
|
|
62
|
-
message: `Setting "${key}" updated at ${scope} level`
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
catch (err) {
|
|
66
|
-
const msg = 'Failed to update setting';
|
|
67
|
-
console.error(msg, err);
|
|
68
|
-
LogService.getInstance().error(msg, 'routes', undefined, err instanceof Error ? err : undefined);
|
|
69
|
-
event.node.res.statusCode = 500;
|
|
70
|
-
return { error: 'Failed to update setting', details: err.message };
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
event.node.res.statusCode = 405;
|
|
74
|
-
return { error: 'Method not allowed' };
|
|
75
|
-
})
|
|
76
|
-
},
|
|
77
|
-
// GET /api/hooks - Get hooks status
|
|
78
|
-
{
|
|
79
|
-
path: '/api/hooks',
|
|
80
|
-
handler: eventHandler(async (event) => {
|
|
81
|
-
if (event.node.req.method === 'GET') {
|
|
82
|
-
const { listAvailableHooks, hasHook } = await import('../../utils/hooks.js');
|
|
83
|
-
const state = stateManager.getState();
|
|
84
|
-
const projectRoot = state.projectRoot || process.cwd();
|
|
85
|
-
// All possible hooks
|
|
86
|
-
const allHookTypes = [
|
|
87
|
-
'before_pane_create',
|
|
88
|
-
'pane_created',
|
|
89
|
-
'worktree_created',
|
|
90
|
-
'before_pane_close',
|
|
91
|
-
'pane_closed',
|
|
92
|
-
'before_worktree_remove',
|
|
93
|
-
'worktree_removed',
|
|
94
|
-
'pre_merge',
|
|
95
|
-
'post_merge',
|
|
96
|
-
'run_test',
|
|
97
|
-
'run_dev',
|
|
98
|
-
];
|
|
99
|
-
// Check status of each hook
|
|
100
|
-
const hooks = allHookTypes.map(hookName => ({
|
|
101
|
-
name: hookName,
|
|
102
|
-
active: hasHook(projectRoot, hookName)
|
|
103
|
-
}));
|
|
104
|
-
return {
|
|
105
|
-
hooks,
|
|
106
|
-
activeCount: hooks.filter(h => h.active).length,
|
|
107
|
-
totalCount: hooks.length
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
event.node.res.statusCode = 405;
|
|
111
|
-
return { error: 'Method not allowed' };
|
|
112
|
-
})
|
|
113
|
-
},
|
|
114
|
-
// GET /api/logs - Get logs with optional filtering
|
|
115
|
-
{
|
|
116
|
-
path: '/api/logs',
|
|
117
|
-
handler: eventHandler(async (event) => {
|
|
118
|
-
if (event.node.req.method === 'GET') {
|
|
119
|
-
const url = new URL(event.node.req.url || '', `http://${event.node.req.headers.host}`);
|
|
120
|
-
const level = url.searchParams.get('level');
|
|
121
|
-
const source = url.searchParams.get('source');
|
|
122
|
-
const paneId = url.searchParams.get('paneId');
|
|
123
|
-
const unreadOnly = url.searchParams.get('unreadOnly') === 'true';
|
|
124
|
-
const filter = {};
|
|
125
|
-
if (level)
|
|
126
|
-
filter.level = level;
|
|
127
|
-
if (source)
|
|
128
|
-
filter.source = source;
|
|
129
|
-
if (paneId)
|
|
130
|
-
filter.paneId = paneId;
|
|
131
|
-
if (unreadOnly)
|
|
132
|
-
filter.unreadOnly = true;
|
|
133
|
-
const logs = stateManager.getLogs(filter);
|
|
134
|
-
const stats = stateManager.getLogStats();
|
|
135
|
-
return {
|
|
136
|
-
logs,
|
|
137
|
-
stats,
|
|
138
|
-
timestamp: Date.now()
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
event.node.res.statusCode = 405;
|
|
142
|
-
return { error: 'Method not allowed' };
|
|
143
|
-
})
|
|
144
|
-
},
|
|
145
|
-
// POST /api/logs/mark-read - Mark all logs as read
|
|
146
|
-
{
|
|
147
|
-
path: '/api/logs/mark-read',
|
|
148
|
-
handler: eventHandler(async (event) => {
|
|
149
|
-
if (event.node.req.method === 'POST') {
|
|
150
|
-
stateManager.markAllLogsAsRead();
|
|
151
|
-
return { success: true, message: 'All logs marked as read' };
|
|
152
|
-
}
|
|
153
|
-
event.node.res.statusCode = 405;
|
|
154
|
-
return { error: 'Method not allowed' };
|
|
155
|
-
})
|
|
156
|
-
}
|
|
157
|
-
];
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=settingsRoutes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settingsRoutes.js","sourceRoot":"","sources":["../../../src/server/routes/settingsRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export declare function createStreamRoutes(): ({
|
|
2
|
-
path: string;
|
|
3
|
-
handler: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<import("stream").Readable | {
|
|
4
|
-
error: string;
|
|
5
|
-
}>>;
|
|
6
|
-
} | {
|
|
7
|
-
path: string;
|
|
8
|
-
handler: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<{
|
|
9
|
-
activeStreams: number;
|
|
10
|
-
totalClients: number;
|
|
11
|
-
streams: Array<{
|
|
12
|
-
paneId: string;
|
|
13
|
-
clients: number;
|
|
14
|
-
dimensions: string;
|
|
15
|
-
}>;
|
|
16
|
-
}>>;
|
|
17
|
-
})[];
|
|
18
|
-
//# sourceMappingURL=streamRoutes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streamRoutes.d.ts","sourceRoot":"","sources":["../../../src/server/routes/streamRoutes.ts"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;KA6FjC"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { eventHandler } from 'h3';
|
|
2
|
-
import { StateManager } from '../../shared/StateManager.js';
|
|
3
|
-
import { getTerminalStreamer } from '../../services/TerminalStreamer.js';
|
|
4
|
-
import { formatStreamMessage } from '../../shared/StreamProtocol.js';
|
|
5
|
-
const stateManager = StateManager.getInstance();
|
|
6
|
-
export function createStreamRoutes() {
|
|
7
|
-
return [
|
|
8
|
-
// GET /api/stream/:paneId - Stream terminal output
|
|
9
|
-
{
|
|
10
|
-
path: '/api/stream',
|
|
11
|
-
handler: eventHandler(async (event) => {
|
|
12
|
-
const url = event.node.req.url || '';
|
|
13
|
-
// When using app.use('/api/stream'), the URL is already stripped
|
|
14
|
-
// So we just need to remove the leading slash
|
|
15
|
-
const dmuxId = url.startsWith('/') ? url.substring(1) : url;
|
|
16
|
-
if (!dmuxId || dmuxId.includes('/')) {
|
|
17
|
-
event.node.res.statusCode = 404;
|
|
18
|
-
return { error: 'Invalid pane ID' };
|
|
19
|
-
}
|
|
20
|
-
// Find the pane by dmux ID
|
|
21
|
-
const pane = stateManager.getPaneById(decodeURIComponent(dmuxId));
|
|
22
|
-
if (!pane || !pane.paneId) {
|
|
23
|
-
event.node.res.statusCode = 404;
|
|
24
|
-
return { error: 'Pane not found' };
|
|
25
|
-
}
|
|
26
|
-
// Create a readable stream
|
|
27
|
-
const { Readable } = await import('stream');
|
|
28
|
-
const stream = new Readable({
|
|
29
|
-
read() { } // No-op, we'll push data as it arrives
|
|
30
|
-
});
|
|
31
|
-
const streamer = getTerminalStreamer();
|
|
32
|
-
// Start streaming - pass the stream object
|
|
33
|
-
await streamer.startStream(pane.id, pane.paneId, stream);
|
|
34
|
-
// Handle client disconnect
|
|
35
|
-
event.node.req.on('close', () => {
|
|
36
|
-
streamer.stopStream(pane.id, stream);
|
|
37
|
-
stream.destroy();
|
|
38
|
-
});
|
|
39
|
-
// Send heartbeat every 30 seconds to keep connection alive
|
|
40
|
-
const heartbeat = setInterval(() => {
|
|
41
|
-
try {
|
|
42
|
-
const heartbeatMessage = {
|
|
43
|
-
type: 'heartbeat',
|
|
44
|
-
timestamp: Date.now()
|
|
45
|
-
};
|
|
46
|
-
stream.push(formatStreamMessage(heartbeatMessage));
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
clearInterval(heartbeat);
|
|
50
|
-
}
|
|
51
|
-
}, 30000);
|
|
52
|
-
// Cleanup heartbeat on disconnect
|
|
53
|
-
event.node.req.on('close', () => {
|
|
54
|
-
clearInterval(heartbeat);
|
|
55
|
-
stream.destroy();
|
|
56
|
-
});
|
|
57
|
-
// Return the readable stream - h3 will pipe it to the response
|
|
58
|
-
return stream;
|
|
59
|
-
})
|
|
60
|
-
},
|
|
61
|
-
// GET /api/stream-stats - Get streaming statistics
|
|
62
|
-
{
|
|
63
|
-
path: '/api/stream-stats',
|
|
64
|
-
handler: eventHandler(async () => {
|
|
65
|
-
const streamer = getTerminalStreamer();
|
|
66
|
-
return streamer.getStats();
|
|
67
|
-
})
|
|
68
|
-
},
|
|
69
|
-
// GET /api/test-stream - Simple test stream
|
|
70
|
-
{
|
|
71
|
-
path: '/api/test-stream',
|
|
72
|
-
handler: eventHandler(async (event) => {
|
|
73
|
-
const { Readable } = await import('stream');
|
|
74
|
-
const stream = new Readable({
|
|
75
|
-
read() { }
|
|
76
|
-
});
|
|
77
|
-
// Send some test data
|
|
78
|
-
stream.push('TEST:First message\n');
|
|
79
|
-
setTimeout(() => stream.push('TEST:Second message\n'), 100);
|
|
80
|
-
setTimeout(() => stream.push('TEST:Third message\n'), 200);
|
|
81
|
-
setTimeout(() => stream.push(null), 300); // End stream
|
|
82
|
-
return stream;
|
|
83
|
-
})
|
|
84
|
-
}
|
|
85
|
-
];
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=streamRoutes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streamRoutes.js","sourceRoot":"","sources":["../../../src/server/routes/streamRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare function createTunnelRoutes(server?: any): {
|
|
2
|
-
path: string;
|
|
3
|
-
handler: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<{
|
|
4
|
-
url: any;
|
|
5
|
-
error?: undefined;
|
|
6
|
-
} | {
|
|
7
|
-
error: any;
|
|
8
|
-
url?: undefined;
|
|
9
|
-
}>>;
|
|
10
|
-
}[];
|
|
11
|
-
//# sourceMappingURL=tunnelRoutes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tunnelRoutes.d.ts","sourceRoot":"","sources":["../../../src/server/routes/tunnelRoutes.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,GAAG;;;;;;;;;IA0B9C"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { eventHandler } from 'h3';
|
|
2
|
-
export function createTunnelRoutes(server) {
|
|
3
|
-
return [
|
|
4
|
-
// POST /api/tunnel - Create tunnel for remote access
|
|
5
|
-
{
|
|
6
|
-
path: '/api/tunnel',
|
|
7
|
-
handler: eventHandler(async (event) => {
|
|
8
|
-
if (event.node.req.method === 'POST') {
|
|
9
|
-
if (!server) {
|
|
10
|
-
event.node.res.statusCode = 500;
|
|
11
|
-
return { error: 'Server instance not available' };
|
|
12
|
-
}
|
|
13
|
-
try {
|
|
14
|
-
const url = await server.startTunnel();
|
|
15
|
-
return { url };
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
event.node.res.statusCode = 500;
|
|
19
|
-
return { error: error.message || 'Failed to create tunnel' };
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
event.node.res.statusCode = 405;
|
|
23
|
-
return { error: 'Method not allowed' };
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
];
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=tunnelRoutes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tunnelRoutes.js","sourceRoot":"","sources":["../../../src/server/routes/tunnelRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,MAAM,UAAU,kBAAkB,CAAC,MAAY;IAC7C,OAAO;QACL,qDAAqD;QACrD;YACE,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACrC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;wBAChC,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;oBACpD,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;wBACvC,OAAO,EAAE,GAAG,EAAE,CAAC;oBACjB,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;wBAChC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,yBAAyB,EAAE,CAAC;oBAC/D,CAAC;gBACH,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBAChC,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;YACzC,CAAC,CAAC;SACH;KACF,CAAC;AACJ,CAAC"}
|
package/dist/server/routes.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Legacy routes.ts - Re-exports from modular route structure
|
|
3
|
-
*
|
|
4
|
-
* This file maintains backward compatibility while delegating to the new
|
|
5
|
-
* modular route system in src/server/routes/
|
|
6
|
-
*
|
|
7
|
-
* Route organization:
|
|
8
|
-
* - panesRoutes.ts - Pane CRUD, snapshot, test/dev status
|
|
9
|
-
* - streamRoutes.ts - SSE streaming endpoints
|
|
10
|
-
* - keysRoutes.ts - Keystroke input endpoints
|
|
11
|
-
* - actionsRoutes.ts - Action system endpoints
|
|
12
|
-
* - settingsRoutes.ts - Settings, session, hooks, logs
|
|
13
|
-
* - tunnelRoutes.ts - Remote tunnel creation
|
|
14
|
-
* - healthRoutes.ts - Health check + static file serving
|
|
15
|
-
*/
|
|
16
|
-
export { setupRoutes } from './routes/index.js';
|
|
17
|
-
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/server/routes.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Legacy routes.ts - Re-exports from modular route structure
|
|
3
|
-
*
|
|
4
|
-
* This file maintains backward compatibility while delegating to the new
|
|
5
|
-
* modular route system in src/server/routes/
|
|
6
|
-
*
|
|
7
|
-
* Route organization:
|
|
8
|
-
* - panesRoutes.ts - Pane CRUD, snapshot, test/dev status
|
|
9
|
-
* - streamRoutes.ts - SSE streaming endpoints
|
|
10
|
-
* - keysRoutes.ts - Keystroke input endpoints
|
|
11
|
-
* - actionsRoutes.ts - Action system endpoints
|
|
12
|
-
* - settingsRoutes.ts - Settings, session, hooks, logs
|
|
13
|
-
* - tunnelRoutes.ts - Remote tunnel creation
|
|
14
|
-
* - healthRoutes.ts - Health check + static file serving
|
|
15
|
-
*/
|
|
16
|
-
export { setupRoutes } from './routes/index.js';
|
|
17
|
-
//# sourceMappingURL=routes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare class TunnelService {
|
|
2
|
-
private tunnel;
|
|
3
|
-
private tunnelUrl;
|
|
4
|
-
private isCreating;
|
|
5
|
-
start(port: number): Promise<string>;
|
|
6
|
-
stop(): Promise<void>;
|
|
7
|
-
getUrl(): string | null;
|
|
8
|
-
}
|
|
9
|
-
export declare const tunnelService: TunnelService;
|
|
10
|
-
//# sourceMappingURL=TunnelService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TunnelService.d.ts","sourceRoot":"","sources":["../../src/services/TunnelService.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAkB;IAE9B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwFpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,MAAM,IAAI,MAAM,GAAG,IAAI;CAGxB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { startTunnel } from 'untun';
|
|
2
|
-
import { LogService } from './LogService.js';
|
|
3
|
-
import { TUNNEL_RETRY_DELAY } from '../constants/timing.js';
|
|
4
|
-
export class TunnelService {
|
|
5
|
-
tunnel = null;
|
|
6
|
-
tunnelUrl = null;
|
|
7
|
-
isCreating = false;
|
|
8
|
-
async start(port) {
|
|
9
|
-
// If we already have a URL, return it
|
|
10
|
-
if (this.tunnelUrl) {
|
|
11
|
-
LogService.getInstance().info('Returning existing tunnel URL', 'TunnelService');
|
|
12
|
-
return this.tunnelUrl;
|
|
13
|
-
}
|
|
14
|
-
// If tunnel is being created, wait a bit and check again
|
|
15
|
-
if (this.isCreating) {
|
|
16
|
-
LogService.getInstance().info('Tunnel creation already in progress, waiting...', 'TunnelService');
|
|
17
|
-
// Wait up to 45 seconds for existing creation to finish
|
|
18
|
-
for (let i = 0; i < 45; i++) {
|
|
19
|
-
await new Promise(resolve => setTimeout(resolve, TUNNEL_RETRY_DELAY));
|
|
20
|
-
if (this.tunnelUrl) {
|
|
21
|
-
return this.tunnelUrl;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
throw new Error('Tunnel creation timed out while waiting for existing process');
|
|
25
|
-
}
|
|
26
|
-
// If we have a tunnel but no URL yet, try to get the URL
|
|
27
|
-
if (this.tunnel && !this.tunnelUrl) {
|
|
28
|
-
try {
|
|
29
|
-
LogService.getInstance().info('Found existing tunnel, attempting to get URL...', 'TunnelService');
|
|
30
|
-
const urlPromise = this.tunnel.getURL();
|
|
31
|
-
const urlTimeoutPromise = new Promise((_, reject) => {
|
|
32
|
-
setTimeout(() => reject(new Error('Getting tunnel URL timed out after 30 seconds')), 30000);
|
|
33
|
-
});
|
|
34
|
-
this.tunnelUrl = await Promise.race([urlPromise, urlTimeoutPromise]);
|
|
35
|
-
if (this.tunnelUrl) {
|
|
36
|
-
LogService.getInstance().info(`Tunnel URL: ${this.tunnelUrl}`, 'TunnelService');
|
|
37
|
-
return this.tunnelUrl;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
LogService.getInstance().error('Failed to get URL from existing tunnel', 'TunnelService', undefined, error);
|
|
42
|
-
// Continue to create new tunnel
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
this.isCreating = true;
|
|
46
|
-
try {
|
|
47
|
-
const msg = `Starting tunnel for port ${port}`;
|
|
48
|
-
LogService.getInstance().info(msg, 'TunnelService');
|
|
49
|
-
// Start tunnel with timeout and better error handling
|
|
50
|
-
const tunnelPromise = startTunnel({
|
|
51
|
-
port,
|
|
52
|
-
acceptCloudflareNotice: true
|
|
53
|
-
});
|
|
54
|
-
// Add timeout to prevent hanging
|
|
55
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
56
|
-
setTimeout(() => reject(new Error('Tunnel creation timed out after 45 seconds')), 45000);
|
|
57
|
-
});
|
|
58
|
-
this.tunnel = await Promise.race([tunnelPromise, timeoutPromise]);
|
|
59
|
-
const msg1 = 'Tunnel created, getting URL...';
|
|
60
|
-
LogService.getInstance().info(msg1, 'TunnelService');
|
|
61
|
-
// Get URL with longer timeout (cloudflare can be slow)
|
|
62
|
-
const urlPromise = this.tunnel.getURL();
|
|
63
|
-
const urlTimeoutPromise = new Promise((_, reject) => {
|
|
64
|
-
setTimeout(() => reject(new Error('Getting tunnel URL timed out after 30 seconds')), 30000);
|
|
65
|
-
});
|
|
66
|
-
this.tunnelUrl = await Promise.race([urlPromise, urlTimeoutPromise]);
|
|
67
|
-
if (!this.tunnelUrl) {
|
|
68
|
-
throw new Error('Tunnel URL is null');
|
|
69
|
-
}
|
|
70
|
-
const msg2 = `Tunnel URL: ${this.tunnelUrl}`;
|
|
71
|
-
LogService.getInstance().info(msg2, 'TunnelService');
|
|
72
|
-
return this.tunnelUrl;
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
const msg = 'Failed to start tunnel';
|
|
76
|
-
LogService.getInstance().error(msg, 'TunnelService', undefined, error instanceof Error ? error : undefined);
|
|
77
|
-
// Don't clean up the tunnel on failure - it might be in progress
|
|
78
|
-
// Just clean up the URL
|
|
79
|
-
this.tunnelUrl = null;
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
this.isCreating = false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
async stop() {
|
|
87
|
-
if (this.tunnel) {
|
|
88
|
-
await this.tunnel.close();
|
|
89
|
-
this.tunnel = null;
|
|
90
|
-
this.tunnelUrl = null;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
getUrl() {
|
|
94
|
-
return this.tunnelUrl;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
export const tunnelService = new TunnelService();
|
|
98
|
-
//# sourceMappingURL=TunnelService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TunnelService.js","sourceRoot":"","sources":["../../src/services/TunnelService.ts"],"names":[],"mappings":"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"}
|