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.
Files changed (176) hide show
  1. package/README.md +44 -141
  2. package/dist/actions/implementations/closeAction.d.ts.map +1 -1
  3. package/dist/actions/implementations/closeAction.js +25 -20
  4. package/dist/actions/implementations/closeAction.js.map +1 -1
  5. package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
  6. package/dist/actions/implementations/mergeAction.js +2 -1
  7. package/dist/actions/implementations/mergeAction.js.map +1 -1
  8. package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
  9. package/dist/actions/merge/conflictResolution.js +2 -1
  10. package/dist/actions/merge/conflictResolution.js.map +1 -1
  11. package/dist/actions/merge/mergeExecution.d.ts.map +1 -1
  12. package/dist/actions/merge/mergeExecution.js +2 -1
  13. package/dist/actions/merge/mergeExecution.js.map +1 -1
  14. package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -1
  15. package/dist/components/dialogs/SettingsDialog.js +3 -1
  16. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  17. package/dist/components/panes/MergePane.d.ts +1 -0
  18. package/dist/components/panes/MergePane.d.ts.map +1 -1
  19. package/dist/components/panes/MergePane.js +14 -3
  20. package/dist/components/panes/MergePane.js.map +1 -1
  21. package/dist/components/popups/projectSelectPopup.d.ts +7 -0
  22. package/dist/components/popups/projectSelectPopup.d.ts.map +1 -0
  23. package/dist/components/popups/projectSelectPopup.js +124 -0
  24. package/dist/components/popups/projectSelectPopup.js.map +1 -0
  25. package/dist/components/popups/settingsPopup.js +25 -8
  26. package/dist/components/popups/settingsPopup.js.map +1 -1
  27. package/dist/components/popups/shared/DirectoryList.d.ts +14 -0
  28. package/dist/components/popups/shared/DirectoryList.d.ts.map +1 -0
  29. package/dist/components/popups/shared/DirectoryList.js +46 -0
  30. package/dist/components/popups/shared/DirectoryList.js.map +1 -0
  31. package/dist/components/popups/shared/index.d.ts +1 -0
  32. package/dist/components/popups/shared/index.d.ts.map +1 -1
  33. package/dist/components/popups/shared/index.js +1 -0
  34. package/dist/components/popups/shared/index.js.map +1 -1
  35. package/dist/components/popups/shortcutsPopup.js +8 -9
  36. package/dist/components/popups/shortcutsPopup.js.map +1 -1
  37. package/dist/hooks/useAutoUpdater.d.ts.map +1 -1
  38. package/dist/hooks/useAutoUpdater.js +42 -23
  39. package/dist/hooks/useAutoUpdater.js.map +1 -1
  40. package/dist/hooks/useInputHandling.d.ts.map +1 -1
  41. package/dist/hooks/useInputHandling.js +25 -5
  42. package/dist/hooks/useInputHandling.js.map +1 -1
  43. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  44. package/dist/hooks/useWorktreeActions.js +16 -8
  45. package/dist/hooks/useWorktreeActions.js.map +1 -1
  46. package/dist/index.js +8 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/server/embedded-assets.d.ts.map +1 -1
  49. package/dist/server/embedded-assets.js +41 -30
  50. package/dist/server/embedded-assets.js.map +1 -1
  51. package/dist/services/AutoUpdater.d.ts +4 -0
  52. package/dist/services/AutoUpdater.d.ts.map +1 -1
  53. package/dist/services/AutoUpdater.js +23 -0
  54. package/dist/services/AutoUpdater.js.map +1 -1
  55. package/dist/services/PopupManager.d.ts +2 -1
  56. package/dist/services/PopupManager.d.ts.map +1 -1
  57. package/dist/services/PopupManager.js +31 -11
  58. package/dist/services/PopupManager.js.map +1 -1
  59. package/dist/services/TmuxService.d.ts +6 -1
  60. package/dist/services/TmuxService.d.ts.map +1 -1
  61. package/dist/services/TmuxService.js +11 -1
  62. package/dist/services/TmuxService.js.map +1 -1
  63. package/dist/services/WorktreeCleanupService.d.ts +22 -0
  64. package/dist/services/WorktreeCleanupService.d.ts.map +1 -0
  65. package/dist/services/WorktreeCleanupService.js +80 -0
  66. package/dist/services/WorktreeCleanupService.js.map +1 -0
  67. package/dist/types.d.ts +5 -1
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/utils/agentLaunch.d.ts +4 -0
  70. package/dist/utils/agentLaunch.d.ts.map +1 -1
  71. package/dist/utils/agentLaunch.js +24 -0
  72. package/dist/utils/agentLaunch.js.map +1 -1
  73. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  74. package/dist/utils/conflictResolutionPane.js +61 -23
  75. package/dist/utils/conflictResolutionPane.js.map +1 -1
  76. package/dist/utils/dirScanner.d.ts +30 -0
  77. package/dist/utils/dirScanner.d.ts.map +1 -0
  78. package/dist/utils/dirScanner.js +99 -0
  79. package/dist/utils/dirScanner.js.map +1 -0
  80. package/dist/utils/generated-agents-doc.d.ts +1 -1
  81. package/dist/utils/generated-agents-doc.js +1 -1
  82. package/dist/utils/git.d.ts +13 -0
  83. package/dist/utils/git.d.ts.map +1 -1
  84. package/dist/utils/git.js +20 -0
  85. package/dist/utils/git.js.map +1 -1
  86. package/dist/utils/hooks.d.ts.map +1 -1
  87. package/dist/utils/hooks.js +51 -19
  88. package/dist/utils/hooks.js.map +1 -1
  89. package/dist/utils/hooksDocs.d.ts +1 -1
  90. package/dist/utils/mergeExecution.d.ts.map +1 -1
  91. package/dist/utils/mergeExecution.js +6 -3
  92. package/dist/utils/mergeExecution.js.map +1 -1
  93. package/dist/utils/onboarding.d.ts +9 -0
  94. package/dist/utils/onboarding.d.ts.map +1 -0
  95. package/dist/utils/onboarding.js +110 -0
  96. package/dist/utils/onboarding.js.map +1 -0
  97. package/dist/utils/openRouterApiKeySetup.d.ts +28 -0
  98. package/dist/utils/openRouterApiKeySetup.d.ts.map +1 -0
  99. package/dist/utils/openRouterApiKeySetup.js +143 -0
  100. package/dist/utils/openRouterApiKeySetup.js.map +1 -0
  101. package/dist/utils/paneCreation.d.ts.map +1 -1
  102. package/dist/utils/paneCreation.js +116 -53
  103. package/dist/utils/paneCreation.js.map +1 -1
  104. package/dist/utils/promptStore.d.ts +7 -0
  105. package/dist/utils/promptStore.d.ts.map +1 -0
  106. package/dist/utils/promptStore.js +75 -0
  107. package/dist/utils/promptStore.js.map +1 -0
  108. package/dist/utils/reopenWorktree.d.ts.map +1 -1
  109. package/dist/utils/reopenWorktree.js +11 -4
  110. package/dist/utils/reopenWorktree.js.map +1 -1
  111. package/dist/utils/settingsManager.d.ts.map +1 -1
  112. package/dist/utils/settingsManager.js +59 -0
  113. package/dist/utils/settingsManager.js.map +1 -1
  114. package/dist/utils/tmux.d.ts +2 -1
  115. package/dist/utils/tmux.d.ts.map +1 -1
  116. package/dist/utils/tmux.js +3 -1
  117. package/dist/utils/tmux.js.map +1 -1
  118. package/dist/workers/updateChecker.js +21 -6
  119. package/dist/workers/updateChecker.js.map +1 -1
  120. package/package.json +5 -8
  121. package/dist/components/popups/remotePopup.d.ts +0 -6
  122. package/dist/components/popups/remotePopup.d.ts.map +0 -1
  123. package/dist/components/popups/remotePopup.js +0 -166
  124. package/dist/components/popups/remotePopup.js.map +0 -1
  125. package/dist/hooks/useTunnelManagement.d.ts +0 -18
  126. package/dist/hooks/useTunnelManagement.d.ts.map +0 -1
  127. package/dist/hooks/useTunnelManagement.js +0 -55
  128. package/dist/hooks/useTunnelManagement.js.map +0 -1
  129. package/dist/server/actionsApi.d.ts +0 -37
  130. package/dist/server/actionsApi.d.ts.map +0 -1
  131. package/dist/server/actionsApi.js +0 -256
  132. package/dist/server/actionsApi.js.map +0 -1
  133. package/dist/server/index.d.ts +0 -21
  134. package/dist/server/index.d.ts.map +0 -1
  135. package/dist/server/index.js +0 -100
  136. package/dist/server/index.js.map +0 -1
  137. package/dist/server/routes/actionsRoutes.d.ts +0 -2
  138. package/dist/server/routes/actionsRoutes.d.ts.map +0 -1
  139. package/dist/server/routes/actionsRoutes.js +0 -110
  140. package/dist/server/routes/actionsRoutes.js.map +0 -1
  141. package/dist/server/routes/healthRoutes.d.ts +0 -13
  142. package/dist/server/routes/healthRoutes.d.ts.map +0 -1
  143. package/dist/server/routes/healthRoutes.js +0 -70
  144. package/dist/server/routes/healthRoutes.js.map +0 -1
  145. package/dist/server/routes/index.d.ts +0 -8
  146. package/dist/server/routes/index.d.ts.map +0 -1
  147. package/dist/server/routes/index.js +0 -67
  148. package/dist/server/routes/index.js.map +0 -1
  149. package/dist/server/routes/keysRoutes.d.ts +0 -33
  150. package/dist/server/routes/keysRoutes.d.ts.map +0 -1
  151. package/dist/server/routes/keysRoutes.js +0 -128
  152. package/dist/server/routes/keysRoutes.js.map +0 -1
  153. package/dist/server/routes/panesRoutes.d.ts +0 -2
  154. package/dist/server/routes/panesRoutes.d.ts.map +0 -1
  155. package/dist/server/routes/panesRoutes.js +0 -414
  156. package/dist/server/routes/panesRoutes.js.map +0 -1
  157. package/dist/server/routes/settingsRoutes.d.ts +0 -94
  158. package/dist/server/routes/settingsRoutes.d.ts.map +0 -1
  159. package/dist/server/routes/settingsRoutes.js +0 -159
  160. package/dist/server/routes/settingsRoutes.js.map +0 -1
  161. package/dist/server/routes/streamRoutes.d.ts +0 -18
  162. package/dist/server/routes/streamRoutes.d.ts.map +0 -1
  163. package/dist/server/routes/streamRoutes.js +0 -87
  164. package/dist/server/routes/streamRoutes.js.map +0 -1
  165. package/dist/server/routes/tunnelRoutes.d.ts +0 -11
  166. package/dist/server/routes/tunnelRoutes.d.ts.map +0 -1
  167. package/dist/server/routes/tunnelRoutes.js +0 -28
  168. package/dist/server/routes/tunnelRoutes.js.map +0 -1
  169. package/dist/server/routes.d.ts +0 -17
  170. package/dist/server/routes.d.ts.map +0 -1
  171. package/dist/server/routes.js +0 -17
  172. package/dist/server/routes.js.map +0 -1
  173. package/dist/services/TunnelService.d.ts +0 -10
  174. package/dist/services/TunnelService.d.ts.map +0 -1
  175. package/dist/services/TunnelService.js +0 -98
  176. 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"}
@@ -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"}
@@ -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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"}