vskill 0.2.63 → 0.2.65
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.
|
@@ -10,6 +10,7 @@ import { homedir } from "node:os";
|
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import { startEvalServer } from "../../eval-server/eval-server.js";
|
|
12
12
|
import { yellow, dim, red, cyan, bold } from "../../utils/output.js";
|
|
13
|
+
import { createPrompter } from "../../utils/prompts.js";
|
|
13
14
|
/**
|
|
14
15
|
* Deterministic port for a project path.
|
|
15
16
|
* Maps the absolute path to a port in range 3077-3177 using a hash.
|
|
@@ -90,68 +91,83 @@ function findProcessOnPort(port) {
|
|
|
90
91
|
return null;
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
|
-
/** Kill a process and wait for port
|
|
94
|
-
async function killAndWait(pid) {
|
|
94
|
+
/** Kill a process and wait for the port to actually free up. */
|
|
95
|
+
async function killAndWait(pid, port) {
|
|
95
96
|
try {
|
|
96
97
|
process.kill(pid, "SIGTERM");
|
|
97
98
|
}
|
|
98
99
|
catch {
|
|
99
100
|
return;
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
|
|
102
|
+
// Wait for process to exit
|
|
103
|
+
const procDeadline = Date.now() + 3000;
|
|
104
|
+
while (Date.now() < procDeadline) {
|
|
103
105
|
try {
|
|
104
106
|
process.kill(pid, 0);
|
|
105
107
|
}
|
|
106
108
|
catch {
|
|
107
|
-
|
|
109
|
+
break;
|
|
108
110
|
} // gone
|
|
109
111
|
await new Promise((r) => setTimeout(r, 100));
|
|
110
112
|
}
|
|
113
|
+
// Force-kill if still alive
|
|
111
114
|
try {
|
|
115
|
+
process.kill(pid, 0);
|
|
112
116
|
process.kill(pid, "SIGKILL");
|
|
113
117
|
}
|
|
114
118
|
catch { /* already dead */ }
|
|
115
|
-
|
|
119
|
+
// Wait for port to actually free up (OS may hold it briefly after process exits)
|
|
120
|
+
const portDeadline = Date.now() + 5000;
|
|
121
|
+
while (Date.now() < portDeadline) {
|
|
122
|
+
if (!(await isPortInUse(port)))
|
|
123
|
+
return;
|
|
124
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
125
|
+
}
|
|
116
126
|
}
|
|
117
127
|
/**
|
|
118
|
-
* Handle port conflict
|
|
119
|
-
* - Same project → auto-kill and restart
|
|
120
|
-
* - Different project or unknown → show diagnostics and exit
|
|
128
|
+
* Handle port conflict — show what's running and ask user to confirm kill.
|
|
121
129
|
*/
|
|
122
130
|
async function handlePortConflict(port, resolvedRoot) {
|
|
123
131
|
const existing = await probeVskillServer(port);
|
|
132
|
+
const proc = findProcessOnPort(port);
|
|
133
|
+
const prompter = createPrompter();
|
|
124
134
|
if (existing) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const proc = findProcessOnPort(port);
|
|
129
|
-
if (proc)
|
|
130
|
-
await killAndWait(proc.pid);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
// Different project
|
|
134
|
-
console.error(red(`\n Port ${port} is in use by another eval server:\n`) +
|
|
135
|
-
`\n ${bold("Project:")} ${cyan(existing.projectName || "unknown")}` +
|
|
135
|
+
const sameProject = existing.root === resolvedRoot;
|
|
136
|
+
console.log(`\n ${bold("Port")} ${cyan(String(port))} ${bold("is already in use:")}` +
|
|
137
|
+
`\n ${bold("Project:")} ${cyan(existing.projectName || "unknown")}${sameProject ? dim(" (same project)") : ""}` +
|
|
136
138
|
`\n ${bold("Root:")} ${dim(existing.root)}` +
|
|
137
139
|
`\n ${bold("Model:")} ${dim(existing.model)}` +
|
|
138
|
-
`\n
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
(proc ? `\n ${bold("PID:")} ${dim(String(proc.pid))}` : "") +
|
|
141
|
+
"\n");
|
|
142
|
+
const confirmed = await prompter.promptConfirm(` Kill it and restart?`, sameProject);
|
|
143
|
+
if (!confirmed) {
|
|
144
|
+
console.log(dim(`\n Aborted. Use ${cyan(`vskill eval serve --port ${port + 1}`)} for a different port.\n`));
|
|
145
|
+
process.exit(0);
|
|
146
|
+
}
|
|
147
|
+
if (proc) {
|
|
148
|
+
console.log(dim(` Stopping process ${proc.pid}...`));
|
|
149
|
+
await killAndWait(proc.pid, port);
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
141
152
|
}
|
|
142
|
-
// Not a vskill server
|
|
143
|
-
const proc = findProcessOnPort(port);
|
|
153
|
+
// Not a vskill server — unknown process
|
|
144
154
|
if (proc) {
|
|
145
|
-
console.
|
|
155
|
+
console.log(`\n ${bold("Port")} ${cyan(String(port))} ${bold("is in use by another process:")}` +
|
|
146
156
|
`\n ${bold("PID:")} ${proc.pid}` +
|
|
147
157
|
`\n ${bold("Command:")} ${dim(proc.command)}` +
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
158
|
+
"\n");
|
|
159
|
+
const confirmed = await prompter.promptConfirm(` Kill it and proceed?`, false);
|
|
160
|
+
if (!confirmed) {
|
|
161
|
+
console.log(dim(`\n Aborted. Use ${cyan(`vskill eval serve --port ${port + 1}`)} for a different port.\n`));
|
|
162
|
+
process.exit(0);
|
|
163
|
+
}
|
|
164
|
+
console.log(dim(` Stopping process ${proc.pid}...`));
|
|
165
|
+
await killAndWait(proc.pid, port);
|
|
166
|
+
return;
|
|
154
167
|
}
|
|
168
|
+
// Port in use but can't identify the process
|
|
169
|
+
console.error(red(`\n Port ${port} is in use but the process could not be identified.\n`) +
|
|
170
|
+
` ${dim("Try:")} ${cyan(`vskill eval serve --port ${port + 1}`)}\n`);
|
|
155
171
|
process.exit(1);
|
|
156
172
|
}
|
|
157
173
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/eval/serve.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/eval/serve.ts"],"names":[],"mappings":"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"}
|