agentic-orchestrator 0.1.21 → 0.1.22

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 CHANGED
@@ -329,18 +329,15 @@ node apps/control-plane/scripts/validate-docker-mcp-contract.mjs --smoke
329
329
 
330
330
  ### `stop`
331
331
 
332
- Current behavior is a placeholder only:
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 (default `3000`) |
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: 'Signal the running supervisor to stop gracefully.',
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: 120000
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
- return Promise.resolve({ ok: true, data: { status: 'stop_not_implemented_yet' } });
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('GIVEN_stop_command_WHEN_executed_THEN_returns_stop_not_implemented_yet', async () => {
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(writes[0]).toMatchObject({ ok: true, data: { status: 'stop_not_implemented_yet' } });
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('GIVEN_command_without_flags_WHEN_execute_called_THEN_renders_without_flags_section', async () => {
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
- // stop has no flags
496
- expect(result.data.help).not.toContain('Flags:');
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('GIVEN_stop_command_WHEN_main_runs_THEN_returns_not_implemented_status', async () => {
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: { status: 'stop_not_implemented_yet' },
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
+ });
@@ -11,6 +11,6 @@ runtime:
11
11
  default_provider: claude
12
12
  default_model: local-default
13
13
  worker_provider_mode: live
14
- worker_response_timeout_ms: 120000
14
+ worker_response_timeout_ms: 600000
15
15
  max_consecutive_no_progress_iterations: 2
16
16
  role_provider_overrides: {}
@@ -52,8 +52,12 @@ const COMMAND_HELP = {
52
52
  ],
53
53
  },
54
54
  [CliCommand.Stop]: {
55
- usage: 'aop stop',
56
- description: 'Signal the running supervisor to stop gracefully.',
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":"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"}
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: 120000
353
+ worker_response_timeout_ms: 600000
354
354
  max_consecutive_no_progress_iterations: 2
355
355
  ${providerConfigEnvLine} role_provider_overrides: {}
356
356
  `;
@@ -1,3 +1,7 @@
1
+ interface StopCommandOptions {
2
+ port?: number;
3
+ }
1
4
  export declare class StopCommandHandler {
2
- execute(): Promise<unknown>;
5
+ execute(options?: StopCommandOptions): Promise<unknown>;
3
6
  }
7
+ export {};
@@ -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
- return Promise.resolve({ ok: true, data: { status: 'stop_not_implemented_yet' } });
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,kBAAkB;IAC7B,OAAO;QACL,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;CACF"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-orchestrator",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "private": false,
5
5
  "workspaces": [
6
6
  "packages/*"
@@ -140,7 +140,7 @@ Extend `runtime` with watchdog controls:
140
140
 
141
141
  ```yaml
142
142
  runtime:
143
- worker_response_timeout_ms: 300000 # existing hard timeout (overall)
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
@@ -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.