dmux 5.0.0 → 5.2.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 +44 -141
- package/dist/actions/implementations/closeAction.d.ts.map +1 -1
- package/dist/actions/implementations/closeAction.js +25 -20
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
- package/dist/actions/implementations/mergeAction.js +2 -1
- package/dist/actions/implementations/mergeAction.js.map +1 -1
- package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
- package/dist/actions/merge/conflictResolution.js +2 -1
- package/dist/actions/merge/conflictResolution.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/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/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/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 +8 -9
- package/dist/components/popups/shortcutsPopup.js.map +1 -1
- package/dist/hooks/useAutoUpdater.d.ts.map +1 -1
- package/dist/hooks/useAutoUpdater.js +42 -23
- package/dist/hooks/useAutoUpdater.js.map +1 -1
- package/dist/hooks/useInputHandling.d.ts.map +1 -1
- package/dist/hooks/useInputHandling.js +25 -5
- package/dist/hooks/useInputHandling.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 +8 -3
- package/dist/index.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +41 -30
- 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/PopupManager.d.ts +2 -1
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +31 -11
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/TmuxService.d.ts +6 -1
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +11 -1
- 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 +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentLaunch.d.ts +4 -0
- package/dist/utils/agentLaunch.d.ts.map +1 -1
- package/dist/utils/agentLaunch.js +24 -0
- package/dist/utils/agentLaunch.js.map +1 -1
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +61 -23
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- 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/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- 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.d.ts.map +1 -1
- package/dist/utils/hooks.js +51 -19
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +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/onboarding.d.ts +9 -0
- package/dist/utils/onboarding.d.ts.map +1 -0
- package/dist/utils/onboarding.js +110 -0
- package/dist/utils/onboarding.js.map +1 -0
- package/dist/utils/openRouterApiKeySetup.d.ts +28 -0
- package/dist/utils/openRouterApiKeySetup.d.ts.map +1 -0
- package/dist/utils/openRouterApiKeySetup.js +143 -0
- package/dist/utils/openRouterApiKeySetup.js.map +1 -0
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +116 -53
- package/dist/utils/paneCreation.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.map +1 -1
- package/dist/utils/reopenWorktree.js +11 -4
- package/dist/utils/reopenWorktree.js.map +1 -1
- package/dist/utils/settingsManager.d.ts.map +1 -1
- package/dist/utils/settingsManager.js +59 -0
- package/dist/utils/settingsManager.js.map +1 -1
- package/dist/utils/tmux.d.ts +2 -1
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +3 -1
- package/dist/utils/tmux.js.map +1 -1
- package/dist/workers/updateChecker.js +21 -6
- package/dist/workers/updateChecker.js.map +1 -1
- package/package.json +5 -8
- 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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"}
|