@agent-deck/cli 1.9.0 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend-runtime.d.ts +13 -0
- package/dist/backend-runtime.d.ts.map +1 -1
- package/dist/backend-runtime.js +20 -0
- package/dist/backend-runtime.js.map +1 -1
- package/dist/cli-integration-harness.d.ts +93 -0
- package/dist/cli-integration-harness.d.ts.map +1 -0
- package/dist/cli-integration-harness.js +309 -0
- package/dist/cli-integration-harness.js.map +1 -0
- package/dist/daemon-logs.d.ts +7 -0
- package/dist/daemon-logs.d.ts.map +1 -1
- package/dist/daemon-logs.js +55 -0
- package/dist/daemon-logs.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp-bridge.d.ts +182 -0
- package/dist/mcp-bridge.d.ts.map +1 -0
- package/dist/mcp-bridge.js +856 -0
- package/dist/mcp-bridge.js.map +1 -0
- package/dist/mcp-launcher.d.ts +9 -0
- package/dist/mcp-launcher.d.ts.map +1 -1
- package/dist/mcp-launcher.js +47 -0
- package/dist/mcp-launcher.js.map +1 -1
- package/dist/menubar.d.ts +13 -0
- package/dist/menubar.d.ts.map +1 -1
- package/dist/menubar.js +32 -1
- package/dist/menubar.js.map +1 -1
- package/dist/node-runtime.d.ts +14 -2
- package/dist/node-runtime.d.ts.map +1 -1
- package/dist/node-runtime.js +37 -18
- package/dist/node-runtime.js.map +1 -1
- package/dist/ports.d.ts +38 -0
- package/dist/ports.d.ts.map +1 -1
- package/dist/ports.js +63 -0
- package/dist/ports.js.map +1 -1
- package/dist/setup.js +1 -1
- package/dist/setup.js.map +1 -1
- package/dist/shutdown-reason.d.ts +105 -0
- package/dist/shutdown-reason.d.ts.map +1 -0
- package/dist/shutdown-reason.js +247 -0
- package/dist/shutdown-reason.js.map +1 -0
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +361 -37
- package/dist/start.js.map +1 -1
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +30 -0
- package/dist/status.js.map +1 -1
- package/dist/stop.d.ts +14 -1
- package/dist/stop.d.ts.map +1 -1
- package/dist/stop.js +72 -1
- package/dist/stop.js.map +1 -1
- package/dist/store.d.ts +9 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +41 -0
- package/dist/store.js.map +1 -1
- package/package.json +3 -3
|
@@ -116,6 +116,19 @@ export type CliStore = {
|
|
|
116
116
|
}>;
|
|
117
117
|
};
|
|
118
118
|
export declare function createStore(): CliStore;
|
|
119
|
+
export type LastReindexRecord = {
|
|
120
|
+
at: string;
|
|
121
|
+
ok: boolean;
|
|
122
|
+
error?: string;
|
|
123
|
+
warnings: string[];
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Last reindex outcome for status/doctor, or null when nothing was recorded (or
|
|
127
|
+
* the backend/database cannot be read). Callers print nothing for null: the rest
|
|
128
|
+
* of the diagnostic — including doctor's own backend and sqlite checks — has to
|
|
129
|
+
* keep running when the store cannot be reached.
|
|
130
|
+
*/
|
|
131
|
+
export declare function readLastReindex(): LastReindexRecord | null;
|
|
119
132
|
export declare function parseConnections(value: string | undefined): string[];
|
|
120
133
|
export declare function readSecretFromStdin(prompt: string): Promise<string>;
|
|
121
134
|
export declare function runCommand(command: string, args: string[], env: Record<string, string>): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-runtime.d.ts","sourceRoot":"","sources":["../src/backend-runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backend-runtime.d.ts","sourceRoot":"","sources":["../src/backend-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/backend-runtime.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.createCredentialManager = createCredentialManager;
|
|
|
7
7
|
exports.createCollectionAdmin = createCollectionAdmin;
|
|
8
8
|
exports.createExportImport = createExportImport;
|
|
9
9
|
exports.createStore = createStore;
|
|
10
|
+
exports.readLastReindex = readLastReindex;
|
|
10
11
|
exports.parseConnections = parseConnections;
|
|
11
12
|
exports.readSecretFromStdin = readSecretFromStdin;
|
|
12
13
|
exports.runCommand = runCommand;
|
|
@@ -45,6 +46,25 @@ function createStore() {
|
|
|
45
46
|
const { createCliStore } = require(cliRuntime);
|
|
46
47
|
return createCliStore();
|
|
47
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Last reindex outcome for status/doctor, or null when nothing was recorded (or
|
|
51
|
+
* the backend/database cannot be read). Callers print nothing for null: the rest
|
|
52
|
+
* of the diagnostic — including doctor's own backend and sqlite checks — has to
|
|
53
|
+
* keep running when the store cannot be reached.
|
|
54
|
+
*/
|
|
55
|
+
function readLastReindex() {
|
|
56
|
+
try {
|
|
57
|
+
const cliRuntime = require.resolve('@agent-deck/backend/cli-runtime', {
|
|
58
|
+
paths: [(0, paths_1.getCliPackageRoot)()],
|
|
59
|
+
});
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
61
|
+
const { readLastStoreReindex } = require(cliRuntime);
|
|
62
|
+
return readLastStoreReindex();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
48
68
|
function parseConnections(value) {
|
|
49
69
|
if (!value?.trim()) {
|
|
50
70
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-runtime.js","sourceRoot":"","sources":["../src/backend-runtime.ts"],"names":[],"mappings":";;;;;AAKA,0DASC;AAeD,sDASC;AA+BD,gDASC;AA6BD,kCASC;AAED,4CAKC;AAED,kDAoBC;AAED,gCAeC;
|
|
1
|
+
{"version":3,"file":"backend-runtime.js","sourceRoot":"","sources":["../src/backend-runtime.ts"],"names":[],"mappings":";;;;;AAKA,0DASC;AAeD,sDASC;AA+BD,gDASC;AA6BD,kCASC;AAeD,0CAaC;AAED,4CAKC;AAED,kDAoBC;AAED,gCAeC;AA9LD,2DAA2C;AAC3C,kEAAqC;AAErC,mCAA4C;AAE5C,SAAgB,uBAAuB;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE;QACpE,KAAK,EAAE,CAAC,IAAA,yBAAiB,GAAE,CAAC;KAC7B,CAAC,CAAC;IACH,iEAAiE;IACjE,MAAM,EAAE,0BAA0B,EAAE,GAAG,OAAO,CAAC,UAAU,CAExD,CAAC;IACF,OAAO,0BAA0B,EAAE,CAAC;AACtC,CAAC;AAeD,SAAgB,qBAAqB;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE;QACpE,KAAK,EAAE,CAAC,IAAA,yBAAiB,GAAE,CAAC;KAC7B,CAAC,CAAC;IACH,iEAAiE;IACjE,MAAM,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,UAAU,CAEtD,CAAC;IACF,OAAO,wBAAwB,EAAE,CAAC;AACpC,CAAC;AA+BD,SAAgB,kBAAkB;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE;QACpE,KAAK,EAAE,CAAC,IAAA,yBAAiB,GAAE,CAAC;KAC7B,CAAC,CAAC;IACH,iEAAiE;IACjE,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,UAAU,CAEnD,CAAC;IACF,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AA6BD,SAAgB,WAAW;IACzB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE;QACpE,KAAK,EAAE,CAAC,IAAA,yBAAiB,GAAE,CAAC;KAC7B,CAAC,CAAC;IACH,iEAAiE;IACjE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,UAAU,CAE5C,CAAC;IACF,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC;AASD;;;;;GAKG;AACH,SAAgB,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE;YACpE,KAAK,EAAE,CAAC,IAAA,yBAAiB,GAAE,CAAC;SAC7B,CAAC,CAAC;QACH,iEAAiE;QACjE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,UAAU,CAElD,CAAC;QACF,OAAO,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAyB;IACxD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,MAAc;IACtD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,EAAE,GAAG,uBAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,UAAU,CACxB,OAAe,EACf,IAAc,EACd,GAA2B;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;YAC/B,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
import type { DaemonLogName } from './daemon-logs';
|
|
3
|
+
/**
|
|
4
|
+
* Shared rig for the suites that drive the *built* CLI as a real operator would.
|
|
5
|
+
* NOT-135's acceptance criteria are about what survives in `~/.agent-deck` after
|
|
6
|
+
* a process is gone, so those tests spawn `agent-deck` and read the files it
|
|
7
|
+
* leaves behind instead of re-stating the supervisor's decisions in TypeScript.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CLI_PACKAGE: string;
|
|
10
|
+
export declare const BACKEND_PACKAGE: string;
|
|
11
|
+
export declare const CLI_ENTRY: string;
|
|
12
|
+
/**
|
|
13
|
+
* These suites spawn the built CLI and the built backend, so a stale dist would
|
|
14
|
+
* silently test the previous build. Turbo runs `build` before `test`; a bare
|
|
15
|
+
* `vitest` inside the package does not.
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertFreshBuild(packageDir: string): void;
|
|
18
|
+
/** Both halves of a run: the CLI that supervises and the backend it spawns. */
|
|
19
|
+
export declare function assertFreshCliAndBackendBuild(): void;
|
|
20
|
+
/**
|
|
21
|
+
* A store *and* a pair of ports, because `agent-deck stop` and `agent-deck
|
|
22
|
+
* status` take their ports from the environment, not from run.json: a suite that
|
|
23
|
+
* isolated only the home would send `stop` at whatever is listening on the
|
|
24
|
+
* defaults — i.e. the developer's own deck. Every CLI call here goes through
|
|
25
|
+
* this object so that cannot happen.
|
|
26
|
+
*/
|
|
27
|
+
export interface IsolatedDeck {
|
|
28
|
+
home: string;
|
|
29
|
+
backendPort: number;
|
|
30
|
+
mcpPort: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function createIsolatedDeck(prefix: string): Promise<IsolatedDeck>;
|
|
33
|
+
/**
|
|
34
|
+
* Teardown runs even when setup threw, and `fs.rmSync(undefined)` there would
|
|
35
|
+
* replace the real failure (a stale dist, say) with an ERR_INVALID_ARG_TYPE.
|
|
36
|
+
*/
|
|
37
|
+
export declare function removeIsolatedDeck(deck: IsolatedDeck | undefined): void;
|
|
38
|
+
/** A port nothing is listening on — released before it is handed back. */
|
|
39
|
+
export declare function reserveFreePort(): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* A port held open for the length of the test, to trip a port-conflict check.
|
|
42
|
+
*
|
|
43
|
+
* The accepted sockets are tracked and destroyed on release: the CLI's port
|
|
44
|
+
* probe connects here, and a socket nothing ever reads stays paused — so it
|
|
45
|
+
* never emits 'end', is never destroyed, and `server.close()` would wait on it
|
|
46
|
+
* for the rest of the test.
|
|
47
|
+
*/
|
|
48
|
+
export declare function occupyPort(): Promise<{
|
|
49
|
+
port: number;
|
|
50
|
+
release: () => Promise<void>;
|
|
51
|
+
}>;
|
|
52
|
+
export interface CliResult {
|
|
53
|
+
status: number | null;
|
|
54
|
+
stdout: string;
|
|
55
|
+
stderr: string;
|
|
56
|
+
}
|
|
57
|
+
export declare function runCli(deck: IsolatedDeck, args: string[], env?: NodeJS.ProcessEnv): CliResult;
|
|
58
|
+
/** Foreground `agent-deck start`: the inherit-mode run a Ctrl-C interrupts. */
|
|
59
|
+
export declare function spawnCli(deck: IsolatedDeck, args: string[], env?: NodeJS.ProcessEnv): ChildProcess;
|
|
60
|
+
export declare function readDaemonLog(deck: IsolatedDeck, name: DaemonLogName): string;
|
|
61
|
+
/** Every `supervisor shutting down` line this deck has recorded, oldest first. */
|
|
62
|
+
export declare function shutdownLines(deck: IsolatedDeck): string[];
|
|
63
|
+
/** The record `agent-deck status` reads for "why did the deck stop?". */
|
|
64
|
+
export declare function readLastStopFile(deck: IsolatedDeck): {
|
|
65
|
+
at: string;
|
|
66
|
+
reason: string;
|
|
67
|
+
} | null;
|
|
68
|
+
/** The failed-start record, which lives beside last-stop.json and never replaces it. */
|
|
69
|
+
export declare function readLastStartFailureFile(deck: IsolatedDeck): {
|
|
70
|
+
at: string;
|
|
71
|
+
reason: string;
|
|
72
|
+
} | null;
|
|
73
|
+
export interface RunStateFile {
|
|
74
|
+
backendPid: number;
|
|
75
|
+
mcpPid: number;
|
|
76
|
+
cliPid: number;
|
|
77
|
+
}
|
|
78
|
+
export declare function readRunStateFile(deck: IsolatedDeck): RunStateFile | null;
|
|
79
|
+
/**
|
|
80
|
+
* run.json is the last thing a start writes — after the backend answers /health
|
|
81
|
+
* and after MCP comes up — so a caller that waited only for health can still
|
|
82
|
+
* find no pids to work with.
|
|
83
|
+
*/
|
|
84
|
+
export declare function waitForRunState(deck: IsolatedDeck, timeoutMs?: number): Promise<RunStateFile>;
|
|
85
|
+
export declare function isAlive(pid: number): boolean;
|
|
86
|
+
export declare function waitUntil(predicate: () => boolean | Promise<boolean>, timeoutMs?: number, intervalMs?: number): Promise<boolean>;
|
|
87
|
+
export declare function waitForHealthy(port: number, timeoutMs?: number): Promise<boolean>;
|
|
88
|
+
/**
|
|
89
|
+
* Last resort between tests: a supervisor that survived its scenario would hold
|
|
90
|
+
* the ports (and keep writing to a home the next test is about to delete).
|
|
91
|
+
*/
|
|
92
|
+
export declare function killLeftovers(deck: IsolatedDeck | undefined, extra?: (ChildProcess | null)[]): void;
|
|
93
|
+
//# sourceMappingURL=cli-integration-harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-integration-harness.d.ts","sourceRoot":"","sources":["../src/cli-integration-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CLI_ENTRY = exports.BACKEND_PACKAGE = exports.CLI_PACKAGE = void 0;
|
|
7
|
+
exports.assertFreshBuild = assertFreshBuild;
|
|
8
|
+
exports.assertFreshCliAndBackendBuild = assertFreshCliAndBackendBuild;
|
|
9
|
+
exports.createIsolatedDeck = createIsolatedDeck;
|
|
10
|
+
exports.removeIsolatedDeck = removeIsolatedDeck;
|
|
11
|
+
exports.reserveFreePort = reserveFreePort;
|
|
12
|
+
exports.occupyPort = occupyPort;
|
|
13
|
+
exports.runCli = runCli;
|
|
14
|
+
exports.spawnCli = spawnCli;
|
|
15
|
+
exports.readDaemonLog = readDaemonLog;
|
|
16
|
+
exports.shutdownLines = shutdownLines;
|
|
17
|
+
exports.readLastStopFile = readLastStopFile;
|
|
18
|
+
exports.readLastStartFailureFile = readLastStartFailureFile;
|
|
19
|
+
exports.readRunStateFile = readRunStateFile;
|
|
20
|
+
exports.waitForRunState = waitForRunState;
|
|
21
|
+
exports.isAlive = isAlive;
|
|
22
|
+
exports.waitUntil = waitUntil;
|
|
23
|
+
exports.waitForHealthy = waitForHealthy;
|
|
24
|
+
exports.killLeftovers = killLeftovers;
|
|
25
|
+
const node_child_process_1 = require("node:child_process");
|
|
26
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
27
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
28
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
29
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
30
|
+
const defaults_1 = require("./defaults");
|
|
31
|
+
/**
|
|
32
|
+
* Shared rig for the suites that drive the *built* CLI as a real operator would.
|
|
33
|
+
* NOT-135's acceptance criteria are about what survives in `~/.agent-deck` after
|
|
34
|
+
* a process is gone, so those tests spawn `agent-deck` and read the files it
|
|
35
|
+
* leaves behind instead of re-stating the supervisor's decisions in TypeScript.
|
|
36
|
+
*/
|
|
37
|
+
exports.CLI_PACKAGE = node_path_1.default.resolve(__dirname, '..');
|
|
38
|
+
exports.BACKEND_PACKAGE = node_path_1.default.resolve(exports.CLI_PACKAGE, '..', 'backend');
|
|
39
|
+
exports.CLI_ENTRY = node_path_1.default.join(exports.CLI_PACKAGE, 'dist', 'bin.js');
|
|
40
|
+
/** Newest mtime under `dir`, or null when it is missing or empty. */
|
|
41
|
+
function newestMtime(dir, isIgnored = () => false) {
|
|
42
|
+
let newest = null;
|
|
43
|
+
const walk = (current) => {
|
|
44
|
+
let entries;
|
|
45
|
+
try {
|
|
46
|
+
entries = node_fs_1.default.readdirSync(current, { withFileTypes: true });
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
const full = node_path_1.default.join(current, entry.name);
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
if (entry.name !== 'node_modules') {
|
|
55
|
+
walk(full);
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!entry.isFile() || isIgnored(full)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const { mtimeMs } = node_fs_1.default.statSync(full);
|
|
63
|
+
if (newest === null || mtimeMs > newest) {
|
|
64
|
+
newest = mtimeMs;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
walk(dir);
|
|
69
|
+
return newest;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* These suites spawn the built CLI and the built backend, so a stale dist would
|
|
73
|
+
* silently test the previous build. Turbo runs `build` before `test`; a bare
|
|
74
|
+
* `vitest` inside the package does not.
|
|
75
|
+
*/
|
|
76
|
+
function assertFreshBuild(packageDir) {
|
|
77
|
+
const dist = newestMtime(node_path_1.default.join(packageDir, 'dist'));
|
|
78
|
+
if (dist === null) {
|
|
79
|
+
throw new Error(`${packageDir}/dist is missing — run npm run build before this suite.`);
|
|
80
|
+
}
|
|
81
|
+
const src = newestMtime(node_path_1.default.join(packageDir, 'src'), (file) => file.endsWith('.test.ts'));
|
|
82
|
+
if (src !== null && src > dist) {
|
|
83
|
+
throw new Error(`${packageDir}/dist is older than its sources — run npm run build before this suite.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Both halves of a run: the CLI that supervises and the backend it spawns. */
|
|
87
|
+
function assertFreshCliAndBackendBuild() {
|
|
88
|
+
assertFreshBuild(exports.CLI_PACKAGE);
|
|
89
|
+
assertFreshBuild(exports.BACKEND_PACKAGE);
|
|
90
|
+
}
|
|
91
|
+
async function createIsolatedDeck(prefix) {
|
|
92
|
+
const backendPort = await reserveFreePort();
|
|
93
|
+
let mcpPort = await reserveFreePort();
|
|
94
|
+
// Both come from the ephemeral range; the second must not repeat the first.
|
|
95
|
+
while (mcpPort === backendPort) {
|
|
96
|
+
mcpPort = await reserveFreePort();
|
|
97
|
+
}
|
|
98
|
+
return { home: node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), prefix)), backendPort, mcpPort };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Teardown runs even when setup threw, and `fs.rmSync(undefined)` there would
|
|
102
|
+
* replace the real failure (a stale dist, say) with an ERR_INVALID_ARG_TYPE.
|
|
103
|
+
*/
|
|
104
|
+
function removeIsolatedDeck(deck) {
|
|
105
|
+
if (deck) {
|
|
106
|
+
node_fs_1.default.rmSync(deck.home, { recursive: true, force: true });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** A port nothing is listening on — released before it is handed back. */
|
|
110
|
+
function reserveFreePort() {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
const server = node_net_1.default.createServer();
|
|
113
|
+
server.once('error', reject);
|
|
114
|
+
server.listen(0, '127.0.0.1', () => {
|
|
115
|
+
const { port } = server.address();
|
|
116
|
+
server.close(() => resolve(port));
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A port held open for the length of the test, to trip a port-conflict check.
|
|
122
|
+
*
|
|
123
|
+
* The accepted sockets are tracked and destroyed on release: the CLI's port
|
|
124
|
+
* probe connects here, and a socket nothing ever reads stays paused — so it
|
|
125
|
+
* never emits 'end', is never destroyed, and `server.close()` would wait on it
|
|
126
|
+
* for the rest of the test.
|
|
127
|
+
*/
|
|
128
|
+
function occupyPort() {
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
const server = node_net_1.default.createServer();
|
|
131
|
+
const sockets = new Set();
|
|
132
|
+
server.on('connection', (socket) => {
|
|
133
|
+
sockets.add(socket);
|
|
134
|
+
socket.on('close', () => sockets.delete(socket));
|
|
135
|
+
// Nothing here speaks a protocol; a probe only needs the accept.
|
|
136
|
+
socket.on('error', () => socket.destroy());
|
|
137
|
+
});
|
|
138
|
+
server.once('error', reject);
|
|
139
|
+
server.listen(0, '127.0.0.1', () => {
|
|
140
|
+
const { port } = server.address();
|
|
141
|
+
resolve({
|
|
142
|
+
port,
|
|
143
|
+
release: () => new Promise((done) => {
|
|
144
|
+
for (const socket of sockets) {
|
|
145
|
+
socket.destroy();
|
|
146
|
+
}
|
|
147
|
+
server.close(() => done());
|
|
148
|
+
}),
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* `agent-deck stop` kills whatever holds the configured ports, so a test that
|
|
155
|
+
* ran on the defaults would stop the developer's deck — and a `status` on them
|
|
156
|
+
* would report it. Nothing in these suites may use the shipped defaults.
|
|
157
|
+
*/
|
|
158
|
+
function assertIsolatedPorts(deck) {
|
|
159
|
+
for (const [port, label] of [
|
|
160
|
+
[deck.backendPort, 'backend'],
|
|
161
|
+
[deck.mcpPort, 'MCP'],
|
|
162
|
+
]) {
|
|
163
|
+
if (port === defaults_1.CLI_DEFAULT_BACKEND_PORT || port === defaults_1.CLI_DEFAULT_MCP_PORT) {
|
|
164
|
+
throw new Error(`refusing to run the CLI with the default ${label} port ${port}: that is the developer's own deck`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function cliEnv(deck, extra = {}) {
|
|
169
|
+
assertIsolatedPorts(deck);
|
|
170
|
+
return {
|
|
171
|
+
...process.env,
|
|
172
|
+
AGENT_DECK_HOME: deck.home,
|
|
173
|
+
AGENT_DECK_HOST: '127.0.0.1',
|
|
174
|
+
// `stop` and `status` read the ports from here — pin them, or they act on
|
|
175
|
+
// whatever is listening on 1111/1110.
|
|
176
|
+
AGENT_DECK_BACKEND_PORT: String(deck.backendPort),
|
|
177
|
+
AGENT_DECK_MCP_PORT: String(deck.mcpPort),
|
|
178
|
+
// Keep the run off the network; an update check is not under test.
|
|
179
|
+
AGENT_DECK_NO_UPDATE_CHECK: '1',
|
|
180
|
+
// The spawned backend opens the secret store on startup, and the real one
|
|
181
|
+
// is macOS-only — on Linux CI it throws VaultUnsupportedError and the deck
|
|
182
|
+
// never becomes healthy. These tests are about stop origins, not secrets,
|
|
183
|
+
// so use the in-memory store the rest of the suite already uses. It also
|
|
184
|
+
// keeps the run out of the developer's keychain on macOS.
|
|
185
|
+
AGENT_DECK_SECRET_STORE: 'memory',
|
|
186
|
+
...extra,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function runCli(deck, args, env = {}) {
|
|
190
|
+
const result = (0, node_child_process_1.spawnSync)(process.execPath, [exports.CLI_ENTRY, ...args], {
|
|
191
|
+
encoding: 'utf8',
|
|
192
|
+
timeout: 90_000,
|
|
193
|
+
env: cliEnv(deck, env),
|
|
194
|
+
});
|
|
195
|
+
return { status: result.status, stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
|
|
196
|
+
}
|
|
197
|
+
/** Foreground `agent-deck start`: the inherit-mode run a Ctrl-C interrupts. */
|
|
198
|
+
function spawnCli(deck, args, env = {}) {
|
|
199
|
+
return (0, node_child_process_1.spawn)(process.execPath, [exports.CLI_ENTRY, ...args], {
|
|
200
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
201
|
+
env: cliEnv(deck, env),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function readDaemonLog(deck, name) {
|
|
205
|
+
try {
|
|
206
|
+
return node_fs_1.default.readFileSync(node_path_1.default.join(deck.home, 'logs', `${name}.log`), 'utf8');
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return '';
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Every `supervisor shutting down` line this deck has recorded, oldest first. */
|
|
213
|
+
function shutdownLines(deck) {
|
|
214
|
+
return readDaemonLog(deck, 'supervisor')
|
|
215
|
+
.split('\n')
|
|
216
|
+
.filter((line) => line.includes('supervisor shutting down'));
|
|
217
|
+
}
|
|
218
|
+
/** The record `agent-deck status` reads for "why did the deck stop?". */
|
|
219
|
+
function readLastStopFile(deck) {
|
|
220
|
+
try {
|
|
221
|
+
return JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(deck.home, 'last-stop.json'), 'utf8'));
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** The failed-start record, which lives beside last-stop.json and never replaces it. */
|
|
228
|
+
function readLastStartFailureFile(deck) {
|
|
229
|
+
try {
|
|
230
|
+
return JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(deck.home, 'last-start-failure.json'), 'utf8'));
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function readRunStateFile(deck) {
|
|
237
|
+
try {
|
|
238
|
+
return JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(deck.home, 'run.json'), 'utf8'));
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* run.json is the last thing a start writes — after the backend answers /health
|
|
246
|
+
* and after MCP comes up — so a caller that waited only for health can still
|
|
247
|
+
* find no pids to work with.
|
|
248
|
+
*/
|
|
249
|
+
async function waitForRunState(deck, timeoutMs = 30_000) {
|
|
250
|
+
await waitUntil(() => readRunStateFile(deck) !== null, timeoutMs);
|
|
251
|
+
const state = readRunStateFile(deck);
|
|
252
|
+
if (state === null) {
|
|
253
|
+
throw new Error(`${deck.home}/run.json was never written`);
|
|
254
|
+
}
|
|
255
|
+
return state;
|
|
256
|
+
}
|
|
257
|
+
function isAlive(pid) {
|
|
258
|
+
if (!pid) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
try {
|
|
262
|
+
process.kill(pid, 0);
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function waitUntil(predicate, timeoutMs = 30_000, intervalMs = 100) {
|
|
270
|
+
const deadline = Date.now() + timeoutMs;
|
|
271
|
+
for (;;) {
|
|
272
|
+
if (await predicate()) {
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
if (Date.now() >= deadline) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
async function waitForHealthy(port, timeoutMs = 30_000) {
|
|
282
|
+
return waitUntil(async () => {
|
|
283
|
+
try {
|
|
284
|
+
return (await fetch(`http://127.0.0.1:${port}/health`)).ok;
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
}, timeoutMs);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Last resort between tests: a supervisor that survived its scenario would hold
|
|
293
|
+
* the ports (and keep writing to a home the next test is about to delete).
|
|
294
|
+
*/
|
|
295
|
+
function killLeftovers(deck, extra = []) {
|
|
296
|
+
const state = deck ? readRunStateFile(deck) : null;
|
|
297
|
+
const pids = [state?.mcpPid, state?.backendPid, state?.cliPid, ...extra.map((child) => child?.pid)];
|
|
298
|
+
for (const pid of pids) {
|
|
299
|
+
if (pid && isAlive(pid)) {
|
|
300
|
+
try {
|
|
301
|
+
process.kill(pid, 'SIGKILL');
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// Already gone.
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=cli-integration-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-integration-harness.js","sourceRoot":"","sources":["../src/cli-integration-harness.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon-logs.d.ts
CHANGED
|
@@ -4,5 +4,12 @@ export declare function resolveDaemonLogPath(name: DaemonLogName): string;
|
|
|
4
4
|
/** Append-only log sink; returns fd for child stdio (caller does not close while process runs). */
|
|
5
5
|
export declare function openDaemonLogFd(name: DaemonLogName): number;
|
|
6
6
|
export declare function appendDaemonLogLine(name: DaemonLogName, line: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Last `maxLines` meaningful lines of a child log, newest last. Reads only the
|
|
9
|
+
* trailing window of the file, so a multi-GB backend.log stays cheap.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readDaemonLogTail(name: DaemonLogName, maxLines?: number): string[];
|
|
12
|
+
/** Supervisor-log rendering of a child log tail, so the origin of each line is obvious. */
|
|
13
|
+
export declare function formatChildLogTail(name: DaemonLogName, lines: string[]): string[];
|
|
7
14
|
export declare function resolveCliEntry(): string;
|
|
8
15
|
//# sourceMappingURL=daemon-logs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-logs.d.ts","sourceRoot":"","sources":["../src/daemon-logs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-logs.d.ts","sourceRoot":"","sources":["../src/daemon-logs.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC;AAK7D,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAEhE;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAM3D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,SAAK,GAAG,MAAM,EAAE,CAgC9E;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CASjF;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
package/dist/daemon-logs.js
CHANGED
|
@@ -7,10 +7,15 @@ exports.resolveDaemonLogsDir = resolveDaemonLogsDir;
|
|
|
7
7
|
exports.resolveDaemonLogPath = resolveDaemonLogPath;
|
|
8
8
|
exports.openDaemonLogFd = openDaemonLogFd;
|
|
9
9
|
exports.appendDaemonLogLine = appendDaemonLogLine;
|
|
10
|
+
exports.readDaemonLogTail = readDaemonLogTail;
|
|
11
|
+
exports.formatChildLogTail = formatChildLogTail;
|
|
10
12
|
exports.resolveCliEntry = resolveCliEntry;
|
|
11
13
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
12
14
|
const node_path_1 = __importDefault(require("node:path"));
|
|
13
15
|
const shared_1 = require("@agent-deck/shared");
|
|
16
|
+
const strip_ansi_1 = require("./strip-ansi");
|
|
17
|
+
/** Child logs grow to hundreds of MB — only ever read the tail window. */
|
|
18
|
+
const LOG_TAIL_BYTES = 64 * 1024;
|
|
14
19
|
function resolveDaemonLogsDir() {
|
|
15
20
|
return node_path_1.default.join((0, shared_1.resolveAgentDeckHome)(), 'logs');
|
|
16
21
|
}
|
|
@@ -30,6 +35,56 @@ function appendDaemonLogLine(name, line) {
|
|
|
30
35
|
node_fs_1.default.mkdirSync(node_path_1.default.dirname(logPath), { recursive: true });
|
|
31
36
|
node_fs_1.default.appendFileSync(logPath, `${line}\n`);
|
|
32
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Last `maxLines` meaningful lines of a child log, newest last. Reads only the
|
|
40
|
+
* trailing window of the file, so a multi-GB backend.log stays cheap.
|
|
41
|
+
*/
|
|
42
|
+
function readDaemonLogTail(name, maxLines = 20) {
|
|
43
|
+
let fd;
|
|
44
|
+
try {
|
|
45
|
+
const logPath = resolveDaemonLogPath(name);
|
|
46
|
+
fd = node_fs_1.default.openSync(logPath, 'r');
|
|
47
|
+
const size = node_fs_1.default.fstatSync(fd).size;
|
|
48
|
+
const length = Math.min(size, LOG_TAIL_BYTES);
|
|
49
|
+
const buffer = Buffer.alloc(length);
|
|
50
|
+
node_fs_1.default.readSync(fd, buffer, 0, length, size - length);
|
|
51
|
+
const text = buffer.toString('utf8');
|
|
52
|
+
// A partial first line is an artefact of the window, not a log entry.
|
|
53
|
+
const lines = (size > length ? text.slice(text.indexOf('\n') + 1) : text)
|
|
54
|
+
.split('\n')
|
|
55
|
+
.map((line) => (0, strip_ansi_1.stripAnsi)(line).trimEnd())
|
|
56
|
+
.filter((line) => line.length > 0);
|
|
57
|
+
// Each spawn writes a `--- <name> <iso> ---` banner; report the current
|
|
58
|
+
// run only, so a previous run's output cannot look like this failure.
|
|
59
|
+
let lastBanner = -1;
|
|
60
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
61
|
+
if (/^--- \w+ \d{4}-\d{2}-\d{2}T/.test(lines[i])) {
|
|
62
|
+
lastBanner = i;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return (lastBanner >= 0 ? lines.slice(lastBanner + 1) : lines).slice(-maxLines);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
if (fd !== undefined) {
|
|
73
|
+
node_fs_1.default.closeSync(fd);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Supervisor-log rendering of a child log tail, so the origin of each line is obvious. */
|
|
78
|
+
function formatChildLogTail(name, lines) {
|
|
79
|
+
if (lines.length === 0) {
|
|
80
|
+
return [`[agent-deck] ${name}.log had no output to show (${resolveDaemonLogPath(name)})`];
|
|
81
|
+
}
|
|
82
|
+
return [
|
|
83
|
+
`[agent-deck] --- last ${lines.length} line(s) of ${name}.log ---`,
|
|
84
|
+
...lines.map((line) => `[agent-deck] ${name}.log| ${line}`),
|
|
85
|
+
`[agent-deck] --- end of ${name}.log tail (${resolveDaemonLogPath(name)}) ---`,
|
|
86
|
+
];
|
|
87
|
+
}
|
|
33
88
|
function resolveCliEntry() {
|
|
34
89
|
return process.argv[1] ?? node_path_1.default.join(__dirname, 'bin.js');
|
|
35
90
|
}
|
package/dist/daemon-logs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-logs.js","sourceRoot":"","sources":["../src/daemon-logs.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"daemon-logs.js","sourceRoot":"","sources":["../src/daemon-logs.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6EA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDtE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBzD;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBrE;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwE7D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc1E;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6EA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDtE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBzD;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBrE;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwE7D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc1E;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuG5D"}
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,7 @@ function getVaultManager() {
|
|
|
32
32
|
function printUsage() {
|
|
33
33
|
console.log(`Usage:
|
|
34
34
|
agent-deck start [--daemon] [--open|--no-open] [--no-ui] [--force] [--port PORT] [--mcp-port PORT]
|
|
35
|
-
agent-deck stop
|
|
35
|
+
agent-deck stop [--source NAME] [--detail TEXT]
|
|
36
36
|
agent-deck status
|
|
37
37
|
agent-deck open [--path /...]
|
|
38
38
|
agent-deck statusline [--workspace <path>]
|
|
@@ -271,7 +271,8 @@ async function runCli(argv) {
|
|
|
271
271
|
return (0, start_1.runStart)({ openBrowser, skipUi, force, daemon, supervisor, backendPort, mcpPort });
|
|
272
272
|
}
|
|
273
273
|
case 'stop':
|
|
274
|
-
|
|
274
|
+
// --source lets the menubar/dashboard/scripts name themselves in the log.
|
|
275
|
+
return (0, stop_1.runStop)((0, stop_1.parseStopOptions)(rest));
|
|
275
276
|
case 'status':
|
|
276
277
|
return (0, status_1.runStatus)();
|
|
277
278
|
case 'open':
|