agentic-orchestrator 0.1.21 → 0.1.23
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/README.md +5 -8
- package/apps/control-plane/src/cli/help-command-handler.ts +6 -2
- package/apps/control-plane/src/cli/init-command-handler.ts +1 -1
- package/apps/control-plane/src/cli/stop-command-handler.ts +166 -2
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +11 -7
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +35 -0
- package/apps/control-plane/test/bootstrap.spec.ts +34 -2
- package/apps/control-plane/test/cli-helpers.spec.ts +5 -4
- package/apps/control-plane/test/cli.unit.spec.ts +7 -2
- package/apps/control-plane/test/stop-command.spec.ts +395 -0
- package/config/agentic/orchestrator/agents.yaml +1 -1
- package/dist/apps/control-plane/cli/help-command-handler.js +6 -2
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +1 -1
- package/dist/apps/control-plane/cli/stop-command-handler.d.ts +5 -1
- package/dist/apps/control-plane/cli/stop-command-handler.js +145 -2
- package/dist/apps/control-plane/cli/stop-command-handler.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +9 -6
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/package.json +1 -1
- package/spec-files/outstanding/agentic_orchestrator_worker_runtime_watchdog_resilience_spec.md +1 -1
- package/spec-files/progress.md +55 -0
package/README.md
CHANGED
|
@@ -329,18 +329,15 @@ node apps/control-plane/scripts/validate-docker-mcp-contract.mjs --smoke
|
|
|
329
329
|
|
|
330
330
|
### `stop`
|
|
331
331
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
```json
|
|
335
|
-
{ "ok": true, "data": { "status": "stop_not_implemented_yet" } }
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
It does not currently terminate active sessions or revoke leases.
|
|
332
|
+
Stops the dashboard server by killing the process listening on a port.
|
|
339
333
|
|
|
340
334
|
Example:
|
|
341
335
|
|
|
342
336
|
```bash
|
|
343
337
|
aop stop
|
|
338
|
+
|
|
339
|
+
# Stop a custom dashboard port
|
|
340
|
+
aop stop --port 8080
|
|
344
341
|
```
|
|
345
342
|
|
|
346
343
|
### `delete`
|
|
@@ -511,7 +508,7 @@ Supported options:
|
|
|
511
508
|
| `--all` | Aggregate across all projects (`status`); delete all features (`delete`) |
|
|
512
509
|
| `--auto` | Non-interactive init with all defaults (`init`) |
|
|
513
510
|
| `--force` | Overwrite existing config (`init`); force retry regardless of state (`retry`) |
|
|
514
|
-
| `--port <number>` | Dashboard listen port (
|
|
511
|
+
| `--port <number>` | Dashboard listen port (`aop dashboard`) or stop target port (`aop stop`) |
|
|
515
512
|
| `--dev` | Start dashboard in Next.js dev mode |
|
|
516
513
|
| `--foreground` | Keep dashboard server in the foreground |
|
|
517
514
|
| `--message <text>` | Message to deliver to agent session (`send`) |
|
|
@@ -59,8 +59,12 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
59
59
|
],
|
|
60
60
|
},
|
|
61
61
|
[CliCommand.Stop]: {
|
|
62
|
-
usage: 'aop stop',
|
|
63
|
-
description: '
|
|
62
|
+
usage: 'aop stop [flags]',
|
|
63
|
+
description: 'Stop the dashboard server by terminating listeners on a target port.',
|
|
64
|
+
flags: [
|
|
65
|
+
{ flag: '--port <number>', description: 'Port to stop (default: 3000)' },
|
|
66
|
+
{ flag: '--project <name>', description: 'Use the project default dashboard port' },
|
|
67
|
+
],
|
|
64
68
|
},
|
|
65
69
|
[CliCommand.Delete]: {
|
|
66
70
|
usage: 'aop delete [flags]',
|
|
@@ -424,7 +424,7 @@ runtime:
|
|
|
424
424
|
default_provider: ${wizard.defaultProvider}
|
|
425
425
|
default_model: ${wizard.defaultModel}
|
|
426
426
|
worker_provider_mode: live
|
|
427
|
-
worker_response_timeout_ms:
|
|
427
|
+
worker_response_timeout_ms: 600000
|
|
428
428
|
max_consecutive_no_progress_iterations: 2
|
|
429
429
|
${providerConfigEnvLine} role_provider_overrides: {}
|
|
430
430
|
`;
|
|
@@ -1,5 +1,169 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
const DEFAULT_DASHBOARD_PORT = 3000;
|
|
6
|
+
|
|
7
|
+
interface StopCommandOptions {
|
|
8
|
+
port?: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function normalizePort(port: number | undefined): number {
|
|
12
|
+
if (typeof port === 'number' && Number.isInteger(port) && port >= 1 && port <= 65535) {
|
|
13
|
+
return port;
|
|
14
|
+
}
|
|
15
|
+
return DEFAULT_DASHBOARD_PORT;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parsePids(raw: string): number[] {
|
|
19
|
+
const values = raw
|
|
20
|
+
.split(/\r?\n/)
|
|
21
|
+
.map((line) => Number.parseInt(line.trim(), 10))
|
|
22
|
+
.filter((value) => Number.isInteger(value) && value > 0);
|
|
23
|
+
return [...new Set(values)];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function extractStdout(result: unknown): string {
|
|
27
|
+
if (typeof result === 'string') {
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
if (!result || typeof result !== 'object') {
|
|
31
|
+
return '';
|
|
32
|
+
}
|
|
33
|
+
const record = result as Record<string, unknown>;
|
|
34
|
+
const stdout = record.stdout;
|
|
35
|
+
if (typeof stdout === 'string') {
|
|
36
|
+
return stdout;
|
|
37
|
+
}
|
|
38
|
+
if (stdout instanceof Uint8Array) {
|
|
39
|
+
return Buffer.from(stdout).toString('utf8');
|
|
40
|
+
}
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function readErrorCode(error: unknown): string | number | undefined {
|
|
45
|
+
if (!error || typeof error !== 'object') {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const record = error as Record<string, unknown>;
|
|
49
|
+
const { code } = record;
|
|
50
|
+
return typeof code === 'string' || typeof code === 'number' ? code : undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isNotFoundError(error: unknown): boolean {
|
|
54
|
+
return readErrorCode(error) === 'ENOENT';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function isNoMatchesError(error: unknown): boolean {
|
|
58
|
+
return readErrorCode(error) === 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function findPidsOnWindows(port: number): Promise<number[]> {
|
|
62
|
+
const stdout = extractStdout(await execFileAsync('netstat', ['-ano', '-p', 'tcp']));
|
|
63
|
+
const pids: number[] = [];
|
|
64
|
+
const lines = stdout.split(/\r?\n/);
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
if (!line.includes('LISTENING')) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const parts = line.trim().split(/\s+/);
|
|
70
|
+
if (parts.length < 5) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const localAddress = parts[1];
|
|
74
|
+
const pid = Number.parseInt(parts[4], 10);
|
|
75
|
+
const localPortRaw = localAddress.includes(':') ? localAddress.split(':').pop() : null;
|
|
76
|
+
const localPort = localPortRaw ? Number.parseInt(localPortRaw, 10) : Number.NaN;
|
|
77
|
+
if (localPort === port && Number.isInteger(pid) && pid > 0) {
|
|
78
|
+
pids.push(pid);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return [...new Set(pids)];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function findPidsOnUnix(port: number): Promise<number[]> {
|
|
85
|
+
try {
|
|
86
|
+
const stdout = extractStdout(
|
|
87
|
+
await execFileAsync('lsof', ['-nP', '-iTCP:' + String(port), '-sTCP:LISTEN', '-t']),
|
|
88
|
+
);
|
|
89
|
+
return parsePids(stdout);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
if (isNoMatchesError(error)) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
if (isNotFoundError(error)) {
|
|
95
|
+
// Minimal fallback when lsof is unavailable.
|
|
96
|
+
const stdout = extractStdout(
|
|
97
|
+
await execFileAsync('ss', ['-ltnp', 'sport = :' + String(port)]),
|
|
98
|
+
);
|
|
99
|
+
const pidMatches = [...stdout.matchAll(/pid=(\d+)/g)];
|
|
100
|
+
const pids = pidMatches
|
|
101
|
+
.map((match) => Number.parseInt(match[1], 10))
|
|
102
|
+
.filter((value) => Number.isInteger(value) && value > 0);
|
|
103
|
+
return [...new Set(pids)];
|
|
104
|
+
}
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function findListeningPids(port: number): Promise<number[]> {
|
|
110
|
+
if (process.platform === 'win32') {
|
|
111
|
+
return await findPidsOnWindows(port);
|
|
112
|
+
}
|
|
113
|
+
return await findPidsOnUnix(port);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function killPid(pid: number): Promise<void> {
|
|
117
|
+
if (process.platform === 'win32') {
|
|
118
|
+
await execFileAsync('taskkill', ['/PID', String(pid), '/F']);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
await execFileAsync('kill', ['-TERM', String(pid)]);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function isAlreadyExitedError(error: unknown): boolean {
|
|
125
|
+
const code = readErrorCode(error);
|
|
126
|
+
return code === 'ESRCH' || code === 1;
|
|
127
|
+
}
|
|
128
|
+
|
|
1
129
|
export class StopCommandHandler {
|
|
2
|
-
execute(): Promise<unknown> {
|
|
3
|
-
|
|
130
|
+
async execute(options: StopCommandOptions = {}): Promise<unknown> {
|
|
131
|
+
const port = normalizePort(options.port);
|
|
132
|
+
const pids = await findListeningPids(port);
|
|
133
|
+
if (pids.length === 0) {
|
|
134
|
+
return {
|
|
135
|
+
ok: true,
|
|
136
|
+
data: {
|
|
137
|
+
command: 'stop',
|
|
138
|
+
target: 'dashboard',
|
|
139
|
+
port,
|
|
140
|
+
stopped: false,
|
|
141
|
+
message: `No process is listening on port ${port}`,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for (const pid of pids) {
|
|
147
|
+
try {
|
|
148
|
+
await killPid(pid);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
if (isAlreadyExitedError(error)) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
ok: true,
|
|
159
|
+
data: {
|
|
160
|
+
command: 'stop',
|
|
161
|
+
target: 'dashboard',
|
|
162
|
+
port,
|
|
163
|
+
stopped: true,
|
|
164
|
+
pids,
|
|
165
|
+
message: `Stopped listener(s) on port ${port}`,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
4
168
|
}
|
|
5
169
|
}
|
|
@@ -253,6 +253,17 @@ export async function runCli(
|
|
|
253
253
|
return 0;
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
+
if (options.command === CliCommand.Stop) {
|
|
257
|
+
const handler = new StopCommandHandler();
|
|
258
|
+
const defaultDashboardPort =
|
|
259
|
+
selectedProject?.dashboard_port ?? multiConfig?.defaults?.dashboard_port;
|
|
260
|
+
const payload = await handler.execute({
|
|
261
|
+
port: options.port ?? defaultDashboardPort,
|
|
262
|
+
});
|
|
263
|
+
printPayload(payload);
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
|
|
256
267
|
const transport = parser.resolveTransport(options.transport);
|
|
257
268
|
const runId = `run:${crypto.randomUUID()}`;
|
|
258
269
|
|
|
@@ -380,13 +391,6 @@ export async function runCli(
|
|
|
380
391
|
return 0;
|
|
381
392
|
}
|
|
382
393
|
|
|
383
|
-
if (options.command === CliCommand.Stop) {
|
|
384
|
-
const handler = new StopCommandHandler();
|
|
385
|
-
const payload = await handler.execute();
|
|
386
|
-
printPayload(payload);
|
|
387
|
-
return 0;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
394
|
if (options.command === CliCommand.Delete) {
|
|
391
395
|
const handler = new DeleteCommandHandler(toolClient, runId);
|
|
392
396
|
const payload = await handler.execute(options);
|
|
@@ -13,6 +13,17 @@ const ensureLoadedMock = vi.hoisted(() => vi.fn(async () => undefined));
|
|
|
13
13
|
const createToolingRuntimeMock = vi.hoisted(() => vi.fn(async () => ({ runtime: 'ok' })));
|
|
14
14
|
const resolveToolClientMock = vi.hoisted(() => vi.fn());
|
|
15
15
|
const toolCallMock = vi.hoisted(() => vi.fn(async () => ({ ok: true, data: {} })));
|
|
16
|
+
const stopExecuteMock = vi.hoisted(() =>
|
|
17
|
+
vi.fn(async (options?: { port?: number }) => ({
|
|
18
|
+
ok: true,
|
|
19
|
+
data: {
|
|
20
|
+
command: 'stop',
|
|
21
|
+
target: 'dashboard',
|
|
22
|
+
port: options?.port ?? 3000,
|
|
23
|
+
stopped: false,
|
|
24
|
+
},
|
|
25
|
+
})),
|
|
26
|
+
);
|
|
16
27
|
|
|
17
28
|
/** Allows per-test control of getPolicySnapshot return value */
|
|
18
29
|
const policySnapshotOverride = vi.hoisted(() => ({
|
|
@@ -98,6 +109,14 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
|
|
|
98
109
|
},
|
|
99
110
|
}));
|
|
100
111
|
|
|
112
|
+
vi.mock('../src/cli/stop-command-handler.js', () => ({
|
|
113
|
+
StopCommandHandler: class StopCommandHandler {
|
|
114
|
+
async execute(options?: { port?: number }) {
|
|
115
|
+
return await stopExecuteMock(options);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
}));
|
|
119
|
+
|
|
101
120
|
vi.mock('../src/cli/run-command-handler.js', () => ({
|
|
102
121
|
RunCommandHandler: class RunCommandHandler {
|
|
103
122
|
async execute() {
|
|
@@ -156,6 +175,7 @@ describe('bootstrap edge-case branch coverage', () => {
|
|
|
156
175
|
toolCallMock.mockResolvedValue({ ok: true, data: { features: [] } });
|
|
157
176
|
ensureLoadedMock.mockClear();
|
|
158
177
|
createToolingRuntimeMock.mockClear();
|
|
178
|
+
stopExecuteMock.mockClear();
|
|
159
179
|
stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
160
180
|
policySnapshotOverride.value = {};
|
|
161
181
|
kernelThrowOverride.value = null;
|
|
@@ -288,6 +308,21 @@ describe('bootstrap edge-case branch coverage', () => {
|
|
|
288
308
|
expect(code).toBe(0);
|
|
289
309
|
});
|
|
290
310
|
|
|
311
|
+
it('GIVEN_stop_command_without_port_option_WHEN_executed_THEN_uses_project_default_port', async () => {
|
|
312
|
+
const proj1 = path.join(tmpDir, 'proj1');
|
|
313
|
+
await fs.mkdir(proj1, { recursive: true });
|
|
314
|
+
await writeMultiProjectYaml(
|
|
315
|
+
tmpDir,
|
|
316
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n dashboard_port: 4111\n`,
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
320
|
+
const code = await runCli(['stop', '--project', 'proj1'], { cwd: tmpDir, env: process.env });
|
|
321
|
+
|
|
322
|
+
expect(code).toBe(0);
|
|
323
|
+
expect(stopExecuteMock).toHaveBeenCalledWith({ port: 4111 });
|
|
324
|
+
});
|
|
325
|
+
|
|
291
326
|
it('GIVEN_status_all_with_one_project_throwing_error_without_code_WHEN_executed_THEN_uses_fallback_code', async () => {
|
|
292
327
|
// Covers line 205: typed.code ?? ERROR_CODES.INTERNAL_ERROR when typed.code is undefined
|
|
293
328
|
const proj1 = path.join(tmpDir, 'proj1');
|
|
@@ -11,6 +11,17 @@ const resolveToolClientMock = vi.hoisted(() => vi.fn());
|
|
|
11
11
|
const toolCallMock = vi.hoisted(() => vi.fn(async () => ({ ok: true, data: {} })));
|
|
12
12
|
const readlineQuestionMock = vi.hoisted(() => vi.fn(async () => ''));
|
|
13
13
|
const readlineCloseMock = vi.hoisted(() => vi.fn());
|
|
14
|
+
const stopExecuteMock = vi.hoisted(() =>
|
|
15
|
+
vi.fn(async (options?: { port?: number }) => ({
|
|
16
|
+
ok: true,
|
|
17
|
+
data: {
|
|
18
|
+
command: 'stop',
|
|
19
|
+
target: 'dashboard',
|
|
20
|
+
port: options?.port ?? 3000,
|
|
21
|
+
stopped: false,
|
|
22
|
+
},
|
|
23
|
+
})),
|
|
24
|
+
);
|
|
14
25
|
|
|
15
26
|
vi.mock('node:readline/promises', () => ({
|
|
16
27
|
default: {
|
|
@@ -88,6 +99,14 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
|
|
|
88
99
|
},
|
|
89
100
|
}));
|
|
90
101
|
|
|
102
|
+
vi.mock('../src/cli/stop-command-handler.js', () => ({
|
|
103
|
+
StopCommandHandler: class StopCommandHandler {
|
|
104
|
+
async execute(options?: { port?: number }) {
|
|
105
|
+
return await stopExecuteMock(options);
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
}));
|
|
109
|
+
|
|
91
110
|
vi.mock('../src/cli/run-command-handler.js', () => ({
|
|
92
111
|
RunCommandHandler: class RunCommandHandler {
|
|
93
112
|
async execute() {
|
|
@@ -151,6 +170,7 @@ describe('bootstrap runCli', () => {
|
|
|
151
170
|
toolCallMock.mockClear();
|
|
152
171
|
ensureLoadedMock.mockClear();
|
|
153
172
|
createToolingRuntimeMock.mockClear();
|
|
173
|
+
stopExecuteMock.mockClear();
|
|
154
174
|
stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
155
175
|
});
|
|
156
176
|
|
|
@@ -159,13 +179,25 @@ describe('bootstrap runCli', () => {
|
|
|
159
179
|
vi.clearAllMocks();
|
|
160
180
|
});
|
|
161
181
|
|
|
162
|
-
it('
|
|
182
|
+
it('GIVEN_stop_command_WHEN_executed_THEN_returns_stop_dashboard_payload', async () => {
|
|
163
183
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
164
184
|
const code = await runCli(['stop'], { cwd: '/tmp', env: process.env });
|
|
165
185
|
|
|
166
186
|
const writes = asJsonWrites(stdoutSpy);
|
|
167
187
|
expect(code).toBe(0);
|
|
168
|
-
expect(
|
|
188
|
+
expect(stopExecuteMock).toHaveBeenCalledWith({ port: undefined });
|
|
189
|
+
expect(writes[0]).toMatchObject({
|
|
190
|
+
ok: true,
|
|
191
|
+
data: { command: 'stop', target: 'dashboard', port: 3000, stopped: false },
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('GIVEN_stop_command_with_port_WHEN_executed_THEN_passes_port_to_handler', async () => {
|
|
196
|
+
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
197
|
+
const code = await runCli(['stop', '--port', '8080'], { cwd: '/tmp', env: process.env });
|
|
198
|
+
|
|
199
|
+
expect(code).toBe(0);
|
|
200
|
+
expect(stopExecuteMock).toHaveBeenCalledWith({ port: 8080 });
|
|
169
201
|
});
|
|
170
202
|
|
|
171
203
|
it('GIVEN_delete_command_with_feature_id_and_yes_WHEN_executed_THEN_calls_toolClient', async () => {
|
|
@@ -486,14 +486,15 @@ describe('HelpCommandHandler', () => {
|
|
|
486
486
|
expect(result.data.help).toContain('Commands:');
|
|
487
487
|
});
|
|
488
488
|
|
|
489
|
-
it('
|
|
489
|
+
it('GIVEN_stop_help_WHEN_execute_called_THEN_renders_stop_flags_section', async () => {
|
|
490
490
|
const { HelpCommandHandler } = await import('../src/cli/help-command-handler.js');
|
|
491
491
|
const handler = new HelpCommandHandler();
|
|
492
492
|
const result = handler.execute('stop');
|
|
493
493
|
expect(result.ok).toBe(true);
|
|
494
|
-
expect(result.data.help).toContain('Usage: aop stop');
|
|
495
|
-
|
|
496
|
-
expect(result.data.help).
|
|
494
|
+
expect(result.data.help).toContain('Usage: aop stop [flags]');
|
|
495
|
+
expect(result.data.help).toContain('Flags:');
|
|
496
|
+
expect(result.data.help).toContain('--port <number>');
|
|
497
|
+
expect(result.data.help).toContain('--project <name>');
|
|
497
498
|
});
|
|
498
499
|
|
|
499
500
|
it('GIVEN_delete_help_WHEN_execute_called_THEN_documents_yes_for_destructive_delete', async () => {
|
|
@@ -348,14 +348,19 @@ describe('aop CLI unit', () => {
|
|
|
348
348
|
});
|
|
349
349
|
});
|
|
350
350
|
|
|
351
|
-
it('
|
|
351
|
+
it('GIVEN_stop_command_WHEN_main_runs_THEN_returns_stop_dashboard_payload', async () => {
|
|
352
352
|
const code = await main(['stop'], { cwd, env: {} as NodeJS.ProcessEnv });
|
|
353
353
|
const writes = asJsonWrites(stdoutSpy);
|
|
354
354
|
|
|
355
355
|
expect(code).toBe(0);
|
|
356
356
|
expect(writes[0]).toMatchObject({
|
|
357
357
|
ok: true,
|
|
358
|
-
data: {
|
|
358
|
+
data: expect.objectContaining({
|
|
359
|
+
command: 'stop',
|
|
360
|
+
target: 'dashboard',
|
|
361
|
+
port: 3000,
|
|
362
|
+
stopped: expect.any(Boolean),
|
|
363
|
+
}),
|
|
359
364
|
});
|
|
360
365
|
});
|
|
361
366
|
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import type { ExecFileException } from 'node:child_process';
|
|
3
|
+
import { StopCommandHandler } from '../src/cli/stop-command-handler.js';
|
|
4
|
+
|
|
5
|
+
vi.mock('node:child_process', () => ({
|
|
6
|
+
execFile: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
type ExecCallback = (error: ExecFileException | null, stdout?: unknown, stderr?: unknown) => void;
|
|
10
|
+
|
|
11
|
+
const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, 'platform');
|
|
12
|
+
|
|
13
|
+
function makeExecError(code?: string | number): ExecFileException {
|
|
14
|
+
const error = new Error('exec failed') as ExecFileException;
|
|
15
|
+
if (code !== undefined) {
|
|
16
|
+
error.code = code;
|
|
17
|
+
}
|
|
18
|
+
return error;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function callbackFromArgs(args: unknown[]): ExecCallback {
|
|
22
|
+
const callback = args.at(-1);
|
|
23
|
+
if (typeof callback !== 'function') {
|
|
24
|
+
throw new Error('missing execFile callback');
|
|
25
|
+
}
|
|
26
|
+
return callback as ExecCallback;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function setProcessPlatform(platform: NodeJS.Platform): void {
|
|
30
|
+
Object.defineProperty(process, 'platform', { value: platform });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe('StopCommandHandler', () => {
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
if (originalPlatformDescriptor) {
|
|
37
|
+
Object.defineProperty(process, 'platform', originalPlatformDescriptor);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('GIVEN_no_process_on_port_WHEN_execute_THEN_returns_stopped_false', async () => {
|
|
42
|
+
const { execFile } = await import('node:child_process');
|
|
43
|
+
|
|
44
|
+
vi.mocked(execFile).mockImplementation((...args) => {
|
|
45
|
+
callbackFromArgs(args)(makeExecError(1), '', '');
|
|
46
|
+
return {} as never;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const handler = new StopCommandHandler();
|
|
50
|
+
const result = await handler.execute({ port: 3000 });
|
|
51
|
+
|
|
52
|
+
expect(execFile).toHaveBeenCalledWith(
|
|
53
|
+
'lsof',
|
|
54
|
+
['-nP', '-iTCP:3000', '-sTCP:LISTEN', '-t'],
|
|
55
|
+
expect.any(Function),
|
|
56
|
+
);
|
|
57
|
+
expect(result).toMatchObject({
|
|
58
|
+
ok: true,
|
|
59
|
+
data: {
|
|
60
|
+
command: 'stop',
|
|
61
|
+
target: 'dashboard',
|
|
62
|
+
port: 3000,
|
|
63
|
+
stopped: false,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('GIVEN_invalid_port_WHEN_execute_THEN_falls_back_to_default_port_3000', async () => {
|
|
69
|
+
const { execFile } = await import('node:child_process');
|
|
70
|
+
|
|
71
|
+
vi.mocked(execFile).mockImplementation((...args) => {
|
|
72
|
+
callbackFromArgs(args)(makeExecError(1), '', '');
|
|
73
|
+
return {} as never;
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const handler = new StopCommandHandler();
|
|
77
|
+
await handler.execute({ port: 0 });
|
|
78
|
+
|
|
79
|
+
expect(execFile).toHaveBeenCalledWith(
|
|
80
|
+
'lsof',
|
|
81
|
+
['-nP', '-iTCP:3000', '-sTCP:LISTEN', '-t'],
|
|
82
|
+
expect.any(Function),
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('GIVEN_listener_on_port_WHEN_execute_THEN_kills_pid_and_returns_stopped_true', async () => {
|
|
87
|
+
const { execFile } = await import('node:child_process');
|
|
88
|
+
|
|
89
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
90
|
+
const file = allArgs[0];
|
|
91
|
+
const args = allArgs[1] as string[];
|
|
92
|
+
const callback = callbackFromArgs(allArgs);
|
|
93
|
+
if (file === 'lsof') {
|
|
94
|
+
callback(null, '123\n', '');
|
|
95
|
+
return {} as never;
|
|
96
|
+
}
|
|
97
|
+
if (file === 'kill' && args[0] === '-TERM' && args[1] === '123') {
|
|
98
|
+
callback(null, '', '');
|
|
99
|
+
return {} as never;
|
|
100
|
+
}
|
|
101
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
102
|
+
return {} as never;
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const handler = new StopCommandHandler();
|
|
106
|
+
const result = await handler.execute({ port: 4000 });
|
|
107
|
+
|
|
108
|
+
expect(execFile).toHaveBeenCalledWith(
|
|
109
|
+
'lsof',
|
|
110
|
+
['-nP', '-iTCP:4000', '-sTCP:LISTEN', '-t'],
|
|
111
|
+
expect.any(Function),
|
|
112
|
+
);
|
|
113
|
+
expect(execFile).toHaveBeenCalledWith('kill', ['-TERM', '123'], expect.any(Function));
|
|
114
|
+
expect(result).toMatchObject({
|
|
115
|
+
ok: true,
|
|
116
|
+
data: {
|
|
117
|
+
command: 'stop',
|
|
118
|
+
target: 'dashboard',
|
|
119
|
+
port: 4000,
|
|
120
|
+
stopped: true,
|
|
121
|
+
pids: [123],
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('GIVEN_lsof_not_found_WHEN_execute_THEN_falls_back_to_ss_and_stops_all_found_pids', async () => {
|
|
127
|
+
const { execFile } = await import('node:child_process');
|
|
128
|
+
|
|
129
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
130
|
+
const file = allArgs[0];
|
|
131
|
+
const args = allArgs[1] as string[];
|
|
132
|
+
const callback = callbackFromArgs(allArgs);
|
|
133
|
+
if (file === 'lsof') {
|
|
134
|
+
callback(makeExecError('ENOENT'), '', '');
|
|
135
|
+
return {} as never;
|
|
136
|
+
}
|
|
137
|
+
if (file === 'ss') {
|
|
138
|
+
callback(
|
|
139
|
+
null,
|
|
140
|
+
'users:(("node",pid=777,fd=3))\nusers:(("node",pid=777,fd=5))\nusers:(("node",pid=778,fd=7))',
|
|
141
|
+
'',
|
|
142
|
+
);
|
|
143
|
+
return {} as never;
|
|
144
|
+
}
|
|
145
|
+
if (file === 'kill' && (args[1] === '777' || args[1] === '778')) {
|
|
146
|
+
callback(null, '', '');
|
|
147
|
+
return {} as never;
|
|
148
|
+
}
|
|
149
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
150
|
+
return {} as never;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const handler = new StopCommandHandler();
|
|
154
|
+
const result = await handler.execute({ port: 5000 });
|
|
155
|
+
|
|
156
|
+
expect(execFile).toHaveBeenCalledWith('ss', ['-ltnp', 'sport = :5000'], expect.any(Function));
|
|
157
|
+
expect(execFile).toHaveBeenCalledWith('kill', ['-TERM', '777'], expect.any(Function));
|
|
158
|
+
expect(execFile).toHaveBeenCalledWith('kill', ['-TERM', '778'], expect.any(Function));
|
|
159
|
+
expect(result).toMatchObject({
|
|
160
|
+
ok: true,
|
|
161
|
+
data: {
|
|
162
|
+
stopped: true,
|
|
163
|
+
pids: [777, 778],
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('GIVEN_lsof_returns_object_stdout_WHEN_execute_THEN_parses_stdout_field', async () => {
|
|
169
|
+
const { execFile } = await import('node:child_process');
|
|
170
|
+
|
|
171
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
172
|
+
const file = allArgs[0];
|
|
173
|
+
const args = allArgs[1] as string[];
|
|
174
|
+
const callback = callbackFromArgs(allArgs);
|
|
175
|
+
if (file === 'lsof') {
|
|
176
|
+
callback(null, { stdout: '801\n' }, '');
|
|
177
|
+
return {} as never;
|
|
178
|
+
}
|
|
179
|
+
if (file === 'kill' && args[1] === '801') {
|
|
180
|
+
callback(null, '', '');
|
|
181
|
+
return {} as never;
|
|
182
|
+
}
|
|
183
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
184
|
+
return {} as never;
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const handler = new StopCommandHandler();
|
|
188
|
+
const result = await handler.execute({ port: 8010 });
|
|
189
|
+
|
|
190
|
+
expect(result).toMatchObject({
|
|
191
|
+
ok: true,
|
|
192
|
+
data: {
|
|
193
|
+
stopped: true,
|
|
194
|
+
pids: [801],
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('GIVEN_lsof_returns_non_object_stdout_WHEN_execute_THEN_treats_as_no_listener', async () => {
|
|
200
|
+
const { execFile } = await import('node:child_process');
|
|
201
|
+
|
|
202
|
+
vi.mocked(execFile).mockImplementation((...args) => {
|
|
203
|
+
callbackFromArgs(args)(null, undefined, '');
|
|
204
|
+
return {} as never;
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
const handler = new StopCommandHandler();
|
|
208
|
+
const result = await handler.execute({ port: 3001 });
|
|
209
|
+
|
|
210
|
+
expect(result).toMatchObject({
|
|
211
|
+
ok: true,
|
|
212
|
+
data: {
|
|
213
|
+
stopped: false,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('GIVEN_lsof_non_match_error_is_not_enoent_or_no_matches_WHEN_execute_THEN_throws', async () => {
|
|
219
|
+
const { execFile } = await import('node:child_process');
|
|
220
|
+
|
|
221
|
+
vi.mocked(execFile).mockImplementation((...args) => {
|
|
222
|
+
callbackFromArgs(args)(makeExecError('EACCES'), '', '');
|
|
223
|
+
return {} as never;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const handler = new StopCommandHandler();
|
|
227
|
+
await expect(handler.execute({ port: 8080 })).rejects.toMatchObject({ code: 'EACCES' });
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('GIVEN_lsof_throws_non_object_error_WHEN_execute_THEN_rethrows_it', async () => {
|
|
231
|
+
const { execFile } = await import('node:child_process');
|
|
232
|
+
|
|
233
|
+
vi.mocked(execFile).mockImplementation((...args) => {
|
|
234
|
+
callbackFromArgs(args)('boom' as unknown as ExecFileException, '', '');
|
|
235
|
+
return {} as never;
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
const handler = new StopCommandHandler();
|
|
239
|
+
await expect(handler.execute({ port: 8082 })).rejects.toBe('boom');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('GIVEN_kill_reports_esrch_WHEN_execute_THEN_ignores_and_continues', async () => {
|
|
243
|
+
const { execFile } = await import('node:child_process');
|
|
244
|
+
|
|
245
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
246
|
+
const file = allArgs[0];
|
|
247
|
+
const args = allArgs[1] as string[];
|
|
248
|
+
const callback = callbackFromArgs(allArgs);
|
|
249
|
+
if (file === 'lsof') {
|
|
250
|
+
callback(null, '501\n502\n', '');
|
|
251
|
+
return {} as never;
|
|
252
|
+
}
|
|
253
|
+
if (file === 'kill' && args[1] === '501') {
|
|
254
|
+
callback(makeExecError('ESRCH'), '', '');
|
|
255
|
+
return {} as never;
|
|
256
|
+
}
|
|
257
|
+
if (file === 'kill' && args[1] === '502') {
|
|
258
|
+
callback(null, '', '');
|
|
259
|
+
return {} as never;
|
|
260
|
+
}
|
|
261
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
262
|
+
return {} as never;
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
const handler = new StopCommandHandler();
|
|
266
|
+
const result = await handler.execute({ port: 9000 });
|
|
267
|
+
|
|
268
|
+
expect(result).toMatchObject({
|
|
269
|
+
ok: true,
|
|
270
|
+
data: {
|
|
271
|
+
stopped: true,
|
|
272
|
+
pids: [501, 502],
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('GIVEN_kill_reports_numeric_code_1_WHEN_execute_THEN_ignores_as_already_exited', async () => {
|
|
278
|
+
const { execFile } = await import('node:child_process');
|
|
279
|
+
|
|
280
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
281
|
+
const file = allArgs[0];
|
|
282
|
+
const args = allArgs[1] as string[];
|
|
283
|
+
const callback = callbackFromArgs(allArgs);
|
|
284
|
+
if (file === 'lsof') {
|
|
285
|
+
callback(null, '600\n', '');
|
|
286
|
+
return {} as never;
|
|
287
|
+
}
|
|
288
|
+
if (file === 'kill' && args[1] === '600') {
|
|
289
|
+
callback(makeExecError(1), '', '');
|
|
290
|
+
return {} as never;
|
|
291
|
+
}
|
|
292
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
293
|
+
return {} as never;
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
const handler = new StopCommandHandler();
|
|
297
|
+
const result = await handler.execute({ port: 9001 });
|
|
298
|
+
|
|
299
|
+
expect(result).toMatchObject({
|
|
300
|
+
ok: true,
|
|
301
|
+
data: {
|
|
302
|
+
stopped: true,
|
|
303
|
+
pids: [600],
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('GIVEN_kill_reports_non_recoverable_error_WHEN_execute_THEN_throws', async () => {
|
|
309
|
+
const { execFile } = await import('node:child_process');
|
|
310
|
+
|
|
311
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
312
|
+
const file = allArgs[0];
|
|
313
|
+
const args = allArgs[1] as string[];
|
|
314
|
+
const callback = callbackFromArgs(allArgs);
|
|
315
|
+
if (file === 'lsof') {
|
|
316
|
+
callback(null, '700\n', '');
|
|
317
|
+
return {} as never;
|
|
318
|
+
}
|
|
319
|
+
if (file === 'kill' && args[1] === '700') {
|
|
320
|
+
callback(makeExecError('EPERM'), '', '');
|
|
321
|
+
return {} as never;
|
|
322
|
+
}
|
|
323
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
324
|
+
return {} as never;
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
const handler = new StopCommandHandler();
|
|
328
|
+
await expect(handler.execute({ port: 9100 })).rejects.toMatchObject({ code: 'EPERM' });
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('GIVEN_windows_platform_WHEN_execute_THEN_uses_netstat_and_taskkill', async () => {
|
|
332
|
+
setProcessPlatform('win32');
|
|
333
|
+
const { execFile } = await import('node:child_process');
|
|
334
|
+
|
|
335
|
+
vi.mocked(execFile).mockImplementation((...allArgs) => {
|
|
336
|
+
const file = allArgs[0];
|
|
337
|
+
const args = allArgs[1] as string[];
|
|
338
|
+
const callback = callbackFromArgs(allArgs);
|
|
339
|
+
if (file === 'netstat') {
|
|
340
|
+
const output = [
|
|
341
|
+
'Active Connections',
|
|
342
|
+
' Proto Local Address Foreign Address State PID',
|
|
343
|
+
' TCP 127.0.0.1:4000 0.0.0.0:0 ESTABLISHED 100',
|
|
344
|
+
' TCP 0.0.0.0:4000 0.0.0.0:0 LISTENING 456',
|
|
345
|
+
' TCP 0.0.0.0:4000 0.0.0.0:0 LISTENING 456',
|
|
346
|
+
' TCP 0.0.0.0 0.0.0.0:0 LISTENING 457',
|
|
347
|
+
' TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 999',
|
|
348
|
+
' TCP malformed LISTENING',
|
|
349
|
+
].join('\r\n');
|
|
350
|
+
callback(null, { stdout: Buffer.from(output, 'utf8') }, '');
|
|
351
|
+
return {} as never;
|
|
352
|
+
}
|
|
353
|
+
if (file === 'taskkill' && args[0] === '/PID' && args[1] === '456' && args[2] === '/F') {
|
|
354
|
+
callback(null, '', '');
|
|
355
|
+
return {} as never;
|
|
356
|
+
}
|
|
357
|
+
callback(makeExecError('UNEXPECTED'), '', '');
|
|
358
|
+
return {} as never;
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
const handler = new StopCommandHandler();
|
|
362
|
+
const result = await handler.execute({ port: 4000 });
|
|
363
|
+
|
|
364
|
+
expect(execFile).toHaveBeenCalledWith('netstat', ['-ano', '-p', 'tcp'], expect.any(Function));
|
|
365
|
+
expect(execFile).toHaveBeenCalledWith('taskkill', ['/PID', '456', '/F'], expect.any(Function));
|
|
366
|
+
expect(result).toMatchObject({
|
|
367
|
+
ok: true,
|
|
368
|
+
data: {
|
|
369
|
+
stopped: true,
|
|
370
|
+
pids: [456],
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it('GIVEN_windows_platform_with_no_listener_WHEN_execute_THEN_returns_stopped_false', async () => {
|
|
376
|
+
setProcessPlatform('win32');
|
|
377
|
+
const { execFile } = await import('node:child_process');
|
|
378
|
+
|
|
379
|
+
vi.mocked(execFile).mockImplementation((...args) => {
|
|
380
|
+
callbackFromArgs(args)(null, 'TCP 0.0.0.0:1234 0.0.0.0:0 LISTENING 999', '');
|
|
381
|
+
return {} as never;
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
const handler = new StopCommandHandler();
|
|
385
|
+
const result = await handler.execute({ port: 9876 });
|
|
386
|
+
|
|
387
|
+
expect(result).toMatchObject({
|
|
388
|
+
ok: true,
|
|
389
|
+
data: {
|
|
390
|
+
stopped: false,
|
|
391
|
+
port: 9876,
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
});
|
|
@@ -52,8 +52,12 @@ const COMMAND_HELP = {
|
|
|
52
52
|
],
|
|
53
53
|
},
|
|
54
54
|
[CliCommand.Stop]: {
|
|
55
|
-
usage: 'aop stop',
|
|
56
|
-
description: '
|
|
55
|
+
usage: 'aop stop [flags]',
|
|
56
|
+
description: 'Stop the dashboard server by terminating listeners on a target port.',
|
|
57
|
+
flags: [
|
|
58
|
+
{ flag: '--port <number>', description: 'Port to stop (default: 3000)' },
|
|
59
|
+
{ flag: '--project <name>', description: 'Use the project default dashboard port' },
|
|
60
|
+
],
|
|
57
61
|
},
|
|
58
62
|
[CliCommand.Delete]: {
|
|
59
63
|
usage: 'aop delete [flags]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-command-handler.js","sourceRoot":"","sources":["../../../../apps/control-plane/src/cli/help-command-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQxC,MAAM,YAAY,GAAoC;IACpD,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QAChB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,mDAAmD;QAChE,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE;YAC3D,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE;YAC7D;gBACE,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,qEAAqE;aACnF;YACD;gBACE,IAAI,EAAE,yBAAyB;gBAC/B,WAAW,EAAE,oDAAoD;aAClE;YACD,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,sBAAsB,EAAE;YACrE,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,2BAA2B,EAAE;YAC3E;gBACE,IAAI,EAAE,6BAA6B;gBACnC,WAAW,EAAE,uDAAuD;aACrE;YACD;gBACE,IAAI,EAAE,oCAAoC;gBAC1C,WAAW,EAAE,+DAA+D;aAC7E;YACD,EAAE,IAAI,EAAE,6BAA6B,EAAE,WAAW,EAAE,qCAAqC,EAAE;YAC3F,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC5E,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,wCAAwC,EAAE;SACpF;KACF;IACD,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QACnB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,2CAA2C;QACxD,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,gDAAgD,EAAE;YACpF,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4DAA4D,EAAE;YAC5F,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,6BAA6B,EAAE;SACzE;KACF;IACD,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QACnB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACvE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iDAAiD,EAAE;YACnF;gBACE,IAAI,EAAE,oCAAoC;gBAC1C,WAAW,EAAE,gDAAgD;aAC9D;YACD,EAAE,IAAI,EAAE,6BAA6B,EAAE,WAAW,EAAE,qCAAqC,EAAE;SAC5F;KACF;IACD,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QACjB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"help-command-handler.js","sourceRoot":"","sources":["../../../../apps/control-plane/src/cli/help-command-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -350,7 +350,7 @@ runtime:
|
|
|
350
350
|
default_provider: ${wizard.defaultProvider}
|
|
351
351
|
default_model: ${wizard.defaultModel}
|
|
352
352
|
worker_provider_mode: live
|
|
353
|
-
worker_response_timeout_ms:
|
|
353
|
+
worker_response_timeout_ms: 600000
|
|
354
354
|
max_consecutive_no_progress_iterations: 2
|
|
355
355
|
${providerConfigEnvLine} role_provider_overrides: {}
|
|
356
356
|
`;
|
|
@@ -1,6 +1,149 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
const DEFAULT_DASHBOARD_PORT = 3000;
|
|
5
|
+
function normalizePort(port) {
|
|
6
|
+
if (typeof port === 'number' && Number.isInteger(port) && port >= 1 && port <= 65535) {
|
|
7
|
+
return port;
|
|
8
|
+
}
|
|
9
|
+
return DEFAULT_DASHBOARD_PORT;
|
|
10
|
+
}
|
|
11
|
+
function parsePids(raw) {
|
|
12
|
+
const values = raw
|
|
13
|
+
.split(/\r?\n/)
|
|
14
|
+
.map((line) => Number.parseInt(line.trim(), 10))
|
|
15
|
+
.filter((value) => Number.isInteger(value) && value > 0);
|
|
16
|
+
return [...new Set(values)];
|
|
17
|
+
}
|
|
18
|
+
function extractStdout(result) {
|
|
19
|
+
if (typeof result === 'string') {
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
if (!result || typeof result !== 'object') {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
const record = result;
|
|
26
|
+
const stdout = record.stdout;
|
|
27
|
+
if (typeof stdout === 'string') {
|
|
28
|
+
return stdout;
|
|
29
|
+
}
|
|
30
|
+
if (stdout instanceof Uint8Array) {
|
|
31
|
+
return Buffer.from(stdout).toString('utf8');
|
|
32
|
+
}
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
function readErrorCode(error) {
|
|
36
|
+
if (!error || typeof error !== 'object') {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const record = error;
|
|
40
|
+
const { code } = record;
|
|
41
|
+
return typeof code === 'string' || typeof code === 'number' ? code : undefined;
|
|
42
|
+
}
|
|
43
|
+
function isNotFoundError(error) {
|
|
44
|
+
return readErrorCode(error) === 'ENOENT';
|
|
45
|
+
}
|
|
46
|
+
function isNoMatchesError(error) {
|
|
47
|
+
return readErrorCode(error) === 1;
|
|
48
|
+
}
|
|
49
|
+
async function findPidsOnWindows(port) {
|
|
50
|
+
const stdout = extractStdout(await execFileAsync('netstat', ['-ano', '-p', 'tcp']));
|
|
51
|
+
const pids = [];
|
|
52
|
+
const lines = stdout.split(/\r?\n/);
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
if (!line.includes('LISTENING')) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const parts = line.trim().split(/\s+/);
|
|
58
|
+
if (parts.length < 5) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const localAddress = parts[1];
|
|
62
|
+
const pid = Number.parseInt(parts[4], 10);
|
|
63
|
+
const localPortRaw = localAddress.includes(':') ? localAddress.split(':').pop() : null;
|
|
64
|
+
const localPort = localPortRaw ? Number.parseInt(localPortRaw, 10) : Number.NaN;
|
|
65
|
+
if (localPort === port && Number.isInteger(pid) && pid > 0) {
|
|
66
|
+
pids.push(pid);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return [...new Set(pids)];
|
|
70
|
+
}
|
|
71
|
+
async function findPidsOnUnix(port) {
|
|
72
|
+
try {
|
|
73
|
+
const stdout = extractStdout(await execFileAsync('lsof', ['-nP', '-iTCP:' + String(port), '-sTCP:LISTEN', '-t']));
|
|
74
|
+
return parsePids(stdout);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (isNoMatchesError(error)) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
if (isNotFoundError(error)) {
|
|
81
|
+
// Minimal fallback when lsof is unavailable.
|
|
82
|
+
const stdout = extractStdout(await execFileAsync('ss', ['-ltnp', 'sport = :' + String(port)]));
|
|
83
|
+
const pidMatches = [...stdout.matchAll(/pid=(\d+)/g)];
|
|
84
|
+
const pids = pidMatches
|
|
85
|
+
.map((match) => Number.parseInt(match[1], 10))
|
|
86
|
+
.filter((value) => Number.isInteger(value) && value > 0);
|
|
87
|
+
return [...new Set(pids)];
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function findListeningPids(port) {
|
|
93
|
+
if (process.platform === 'win32') {
|
|
94
|
+
return await findPidsOnWindows(port);
|
|
95
|
+
}
|
|
96
|
+
return await findPidsOnUnix(port);
|
|
97
|
+
}
|
|
98
|
+
async function killPid(pid) {
|
|
99
|
+
if (process.platform === 'win32') {
|
|
100
|
+
await execFileAsync('taskkill', ['/PID', String(pid), '/F']);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
await execFileAsync('kill', ['-TERM', String(pid)]);
|
|
104
|
+
}
|
|
105
|
+
function isAlreadyExitedError(error) {
|
|
106
|
+
const code = readErrorCode(error);
|
|
107
|
+
return code === 'ESRCH' || code === 1;
|
|
108
|
+
}
|
|
1
109
|
export class StopCommandHandler {
|
|
2
|
-
execute() {
|
|
3
|
-
|
|
110
|
+
async execute(options = {}) {
|
|
111
|
+
const port = normalizePort(options.port);
|
|
112
|
+
const pids = await findListeningPids(port);
|
|
113
|
+
if (pids.length === 0) {
|
|
114
|
+
return {
|
|
115
|
+
ok: true,
|
|
116
|
+
data: {
|
|
117
|
+
command: 'stop',
|
|
118
|
+
target: 'dashboard',
|
|
119
|
+
port,
|
|
120
|
+
stopped: false,
|
|
121
|
+
message: `No process is listening on port ${port}`,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
for (const pid of pids) {
|
|
126
|
+
try {
|
|
127
|
+
await killPid(pid);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (isAlreadyExitedError(error)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
ok: true,
|
|
138
|
+
data: {
|
|
139
|
+
command: 'stop',
|
|
140
|
+
target: 'dashboard',
|
|
141
|
+
port,
|
|
142
|
+
stopped: true,
|
|
143
|
+
pids,
|
|
144
|
+
message: `Stopped listener(s) on port ${port}`,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
4
147
|
}
|
|
5
148
|
}
|
|
6
149
|
//# sourceMappingURL=stop-command-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-command-handler.js","sourceRoot":"","sources":["../../../../apps/control-plane/src/cli/stop-command-handler.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"stop-command-handler.js","sourceRoot":"","sources":["../../../../apps/control-plane/src/cli/stop-command-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -206,6 +206,15 @@ export async function runCli(argv = process.argv.slice(2), runtime = { cwd: proc
|
|
|
206
206
|
printPayload(payload);
|
|
207
207
|
return 0;
|
|
208
208
|
}
|
|
209
|
+
if (options.command === CliCommand.Stop) {
|
|
210
|
+
const handler = new StopCommandHandler();
|
|
211
|
+
const defaultDashboardPort = selectedProject?.dashboard_port ?? multiConfig?.defaults?.dashboard_port;
|
|
212
|
+
const payload = await handler.execute({
|
|
213
|
+
port: options.port ?? defaultDashboardPort,
|
|
214
|
+
});
|
|
215
|
+
printPayload(payload);
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
209
218
|
const transport = parser.resolveTransport(options.transport);
|
|
210
219
|
const runId = `run:${crypto.randomUUID()}`;
|
|
211
220
|
// Handle --all for status: aggregate across all projects in multi-project.yaml
|
|
@@ -317,12 +326,6 @@ export async function runCli(argv = process.argv.slice(2), runtime = { cwd: proc
|
|
|
317
326
|
printPayload(payload);
|
|
318
327
|
return 0;
|
|
319
328
|
}
|
|
320
|
-
if (options.command === CliCommand.Stop) {
|
|
321
|
-
const handler = new StopCommandHandler();
|
|
322
|
-
const payload = await handler.execute();
|
|
323
|
-
printPayload(payload);
|
|
324
|
-
return 0;
|
|
325
|
-
}
|
|
326
329
|
if (options.command === CliCommand.Delete) {
|
|
327
330
|
const handler = new DeleteCommandHandler(toolClient, runId);
|
|
328
331
|
const payload = await handler.execute(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../../apps/control-plane/src/interfaces/cli/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../../apps/control-plane/src/interfaces/cli/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/spec-files/outstanding/agentic_orchestrator_worker_runtime_watchdog_resilience_spec.md
CHANGED
|
@@ -140,7 +140,7 @@ Extend `runtime` with watchdog controls:
|
|
|
140
140
|
|
|
141
141
|
```yaml
|
|
142
142
|
runtime:
|
|
143
|
-
worker_response_timeout_ms:
|
|
143
|
+
worker_response_timeout_ms: 600000 # existing hard timeout (overall); 10 min to accommodate large-context API latency
|
|
144
144
|
worker_spawn_timeout_ms: 15000 # max time to first spawn readiness
|
|
145
145
|
worker_idle_timeout_ms: 120000 # max silence window after spawn
|
|
146
146
|
worker_watchdog_poll_interval_ms: 1000 # watchdog cadence
|
package/spec-files/progress.md
CHANGED
|
@@ -968,6 +968,61 @@
|
|
|
968
968
|
|
|
969
969
|
---
|
|
970
970
|
|
|
971
|
+
✅ **Entry 195 — Implement `aop stop` dashboard port termination**
|
|
972
|
+
|
|
973
|
+
- **Goal:** Add a reliable CLI command to stop a running dashboard instance by terminating the listener on its port.
|
|
974
|
+
- **Changes made:**
|
|
975
|
+
- `apps/control-plane/src/cli/stop-command-handler.ts`
|
|
976
|
+
- replaced placeholder response with real stop logic that resolves a target port, discovers listening PIDs (`lsof`/`ss` on Unix, `netstat` on Windows), and terminates those processes (`kill -TERM`/`taskkill`).
|
|
977
|
+
- added deterministic no-op response when no process is listening on the target port.
|
|
978
|
+
- `apps/control-plane/src/interfaces/cli/bootstrap.ts`
|
|
979
|
+
- moved `stop` command dispatch into early command handling (same stage as `init`/`dashboard`) so it does not depend on kernel/tool runtime initialization.
|
|
980
|
+
- wired stop port resolution to `--port` with fallback to project/default dashboard port from `multi-project.yaml`.
|
|
981
|
+
- `apps/control-plane/src/cli/help-command-handler.ts`
|
|
982
|
+
- updated `aop stop` help text and flags to document port/project behavior.
|
|
983
|
+
- `README.md`
|
|
984
|
+
- replaced the old `stop` placeholder docs with real usage examples.
|
|
985
|
+
- updated CLI options table so `--port` explicitly covers both `aop dashboard` and `aop stop`.
|
|
986
|
+
- `apps/control-plane/test/stop-command.spec.ts`
|
|
987
|
+
- added unit coverage for “no listener on port” and “listener found then terminated” paths.
|
|
988
|
+
- `apps/control-plane/test/bootstrap.spec.ts`
|
|
989
|
+
- updated stop command expectations and added explicit `--port` pass-through assertion.
|
|
990
|
+
- `apps/control-plane/test/bootstrap-edge-cases.spec.ts`
|
|
991
|
+
- added coverage for project-default dashboard port propagation into `aop stop`.
|
|
992
|
+
- **Result:** `npx vitest run apps/control-plane/test/stop-command.spec.ts apps/control-plane/test/bootstrap.spec.ts apps/control-plane/test/bootstrap-edge-cases.spec.ts apps/control-plane/test/dashboard-command.spec.ts` [PASS] (78 tests). `npm run typecheck` [PASS]. `npm run lint` [PASS].
|
|
993
|
+
|
|
994
|
+
---
|
|
995
|
+
|
|
996
|
+
✅ **Entry 196 — Align CLI test expectations with implemented `aop stop` behavior**
|
|
997
|
+
|
|
998
|
+
- **Goal:** Resolve failing tests that still asserted legacy placeholder stop behavior and outdated help output after `aop stop` gained real port-termination support.
|
|
999
|
+
- **Changes made:**
|
|
1000
|
+
- `apps/control-plane/test/cli-helpers.spec.ts`
|
|
1001
|
+
- updated `HelpCommandHandler` stop-help assertion to expect `aop stop [flags]` with `Flags:` section including `--port <number>` and `--project <name>`.
|
|
1002
|
+
- `apps/control-plane/test/cli.unit.spec.ts`
|
|
1003
|
+
- replaced legacy `stop_not_implemented_yet` expectation with the new stop payload shape (`command`, `target`, `port`, `stopped`) using a non-flaky matcher for `stopped`.
|
|
1004
|
+
- **Result:** `npx vitest run apps/control-plane/test/cli-helpers.spec.ts apps/control-plane/test/cli.unit.spec.ts` [PASS] (112 tests). `npm run lint` [PASS].
|
|
1005
|
+
|
|
1006
|
+
---
|
|
1007
|
+
|
|
1008
|
+
✅ **Entry 197 — Raise `stop-command-handler.ts` coverage above 90% thresholds**
|
|
1009
|
+
|
|
1010
|
+
- **Goal:** Bring `apps/control-plane/src/cli/stop-command-handler.ts` to policy-compliant coverage for statements, branches, functions, and lines.
|
|
1011
|
+
- **Changes made:**
|
|
1012
|
+
- `apps/control-plane/test/stop-command.spec.ts`
|
|
1013
|
+
- expanded from 2 tests to 13 focused tests that cover:
|
|
1014
|
+
- Unix `lsof` success/no-match/error flows.
|
|
1015
|
+
- Unix fallback to `ss` when `lsof` is unavailable (`ENOENT`).
|
|
1016
|
+
- recoverable kill errors (`ESRCH` and numeric code `1`) vs non-recoverable kill failures.
|
|
1017
|
+
- invalid-port normalization fallback to default port `3000`.
|
|
1018
|
+
- stdout parsing branches for plain string, object `{ stdout: string }`, object `{ stdout: Buffer }`, and undefined stdout.
|
|
1019
|
+
- Windows `netstat` parsing + `taskkill` termination path via platform override.
|
|
1020
|
+
- Windows no-listener path.
|
|
1021
|
+
- added deterministic `process.platform` override/restore helper for cross-platform branch coverage.
|
|
1022
|
+
- **Result:** `npx vitest run apps/control-plane/test/stop-command.spec.ts --coverage --coverage.reporter=text --coverage.include=apps/control-plane/src/cli/stop-command-handler.ts` [PASS], file coverage now `98.68% statements`, `96.42% branches`, `100% functions`, `98.68% lines`. `npm test` [PASS] (`75` files / `1036` tests).
|
|
1023
|
+
|
|
1024
|
+
---
|
|
1025
|
+
|
|
971
1026
|
## Next Tasks:
|
|
972
1027
|
|
|
973
1028
|
1. None — dashboard UX regression fixes completed in Entry 193.
|