@autocode-cli/autocode 0.1.23 → 0.1.24

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.
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAkLtC"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAqItC"}
@@ -11,8 +11,7 @@ import { logger } from '../../utils/logger.js';
11
11
  import { pipelineExists } from '../../core/pipeline.js';
12
12
  import { hasTransitionIssues, getTransitionIssues, applySync, previewSync } from '../../core/sync.js';
13
13
  import { setTunnelUrl } from '../../server/websocket.js';
14
- import { isCloudflaredInstalled, isCloudflaredLoggedIn, loadTunnelConfig, saveTunnelConfig, getTunnelInfo, createTunnel, routeTunnelDns, generateCloudflaredConfig, runTunnel, } from '../../utils/tunnel.js';
15
- import { promptTunnelConfig } from '../../utils/prompt.js';
14
+ import { isCloudflaredInstalled, getOrCreateTunnel, startTunnelSupervisor, } from '../../utils/tunnel.js';
16
15
  /**
17
16
  * Kill any process using the specified port
18
17
  */
@@ -44,7 +43,7 @@ export function serveCommand() {
44
43
  cmd
45
44
  .description('Start the web dashboard server')
46
45
  .option('-p, --port <port>', 'Server port', String(DEFAULT_PORT))
47
- .option('-e, --expose', 'Expose dashboard via Cloudflare named tunnel')
46
+ .option('-e, --expose', 'Expose dashboard via Cloudflare tunnel (persistent)')
48
47
  .action(async (options) => {
49
48
  const port = parseInt(options.port, 10) || DEFAULT_PORT;
50
49
  const config = getConfig();
@@ -101,84 +100,48 @@ export function serveCommand() {
101
100
  try {
102
101
  const { startServer } = await import('../../server/index.js');
103
102
  await startServer(port);
104
- // Start Cloudflare named tunnel if --expose option is set
103
+ // Start Cloudflare tunnel if --expose option is set
105
104
  if (options.expose) {
106
- // Step 1: Check if cloudflared is installed
105
+ // Check if cloudflared is installed
107
106
  if (!isCloudflaredInstalled()) {
108
107
  logger.error('cloudflared is not installed');
109
108
  logger.info('Install: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/');
110
109
  process.exit(1);
111
110
  }
112
- // Step 2: Check if user is logged in to Cloudflare
113
- if (!isCloudflaredLoggedIn()) {
114
- logger.error('You must be logged in to Cloudflare');
115
- logger.info('Run: cloudflared tunnel login');
116
- logger.info('Then retry: autocode serve --expose');
117
- process.exit(1);
118
- }
119
- // Step 3: Load or create tunnel config
120
- let tunnelConfig = loadTunnelConfig(config.root);
121
- if (!tunnelConfig) {
122
- logger.info('No tunnel configuration found. Setting up...');
123
- tunnelConfig = await promptTunnelConfig();
124
- saveTunnelConfig(config.root, tunnelConfig);
125
- logger.success('Tunnel configuration saved to .autocode/config.yml');
126
- }
127
- // Step 4: Ensure tunnel exists
128
- let tunnelInfo = getTunnelInfo(tunnelConfig.name);
129
- if (!tunnelInfo) {
130
- logger.info(`Creating tunnel "${tunnelConfig.name}"...`);
131
- const createResult = createTunnel(tunnelConfig.name);
132
- if (!createResult.success) {
133
- logger.error(`Failed to create tunnel: ${createResult.error}`);
134
- process.exit(1);
135
- }
136
- tunnelInfo = { id: createResult.id, name: tunnelConfig.name };
137
- logger.success(`Tunnel "${tunnelConfig.name}" created`);
138
- }
139
- // Step 5: Configure DNS route
140
- logger.info(`Configuring DNS route for ${tunnelConfig.hostname}...`);
141
- const routeResult = routeTunnelDns(tunnelConfig.name, tunnelConfig.hostname);
142
- if (!routeResult.success && !routeResult.alreadyExists) {
143
- logger.error(`Failed to configure DNS: ${routeResult.error}`);
144
- process.exit(1);
145
- }
146
- if (routeResult.alreadyExists) {
147
- logger.info(`DNS route for ${tunnelConfig.hostname} already configured`);
148
- }
149
- else {
150
- logger.success(`DNS route configured: ${tunnelConfig.hostname}`);
151
- }
152
- // Step 6: Generate cloudflared config and run tunnel
153
- let cloudflaredConfigPath;
111
+ logger.info('Setting up Cloudflare tunnel...');
154
112
  try {
155
- cloudflaredConfigPath = generateCloudflaredConfig(config.root, tunnelInfo.id, tunnelConfig.hostname, port);
113
+ // Get or create tunnel (reuses existing if alive)
114
+ const { url, reused } = await getOrCreateTunnel(config.root, port);
115
+ if (reused) {
116
+ logger.info('Reusing existing tunnel');
117
+ }
118
+ else {
119
+ logger.success('New tunnel created');
120
+ }
121
+ logger.success(`Dashboard exposed at: ${url}`);
122
+ setTunnelUrl(url);
123
+ // Start supervisor to monitor and restart tunnel if it dies
124
+ const supervisorInterval = startTunnelSupervisor(config.root, port, (newUrl) => {
125
+ logger.warn('Tunnel died, restarted with new URL');
126
+ logger.success(`Dashboard exposed at: ${newUrl}`);
127
+ setTunnelUrl(newUrl);
128
+ });
129
+ // Note: We do NOT kill the tunnel on Ctrl+C
130
+ // The tunnel persists independently
131
+ logger.info('Tunnel runs independently (survives Ctrl+C)');
132
+ logger.info('Use "autocode tunnel stop" to stop it manually');
133
+ // Clean up supervisor interval on exit (but not the tunnel)
134
+ const cleanup = () => {
135
+ clearInterval(supervisorInterval);
136
+ process.exit(0);
137
+ };
138
+ process.on('SIGINT', cleanup);
139
+ process.on('SIGTERM', cleanup);
156
140
  }
157
141
  catch (error) {
158
- logger.error(`Failed to generate tunnel config: ${error}`);
142
+ logger.error(`Failed to setup tunnel: ${error}`);
159
143
  process.exit(1);
160
144
  }
161
- logger.info('Starting Cloudflare tunnel...');
162
- const tunnel = runTunnel(cloudflaredConfigPath, tunnelConfig.name);
163
- // Monitor tunnel stderr for connection status
164
- tunnel.stderr?.on('data', (data) => {
165
- const output = data.toString();
166
- // Log connection events
167
- if (output.includes('Registered tunnel connection')) {
168
- logger.info('Tunnel connected');
169
- }
170
- });
171
- // Step 7: Broadcast the persistent URL
172
- const url = `https://${tunnelConfig.hostname}`;
173
- logger.success(`Dashboard exposed at: ${url}`);
174
- setTunnelUrl(url);
175
- // Cleanup on exit
176
- const cleanup = () => {
177
- tunnel.kill();
178
- process.exit(0);
179
- };
180
- process.on('SIGINT', cleanup);
181
- process.on('SIGTERM', cleanup);
182
145
  }
183
146
  }
184
147
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * tunnel command - Manage Cloudflare tunnel
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the tunnel command
7
+ */
8
+ export declare function tunnelCommand(): Command;
9
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAuFvC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * tunnel command - Manage Cloudflare tunnel
3
+ */
4
+ import { Command } from 'commander';
5
+ import { getConfig, DEFAULT_PORT } from '../../utils/config.js';
6
+ import { logger } from '../../utils/logger.js';
7
+ import { isCloudflaredInstalled, getTunnelStatus, stopTunnel, startDetachedTunnel, } from '../../utils/tunnel.js';
8
+ /**
9
+ * Create the tunnel command
10
+ */
11
+ export function tunnelCommand() {
12
+ const cmd = new Command('tunnel');
13
+ cmd.description('Manage Cloudflare tunnel');
14
+ // tunnel status
15
+ cmd
16
+ .command('status')
17
+ .description('Show tunnel status')
18
+ .action(() => {
19
+ const config = getConfig();
20
+ const status = getTunnelStatus(config.root);
21
+ if (!status.state) {
22
+ logger.info('No tunnel configured');
23
+ return;
24
+ }
25
+ if (status.running) {
26
+ logger.success('Tunnel is running');
27
+ logger.info(` URL: ${status.state.url}`);
28
+ logger.info(` PID: ${status.state.pid}`);
29
+ logger.info(` Port: ${status.state.port}`);
30
+ logger.info(` Uptime: ${status.uptime}`);
31
+ }
32
+ else {
33
+ logger.warn('Tunnel is not running (stale state found)');
34
+ logger.info(` Last URL: ${status.state.url}`);
35
+ logger.info(` Last PID: ${status.state.pid}`);
36
+ }
37
+ });
38
+ // tunnel stop
39
+ cmd
40
+ .command('stop')
41
+ .description('Stop the tunnel')
42
+ .action(() => {
43
+ const config = getConfig();
44
+ const status = getTunnelStatus(config.root);
45
+ if (!status.state) {
46
+ logger.info('No tunnel to stop');
47
+ return;
48
+ }
49
+ if (stopTunnel(config.root)) {
50
+ logger.success('Tunnel stopped');
51
+ }
52
+ else {
53
+ logger.warn('Tunnel was not running');
54
+ }
55
+ });
56
+ // tunnel restart
57
+ cmd
58
+ .command('restart')
59
+ .description('Restart the tunnel (new URL)')
60
+ .option('-p, --port <port>', 'Server port', String(DEFAULT_PORT))
61
+ .action(async (options) => {
62
+ const config = getConfig();
63
+ const port = parseInt(options.port, 10) || DEFAULT_PORT;
64
+ // Check cloudflared
65
+ if (!isCloudflaredInstalled()) {
66
+ logger.error('cloudflared is not installed');
67
+ logger.info('Install: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/');
68
+ process.exit(1);
69
+ }
70
+ // Stop existing
71
+ const status = getTunnelStatus(config.root);
72
+ if (status.running) {
73
+ logger.info('Stopping existing tunnel...');
74
+ stopTunnel(config.root);
75
+ }
76
+ // Start new
77
+ logger.info('Starting new tunnel...');
78
+ try {
79
+ const { url } = await startDetachedTunnel(config.root, port);
80
+ logger.success('Tunnel restarted');
81
+ logger.info(` URL: ${url}`);
82
+ }
83
+ catch (error) {
84
+ logger.error(`Failed to start tunnel: ${error}`);
85
+ process.exit(1);
86
+ }
87
+ });
88
+ return cmd;
89
+ }
90
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../../src/cli/commands/tunnel.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAoCvC;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAqCvC;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE"}
@@ -14,6 +14,7 @@ import { syncCommand } from './commands/sync.js';
14
14
  import { statsCommand } from './commands/stats.js';
15
15
  import { parentCommand } from './commands/parent.js';
16
16
  import { pipelineCommand } from './commands/pipeline.js';
17
+ import { tunnelCommand } from './commands/tunnel.js';
17
18
  import { getCurrentVersion, checkAndNotify } from '../utils/version-check.js';
18
19
  /**
19
20
  * Create and configure the CLI program
@@ -37,6 +38,7 @@ export function createProgram() {
37
38
  program.addCommand(statsCommand());
38
39
  program.addCommand(parentCommand());
39
40
  program.addCommand(pipelineCommand());
41
+ program.addCommand(tunnelCommand());
40
42
  // Shortcut: autocode AC-000001 => show
41
43
  program
42
44
  .argument('[key]', 'Issue key to show details')
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,mDAAmD,CAAC;SAChE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEhC,oBAAoB;IACpB,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IAEtC,uCAAuC;IACvC,OAAO;SACJ,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;SAC9C,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,+BAA+B;YAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAiB,OAAO,CAAC,IAAI;IACxD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"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"}
@@ -201,17 +201,12 @@ export interface ProjectContext {
201
201
  projectDescription: string;
202
202
  }
203
203
  /**
204
- * Tunnel configuration for Cloudflare named tunnels
204
+ * Tunnel state for persistent quick tunnels
205
205
  */
206
- export interface TunnelConfig {
207
- name: string;
208
- hostname: string;
209
- }
210
- /**
211
- * Tunnel info from cloudflared
212
- */
213
- export interface TunnelInfo {
214
- id: string;
215
- name: string;
206
+ export interface TunnelState {
207
+ pid: number;
208
+ url: string;
209
+ port: number;
210
+ startedAt: string;
216
211
  }
217
212
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAAgD,CAAC;AAEzG;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE;QACR,UAAU,EAAE,cAAc,CAAC;QAC3B,MAAM,EAAE,cAAc,CAAC;QACvB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,gBAAgB,CAAC;IAC/B,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,mBAAmB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;IAC7C,cAAc,EAAE,gBAAgB,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -1,51 +1,62 @@
1
1
  /**
2
- * Cloudflare tunnel management utilities
2
+ * Cloudflare quick tunnel management (daemon mode)
3
+ * Tunnel persists independently of autocode process
3
4
  */
4
- import { type ChildProcess } from 'node:child_process';
5
- import type { TunnelConfig, TunnelInfo } from '../types/index.js';
5
+ import type { TunnelState } from '../types/index.js';
6
6
  /**
7
7
  * Check if cloudflared is installed
8
8
  */
9
9
  export declare function isCloudflaredInstalled(): boolean;
10
10
  /**
11
- * Check if user is logged in to Cloudflare
11
+ * Load tunnel state from .autocode/tunnel.json
12
12
  */
13
- export declare function isCloudflaredLoggedIn(): boolean;
13
+ export declare function loadTunnelState(rootDir: string): TunnelState | null;
14
14
  /**
15
- * Load tunnel config from .autocode/config.yml
15
+ * Save tunnel state to .autocode/tunnel.json
16
16
  */
17
- export declare function loadTunnelConfig(rootDir: string): TunnelConfig | null;
17
+ export declare function saveTunnelState(rootDir: string, state: TunnelState): void;
18
18
  /**
19
- * Save tunnel config to .autocode/config.yml
19
+ * Delete tunnel state file
20
20
  */
21
- export declare function saveTunnelConfig(rootDir: string, tunnelConfig: TunnelConfig): void;
21
+ export declare function deleteTunnelState(rootDir: string): void;
22
22
  /**
23
- * Get tunnel info by name
23
+ * Check if a process is alive by PID
24
24
  */
25
- export declare function getTunnelInfo(name: string): TunnelInfo | null;
25
+ export declare function isProcessAlive(pid: number): boolean;
26
26
  /**
27
- * Create a new tunnel
27
+ * Check if tunnel is alive and functional
28
28
  */
29
- export declare function createTunnel(name: string): {
30
- success: boolean;
31
- error?: string;
32
- id?: string;
33
- };
29
+ export declare function isTunnelAlive(state: TunnelState): boolean;
34
30
  /**
35
- * Configure DNS route for tunnel
31
+ * Stop the tunnel by killing the process
36
32
  */
37
- export declare function routeTunnelDns(name: string, hostname: string): {
38
- success: boolean;
39
- error?: string;
40
- alreadyExists?: boolean;
41
- };
33
+ export declare function stopTunnel(rootDir: string): boolean;
34
+ /**
35
+ * Start a detached cloudflared tunnel
36
+ * Returns a promise that resolves with the tunnel URL
37
+ */
38
+ export declare function startDetachedTunnel(rootDir: string, port: number): Promise<{
39
+ pid: number;
40
+ url: string;
41
+ }>;
42
42
  /**
43
- * Generate cloudflared config file for running the tunnel
44
- * Returns the path to the generated config file
43
+ * Get or create a tunnel
44
+ * Reuses existing tunnel if alive, creates new one otherwise
45
45
  */
46
- export declare function generateCloudflaredConfig(rootDir: string, tunnelId: string, hostname: string, localPort: number): string;
46
+ export declare function getOrCreateTunnel(rootDir: string, port: number): Promise<{
47
+ url: string;
48
+ reused: boolean;
49
+ }>;
47
50
  /**
48
- * Run the tunnel with the given config
51
+ * Tunnel supervisor - monitors and restarts tunnel if it dies
49
52
  */
50
- export declare function runTunnel(configPath: string, tunnelName: string): ChildProcess;
53
+ export declare function startTunnelSupervisor(rootDir: string, port: number, onUrlChange: (url: string) => void, intervalMs?: number): NodeJS.Timeout;
54
+ /**
55
+ * Get tunnel status info
56
+ */
57
+ export declare function getTunnelStatus(rootDir: string): {
58
+ running: boolean;
59
+ state: TunnelState | null;
60
+ uptime: string | null;
61
+ };
51
62
  //# sourceMappingURL=tunnel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/utils/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAmBrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CA0BlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAkB7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CA+B5F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAkB/D;AAiCD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CA6BR;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAM9E"}
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/utils/tunnel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAanE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAGzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAiBnD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAsEvC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAClC,UAAU,SAAQ,GACjB,MAAM,CAAC,OAAO,CAmBhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CA4BA"}
@@ -1,11 +1,18 @@
1
1
  /**
2
- * Cloudflare tunnel management utilities
2
+ * Cloudflare quick tunnel management (daemon mode)
3
+ * Tunnel persists independently of autocode process
3
4
  */
4
5
  import { execSync, spawn } from 'node:child_process';
5
- import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs';
6
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
6
7
  import { join } from 'node:path';
7
- import { homedir } from 'node:os';
8
- import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
8
+ const TUNNEL_STATE_FILE = 'tunnel.json';
9
+ const URL_EXTRACTION_TIMEOUT = 30000; // 30 seconds to get URL
10
+ /**
11
+ * Get tunnel state file path
12
+ */
13
+ function getTunnelStatePath(rootDir) {
14
+ return join(rootDir, '.autocode', TUNNEL_STATE_FILE);
15
+ }
9
16
  /**
10
17
  * Check if cloudflared is installed
11
18
  */
@@ -19,206 +26,215 @@ export function isCloudflaredInstalled() {
19
26
  }
20
27
  }
21
28
  /**
22
- * Check if user is logged in to Cloudflare
23
- */
24
- export function isCloudflaredLoggedIn() {
25
- try {
26
- // Try to list tunnels - will fail if not logged in
27
- execSync('cloudflared tunnel list', { stdio: 'pipe' });
28
- return true;
29
- }
30
- catch (error) {
31
- // Check if error message contains auth-related text
32
- const stderr = error?.stderr?.toString() || '';
33
- if (stderr.includes('login') ||
34
- stderr.includes('certificate') ||
35
- stderr.includes('cert.pem') ||
36
- stderr.includes('You must obtain a certificate')) {
37
- return false;
38
- }
39
- // Other error (e.g., no tunnels) - still logged in
40
- return true;
41
- }
42
- }
43
- /**
44
- * Load tunnel config from .autocode/config.yml
29
+ * Load tunnel state from .autocode/tunnel.json
45
30
  */
46
- export function loadTunnelConfig(rootDir) {
47
- const configPath = join(rootDir, '.autocode', 'config.yml');
48
- if (!existsSync(configPath)) {
31
+ export function loadTunnelState(rootDir) {
32
+ const statePath = getTunnelStatePath(rootDir);
33
+ if (!existsSync(statePath)) {
49
34
  return null;
50
35
  }
51
36
  try {
52
- const content = readFileSync(configPath, 'utf-8');
53
- const config = yamlParse(content);
54
- if (config?.tunnel?.name && config?.tunnel?.hostname) {
55
- return config.tunnel;
56
- }
57
- return null;
37
+ const content = readFileSync(statePath, 'utf-8');
38
+ return JSON.parse(content);
58
39
  }
59
40
  catch {
60
41
  return null;
61
42
  }
62
43
  }
63
44
  /**
64
- * Save tunnel config to .autocode/config.yml
45
+ * Save tunnel state to .autocode/tunnel.json
65
46
  */
66
- export function saveTunnelConfig(rootDir, tunnelConfig) {
67
- const configDir = join(rootDir, '.autocode');
68
- const configPath = join(configDir, 'config.yml');
69
- // Ensure directory exists
70
- if (!existsSync(configDir)) {
71
- mkdirSync(configDir, { recursive: true });
72
- }
73
- // Load existing config or create new
74
- let config = {};
75
- if (existsSync(configPath)) {
76
- try {
77
- const content = readFileSync(configPath, 'utf-8');
78
- config = yamlParse(content) || {};
79
- }
80
- catch {
81
- config = {};
82
- }
83
- }
84
- // Update tunnel section
85
- config.tunnel = tunnelConfig;
86
- // Write back
87
- writeFileSync(configPath, yamlStringify(config));
47
+ export function saveTunnelState(rootDir, state) {
48
+ const statePath = getTunnelStatePath(rootDir);
49
+ writeFileSync(statePath, JSON.stringify(state, null, 2));
88
50
  }
89
51
  /**
90
- * Get tunnel info by name
52
+ * Delete tunnel state file
91
53
  */
92
- export function getTunnelInfo(name) {
93
- try {
94
- const output = execSync('cloudflared tunnel list -o json', {
95
- encoding: 'utf-8',
96
- stdio: ['pipe', 'pipe', 'pipe'],
97
- });
98
- const tunnels = JSON.parse(output);
99
- const tunnel = tunnels.find((t) => t.name === name);
100
- if (tunnel) {
101
- return { id: tunnel.id, name: tunnel.name };
102
- }
103
- return null;
104
- }
105
- catch {
106
- return null;
54
+ export function deleteTunnelState(rootDir) {
55
+ const statePath = getTunnelStatePath(rootDir);
56
+ if (existsSync(statePath)) {
57
+ unlinkSync(statePath);
107
58
  }
108
59
  }
109
60
  /**
110
- * Create a new tunnel
61
+ * Check if a process is alive by PID
111
62
  */
112
- export function createTunnel(name) {
63
+ export function isProcessAlive(pid) {
113
64
  try {
114
- const output = execSync(`cloudflared tunnel create ${name}`, {
115
- encoding: 'utf-8',
116
- stdio: ['pipe', 'pipe', 'pipe'],
117
- });
118
- // Extract tunnel ID from output
119
- const match = output.match(/Created tunnel ([a-f0-9-]+)/);
120
- const id = match ? match[1] : undefined;
121
- // If no ID from output, try to get it from list
122
- if (!id) {
123
- const info = getTunnelInfo(name);
124
- if (info) {
125
- return { success: true, id: info.id };
126
- }
127
- }
128
- return { success: true, id };
129
- }
130
- catch (error) {
131
- const stderr = error?.stderr?.toString() || '';
132
- // Tunnel already exists is not an error
133
- if (stderr.includes('already exists')) {
134
- const info = getTunnelInfo(name);
135
- return { success: true, id: info?.id };
136
- }
137
- return { success: false, error: stderr || 'Failed to create tunnel' };
65
+ process.kill(pid, 0); // Signal 0 = just check
66
+ return true;
67
+ }
68
+ catch {
69
+ return false;
138
70
  }
139
71
  }
140
72
  /**
141
- * Configure DNS route for tunnel
73
+ * Check if tunnel is alive and functional
142
74
  */
143
- export function routeTunnelDns(name, hostname) {
75
+ export function isTunnelAlive(state) {
76
+ // Check if process exists
77
+ if (!isProcessAlive(state.pid)) {
78
+ return false;
79
+ }
80
+ // Verify it's actually a cloudflared process
144
81
  try {
145
- execSync(`cloudflared tunnel route dns ${name} ${hostname}`, {
146
- encoding: 'utf-8',
147
- stdio: ['pipe', 'pipe', 'pipe'],
148
- });
149
- return { success: true };
82
+ const cmdline = execSync(`ps -p ${state.pid} -o comm=`, { encoding: 'utf-8' }).trim();
83
+ return cmdline.includes('cloudflared');
150
84
  }
151
- catch (error) {
152
- const stderr = error?.stderr?.toString() || '';
153
- // DNS record already exists
154
- if (stderr.includes('already exists') || stderr.includes('already associated')) {
155
- return { success: true, alreadyExists: true };
156
- }
157
- return { success: false, error: stderr || 'Failed to configure DNS route' };
85
+ catch {
86
+ return false;
158
87
  }
159
88
  }
160
89
  /**
161
- * Find credentials file for a tunnel
90
+ * Stop the tunnel by killing the process
162
91
  */
163
- function findCredentialsFile(tunnelId) {
164
- const cloudflaredDir = join(homedir(), '.cloudflared');
165
- if (!existsSync(cloudflaredDir)) {
166
- return null;
167
- }
168
- // Look for <tunnelId>.json
169
- const credFile = join(cloudflaredDir, `${tunnelId}.json`);
170
- if (existsSync(credFile)) {
171
- return credFile;
92
+ export function stopTunnel(rootDir) {
93
+ const state = loadTunnelState(rootDir);
94
+ if (!state) {
95
+ return false;
172
96
  }
173
- // Try to find any matching JSON file
174
97
  try {
175
- const files = readdirSync(cloudflaredDir);
176
- for (const file of files) {
177
- if (file.endsWith('.json') && file.includes(tunnelId.substring(0, 8))) {
178
- return join(cloudflaredDir, file);
179
- }
98
+ if (isProcessAlive(state.pid)) {
99
+ process.kill(state.pid, 'SIGTERM');
180
100
  }
181
101
  }
182
102
  catch {
183
- // Ignore
103
+ // Process might already be dead
184
104
  }
185
- return null;
105
+ deleteTunnelState(rootDir);
106
+ return true;
186
107
  }
187
108
  /**
188
- * Generate cloudflared config file for running the tunnel
189
- * Returns the path to the generated config file
109
+ * Start a detached cloudflared tunnel
110
+ * Returns a promise that resolves with the tunnel URL
190
111
  */
191
- export function generateCloudflaredConfig(rootDir, tunnelId, hostname, localPort) {
192
- const configDir = join(rootDir, '.autocode');
193
- const configPath = join(configDir, 'cloudflared.yml');
194
- // Find credentials file
195
- const credentialsFile = findCredentialsFile(tunnelId);
196
- if (!credentialsFile) {
197
- throw new Error(`Credentials file not found for tunnel ${tunnelId}`);
198
- }
199
- // Ensure directory exists
200
- if (!existsSync(configDir)) {
201
- mkdirSync(configDir, { recursive: true });
202
- }
203
- // Generate config
204
- const config = {
205
- tunnel: tunnelId,
206
- 'credentials-file': credentialsFile,
207
- ingress: [
208
- { hostname, service: `http://localhost:${localPort}` },
209
- { service: 'http_status:404' },
210
- ],
112
+ export function startDetachedTunnel(rootDir, port) {
113
+ return new Promise((resolve, reject) => {
114
+ const tunnel = spawn('cloudflared', ['tunnel', '--url', `http://localhost:${port}`], {
115
+ detached: true,
116
+ stdio: ['ignore', 'pipe', 'pipe'],
117
+ });
118
+ if (!tunnel.pid) {
119
+ reject(new Error('Failed to start cloudflared process'));
120
+ return;
121
+ }
122
+ const pid = tunnel.pid;
123
+ let url = null;
124
+ let resolved = false;
125
+ // Timeout for URL extraction
126
+ const timeout = setTimeout(() => {
127
+ if (!resolved) {
128
+ resolved = true;
129
+ tunnel.unref();
130
+ reject(new Error('Timeout waiting for tunnel URL'));
131
+ }
132
+ }, URL_EXTRACTION_TIMEOUT);
133
+ // Extract URL from stderr
134
+ tunnel.stderr?.on('data', (data) => {
135
+ if (resolved)
136
+ return;
137
+ const output = data.toString();
138
+ const match = output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/);
139
+ if (match) {
140
+ url = match[0];
141
+ resolved = true;
142
+ clearTimeout(timeout);
143
+ // Save state
144
+ const state = {
145
+ pid,
146
+ url,
147
+ port,
148
+ startedAt: new Date().toISOString(),
149
+ };
150
+ saveTunnelState(rootDir, state);
151
+ // Detach the process
152
+ tunnel.unref();
153
+ resolve({ pid, url });
154
+ }
155
+ });
156
+ // Handle process exit before URL is found
157
+ tunnel.on('exit', (code) => {
158
+ if (!resolved) {
159
+ resolved = true;
160
+ clearTimeout(timeout);
161
+ reject(new Error(`cloudflared exited with code ${code} before providing URL`));
162
+ }
163
+ });
164
+ tunnel.on('error', (err) => {
165
+ if (!resolved) {
166
+ resolved = true;
167
+ clearTimeout(timeout);
168
+ reject(err);
169
+ }
170
+ });
171
+ });
172
+ }
173
+ /**
174
+ * Get or create a tunnel
175
+ * Reuses existing tunnel if alive, creates new one otherwise
176
+ */
177
+ export async function getOrCreateTunnel(rootDir, port) {
178
+ const state = loadTunnelState(rootDir);
179
+ // Check if existing tunnel is alive and on the same port
180
+ if (state && state.port === port && isTunnelAlive(state)) {
181
+ return { url: state.url, reused: true };
182
+ }
183
+ // Stop old tunnel if exists but not functional
184
+ if (state) {
185
+ stopTunnel(rootDir);
186
+ }
187
+ // Start new tunnel
188
+ const { url } = await startDetachedTunnel(rootDir, port);
189
+ return { url, reused: false };
190
+ }
191
+ /**
192
+ * Tunnel supervisor - monitors and restarts tunnel if it dies
193
+ */
194
+ export function startTunnelSupervisor(rootDir, port, onUrlChange, intervalMs = 30000) {
195
+ const checkAndRestart = async () => {
196
+ const state = loadTunnelState(rootDir);
197
+ if (!state || !isTunnelAlive(state)) {
198
+ try {
199
+ // Tunnel is dead, restart it
200
+ const { url } = await startDetachedTunnel(rootDir, port);
201
+ onUrlChange(url);
202
+ }
203
+ catch {
204
+ // Failed to restart, will retry next interval
205
+ }
206
+ }
211
207
  };
212
- writeFileSync(configPath, yamlStringify(config));
213
- return configPath;
208
+ // Start periodic check
209
+ const interval = setInterval(checkAndRestart, intervalMs);
210
+ return interval;
214
211
  }
215
212
  /**
216
- * Run the tunnel with the given config
213
+ * Get tunnel status info
217
214
  */
218
- export function runTunnel(configPath, tunnelName) {
219
- const tunnel = spawn('cloudflared', ['tunnel', '--config', configPath, 'run', tunnelName], {
220
- stdio: ['ignore', 'pipe', 'pipe'],
221
- });
222
- return tunnel;
215
+ export function getTunnelStatus(rootDir) {
216
+ const state = loadTunnelState(rootDir);
217
+ if (!state) {
218
+ return { running: false, state: null, uptime: null };
219
+ }
220
+ const running = isTunnelAlive(state);
221
+ if (!running) {
222
+ return { running: false, state, uptime: null };
223
+ }
224
+ // Calculate uptime
225
+ const startedAt = new Date(state.startedAt);
226
+ const now = new Date();
227
+ const diffMs = now.getTime() - startedAt.getTime();
228
+ const diffSecs = Math.floor(diffMs / 1000);
229
+ const hours = Math.floor(diffSecs / 3600);
230
+ const minutes = Math.floor((diffSecs % 3600) / 60);
231
+ const seconds = diffSecs % 60;
232
+ let uptime = '';
233
+ if (hours > 0)
234
+ uptime += `${hours}h `;
235
+ if (minutes > 0 || hours > 0)
236
+ uptime += `${minutes}m `;
237
+ uptime += `${seconds}s`;
238
+ return { running: true, state, uptime: uptime.trim() };
223
239
  }
224
240
  //# sourceMappingURL=tunnel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/utils/tunnel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/utils/tunnel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autocode-cli/autocode",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Filesystem-based issues system with web dashboard",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,13 +0,0 @@
1
- /**
2
- * Interactive prompt utilities for CLI
3
- */
4
- import type { TunnelConfig } from '../types/index.js';
5
- /**
6
- * Prompt user for input with optional validation
7
- */
8
- export declare function promptInput(message: string, validate?: (input: string) => string | true): Promise<string>;
9
- /**
10
- * Prompt for tunnel configuration (name and hostname)
11
- */
12
- export declare function promptTunnelConfig(): Promise<TunnelConfig>;
13
- //# sourceMappingURL=prompt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAC1C,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CA+BhE"}
@@ -1,59 +0,0 @@
1
- /**
2
- * Interactive prompt utilities for CLI
3
- */
4
- import { createInterface } from 'node:readline';
5
- /**
6
- * Prompt user for input with optional validation
7
- */
8
- export function promptInput(message, validate) {
9
- return new Promise((resolve) => {
10
- const rl = createInterface({
11
- input: process.stdin,
12
- output: process.stdout,
13
- });
14
- const ask = () => {
15
- rl.question(message, (answer) => {
16
- const trimmed = answer.trim();
17
- if (validate) {
18
- const result = validate(trimmed);
19
- if (result !== true) {
20
- console.log(` ⚠ ${result}`);
21
- ask(); // Re-ask
22
- return;
23
- }
24
- }
25
- rl.close();
26
- resolve(trimmed);
27
- });
28
- };
29
- ask();
30
- });
31
- }
32
- /**
33
- * Prompt for tunnel configuration (name and hostname)
34
- */
35
- export async function promptTunnelConfig() {
36
- console.log('');
37
- console.log('Configuration du tunnel Cloudflare');
38
- console.log('───────────────────────────────────');
39
- console.log('');
40
- const name = await promptInput('Nom du tunnel (ex: mon-projet): ', (input) => {
41
- if (!input)
42
- return 'Le nom du tunnel est requis';
43
- if (!/^[a-z0-9-]+$/.test(input)) {
44
- return 'Le nom doit contenir uniquement des lettres minuscules, chiffres et tirets';
45
- }
46
- return true;
47
- });
48
- const hostname = await promptInput('Hostname complet (ex: dev.mondomaine.com): ', (input) => {
49
- if (!input)
50
- return 'Le hostname est requis';
51
- if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/.test(input)) {
52
- return 'Format invalide (ex: sous-domaine.domaine.com)';
53
- }
54
- return true;
55
- });
56
- console.log('');
57
- return { name, hostname };
58
- }
59
- //# sourceMappingURL=prompt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,QAA2C;IAE3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,GAAS,EAAE;YACrB,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE9B,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACjC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBACpB,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;wBAC7B,GAAG,EAAE,CAAC,CAAC,SAAS;wBAChB,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,GAAG,EAAE,CAAC;IACR,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,kCAAkC,EAClC,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,CAAC,KAAK;YAAE,OAAO,6BAA6B,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,4EAA4E,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,6CAA6C,EAC7C,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,CAAC,KAAK;YAAE,OAAO,wBAAwB,CAAC;QAC5C,IAAI,CAAC,mEAAmE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,OAAO,gDAAgD,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC"}