@autocode-cli/autocode 0.1.23 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +33 -70
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/tunnel.d.ts +9 -0
- package/dist/cli/commands/tunnel.d.ts.map +1 -0
- package/dist/cli/commands/tunnel.js +90 -0
- package/dist/cli/commands/tunnel.js.map +1 -0
- package/dist/cli/parser.d.ts.map +1 -1
- package/dist/cli/parser.js +2 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/server/dashboard/pages/autocreate.d.ts.map +1 -1
- package/dist/server/dashboard/pages/autocreate.js +7 -0
- package/dist/server/dashboard/pages/autocreate.js.map +1 -1
- package/dist/server/dashboard/pages/pipeline-configurator.d.ts.map +1 -1
- package/dist/server/dashboard/pages/pipeline-configurator.js +25 -8
- package/dist/server/dashboard/pages/pipeline-configurator.js.map +1 -1
- package/dist/types/index.d.ts +6 -11
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/tunnel.d.ts +39 -28
- package/dist/utils/tunnel.d.ts.map +1 -1
- package/dist/utils/tunnel.js +179 -163
- package/dist/utils/tunnel.js.map +1 -1
- package/package.json +1 -1
- package/dist/utils/prompt.d.ts +0 -13
- package/dist/utils/prompt.d.ts.map +0 -1
- package/dist/utils/prompt.js +0 -59
- package/dist/utils/prompt.js.map +0 -1
|
@@ -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;
|
|
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,
|
|
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
|
|
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
|
|
103
|
+
// Start Cloudflare tunnel if --expose option is set
|
|
105
104
|
if (options.expose) {
|
|
106
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,yCAAyC;QACzC,QAAQ,CAAC,YAAY,IAAI,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,mDAAmD;YACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,IAAI,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnF,IAAI,GAAG,EAAE,CAAC;gBACR,QAAQ,CAAC,WAAW,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC,GAAG;SACA,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;SAChE,MAAM,CAAC,cAAc,EAAE,qDAAqD,CAAC;SAC7E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;QACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,6CAA6C;QAC7C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;YAE1D,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEvB,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACtE,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEnC,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC5E,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAE9C,mBAAmB;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACvD,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,2BAA2B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,wCAAwC;QACxC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtB,+DAA+D;QAC/D,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,wBAAwB;YACxB,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAEvG,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC;gBACzF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;gBAC9F,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;YAC/F,CAAC;YAED,8BAA8B;YAC9B,IAAI,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,MAAM,2BAA2B,CAAC,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5C,2DAA2D;QAC3D,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC9D,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YAExB,oDAAoD;YACpD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,oCAAoC;gBACpC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;oBAC9B,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBAC7C,MAAM,CAAC,IAAI,CAAC,mGAAmG,CAAC,CAAC;oBACjH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAE/C,IAAI,CAAC;oBACH,kDAAkD;oBAClD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAEnE,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBACzC,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;oBACvC,CAAC;oBAED,MAAM,CAAC,OAAO,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;oBAC/C,YAAY,CAAC,GAAG,CAAC,CAAC;oBAElB,4DAA4D;oBAC5D,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,MAAM,CAAC,IAAI,EACX,IAAI,EACJ,CAAC,MAAM,EAAE,EAAE;wBACT,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;wBACnD,MAAM,CAAC,OAAO,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;wBAClD,YAAY,CAAC,MAAM,CAAC,CAAC;oBACvB,CAAC,CACF,CAAC;oBAEF,4CAA4C;oBAC5C,oCAAoC;oBACpC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;oBAC3D,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;oBAE9D,4DAA4D;oBAC5D,MAAM,OAAO,GAAG,GAAG,EAAE;wBACnB,aAAa,CAAC,kBAAkB,CAAC,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC,CAAC;oBACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEjC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;oBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -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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"}
|
package/dist/cli/parser.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/cli/parser.js
CHANGED
|
@@ -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')
|
package/dist/cli/parser.js.map
CHANGED
|
@@ -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;
|
|
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,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,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;IACtC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IAEpC,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocreate.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/autocreate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"autocreate.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/autocreate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA60B3D"}
|
|
@@ -430,6 +430,7 @@ export function generateAutocreatePage(lang) {
|
|
|
430
430
|
<button class="btn btn-primary btn-large" id="analyzeBtn" onclick="startAnalysis()">
|
|
431
431
|
<span id="analyzeBtnText">Start Analysis</span>
|
|
432
432
|
</button>
|
|
433
|
+
<p style="margin-top: 16px; font-size: 13px; color: var(--muted);" id="cliTip">Tip: Run <code style="background: var(--bg-card); padding: 2px 6px; border-radius: 4px;">autocode pipeline catalog list</code> to see all available columns in the catalog.</p>
|
|
433
434
|
</div>
|
|
434
435
|
|
|
435
436
|
<!-- Loading state -->
|
|
@@ -513,6 +514,7 @@ export function generateAutocreatePage(lang) {
|
|
|
513
514
|
pageTitle: 'Autocreate Columns',
|
|
514
515
|
analyzeTitle: 'Analyze Your Project',
|
|
515
516
|
analyzeDesc: "Claude will analyze your project's codebase and suggest relevant pipeline columns based on your technology stack, dependencies, and project structure.",
|
|
517
|
+
cliTip: 'Tip: Run <code style="background: var(--bg-card); padding: 2px 6px; border-radius: 4px;">autocode pipeline catalog list</code> to see all available columns in the catalog.',
|
|
516
518
|
startAnalysis: 'Start Analysis',
|
|
517
519
|
loading: 'Analyzing your project...',
|
|
518
520
|
loadingHint: 'This may take several minutes for exhaustive analysis',
|
|
@@ -542,6 +544,7 @@ export function generateAutocreatePage(lang) {
|
|
|
542
544
|
pageTitle: 'Autocreate Colonnes',
|
|
543
545
|
analyzeTitle: 'Analysez votre projet',
|
|
544
546
|
analyzeDesc: 'Claude analysera votre codebase et suggérera des colonnes de pipeline pertinentes en fonction de votre stack technologique, dépendances et structure du projet.',
|
|
547
|
+
cliTip: 'Astuce : Exécutez <code style="background: var(--bg-card); padding: 2px 6px; border-radius: 4px;">autocode pipeline catalog list</code> pour voir toutes les colonnes disponibles dans le catalogue.',
|
|
545
548
|
startAnalysis: 'Lancer l\\'analyse',
|
|
546
549
|
loading: 'Analyse de votre projet...',
|
|
547
550
|
loadingHint: 'Cela peut prendre plusieurs minutes pour une analyse exhaustive',
|
|
@@ -596,6 +599,7 @@ export function generateAutocreatePage(lang) {
|
|
|
596
599
|
document.getElementById('backBtn').textContent = t('backBtn');
|
|
597
600
|
document.getElementById('analyzeTitle').textContent = t('analyzeTitle');
|
|
598
601
|
document.getElementById('analyzeDesc').textContent = t('analyzeDesc');
|
|
602
|
+
document.getElementById('cliTip').innerHTML = t('cliTip');
|
|
599
603
|
document.getElementById('analyzeBtnText').textContent = t('startAnalysis');
|
|
600
604
|
document.getElementById('loadingText').textContent = t('loading');
|
|
601
605
|
document.getElementById('loadingHint').textContent = t('loadingHint');
|
|
@@ -652,6 +656,9 @@ export function generateAutocreatePage(lang) {
|
|
|
652
656
|
|
|
653
657
|
showSection('resultsSection');
|
|
654
658
|
renderResults();
|
|
659
|
+
// Update translated titles after showing results
|
|
660
|
+
document.getElementById('assumptionsTitle').textContent = t('assumptionsTitle');
|
|
661
|
+
document.getElementById('risksTitle').textContent = t('risksTitle');
|
|
655
662
|
} catch (error) {
|
|
656
663
|
document.getElementById('errorMessage').textContent = error.message;
|
|
657
664
|
showSection('errorSection');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocreate.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/autocreate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO;cACK,IAAI
|
|
1
|
+
{"version":3,"file":"autocreate.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/autocreate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO;cACK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA00BV,CAAC;AACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-configurator.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"pipeline-configurator.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+3DrE"}
|
|
@@ -580,7 +580,6 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
580
580
|
<button class="lang-btn" data-lang="en">EN</button>
|
|
581
581
|
<button class="lang-btn" data-lang="fr">FR</button>
|
|
582
582
|
</div>
|
|
583
|
-
<button class="btn btn-secondary" id="analyzeBtn" disabled>Analyze</button>
|
|
584
583
|
<button class="btn btn-success" id="savePipelineBtn" disabled>Save Pipeline</button>
|
|
585
584
|
<button class="btn btn-primary" id="activateBtn" disabled>Activate & Sync</button>
|
|
586
585
|
</header>
|
|
@@ -657,8 +656,19 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
657
656
|
</div>
|
|
658
657
|
</div>
|
|
659
658
|
|
|
659
|
+
<!-- Analyze Section -->
|
|
660
|
+
<div class="analyze-section" id="analyzeSection" style="margin-top: 24px; margin-bottom: 12px; padding: 20px; background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); border-radius: 8px; color: white;">
|
|
661
|
+
<div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;">
|
|
662
|
+
<div>
|
|
663
|
+
<h3 id="analyzeSectionTitle" style="margin: 0 0 4px 0; font-size: 16px; font-weight: 600;">Analyze Pipeline</h3>
|
|
664
|
+
<p id="analyzeSectionDesc" style="margin: 0; font-size: 13px; opacity: 0.9;">Review your current pipeline configuration with Claude</p>
|
|
665
|
+
</div>
|
|
666
|
+
<button class="btn" id="analyzeSectionBtn" onclick="runAnalysis()" style="background: white; color: #3b82f6; font-weight: 600; padding: 8px 16px; border-radius: 4px; font-size: 13px; border: none; cursor: pointer;">Analyze</button>
|
|
667
|
+
</div>
|
|
668
|
+
</div>
|
|
669
|
+
|
|
660
670
|
<!-- Autocreate Section -->
|
|
661
|
-
<div class="autocreate-section" id="autocreateSection" style="margin-
|
|
671
|
+
<div class="autocreate-section" id="autocreateSection" style="margin-bottom: 24px; padding: 20px; background: linear-gradient(135deg, var(--accent) 0%, #7c3aed 100%); border-radius: 8px; color: white;">
|
|
662
672
|
<div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;">
|
|
663
673
|
<div>
|
|
664
674
|
<h3 id="autocreateTitle" style="margin: 0 0 4px 0; font-size: 16px; font-weight: 600;">Autocreate</h3>
|
|
@@ -853,6 +863,9 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
853
863
|
autocreateTitle: 'Autocreate',
|
|
854
864
|
autocreateDesc: 'Analyze your project and generate relevant columns automatically',
|
|
855
865
|
autocreateBtn: 'Analyze Project',
|
|
866
|
+
analyzeSectionTitle: 'Analyze Pipeline',
|
|
867
|
+
analyzeSectionDesc: 'Review your current pipeline configuration with Claude',
|
|
868
|
+
analyzeSectionBtn: 'Analyze',
|
|
856
869
|
},
|
|
857
870
|
fr: {
|
|
858
871
|
backBtn: '← Tableau de bord',
|
|
@@ -927,6 +940,9 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
927
940
|
autocreateTitle: 'Autocreate',
|
|
928
941
|
autocreateDesc: 'Analysez votre projet et générez automatiquement des colonnes pertinentes',
|
|
929
942
|
autocreateBtn: 'Analyser le projet',
|
|
943
|
+
analyzeSectionTitle: 'Analyser le Pipeline',
|
|
944
|
+
analyzeSectionDesc: 'Passez en revue votre configuration de pipeline actuelle avec Claude',
|
|
945
|
+
analyzeSectionBtn: 'Analyser',
|
|
930
946
|
}
|
|
931
947
|
};
|
|
932
948
|
|
|
@@ -945,7 +961,6 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
945
961
|
setText($q('.title span'), t('titleSpan'));
|
|
946
962
|
const titleEl = $q('.title');
|
|
947
963
|
if (titleEl && titleEl.childNodes[2]) titleEl.childNodes[2].textContent = ' ' + t('title');
|
|
948
|
-
setText($('analyzeBtn'), t('analyze'));
|
|
949
964
|
setText($('savePipelineBtn'), t('savePipeline'));
|
|
950
965
|
setText($('activateBtn'), t('activateSync'));
|
|
951
966
|
|
|
@@ -982,6 +997,11 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
982
997
|
setText($('autocreateDesc'), t('autocreateDesc'));
|
|
983
998
|
setText($('autocreateBtn'), t('autocreateBtn'));
|
|
984
999
|
|
|
1000
|
+
// Analyze section
|
|
1001
|
+
setText($('analyzeSectionTitle'), t('analyzeSectionTitle'));
|
|
1002
|
+
setText($('analyzeSectionDesc'), t('analyzeSectionDesc'));
|
|
1003
|
+
setText($('analyzeSectionBtn'), t('analyzeSectionBtn'));
|
|
1004
|
+
|
|
985
1005
|
// Catalog
|
|
986
1006
|
const catalogH2 = $q('.catalog h2');
|
|
987
1007
|
if (catalogH2 && catalogH2.childNodes[0]) {
|
|
@@ -1036,7 +1056,7 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
1036
1056
|
const pipelineEditor = document.getElementById('pipelineEditor');
|
|
1037
1057
|
const savePipelineBtn = document.getElementById('savePipelineBtn');
|
|
1038
1058
|
const activateBtn = document.getElementById('activateBtn');
|
|
1039
|
-
const
|
|
1059
|
+
const analyzeSectionBtn = document.getElementById('analyzeSectionBtn');
|
|
1040
1060
|
const notification = document.getElementById('notification');
|
|
1041
1061
|
|
|
1042
1062
|
// Load initial data
|
|
@@ -1367,7 +1387,7 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
1367
1387
|
function updateButtons() {
|
|
1368
1388
|
savePipelineBtn.disabled = !hasChanges || !currentPipeline;
|
|
1369
1389
|
activateBtn.disabled = !currentPipeline || hasChanges;
|
|
1370
|
-
|
|
1390
|
+
analyzeSectionBtn.disabled = !currentPipeline;
|
|
1371
1391
|
|
|
1372
1392
|
// Validate pipeline
|
|
1373
1393
|
if (currentPipeline) {
|
|
@@ -1893,9 +1913,6 @@ export function generatePipelineConfiguratorPage(lang) {
|
|
|
1893
1913
|
document.getElementById('analysisModal').classList.remove('show');
|
|
1894
1914
|
}
|
|
1895
1915
|
|
|
1896
|
-
// Analyze button click handler
|
|
1897
|
-
analyzeBtn.addEventListener('click', runAnalysis);
|
|
1898
|
-
|
|
1899
1916
|
// Initialize
|
|
1900
1917
|
init().then(() => {
|
|
1901
1918
|
updateUILanguage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-configurator.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAAY;IAC3D,OAAO;cACK,IAAI
|
|
1
|
+
{"version":3,"file":"pipeline-configurator.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAAY;IAC3D,OAAO;cACK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA43DV,CAAC;AACT,CAAC"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -201,17 +201,12 @@ export interface ProjectContext {
|
|
|
201
201
|
projectDescription: string;
|
|
202
202
|
}
|
|
203
203
|
/**
|
|
204
|
-
* Tunnel
|
|
204
|
+
* Tunnel state for persistent quick tunnels
|
|
205
205
|
*/
|
|
206
|
-
export interface
|
|
207
|
-
|
|
208
|
-
|
|
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":"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"}
|
package/dist/utils/tunnel.d.ts
CHANGED
|
@@ -1,51 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cloudflare tunnel management
|
|
2
|
+
* Cloudflare quick tunnel management (daemon mode)
|
|
3
|
+
* Tunnel persists independently of autocode process
|
|
3
4
|
*/
|
|
4
|
-
import {
|
|
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
|
-
*
|
|
11
|
+
* Load tunnel state from .autocode/tunnel.json
|
|
12
12
|
*/
|
|
13
|
-
export declare function
|
|
13
|
+
export declare function loadTunnelState(rootDir: string): TunnelState | null;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Save tunnel state to .autocode/tunnel.json
|
|
16
16
|
*/
|
|
17
|
-
export declare function
|
|
17
|
+
export declare function saveTunnelState(rootDir: string, state: TunnelState): void;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* Delete tunnel state file
|
|
20
20
|
*/
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function deleteTunnelState(rootDir: string): void;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Check if a process is alive by PID
|
|
24
24
|
*/
|
|
25
|
-
export declare function
|
|
25
|
+
export declare function isProcessAlive(pid: number): boolean;
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* Check if tunnel is alive and functional
|
|
28
28
|
*/
|
|
29
|
-
export declare function
|
|
30
|
-
success: boolean;
|
|
31
|
-
error?: string;
|
|
32
|
-
id?: string;
|
|
33
|
-
};
|
|
29
|
+
export declare function isTunnelAlive(state: TunnelState): boolean;
|
|
34
30
|
/**
|
|
35
|
-
*
|
|
31
|
+
* Stop the tunnel by killing the process
|
|
36
32
|
*/
|
|
37
|
-
export declare function
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
*
|
|
44
|
-
*
|
|
43
|
+
* Get or create a tunnel
|
|
44
|
+
* Reuses existing tunnel if alive, creates new one otherwise
|
|
45
45
|
*/
|
|
46
|
-
export declare function
|
|
46
|
+
export declare function getOrCreateTunnel(rootDir: string, port: number): Promise<{
|
|
47
|
+
url: string;
|
|
48
|
+
reused: boolean;
|
|
49
|
+
}>;
|
|
47
50
|
/**
|
|
48
|
-
*
|
|
51
|
+
* Tunnel supervisor - monitors and restarts tunnel if it dies
|
|
49
52
|
*/
|
|
50
|
-
export declare function
|
|
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
|
|
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"}
|
package/dist/utils/tunnel.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cloudflare tunnel management
|
|
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,
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
6
7
|
import { join } from 'node:path';
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
*
|
|
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
|
|
47
|
-
const
|
|
48
|
-
if (!existsSync(
|
|
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(
|
|
53
|
-
|
|
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
|
|
45
|
+
* Save tunnel state to .autocode/tunnel.json
|
|
65
46
|
*/
|
|
66
|
-
export function
|
|
67
|
-
const
|
|
68
|
-
|
|
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
|
-
*
|
|
52
|
+
* Delete tunnel state file
|
|
91
53
|
*/
|
|
92
|
-
export function
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
*
|
|
61
|
+
* Check if a process is alive by PID
|
|
111
62
|
*/
|
|
112
|
-
export function
|
|
63
|
+
export function isProcessAlive(pid) {
|
|
113
64
|
try {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
*
|
|
73
|
+
* Check if tunnel is alive and functional
|
|
142
74
|
*/
|
|
143
|
-
export function
|
|
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(`
|
|
146
|
-
|
|
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
|
|
152
|
-
|
|
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
|
-
*
|
|
90
|
+
* Stop the tunnel by killing the process
|
|
162
91
|
*/
|
|
163
|
-
function
|
|
164
|
-
const
|
|
165
|
-
if (!
|
|
166
|
-
return
|
|
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
|
-
|
|
176
|
-
|
|
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
|
-
//
|
|
103
|
+
// Process might already be dead
|
|
184
104
|
}
|
|
185
|
-
|
|
105
|
+
deleteTunnelState(rootDir);
|
|
106
|
+
return true;
|
|
186
107
|
}
|
|
187
108
|
/**
|
|
188
|
-
*
|
|
189
|
-
* Returns
|
|
109
|
+
* Start a detached cloudflared tunnel
|
|
110
|
+
* Returns a promise that resolves with the tunnel URL
|
|
190
111
|
*/
|
|
191
|
-
export function
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
213
|
-
|
|
208
|
+
// Start periodic check
|
|
209
|
+
const interval = setInterval(checkAndRestart, intervalMs);
|
|
210
|
+
return interval;
|
|
214
211
|
}
|
|
215
212
|
/**
|
|
216
|
-
*
|
|
213
|
+
* Get tunnel status info
|
|
217
214
|
*/
|
|
218
|
-
export function
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
package/dist/utils/tunnel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/utils/tunnel.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/utils/tunnel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/utils/prompt.d.ts
DELETED
|
@@ -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"}
|
package/dist/utils/prompt.js
DELETED
|
@@ -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
|
package/dist/utils/prompt.js.map
DELETED
|
@@ -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"}
|