@agentuity/cli 2.0.10 → 2.0.12
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/cache/resource-region.d.ts.map +1 -1
- package/dist/cache/resource-region.js +48 -25
- package/dist/cache/resource-region.js.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.js +4 -4
- package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +20 -0
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.js +62 -4
- package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
- package/dist/cmd/build/vite/index.d.ts +0 -1
- package/dist/cmd/build/vite/index.d.ts.map +1 -1
- package/dist/cmd/build/vite/index.js +0 -1
- package/dist/cmd/build/vite/index.js.map +1 -1
- package/dist/cmd/build/vite/static-renderer.d.ts +17 -0
- package/dist/cmd/build/vite/static-renderer.d.ts.map +1 -1
- package/dist/cmd/build/vite/static-renderer.js +18 -6
- package/dist/cmd/build/vite/static-renderer.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +34 -27
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server.d.ts +9 -0
- package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server.js +5 -1
- package/dist/cmd/build/vite/vite-asset-server.js.map +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-builder.js +12 -1
- package/dist/cmd/build/vite/vite-builder.js.map +1 -1
- package/dist/cmd/build/vite/ws-proxy.d.ts +15 -1
- package/dist/cmd/build/vite/ws-proxy.d.ts.map +1 -1
- package/dist/cmd/build/vite/ws-proxy.js +33 -0
- package/dist/cmd/build/vite/ws-proxy.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +98 -39
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/create.js +3 -4
- package/dist/cmd/cloud/sandbox/checkpoint/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/delete.js +3 -4
- package/dist/cmd/cloud/sandbox/checkpoint/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/list.js +3 -4
- package/dist/cmd/cloud/sandbox/checkpoint/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/restore.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/restore.js +3 -4
- package/dist/cmd/cloud/sandbox/checkpoint/restore.js.map +1 -1
- package/dist/cmd/cloud/sandbox/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/create.js +13 -4
- package/dist/cmd/cloud/sandbox/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/delete.js +3 -4
- package/dist/cmd/cloud/sandbox/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/env.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/env.js +3 -5
- package/dist/cmd/cloud/sandbox/env.js.map +1 -1
- package/dist/cmd/cloud/sandbox/exec.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/exec.js +114 -41
- package/dist/cmd/cloud/sandbox/exec.js.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/list.js +3 -5
- package/dist/cmd/cloud/sandbox/execution/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/cp.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/cp.js +61 -113
- package/dist/cmd/cloud/sandbox/fs/cp.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/download.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/download.js +11 -22
- package/dist/cmd/cloud/sandbox/fs/download.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/ls.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/ls.js +3 -5
- package/dist/cmd/cloud/sandbox/fs/ls.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/mkdir.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/mkdir.js +3 -5
- package/dist/cmd/cloud/sandbox/fs/mkdir.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/rm.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/rm.js +3 -5
- package/dist/cmd/cloud/sandbox/fs/rm.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/rmdir.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/rmdir.js +3 -5
- package/dist/cmd/cloud/sandbox/fs/rmdir.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/upload.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/upload.js +7 -8
- package/dist/cmd/cloud/sandbox/fs/upload.js.map +1 -1
- package/dist/cmd/cloud/sandbox/get.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/get.js +21 -7
- package/dist/cmd/cloud/sandbox/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/job/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/job/create.js +3 -4
- package/dist/cmd/cloud/sandbox/job/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/job/destroy.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/job/destroy.js +3 -4
- package/dist/cmd/cloud/sandbox/job/destroy.js.map +1 -1
- package/dist/cmd/cloud/sandbox/job/get.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/job/get.js +3 -4
- package/dist/cmd/cloud/sandbox/job/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/job/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/job/list.js +3 -4
- package/dist/cmd/cloud/sandbox/job/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/job/logs.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/job/logs.js +4 -4
- package/dist/cmd/cloud/sandbox/job/logs.js.map +1 -1
- package/dist/cmd/cloud/sandbox/pause.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/pause.js +21 -5
- package/dist/cmd/cloud/sandbox/pause.js.map +1 -1
- package/dist/cmd/cloud/sandbox/resume.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/resume.js +3 -4
- package/dist/cmd/cloud/sandbox/resume.js.map +1 -1
- package/dist/cmd/cloud/sandbox/run.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/run.js +36 -7
- package/dist/cmd/cloud/sandbox/run.js.map +1 -1
- package/dist/cmd/cloud/sandbox/util.d.ts +19 -0
- package/dist/cmd/cloud/sandbox/util.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/util.js +40 -2
- package/dist/cmd/cloud/sandbox/util.js.map +1 -1
- package/dist/cmd/coder/create.d.ts.map +1 -1
- package/dist/cmd/coder/create.js +18 -0
- package/dist/cmd/coder/create.js.map +1 -1
- package/dist/cmd/coder/index.d.ts.map +1 -1
- package/dist/cmd/coder/index.js +4 -0
- package/dist/cmd/coder/index.js.map +1 -1
- package/dist/cmd/coder/start.d.ts.map +1 -1
- package/dist/cmd/coder/start.js +52 -1
- package/dist/cmd/coder/start.js.map +1 -1
- package/dist/cmd/coder/tui-init.js +1 -1
- package/dist/cmd/coder/tui-init.js.map +1 -1
- package/dist/cmd/coder/update.d.ts.map +1 -1
- package/dist/cmd/coder/update.js +21 -1
- package/dist/cmd/coder/update.js.map +1 -1
- package/dist/cmd/coder/workspace/create.d.ts.map +1 -1
- package/dist/cmd/coder/workspace/create.js +57 -13
- package/dist/cmd/coder/workspace/create.js.map +1 -1
- package/dist/cmd/coder/workspace/index.d.ts.map +1 -1
- package/dist/cmd/coder/workspace/index.js +1 -1
- package/dist/cmd/coder/workspace/index.js.map +1 -1
- package/dist/cmd/coder/workspace/list.js +2 -2
- package/dist/cmd/coder/workspace/list.js.map +1 -1
- package/dist/cmd/dev/dev-lock.d.ts.map +1 -1
- package/dist/cmd/dev/dev-lock.js +43 -17
- package/dist/cmd/dev/dev-lock.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +211 -125
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/dev/process-manager.d.ts +41 -1
- package/dist/cmd/dev/process-manager.d.ts.map +1 -1
- package/dist/cmd/dev/process-manager.js +160 -31
- package/dist/cmd/dev/process-manager.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +0 -2
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/index.d.ts.map +1 -1
- package/dist/cmd/project/index.js +0 -3
- package/dist/cmd/project/index.js.map +1 -1
- package/dist/cmd/project/template-flow.d.ts +0 -1
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +1 -124
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +7 -7
- package/src/cache/resource-region.ts +68 -44
- package/src/cmd/ai/prompt/web.md +43 -17
- package/src/cmd/build/vite/agent-discovery.ts +4 -4
- package/src/cmd/build/vite/bun-dev-server.ts +92 -6
- package/src/cmd/build/vite/index.ts +0 -1
- package/src/cmd/build/vite/static-renderer.ts +18 -7
- package/src/cmd/build/vite/vite-asset-server-config.ts +37 -27
- package/src/cmd/build/vite/vite-asset-server.ts +5 -1
- package/src/cmd/build/vite/vite-builder.ts +12 -1
- package/src/cmd/build/vite/ws-proxy.ts +52 -3
- package/src/cmd/cloud/deploy.ts +117 -49
- package/src/cmd/cloud/sandbox/checkpoint/create.ts +10 -4
- package/src/cmd/cloud/sandbox/checkpoint/delete.ts +10 -4
- package/src/cmd/cloud/sandbox/checkpoint/list.ts +10 -4
- package/src/cmd/cloud/sandbox/checkpoint/restore.ts +10 -4
- package/src/cmd/cloud/sandbox/create.ts +14 -4
- package/src/cmd/cloud/sandbox/delete.ts +10 -4
- package/src/cmd/cloud/sandbox/env.ts +10 -5
- package/src/cmd/cloud/sandbox/exec.ts +157 -42
- package/src/cmd/cloud/sandbox/execution/list.ts +10 -5
- package/src/cmd/cloud/sandbox/fs/cp.ts +94 -126
- package/src/cmd/cloud/sandbox/fs/download.ts +18 -25
- package/src/cmd/cloud/sandbox/fs/ls.ts +10 -5
- package/src/cmd/cloud/sandbox/fs/mkdir.ts +10 -5
- package/src/cmd/cloud/sandbox/fs/rm.ts +10 -5
- package/src/cmd/cloud/sandbox/fs/rmdir.ts +10 -5
- package/src/cmd/cloud/sandbox/fs/upload.ts +14 -8
- package/src/cmd/cloud/sandbox/get.ts +28 -7
- package/src/cmd/cloud/sandbox/job/create.ts +10 -4
- package/src/cmd/cloud/sandbox/job/destroy.ts +10 -4
- package/src/cmd/cloud/sandbox/job/get.ts +10 -4
- package/src/cmd/cloud/sandbox/job/list.ts +10 -4
- package/src/cmd/cloud/sandbox/job/logs.ts +11 -4
- package/src/cmd/cloud/sandbox/pause.ts +31 -5
- package/src/cmd/cloud/sandbox/resume.ts +10 -4
- package/src/cmd/cloud/sandbox/run.ts +49 -11
- package/src/cmd/cloud/sandbox/util.ts +63 -2
- package/src/cmd/coder/create.ts +24 -1
- package/src/cmd/coder/index.ts +4 -0
- package/src/cmd/coder/start.ts +63 -1
- package/src/cmd/coder/tui-init.ts +1 -1
- package/src/cmd/coder/update.ts +18 -1
- package/src/cmd/coder/workspace/create.ts +84 -15
- package/src/cmd/coder/workspace/index.ts +3 -1
- package/src/cmd/coder/workspace/list.ts +2 -2
- package/src/cmd/dev/dev-lock.ts +50 -16
- package/src/cmd/dev/index.ts +249 -134
- package/src/cmd/dev/process-manager.ts +173 -33
- package/src/cmd/project/create.ts +0 -2
- package/src/cmd/project/index.ts +0 -3
- package/src/cmd/project/template-flow.ts +0 -147
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +0 -45
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.js +0 -166
- package/dist/cmd/build/vite/public-asset-path-plugin.js.map +0 -1
- package/dist/cmd/project/auth/generate.d.ts +0 -5
- package/dist/cmd/project/auth/generate.d.ts.map +0 -1
- package/dist/cmd/project/auth/generate.js +0 -102
- package/dist/cmd/project/auth/generate.js.map +0 -1
- package/dist/cmd/project/auth/index.d.ts +0 -2
- package/dist/cmd/project/auth/index.d.ts.map +0 -1
- package/dist/cmd/project/auth/index.js +0 -21
- package/dist/cmd/project/auth/index.js.map +0 -1
- package/dist/cmd/project/auth/init.d.ts +0 -2
- package/dist/cmd/project/auth/init.d.ts.map +0 -1
- package/dist/cmd/project/auth/init.js +0 -213
- package/dist/cmd/project/auth/init.js.map +0 -1
- package/dist/cmd/project/auth/shared.d.ts +0 -93
- package/dist/cmd/project/auth/shared.d.ts.map +0 -1
- package/dist/cmd/project/auth/shared.js +0 -475
- package/dist/cmd/project/auth/shared.js.map +0 -1
- package/src/cmd/build/vite/public-asset-path-plugin.ts +0 -209
- package/src/cmd/project/auth/generate.ts +0 -116
- package/src/cmd/project/auth/index.ts +0 -21
- package/src/cmd/project/auth/init.ts +0 -256
- package/src/cmd/project/auth/shared.ts +0 -591
package/dist/cmd/dev/dev-lock.js
CHANGED
|
@@ -31,36 +31,62 @@ function pidExists(pid) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Send a signal to a process group (negative PID) with fallback to direct PID.
|
|
35
|
+
* Returns true if the signal was sent successfully.
|
|
35
36
|
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
function killProcessTree(pid, signal, logger) {
|
|
38
|
+
// Safety: never send signals to PID 0 (own process group), PID 1 (init/systemd),
|
|
39
|
+
// or other dangerously low PIDs. process.kill(-1) would signal every process
|
|
40
|
+
// the user owns, which would crash the entire desktop session.
|
|
41
|
+
if (pid <= 1) {
|
|
42
|
+
logger.debug('Refusing to kill dangerous pid %d, skipping process tree kill', pid);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// Try process group kill first (kills all children too)
|
|
39
46
|
try {
|
|
40
|
-
process.kill(pid,
|
|
41
|
-
logger.debug('Sent
|
|
47
|
+
process.kill(-pid, signal);
|
|
48
|
+
logger.debug('Sent %s to process group -%d', signal, pid);
|
|
49
|
+
return true;
|
|
42
50
|
}
|
|
43
51
|
catch (err) {
|
|
44
52
|
const error = err;
|
|
45
|
-
if (error.code
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
if (error.code !== 'ESRCH') {
|
|
54
|
+
logger.debug('Process group kill failed for pid %d (%s), falling back to direct', pid, error.code);
|
|
55
|
+
}
|
|
48
56
|
}
|
|
49
|
-
//
|
|
50
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
51
|
-
if (!pidExists(pid))
|
|
52
|
-
return;
|
|
53
|
-
// Force kill
|
|
57
|
+
// Fall back to direct PID kill
|
|
54
58
|
try {
|
|
55
|
-
process.kill(pid,
|
|
56
|
-
logger.debug('Sent
|
|
59
|
+
process.kill(pid, signal);
|
|
60
|
+
logger.debug('Sent %s to pid %d (direct)', signal, pid);
|
|
61
|
+
return true;
|
|
57
62
|
}
|
|
58
63
|
catch (err) {
|
|
59
64
|
const error = err;
|
|
60
65
|
if (error.code !== 'ESRCH') {
|
|
61
|
-
logger.debug('
|
|
66
|
+
logger.debug('Direct kill failed for pid %d: %s', pid, error.code);
|
|
62
67
|
}
|
|
68
|
+
return false;
|
|
63
69
|
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Kill a process by PID with SIGTERM, then SIGKILL if still alive.
|
|
73
|
+
* Targets the entire process tree to prevent orphaned child processes.
|
|
74
|
+
*/
|
|
75
|
+
async function killPid(pid, logger) {
|
|
76
|
+
if (!pidExists(pid))
|
|
77
|
+
return;
|
|
78
|
+
// Send SIGTERM to process tree
|
|
79
|
+
const sent = killProcessTree(pid, 'SIGTERM', logger);
|
|
80
|
+
if (!sent)
|
|
81
|
+
return;
|
|
82
|
+
// Give it a moment to exit gracefully
|
|
83
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
84
|
+
// Always attempt SIGKILL on the process tree even if the leader has exited.
|
|
85
|
+
// On Unix, process groups persist after the leader exits and signaling via
|
|
86
|
+
// negative PGID still reaches remaining members. killProcessTree() handles
|
|
87
|
+
// ESRCH gracefully if the group no longer exists.
|
|
88
|
+
// Force kill the entire process tree
|
|
89
|
+
killProcessTree(pid, 'SIGKILL', logger);
|
|
64
90
|
// Wait for process to fully terminate
|
|
65
91
|
await new Promise((r) => setTimeout(r, 100));
|
|
66
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-lock.js","sourceRoot":"","sources":["../../../src/cmd/dev/dev-lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAyCzC,SAAS,WAAW,CAAC,OAAe;IACnC,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAA4B,CAAC;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpE,+CAA+C;QAC/C,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;IAC/B,CAAC;AACF,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"dev-lock.js","sourceRoot":"","sources":["../../../src/cmd/dev/dev-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/dev/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/dev/index.ts"],"names":[],"mappings":"AA6JA,eAAO,MAAM,OAAO,mCAijClB,CAAC"}
|
package/dist/cmd/dev/index.js
CHANGED
|
@@ -27,23 +27,27 @@ const MAX_PORT = 65535;
|
|
|
27
27
|
/**
|
|
28
28
|
* Kill any lingering gravity processes from previous dev sessions.
|
|
29
29
|
* This is a defensive measure to clean up orphaned processes.
|
|
30
|
+
*
|
|
31
|
+
* When a projectId is provided, only kills gravity processes for that specific
|
|
32
|
+
* project. Otherwise falls back to killing all gravity processes (used during
|
|
33
|
+
* startup before project info is available).
|
|
30
34
|
*/
|
|
31
|
-
async function killLingeringGravityProcesses(logger) {
|
|
35
|
+
async function killLingeringGravityProcesses(logger, projectId) {
|
|
32
36
|
// Only attempt on Unix-like systems (macOS, Linux)
|
|
33
37
|
if (process.platform === 'win32') {
|
|
34
38
|
return;
|
|
35
39
|
}
|
|
36
40
|
try {
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
const result = Bun.spawnSync(['pkill', '-f',
|
|
41
|
+
// Scope the pkill pattern to the specific project when possible,
|
|
42
|
+
// avoiding killing gravity processes from other dev sessions.
|
|
43
|
+
const pattern = projectId ? `gravity.*--project-id.*${projectId}` : 'gravity.*--endpoint-id';
|
|
44
|
+
const result = Bun.spawnSync(['pkill', '-f', pattern], {
|
|
41
45
|
stdout: 'ignore',
|
|
42
46
|
stderr: 'ignore',
|
|
43
47
|
});
|
|
44
48
|
// Exit code 0 = processes killed, 1 = no matching processes, other = error
|
|
45
49
|
if (result.exitCode === 0) {
|
|
46
|
-
logger.debug('Killed lingering gravity processes from previous session');
|
|
50
|
+
logger.debug('Killed lingering gravity processes%s from previous session', projectId ? ` (project ${projectId})` : '');
|
|
47
51
|
// Brief pause to let processes fully terminate
|
|
48
52
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
49
53
|
}
|
|
@@ -57,19 +61,44 @@ async function killLingeringGravityProcesses(logger) {
|
|
|
57
61
|
}
|
|
58
62
|
/**
|
|
59
63
|
* Kill the Bun backend subprocess if one is running.
|
|
64
|
+
*
|
|
65
|
+
* @param forceKill - If true, sends SIGKILL instead of SIGTERM. Used in
|
|
66
|
+
* process.on('exit') handlers where there's no time for graceful shutdown.
|
|
67
|
+
* Also kills the entire process tree to prevent orphaned child processes.
|
|
60
68
|
*/
|
|
61
|
-
function killBunSubprocess(logger) {
|
|
69
|
+
function killBunSubprocess(logger, forceKill = false) {
|
|
62
70
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
71
|
const globalAny = globalThis;
|
|
64
72
|
const bunSubprocess = globalAny.__AGENTUITY_BUN_SUBPROCESS__;
|
|
65
73
|
if (!bunSubprocess)
|
|
66
74
|
return;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
75
|
+
const signal = forceKill ? 'SIGKILL' : 'SIGTERM';
|
|
76
|
+
const pid = bunSubprocess.pid;
|
|
77
|
+
// Kill the entire process tree if we have a PID (guard against dangerous PIDs)
|
|
78
|
+
if (pid && pid > 1) {
|
|
79
|
+
try {
|
|
80
|
+
process.kill(-pid, signal);
|
|
81
|
+
logger.debug('Sent %s to Bun subprocess process group -%d', signal, pid);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Process group kill failed, fall back to direct kill
|
|
85
|
+
try {
|
|
86
|
+
bunSubprocess.kill(signal);
|
|
87
|
+
logger.debug('Sent %s to Bun subprocess pid %d (direct)', signal, pid);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
logger.debug('Error killing Bun subprocess: %s', err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
70
93
|
}
|
|
71
|
-
|
|
72
|
-
|
|
94
|
+
else {
|
|
95
|
+
try {
|
|
96
|
+
bunSubprocess.kill(signal);
|
|
97
|
+
logger.debug('Bun subprocess killed with %s', signal);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
logger.debug('Error killing Bun subprocess: %s', err);
|
|
101
|
+
}
|
|
73
102
|
}
|
|
74
103
|
globalAny.__AGENTUITY_BUN_SUBPROCESS__ = undefined;
|
|
75
104
|
}
|
|
@@ -277,9 +306,9 @@ export const command = createCommand({
|
|
|
277
306
|
// Prepare dev lock: cleans up stale processes from previous sessions
|
|
278
307
|
// and creates a new lockfile for this session
|
|
279
308
|
const devLock = await prepareDevLock(rootDir, opts.port, logger);
|
|
280
|
-
// Kill any lingering gravity processes from previous dev sessions
|
|
281
|
-
//
|
|
282
|
-
await killLingeringGravityProcesses(logger);
|
|
309
|
+
// Kill any lingering gravity processes from previous dev sessions.
|
|
310
|
+
// Scoped to this project to avoid killing gravity from other dev sessions.
|
|
311
|
+
await killLingeringGravityProcesses(logger, project?.projectId);
|
|
283
312
|
// Check and upgrade @agentuity/* dependencies if needed
|
|
284
313
|
const upgradeResult = await checkAndUpgradeDependencies(rootDir, logger);
|
|
285
314
|
if (upgradeResult.failed.length > 0) {
|
|
@@ -451,91 +480,41 @@ export const command = createCommand({
|
|
|
451
480
|
originalConsoleError(...args);
|
|
452
481
|
};
|
|
453
482
|
}
|
|
454
|
-
//
|
|
455
|
-
//
|
|
456
|
-
//
|
|
483
|
+
// --- State for long-running processes ---
|
|
484
|
+
// Declared early so signal handlers can reference them before
|
|
485
|
+
// servers are started.
|
|
457
486
|
let viteServer = null;
|
|
458
|
-
let vitePort;
|
|
459
|
-
// Initialize process manager to track all servers/processes
|
|
460
|
-
const procManager = initProcessManager(logger);
|
|
461
|
-
try {
|
|
462
|
-
logger.debug('Starting Vite dev server (internal port %d)...', viteInternalPort);
|
|
463
|
-
const viteResult = await startViteAssetServer({
|
|
464
|
-
rootDir,
|
|
465
|
-
logger,
|
|
466
|
-
workbenchPath: workbench.config?.route,
|
|
467
|
-
port: viteInternalPort,
|
|
468
|
-
backendPort: bunBackendPort,
|
|
469
|
-
routePaths,
|
|
470
|
-
liveHostname: devmode?.hostname,
|
|
471
|
-
});
|
|
472
|
-
viteServer = viteResult.server;
|
|
473
|
-
vitePort = viteResult.port;
|
|
474
|
-
// Register Vite server with process manager
|
|
475
|
-
procManager.registerServer({
|
|
476
|
-
id: 'vite',
|
|
477
|
-
server: viteServer,
|
|
478
|
-
description: 'Vite dev server (frontend assets)',
|
|
479
|
-
port: vitePort,
|
|
480
|
-
});
|
|
481
|
-
// Update dev lock with actual Vite port
|
|
482
|
-
await devLock.updatePorts({ vite: vitePort });
|
|
483
|
-
logger.debug(`Vite dev server running on port ${vitePort} (internal, proxying backend on port ${bunBackendPort})`);
|
|
484
|
-
}
|
|
485
|
-
catch (error) {
|
|
486
|
-
tui.error(`Failed to start Vite dev server: ${error}`);
|
|
487
|
-
await procManager.cleanup('vite startup failure');
|
|
488
|
-
await devLock.release();
|
|
489
|
-
originalExit(1);
|
|
490
|
-
return;
|
|
491
|
-
}
|
|
492
|
-
// Start the front-door TCP proxy on the user-facing port.
|
|
493
|
-
// Routes WebSocket upgrades (for /api/*, /_agentuity/*) directly to Bun
|
|
494
|
-
// and everything else (HTTP, HMR WebSocket) to Vite.
|
|
495
|
-
// This works around Bun's broken node:http upgrade socket implementation.
|
|
496
487
|
let frontDoorServer = null;
|
|
497
|
-
try {
|
|
498
|
-
const { startWsProxy } = await import('../build/vite/ws-proxy');
|
|
499
|
-
frontDoorServer = await startWsProxy({
|
|
500
|
-
port: opts.port,
|
|
501
|
-
vitePort,
|
|
502
|
-
backendPort: bunBackendPort,
|
|
503
|
-
routePaths,
|
|
504
|
-
logger,
|
|
505
|
-
});
|
|
506
|
-
// Register front-door proxy with process manager
|
|
507
|
-
procManager.registerServer({
|
|
508
|
-
id: 'front-door-proxy',
|
|
509
|
-
server: {
|
|
510
|
-
close: () => {
|
|
511
|
-
frontDoorServer?.close();
|
|
512
|
-
},
|
|
513
|
-
},
|
|
514
|
-
description: 'Front-door TCP proxy (WS routing)',
|
|
515
|
-
port: opts.port,
|
|
516
|
-
});
|
|
517
|
-
logger.debug(`Front-door proxy on port ${opts.port} (Vite:${vitePort}, Bun:${bunBackendPort})`);
|
|
518
|
-
}
|
|
519
|
-
catch (error) {
|
|
520
|
-
tui.error(`Failed to start front-door proxy: ${error}`);
|
|
521
|
-
await procManager.cleanup('front-door proxy startup failure');
|
|
522
|
-
await devLock.release();
|
|
523
|
-
originalExit(1);
|
|
524
|
-
return;
|
|
525
|
-
}
|
|
526
|
-
// --- State for long-running processes ---
|
|
527
488
|
let gravityProcess = null;
|
|
528
489
|
let gravityHeartbeatInterval = null;
|
|
529
490
|
let stdinListenerRegistered = false;
|
|
530
491
|
let stdinDataHandler = null;
|
|
531
492
|
let shutdownRequested = false;
|
|
493
|
+
// Initialize process manager to track all servers/processes
|
|
494
|
+
const procManager = initProcessManager(logger);
|
|
495
|
+
// Resolve the actual Vite port BEFORE starting Bun so that env vars
|
|
496
|
+
// like AGENTUITY_BASE_URL contain the correct port. The runtime's
|
|
497
|
+
// CORS trusted-origins are built once at startup, so a late update
|
|
498
|
+
// would leave the backend with stale origins.
|
|
499
|
+
const { findAvailablePort } = await import('../build/vite/vite-asset-server');
|
|
500
|
+
const vitePort = await findAvailablePort(viteInternalPort, '127.0.0.1');
|
|
501
|
+
if (vitePort !== viteInternalPort) {
|
|
502
|
+
logger.info(`Port ${viteInternalPort} is in use, using port ${vitePort} for Vite dev server`);
|
|
503
|
+
}
|
|
504
|
+
// Separate guard flags:
|
|
505
|
+
// - cleanupStarted: prevents double-entry into cleanup()
|
|
506
|
+
// - shutdownRequested: breaks the main wait loop (set inside cleanup
|
|
507
|
+
// AFTER the cleanupStarted guard passes, so the loop resolves only
|
|
508
|
+
// once cleanup has actually started running)
|
|
509
|
+
let cleanupStarted = false;
|
|
532
510
|
/**
|
|
533
511
|
* Centralized cleanup function for all resources.
|
|
534
512
|
* Uses the process manager for tracked servers/processes.
|
|
535
513
|
*/
|
|
536
514
|
const cleanup = async (exitAfter = false, exitCode = 0, silent = false) => {
|
|
537
|
-
if (
|
|
515
|
+
if (cleanupStarted)
|
|
538
516
|
return;
|
|
517
|
+
cleanupStarted = true;
|
|
539
518
|
shutdownRequested = true;
|
|
540
519
|
if (!silent) {
|
|
541
520
|
tui.info('Shutting down...');
|
|
@@ -549,7 +528,7 @@ export const command = createCommand({
|
|
|
549
528
|
await procManager.cleanup('shutdown');
|
|
550
529
|
// Additional cleanup for non-tracked resources
|
|
551
530
|
await devLock.release();
|
|
552
|
-
await killLingeringGravityProcesses(logger);
|
|
531
|
+
await killLingeringGravityProcesses(logger, project?.projectId);
|
|
553
532
|
if (exitAfter) {
|
|
554
533
|
if (stdinListenerRegistered && process.stdin.isTTY) {
|
|
555
534
|
try {
|
|
@@ -576,7 +555,6 @@ export const command = createCommand({
|
|
|
576
555
|
exitingFromSignal = true;
|
|
577
556
|
if (reason)
|
|
578
557
|
logger.debug('DevMode terminating (%d): %s', code, reason);
|
|
579
|
-
shutdownRequested = true;
|
|
580
558
|
cleanup(true, code).catch(() => originalExit(1));
|
|
581
559
|
};
|
|
582
560
|
process.on('SIGINT', () => safeExit(0, 'SIGINT'));
|
|
@@ -590,23 +568,15 @@ export const command = createCommand({
|
|
|
590
568
|
logger.warn('Unhandled promise rejection: %s', reason instanceof Error ? (reason.stack ?? reason.message) : String(reason));
|
|
591
569
|
});
|
|
592
570
|
process.on('exit', () => {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
try {
|
|
603
|
-
viteServer.close();
|
|
604
|
-
}
|
|
605
|
-
catch {
|
|
606
|
-
// Ignore
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
killBunSubprocess(logger);
|
|
571
|
+
// Last-resort synchronous cleanup. Only runs aggressive SIGKILL
|
|
572
|
+
// if the async cleanup() hasn't already handled everything.
|
|
573
|
+
// This prevents the race where both cleanup paths try to kill
|
|
574
|
+
// the same processes.
|
|
575
|
+
procManager.forceKillAllSync();
|
|
576
|
+
// SIGKILL the Bun subprocess tree as a final safety net.
|
|
577
|
+
// forceKill=true ensures we use SIGKILL (no time for graceful
|
|
578
|
+
// shutdown in an exit handler) and target the process group.
|
|
579
|
+
killBunSubprocess(logger, true);
|
|
610
580
|
releaseLockSync(rootDir);
|
|
611
581
|
});
|
|
612
582
|
// ================================================================
|
|
@@ -723,6 +693,10 @@ export const command = createCommand({
|
|
|
723
693
|
// Note: AGENTUITY_SDK_KEY, NODE_ENV, AGENTUITY_ENV, and
|
|
724
694
|
// AGENTUITY_TRANSPORT_URL are already set in Step 0b (before
|
|
725
695
|
// agent discovery) to support gateway env patching.
|
|
696
|
+
//
|
|
697
|
+
// vitePort is pre-resolved (via findAvailablePort) before Bun
|
|
698
|
+
// starts, so env vars like AGENTUITY_BASE_URL are correct when
|
|
699
|
+
// the runtime builds its CORS trusted-origin set.
|
|
726
700
|
process.env.AGENTUITY_SDK_DEV_MODE = 'true';
|
|
727
701
|
process.env.AGENTUITY_RUNTIME = 'yes';
|
|
728
702
|
process.env.AGENTUITY_PROJECT_DIR = rootDir;
|
|
@@ -767,20 +741,20 @@ export const command = createCommand({
|
|
|
767
741
|
inspect: opts.inspect,
|
|
768
742
|
inspectWait: opts.inspectWait,
|
|
769
743
|
inspectBrk: opts.inspectBrk,
|
|
744
|
+
// Register the subprocess BEFORE the readiness wait so a SIGINT
|
|
745
|
+
// during startup can clean it up via procManager. Without this,
|
|
746
|
+
// the only safety net is the synchronous process.on('exit')
|
|
747
|
+
// handler, which is fragile and runs too late on some signals.
|
|
748
|
+
onSpawn: (proc) => {
|
|
749
|
+
procManager.registerProcess({
|
|
750
|
+
id: 'bun-backend',
|
|
751
|
+
process: proc,
|
|
752
|
+
description: 'Bun backend server (--hot)',
|
|
753
|
+
port: bunBackendPort,
|
|
754
|
+
critical: true,
|
|
755
|
+
});
|
|
756
|
+
},
|
|
770
757
|
});
|
|
771
|
-
// Register Bun subprocess with process manager
|
|
772
|
-
// The subprocess is stored in globalThis.__AGENTUITY_BUN_SUBPROCESS__
|
|
773
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
774
|
-
const bunSubprocess = globalThis.__AGENTUITY_BUN_SUBPROCESS__;
|
|
775
|
-
if (bunSubprocess) {
|
|
776
|
-
procManager.registerProcess({
|
|
777
|
-
id: 'bun-backend',
|
|
778
|
-
process: bunSubprocess,
|
|
779
|
-
description: 'Bun backend server (--hot)',
|
|
780
|
-
port: bunBackendPort,
|
|
781
|
-
critical: true,
|
|
782
|
-
});
|
|
783
|
-
}
|
|
784
758
|
}
|
|
785
759
|
catch (error) {
|
|
786
760
|
tui.error(`Failed to start Bun backend server: ${error}`);
|
|
@@ -788,7 +762,100 @@ export const command = createCommand({
|
|
|
788
762
|
return;
|
|
789
763
|
}
|
|
790
764
|
// ================================================================
|
|
791
|
-
// Step 4: Start
|
|
765
|
+
// Step 4: Start Vite asset server (frontend + API proxy)
|
|
766
|
+
// ================================================================
|
|
767
|
+
// Vite starts AFTER the Bun backend so that its proxy is ready
|
|
768
|
+
// to forward API requests immediately — no ECONNREFUSED race.
|
|
769
|
+
try {
|
|
770
|
+
logger.debug('Starting Vite dev server (internal port %d)...', viteInternalPort);
|
|
771
|
+
const viteResult = await startViteAssetServer({
|
|
772
|
+
rootDir,
|
|
773
|
+
logger,
|
|
774
|
+
workbenchPath: workbench.config?.route,
|
|
775
|
+
port: vitePort,
|
|
776
|
+
backendPort: bunBackendPort,
|
|
777
|
+
routePaths,
|
|
778
|
+
liveHostname: devmode?.hostname,
|
|
779
|
+
});
|
|
780
|
+
viteServer = viteResult.server;
|
|
781
|
+
// Verify Vite used the port we pre-resolved (should always match
|
|
782
|
+
// since strictPort:true is set and we already confirmed availability).
|
|
783
|
+
if (viteResult.port !== vitePort) {
|
|
784
|
+
logger.warn(`Vite started on port ${viteResult.port} instead of expected ${vitePort} — env vars may be incorrect`);
|
|
785
|
+
}
|
|
786
|
+
// Register Vite server with process manager.
|
|
787
|
+
// We wrap close() to first force-drop keep-alive HTTP/HMR sockets via
|
|
788
|
+
// httpServer.closeAllConnections() (Node 18.2+). Without this, idle
|
|
789
|
+
// keep-alive connections keep the listener bound until they time out,
|
|
790
|
+
// which leaves the Vite port reserved for several seconds after the
|
|
791
|
+
// CLI exits. We also extend the close timeout (Vite's chokidar +
|
|
792
|
+
// HMR teardown can exceed 1s under load).
|
|
793
|
+
const viteForCleanup = viteServer;
|
|
794
|
+
procManager.registerServer({
|
|
795
|
+
id: 'vite',
|
|
796
|
+
server: {
|
|
797
|
+
close: async () => {
|
|
798
|
+
try {
|
|
799
|
+
const http = viteForCleanup.httpServer;
|
|
800
|
+
http?.closeIdleConnections?.();
|
|
801
|
+
http?.closeAllConnections?.();
|
|
802
|
+
}
|
|
803
|
+
catch {
|
|
804
|
+
// Best effort — these methods are runtime-dependent.
|
|
805
|
+
}
|
|
806
|
+
await viteForCleanup.close();
|
|
807
|
+
},
|
|
808
|
+
},
|
|
809
|
+
description: 'Vite dev server (frontend assets)',
|
|
810
|
+
port: vitePort,
|
|
811
|
+
closeTimeoutMs: 3000,
|
|
812
|
+
});
|
|
813
|
+
// Update dev lock with actual Vite port
|
|
814
|
+
await devLock.updatePorts({ vite: vitePort });
|
|
815
|
+
logger.debug(`Vite dev server running on port ${vitePort} (internal, proxying backend on port ${bunBackendPort})`);
|
|
816
|
+
}
|
|
817
|
+
catch (error) {
|
|
818
|
+
tui.error(`Failed to start Vite dev server: ${error}`);
|
|
819
|
+
await cleanup(true, 1, true);
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
// ================================================================
|
|
823
|
+
// Step 5: Start front-door TCP proxy (user-facing port)
|
|
824
|
+
// ================================================================
|
|
825
|
+
// Routes WebSocket upgrades (for /api/*, /_agentuity/*) directly to Bun
|
|
826
|
+
// and everything else (HTTP, HMR WebSocket) to Vite.
|
|
827
|
+
// This works around Bun's broken node:http upgrade socket implementation.
|
|
828
|
+
try {
|
|
829
|
+
const { startWsProxy } = await import('../build/vite/ws-proxy');
|
|
830
|
+
frontDoorServer = await startWsProxy({
|
|
831
|
+
port: opts.port,
|
|
832
|
+
vitePort,
|
|
833
|
+
backendPort: bunBackendPort,
|
|
834
|
+
routePaths,
|
|
835
|
+
logger,
|
|
836
|
+
});
|
|
837
|
+
// Register front-door proxy with process manager. Use closeAll()
|
|
838
|
+
// (returns a Promise) so cleanup actually waits for the listener
|
|
839
|
+
// to release the user-facing port instead of fire-and-forgetting.
|
|
840
|
+
// closeAll() also destroys live piped sockets (HMR WS, backend WS)
|
|
841
|
+
// so the listener doesn't sit waiting for clients to disconnect.
|
|
842
|
+
procManager.registerServer({
|
|
843
|
+
id: 'front-door-proxy',
|
|
844
|
+
server: {
|
|
845
|
+
close: () => frontDoorServer?.closeAll() ?? Promise.resolve(),
|
|
846
|
+
},
|
|
847
|
+
description: 'Front-door TCP proxy (WS routing)',
|
|
848
|
+
port: opts.port,
|
|
849
|
+
});
|
|
850
|
+
logger.debug(`Front-door proxy on port ${opts.port} (Vite:${vitePort}, Bun:${bunBackendPort})`);
|
|
851
|
+
}
|
|
852
|
+
catch (error) {
|
|
853
|
+
tui.error(`Failed to start front-door proxy: ${error}`);
|
|
854
|
+
await cleanup(true, 1, true);
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
// ================================================================
|
|
858
|
+
// Step 6: Start gravity tunnel (if public URL enabled)
|
|
792
859
|
// ================================================================
|
|
793
860
|
if (gravityBin && gravityURL && devmode && project) {
|
|
794
861
|
const privateKeyPEM = devmode.privateKey ?? savedPrivateKey;
|
|
@@ -797,13 +864,20 @@ export const command = createCommand({
|
|
|
797
864
|
await cleanup(true, 1, true);
|
|
798
865
|
return;
|
|
799
866
|
}
|
|
867
|
+
// Gravity must target the user-facing front-door proxy port.
|
|
868
|
+
// The front-door proxy (ws-proxy) is the only server that correctly
|
|
869
|
+
// routes public WebSocket upgrades to /api/* through to the Bun backend.
|
|
870
|
+
// We read the actual bound port from the front-door server to avoid any
|
|
871
|
+
// mismatch with opts.port (e.g. if the port was overridden or shifted).
|
|
872
|
+
const frontDoorPort = frontDoorServer?.address()?.port ??
|
|
873
|
+
opts.port;
|
|
800
874
|
try {
|
|
801
875
|
gravityProcess = Bun.spawn([
|
|
802
876
|
gravityBin,
|
|
803
877
|
'--endpoint-id',
|
|
804
878
|
devmode.id,
|
|
805
879
|
'--port',
|
|
806
|
-
|
|
880
|
+
frontDoorPort.toString(),
|
|
807
881
|
'--url',
|
|
808
882
|
gravityURL,
|
|
809
883
|
'--log-level',
|
|
@@ -819,8 +893,21 @@ export const command = createCommand({
|
|
|
819
893
|
cwd: rootDir,
|
|
820
894
|
stdout: 'pipe',
|
|
821
895
|
stderr: 'pipe',
|
|
822
|
-
|
|
896
|
+
// Make the child a process-group leader so process.kill(-pid, signal)
|
|
897
|
+
// from procManager.killProcessTree() actually reaches the whole tree
|
|
898
|
+
// (otherwise it fails with EPERM and falls back to a direct PID kill
|
|
899
|
+
// that leaves any grandchildren running). We intentionally do NOT call
|
|
900
|
+
// .unref() — we still want the parent to track the child's lifecycle
|
|
901
|
+
// and drive cleanup on Ctrl-C / shutdown.
|
|
902
|
+
detached: true,
|
|
903
|
+
// Pass a clean env without PORT to prevent the inherited
|
|
904
|
+
// PORT (set to bunBackendPort) from leaking into gravity.
|
|
905
|
+
env: {
|
|
906
|
+
...process.env,
|
|
907
|
+
PORT: undefined,
|
|
908
|
+
},
|
|
823
909
|
});
|
|
910
|
+
logger.debug('Gravity tunnel targeting front-door proxy on port %d', frontDoorPort);
|
|
824
911
|
const gravityPid = gravityProcess.pid;
|
|
825
912
|
if (gravityPid) {
|
|
826
913
|
await devLock.registerChild({
|
|
@@ -893,7 +980,7 @@ export const command = createCommand({
|
|
|
893
980
|
}
|
|
894
981
|
}
|
|
895
982
|
// ================================================================
|
|
896
|
-
// Step
|
|
983
|
+
// Step 7: Keyboard shortcuts + wait for shutdown
|
|
897
984
|
// ================================================================
|
|
898
985
|
if (interactive && process.stdin.isTTY && process.stdout.isTTY) {
|
|
899
986
|
stdinListenerRegistered = true;
|
|
@@ -913,7 +1000,6 @@ export const command = createCommand({
|
|
|
913
1000
|
process.stdin.removeListener('data', stdinDataHandler);
|
|
914
1001
|
stdinDataHandler = null;
|
|
915
1002
|
}
|
|
916
|
-
shutdownRequested = true;
|
|
917
1003
|
cleanup(true, 0).catch(() => originalExit(1));
|
|
918
1004
|
return;
|
|
919
1005
|
}
|
|
@@ -952,7 +1038,7 @@ export const command = createCommand({
|
|
|
952
1038
|
finally {
|
|
953
1039
|
/* brute force clean up */
|
|
954
1040
|
await devLock.release();
|
|
955
|
-
await killLingeringGravityProcesses(logger);
|
|
1041
|
+
await killLingeringGravityProcesses(logger, project?.projectId);
|
|
956
1042
|
releaseLockSync(rootDir);
|
|
957
1043
|
}
|
|
958
1044
|
},
|