@abdasis/agentdeck 2.44.2
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 +122 -0
- package/agent/dist/config.d.ts +31 -0
- package/agent/dist/config.d.ts.map +1 -0
- package/agent/dist/config.js +81 -0
- package/agent/dist/config.js.map +1 -0
- package/agent/dist/db/commands.d.ts +25 -0
- package/agent/dist/db/commands.d.ts.map +1 -0
- package/agent/dist/db/commands.js +93 -0
- package/agent/dist/db/commands.js.map +1 -0
- package/agent/dist/db/index.d.ts +30 -0
- package/agent/dist/db/index.d.ts.map +1 -0
- package/agent/dist/db/index.js +368 -0
- package/agent/dist/db/index.js.map +1 -0
- package/agent/dist/db/schema.d.ts +74 -0
- package/agent/dist/db/schema.d.ts.map +1 -0
- package/agent/dist/db/schema.js +100 -0
- package/agent/dist/db/schema.js.map +1 -0
- package/agent/dist/db/sessions.d.ts +46 -0
- package/agent/dist/db/sessions.d.ts.map +1 -0
- package/agent/dist/db/sessions.js +198 -0
- package/agent/dist/db/sessions.js.map +1 -0
- package/agent/dist/index.d.ts +2 -0
- package/agent/dist/index.d.ts.map +1 -0
- package/agent/dist/index.js +19 -0
- package/agent/dist/index.js.map +1 -0
- package/agent/dist/lib/command-session.d.ts +20 -0
- package/agent/dist/lib/command-session.d.ts.map +1 -0
- package/agent/dist/lib/command-session.js +64 -0
- package/agent/dist/lib/command-session.js.map +1 -0
- package/agent/dist/lib/git.d.ts +8 -0
- package/agent/dist/lib/git.d.ts.map +1 -0
- package/agent/dist/lib/git.js +194 -0
- package/agent/dist/lib/git.js.map +1 -0
- package/agent/dist/lib/init-script.d.ts +33 -0
- package/agent/dist/lib/init-script.d.ts.map +1 -0
- package/agent/dist/lib/init-script.js +523 -0
- package/agent/dist/lib/init-script.js.map +1 -0
- package/agent/dist/lib/transcript.d.ts +16 -0
- package/agent/dist/lib/transcript.d.ts.map +1 -0
- package/agent/dist/lib/transcript.js +64 -0
- package/agent/dist/lib/transcript.js.map +1 -0
- package/agent/dist/logger.d.ts +12 -0
- package/agent/dist/logger.d.ts.map +1 -0
- package/agent/dist/logger.js +39 -0
- package/agent/dist/logger.js.map +1 -0
- package/agent/dist/middleware/auth.d.ts +15 -0
- package/agent/dist/middleware/auth.d.ts.map +1 -0
- package/agent/dist/middleware/auth.js +55 -0
- package/agent/dist/middleware/auth.js.map +1 -0
- package/agent/dist/routes/commands.d.ts +8 -0
- package/agent/dist/routes/commands.d.ts.map +1 -0
- package/agent/dist/routes/commands.js +229 -0
- package/agent/dist/routes/commands.js.map +1 -0
- package/agent/dist/routes/files.d.ts +7 -0
- package/agent/dist/routes/files.d.ts.map +1 -0
- package/agent/dist/routes/files.js +206 -0
- package/agent/dist/routes/files.js.map +1 -0
- package/agent/dist/routes/hooks.d.ts +7 -0
- package/agent/dist/routes/hooks.d.ts.map +1 -0
- package/agent/dist/routes/hooks.js +147 -0
- package/agent/dist/routes/hooks.js.map +1 -0
- package/agent/dist/routes/index.d.ts +10 -0
- package/agent/dist/routes/index.d.ts.map +1 -0
- package/agent/dist/routes/index.js +10 -0
- package/agent/dist/routes/index.js.map +1 -0
- package/agent/dist/routes/pair.d.ts +26 -0
- package/agent/dist/routes/pair.d.ts.map +1 -0
- package/agent/dist/routes/pair.js +384 -0
- package/agent/dist/routes/pair.js.map +1 -0
- package/agent/dist/routes/projects.d.ts +6 -0
- package/agent/dist/routes/projects.d.ts.map +1 -0
- package/agent/dist/routes/projects.js +121 -0
- package/agent/dist/routes/projects.js.map +1 -0
- package/agent/dist/routes/sessions-git.d.ts +7 -0
- package/agent/dist/routes/sessions-git.d.ts.map +1 -0
- package/agent/dist/routes/sessions-git.js +31 -0
- package/agent/dist/routes/sessions-git.js.map +1 -0
- package/agent/dist/routes/sessions-tmux.d.ts +7 -0
- package/agent/dist/routes/sessions-tmux.d.ts.map +1 -0
- package/agent/dist/routes/sessions-tmux.js +94 -0
- package/agent/dist/routes/sessions-tmux.js.map +1 -0
- package/agent/dist/routes/sessions.d.ts +7 -0
- package/agent/dist/routes/sessions.d.ts.map +1 -0
- package/agent/dist/routes/sessions.js +172 -0
- package/agent/dist/routes/sessions.js.map +1 -0
- package/agent/dist/server.d.ts +6 -0
- package/agent/dist/server.d.ts.map +1 -0
- package/agent/dist/server.js +95 -0
- package/agent/dist/server.js.map +1 -0
- package/agent/dist/terminal.d.ts +19 -0
- package/agent/dist/terminal.d.ts.map +1 -0
- package/agent/dist/terminal.js +175 -0
- package/agent/dist/terminal.js.map +1 -0
- package/agent/dist/updater.d.ts +18 -0
- package/agent/dist/updater.d.ts.map +1 -0
- package/agent/dist/updater.js +122 -0
- package/agent/dist/updater.js.map +1 -0
- package/agent/dist/version.d.ts +20 -0
- package/agent/dist/version.d.ts.map +1 -0
- package/agent/dist/version.js +66 -0
- package/agent/dist/version.js.map +1 -0
- package/agent/dist/websocket-handlers.d.ts +38 -0
- package/agent/dist/websocket-handlers.d.ts.map +1 -0
- package/agent/dist/websocket-handlers.js +389 -0
- package/agent/dist/websocket-handlers.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.d.ts +2 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.d.ts.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.js +2 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts +235 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.js +5 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/package.json +29 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +304 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +187 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +109 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +38 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/profile.d.ts +3 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +156 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/service.d.ts +3 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +235 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +122 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +48 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +23 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +129 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +39 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +68 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +156 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks.d.ts +67 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +353 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/paths.d.ts +36 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +77 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +60 -0
- package/dist/lib/prerequisites.d.ts.map +1 -0
- package/dist/lib/prerequisites.js +266 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/process.d.ts +40 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +192 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/service/index.d.ts +44 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +18 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/launchd.d.ts +18 -0
- package/dist/service/launchd.d.ts.map +1 -0
- package/dist/service/launchd.js +208 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/systemd.d.ts +18 -0
- package/dist/service/systemd.d.ts.map +1 -0
- package/dist/service/systemd.js +196 -0
- package/dist/service/systemd.js.map +1 -0
- package/hooks/notify-agentdeck.sh +53 -0
- package/package.json +83 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { dirname, join, resolve } from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
4
|
+
import { homedir, platform } from 'os';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
/**
|
|
7
|
+
* Get the home directory, allowing override via AGENTDECK_HOME for E2E testing.
|
|
8
|
+
* This enables running tests in isolated temporary directories without affecting
|
|
9
|
+
* the real user's configuration or system services.
|
|
10
|
+
*/
|
|
11
|
+
export function getTestableHomedir() {
|
|
12
|
+
return process.env.AGENTDECK_HOME || homedir();
|
|
13
|
+
}
|
|
14
|
+
let cachedPaths = null;
|
|
15
|
+
export function getAgentPaths() {
|
|
16
|
+
if (cachedPaths)
|
|
17
|
+
return cachedPaths;
|
|
18
|
+
// CLI root is 2 levels up from lib/ (dist/lib -> dist -> cli root)
|
|
19
|
+
const cliRoot = resolve(__dirname, '..', '..');
|
|
20
|
+
// Check if running from source (monorepo) or installed (npm global)
|
|
21
|
+
// In monorepo: cliRoot is packages/cli, parent has pnpm-workspace.yaml
|
|
22
|
+
const monorepoRoot = resolve(cliRoot, '..', '..');
|
|
23
|
+
const isDev = existsSync(join(monorepoRoot, 'pnpm-workspace.yaml'));
|
|
24
|
+
let agentRoot;
|
|
25
|
+
if (isDev) {
|
|
26
|
+
// Development: agent is in the monorepo
|
|
27
|
+
agentRoot = resolve(monorepoRoot, 'apps', 'agent');
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Production: agent code is bundled with CLI
|
|
31
|
+
agentRoot = join(cliRoot, 'agent');
|
|
32
|
+
}
|
|
33
|
+
// Use testable home directory (allows override via AGENTDECK_HOME)
|
|
34
|
+
const home = getTestableHomedir();
|
|
35
|
+
// Configuration directory
|
|
36
|
+
const configDir = join(home, '.agentdeck');
|
|
37
|
+
// Log directory varies by platform
|
|
38
|
+
const os = platform();
|
|
39
|
+
let logDir;
|
|
40
|
+
if (os === 'darwin') {
|
|
41
|
+
logDir = join(home, 'Library', 'Logs', 'agentdeck-agent');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
logDir = join(home, '.local', 'log', 'agentdeck-agent');
|
|
45
|
+
}
|
|
46
|
+
cachedPaths = {
|
|
47
|
+
cliRoot,
|
|
48
|
+
agentRoot,
|
|
49
|
+
configDir,
|
|
50
|
+
configPath: join(configDir, 'config.json'),
|
|
51
|
+
dataDir: join(configDir, 'data'),
|
|
52
|
+
logDir,
|
|
53
|
+
pidFile: join(configDir, 'agent.pid'),
|
|
54
|
+
nodePath: process.execPath,
|
|
55
|
+
isDev,
|
|
56
|
+
};
|
|
57
|
+
return cachedPaths;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Ensure all required directories exist
|
|
61
|
+
*/
|
|
62
|
+
export function ensureDirectories() {
|
|
63
|
+
const paths = getAgentPaths();
|
|
64
|
+
const dirs = [paths.configDir, paths.dataDir, paths.logDir];
|
|
65
|
+
for (const dir of dirs) {
|
|
66
|
+
if (!existsSync(dir)) {
|
|
67
|
+
mkdirSync(dir, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear cached paths (useful for testing)
|
|
73
|
+
*/
|
|
74
|
+
export function clearPathsCache() {
|
|
75
|
+
cachedPaths = null;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,EAAE,CAAC;AACjD,CAAC;AA+BD,IAAI,WAAW,GAAsB,IAAI,CAAC;AAE1C,MAAM,UAAU,aAAa;IAC3B,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,mEAAmE;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE/C,oEAAoE;IACpE,uEAAuE;IACvE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAEpE,IAAI,SAAiB,CAAC;IAEtB,IAAI,KAAK,EAAE,CAAC;QACV,wCAAwC;QACxC,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,mEAAmE;IACnE,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAElC,0BAA0B;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE3C,mCAAmC;IACnC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,IAAI,MAAc,CAAC;IACnB,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW,GAAG;QACZ,OAAO;QACP,SAAS;QACT,SAAS;QACT,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QAC1C,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;QAChC,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK;KACN,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface PrerequisiteCheck {
|
|
2
|
+
name: string;
|
|
3
|
+
status: 'ok' | 'warn' | 'error';
|
|
4
|
+
message: string;
|
|
5
|
+
required: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Check if Node.js version is sufficient
|
|
9
|
+
*/
|
|
10
|
+
export declare function checkNodeVersion(): PrerequisiteCheck;
|
|
11
|
+
/**
|
|
12
|
+
* Check if tmux is installed
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkTmux(): PrerequisiteCheck;
|
|
15
|
+
/**
|
|
16
|
+
* Check platform compatibility
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkPlatform(): PrerequisiteCheck;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a port is available
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkPort(port: number): Promise<PrerequisiteCheck>;
|
|
23
|
+
/**
|
|
24
|
+
* Run all prerequisite checks
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkAllPrerequisites(port?: number): Promise<PrerequisiteCheck[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if all required prerequisites are met
|
|
29
|
+
*/
|
|
30
|
+
export declare function allRequiredMet(checks: PrerequisiteCheck[]): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check native dependencies (node-pty, better-sqlite3)
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkNativeDeps(): Promise<PrerequisiteCheck>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the stored Node ABI version from the last successful run
|
|
37
|
+
*/
|
|
38
|
+
export declare function getStoredAbiVersion(): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Store the current Node ABI version after successful native module load
|
|
41
|
+
*/
|
|
42
|
+
export declare function storeAbiVersion(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Check if the Node ABI version has changed since last successful run
|
|
45
|
+
*/
|
|
46
|
+
export declare function isAbiVersionChanged(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Rebuild native modules (better-sqlite3, node-pty) for the current Node version
|
|
49
|
+
*/
|
|
50
|
+
export declare function rebuildNativeModules(): {
|
|
51
|
+
success: boolean;
|
|
52
|
+
error?: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Ensure native modules are compatible with the current Node version.
|
|
56
|
+
* Automatically rebuilds if a Node version change is detected.
|
|
57
|
+
*/
|
|
58
|
+
export declare function ensureNativeModules(): Promise<PrerequisiteCheck>;
|
|
59
|
+
export declare const checkNode: typeof checkNodeVersion;
|
|
60
|
+
//# sourceMappingURL=prerequisites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/lib/prerequisites.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CA4BpD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,iBAAiB,CAoB7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,iBAAiB,CA2BjD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkCxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAgClE;AASD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAMnD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgB3E;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAiCtE;AAGD,eAAO,MAAM,SAAS,yBAAmB,CAAC"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { readFileSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { platform } from 'os';
|
|
5
|
+
import * as net from 'net';
|
|
6
|
+
import { getTestableHomedir } from './paths.js';
|
|
7
|
+
import { getAgentPaths } from './paths.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if Node.js version is sufficient
|
|
10
|
+
*/
|
|
11
|
+
export function checkNodeVersion() {
|
|
12
|
+
const version = process.version;
|
|
13
|
+
const major = parseInt(version.slice(1).split('.')[0], 10);
|
|
14
|
+
if (major >= 22) {
|
|
15
|
+
return {
|
|
16
|
+
name: 'Node.js',
|
|
17
|
+
status: 'ok',
|
|
18
|
+
message: version,
|
|
19
|
+
required: true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (major >= 18) {
|
|
23
|
+
return {
|
|
24
|
+
name: 'Node.js',
|
|
25
|
+
status: 'warn',
|
|
26
|
+
message: `${version} (recommended: >=22)`,
|
|
27
|
+
required: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
name: 'Node.js',
|
|
32
|
+
status: 'error',
|
|
33
|
+
message: `${version} (required: >=22)`,
|
|
34
|
+
required: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if tmux is installed
|
|
39
|
+
*/
|
|
40
|
+
export function checkTmux() {
|
|
41
|
+
try {
|
|
42
|
+
const output = execSync('tmux -V', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
43
|
+
return {
|
|
44
|
+
name: 'tmux',
|
|
45
|
+
status: 'ok',
|
|
46
|
+
message: output.trim(),
|
|
47
|
+
required: true,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
const os = platform();
|
|
52
|
+
const installCmd = os === 'darwin' ? 'brew install tmux' : 'sudo apt install tmux';
|
|
53
|
+
return {
|
|
54
|
+
name: 'tmux',
|
|
55
|
+
status: 'error',
|
|
56
|
+
message: `Not installed. Run: ${installCmd}`,
|
|
57
|
+
required: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check platform compatibility
|
|
63
|
+
*/
|
|
64
|
+
export function checkPlatform() {
|
|
65
|
+
const os = platform();
|
|
66
|
+
if (os === 'darwin') {
|
|
67
|
+
return {
|
|
68
|
+
name: 'Platform',
|
|
69
|
+
status: 'ok',
|
|
70
|
+
message: 'macOS',
|
|
71
|
+
required: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (os === 'linux') {
|
|
75
|
+
return {
|
|
76
|
+
name: 'Platform',
|
|
77
|
+
status: 'ok',
|
|
78
|
+
message: 'Linux',
|
|
79
|
+
required: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
name: 'Platform',
|
|
84
|
+
status: 'error',
|
|
85
|
+
message: `Unsupported: ${os}. Only macOS and Linux are supported.`,
|
|
86
|
+
required: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if a port is available
|
|
91
|
+
*/
|
|
92
|
+
export async function checkPort(port) {
|
|
93
|
+
return new Promise((resolve) => {
|
|
94
|
+
const server = net.createServer();
|
|
95
|
+
server.once('error', (err) => {
|
|
96
|
+
if (err.code === 'EADDRINUSE') {
|
|
97
|
+
resolve({
|
|
98
|
+
name: `Port ${port}`,
|
|
99
|
+
status: 'error',
|
|
100
|
+
message: 'Port is already in use',
|
|
101
|
+
required: false,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
resolve({
|
|
106
|
+
name: `Port ${port}`,
|
|
107
|
+
status: 'warn',
|
|
108
|
+
message: `Could not check: ${err.message}`,
|
|
109
|
+
required: false,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
server.once('listening', () => {
|
|
114
|
+
server.close();
|
|
115
|
+
resolve({
|
|
116
|
+
name: `Port ${port}`,
|
|
117
|
+
status: 'ok',
|
|
118
|
+
message: 'Available',
|
|
119
|
+
required: false,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
server.listen(port, '127.0.0.1');
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Run all prerequisite checks
|
|
127
|
+
*/
|
|
128
|
+
export async function checkAllPrerequisites(port) {
|
|
129
|
+
const checks = [checkPlatform(), checkNodeVersion(), checkTmux()];
|
|
130
|
+
if (port) {
|
|
131
|
+
checks.push(await checkPort(port));
|
|
132
|
+
}
|
|
133
|
+
return checks;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if all required prerequisites are met
|
|
137
|
+
*/
|
|
138
|
+
export function allRequiredMet(checks) {
|
|
139
|
+
return checks.filter((c) => c.required).every((c) => c.status !== 'error');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check native dependencies (node-pty, better-sqlite3)
|
|
143
|
+
*/
|
|
144
|
+
export async function checkNativeDeps() {
|
|
145
|
+
const issues = [];
|
|
146
|
+
// Check node-pty
|
|
147
|
+
try {
|
|
148
|
+
await import('@homebridge/node-pty-prebuilt-multiarch');
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
issues.push('node-pty');
|
|
152
|
+
}
|
|
153
|
+
// Check better-sqlite3
|
|
154
|
+
try {
|
|
155
|
+
await import('better-sqlite3');
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
issues.push('better-sqlite3');
|
|
159
|
+
}
|
|
160
|
+
if (issues.length === 0) {
|
|
161
|
+
return {
|
|
162
|
+
name: 'Native modules',
|
|
163
|
+
status: 'ok',
|
|
164
|
+
message: 'All native modules loaded successfully',
|
|
165
|
+
required: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
name: 'Native modules',
|
|
170
|
+
status: 'error',
|
|
171
|
+
message: `Failed to load: ${issues.join(', ')}`,
|
|
172
|
+
required: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get the path to the ABI version tracking file
|
|
177
|
+
*/
|
|
178
|
+
function getAbiVersionFile() {
|
|
179
|
+
return join(getTestableHomedir(), '.agentdeck', 'node-abi-version');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the stored Node ABI version from the last successful run
|
|
183
|
+
*/
|
|
184
|
+
export function getStoredAbiVersion() {
|
|
185
|
+
try {
|
|
186
|
+
return readFileSync(getAbiVersionFile(), 'utf-8').trim();
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Store the current Node ABI version after successful native module load
|
|
194
|
+
*/
|
|
195
|
+
export function storeAbiVersion() {
|
|
196
|
+
try {
|
|
197
|
+
writeFileSync(getAbiVersionFile(), process.versions.modules, 'utf-8');
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Non-critical, ignore
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check if the Node ABI version has changed since last successful run
|
|
205
|
+
*/
|
|
206
|
+
export function isAbiVersionChanged() {
|
|
207
|
+
const stored = getStoredAbiVersion();
|
|
208
|
+
if (!stored)
|
|
209
|
+
return false; // First run, no stored version yet
|
|
210
|
+
return stored !== process.versions.modules;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Rebuild native modules (better-sqlite3, node-pty) for the current Node version
|
|
214
|
+
*/
|
|
215
|
+
export function rebuildNativeModules() {
|
|
216
|
+
const paths = getAgentPaths();
|
|
217
|
+
try {
|
|
218
|
+
execSync('npm rebuild better-sqlite3 @homebridge/node-pty-prebuilt-multiarch', {
|
|
219
|
+
cwd: paths.cliRoot,
|
|
220
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
221
|
+
timeout: 120_000,
|
|
222
|
+
});
|
|
223
|
+
return { success: true };
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
return {
|
|
227
|
+
success: false,
|
|
228
|
+
error: err.message,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Ensure native modules are compatible with the current Node version.
|
|
234
|
+
* Automatically rebuilds if a Node version change is detected.
|
|
235
|
+
*/
|
|
236
|
+
export async function ensureNativeModules() {
|
|
237
|
+
const abiChanged = isAbiVersionChanged();
|
|
238
|
+
if (!abiChanged) {
|
|
239
|
+
// ABI hasn't changed (or first run) — verify modules load
|
|
240
|
+
const check = await checkNativeDeps();
|
|
241
|
+
if (check.status === 'ok') {
|
|
242
|
+
storeAbiVersion();
|
|
243
|
+
return check;
|
|
244
|
+
}
|
|
245
|
+
// Modules failed to load even without ABI change — fall through to rebuild
|
|
246
|
+
}
|
|
247
|
+
// ABI version changed or modules failed to load — try rebuild
|
|
248
|
+
const rebuild = rebuildNativeModules();
|
|
249
|
+
if (!rebuild.success) {
|
|
250
|
+
return {
|
|
251
|
+
name: 'Native modules',
|
|
252
|
+
status: 'error',
|
|
253
|
+
message: `Node version changed and rebuild failed: ${rebuild.error}. Try: npm install -g @agentdeck/cli`,
|
|
254
|
+
required: true,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// Verify modules load after rebuild
|
|
258
|
+
const postCheck = await checkNativeDeps();
|
|
259
|
+
if (postCheck.status === 'ok') {
|
|
260
|
+
storeAbiVersion();
|
|
261
|
+
}
|
|
262
|
+
return postCheck;
|
|
263
|
+
}
|
|
264
|
+
// Aliases for backwards compatibility
|
|
265
|
+
export const checkNode = checkNodeVersion;
|
|
266
|
+
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/lib/prerequisites.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if the agent process is running
|
|
3
|
+
*/
|
|
4
|
+
export declare function isAgentRunning(): {
|
|
5
|
+
running: boolean;
|
|
6
|
+
pid?: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Start the agent as a background daemon
|
|
10
|
+
* @param profileName - Optional profile name to use
|
|
11
|
+
*/
|
|
12
|
+
export declare function startAgentDaemon(profileName?: string | null): Promise<{
|
|
13
|
+
success: boolean;
|
|
14
|
+
pid?: number;
|
|
15
|
+
error?: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Stop the running agent
|
|
19
|
+
*/
|
|
20
|
+
export declare function stopAgent(): {
|
|
21
|
+
success: boolean;
|
|
22
|
+
error?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Restart the agent
|
|
26
|
+
*/
|
|
27
|
+
export declare function restartAgent(): Promise<{
|
|
28
|
+
success: boolean;
|
|
29
|
+
pid?: number;
|
|
30
|
+
error?: string;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Get agent health status by checking the API
|
|
34
|
+
*/
|
|
35
|
+
export declare function getAgentHealth(port: number): Promise<{
|
|
36
|
+
healthy: boolean;
|
|
37
|
+
sessions?: number;
|
|
38
|
+
error?: string;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/lib/process.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CA+BnE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgF/H;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqDhE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAUhG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAWD"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync, openSync } from 'fs';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { getAgentPaths, ensureDirectories } from './paths.js';
|
|
5
|
+
import { loadConfig } from './config.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if the agent process is running
|
|
8
|
+
*/
|
|
9
|
+
export function isAgentRunning() {
|
|
10
|
+
const paths = getAgentPaths();
|
|
11
|
+
if (!existsSync(paths.pidFile)) {
|
|
12
|
+
return { running: false };
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const pidStr = readFileSync(paths.pidFile, 'utf-8').trim();
|
|
16
|
+
const pid = parseInt(pidStr, 10);
|
|
17
|
+
if (isNaN(pid)) {
|
|
18
|
+
return { running: false };
|
|
19
|
+
}
|
|
20
|
+
// Check if process is actually running
|
|
21
|
+
try {
|
|
22
|
+
process.kill(pid, 0); // Signal 0 just checks if process exists
|
|
23
|
+
return { running: true, pid };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Process doesn't exist, clean up stale PID file
|
|
27
|
+
try {
|
|
28
|
+
unlinkSync(paths.pidFile);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Ignore cleanup errors
|
|
32
|
+
}
|
|
33
|
+
return { running: false };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { running: false };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Start the agent as a background daemon
|
|
42
|
+
* @param profileName - Optional profile name to use
|
|
43
|
+
*/
|
|
44
|
+
export async function startAgentDaemon(profileName) {
|
|
45
|
+
const paths = getAgentPaths();
|
|
46
|
+
const config = loadConfig(profileName);
|
|
47
|
+
if (!config) {
|
|
48
|
+
if (profileName) {
|
|
49
|
+
return { success: false, error: `Profile '${profileName}' not found. Run: agentdeck profile create ${profileName}` };
|
|
50
|
+
}
|
|
51
|
+
return { success: false, error: 'Configuration not found. Run: agentdeck init' };
|
|
52
|
+
}
|
|
53
|
+
// Check if already running
|
|
54
|
+
const status = isAgentRunning();
|
|
55
|
+
if (status.running) {
|
|
56
|
+
return { success: false, error: `Agent is already running (PID: ${status.pid})` };
|
|
57
|
+
}
|
|
58
|
+
ensureDirectories();
|
|
59
|
+
// Determine the entry point
|
|
60
|
+
const entryPoint = paths.isDev
|
|
61
|
+
? join(paths.agentRoot, 'src', 'index.ts')
|
|
62
|
+
: join(paths.agentRoot, 'dist', 'index.js');
|
|
63
|
+
if (!existsSync(entryPoint) && !existsSync(entryPoint.replace('.ts', '.js'))) {
|
|
64
|
+
return { success: false, error: `Agent entry point not found: ${entryPoint}` };
|
|
65
|
+
}
|
|
66
|
+
// Prepare log files
|
|
67
|
+
const stdoutLog = join(paths.logDir, 'agent.log');
|
|
68
|
+
const stderrLog = join(paths.logDir, 'agent.error.log');
|
|
69
|
+
const stdout = openSync(stdoutLog, 'a');
|
|
70
|
+
const stderr = openSync(stderrLog, 'a');
|
|
71
|
+
// Build command
|
|
72
|
+
let command;
|
|
73
|
+
let args;
|
|
74
|
+
if (paths.isDev) {
|
|
75
|
+
// Development: use tsx for TypeScript
|
|
76
|
+
command = 'npx';
|
|
77
|
+
args = ['tsx', entryPoint];
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Production: use node directly
|
|
81
|
+
command = paths.nodePath;
|
|
82
|
+
args = [entryPoint];
|
|
83
|
+
}
|
|
84
|
+
// Spawn detached process
|
|
85
|
+
const child = spawn(command, args, {
|
|
86
|
+
cwd: paths.agentRoot,
|
|
87
|
+
detached: true,
|
|
88
|
+
stdio: ['ignore', stdout, stderr],
|
|
89
|
+
env: {
|
|
90
|
+
...process.env,
|
|
91
|
+
AGENTDECK_DATA: paths.dataDir,
|
|
92
|
+
AGENTDECK_PROFILE: profileName || '',
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
if (!child.pid) {
|
|
96
|
+
return { success: false, error: 'Failed to start agent process' };
|
|
97
|
+
}
|
|
98
|
+
// Write PID file
|
|
99
|
+
writeFileSync(paths.pidFile, String(child.pid), 'utf-8');
|
|
100
|
+
// Detach from parent
|
|
101
|
+
child.unref();
|
|
102
|
+
// Wait a moment to check if process started successfully
|
|
103
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
104
|
+
const checkStatus = isAgentRunning();
|
|
105
|
+
if (!checkStatus.running) {
|
|
106
|
+
return { success: false, error: 'Agent process exited immediately. Check logs for errors.' };
|
|
107
|
+
}
|
|
108
|
+
return { success: true, pid: child.pid };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Stop the running agent
|
|
112
|
+
*/
|
|
113
|
+
export function stopAgent() {
|
|
114
|
+
const status = isAgentRunning();
|
|
115
|
+
if (!status.running || !status.pid) {
|
|
116
|
+
return { success: true }; // Already stopped
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
// Send SIGTERM for graceful shutdown
|
|
120
|
+
process.kill(status.pid, 'SIGTERM');
|
|
121
|
+
// Wait for process to exit (max 5 seconds)
|
|
122
|
+
const maxWait = 5000;
|
|
123
|
+
const startTime = Date.now();
|
|
124
|
+
while (Date.now() - startTime < maxWait) {
|
|
125
|
+
try {
|
|
126
|
+
process.kill(status.pid, 0);
|
|
127
|
+
// Still running, wait more
|
|
128
|
+
// Use synchronous wait
|
|
129
|
+
const waitTime = 100;
|
|
130
|
+
const end = Date.now() + waitTime;
|
|
131
|
+
while (Date.now() < end) {
|
|
132
|
+
// Busy wait (not ideal but works for short durations)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Process exited
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// If still running after timeout, force kill
|
|
141
|
+
try {
|
|
142
|
+
process.kill(status.pid, 0);
|
|
143
|
+
process.kill(status.pid, 'SIGKILL');
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Process already exited
|
|
147
|
+
}
|
|
148
|
+
// Clean up PID file
|
|
149
|
+
const paths = getAgentPaths();
|
|
150
|
+
if (existsSync(paths.pidFile)) {
|
|
151
|
+
try {
|
|
152
|
+
unlinkSync(paths.pidFile);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Ignore cleanup errors
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return { success: true };
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return { success: false, error: err.message };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Restart the agent
|
|
166
|
+
*/
|
|
167
|
+
export async function restartAgent() {
|
|
168
|
+
const stopResult = stopAgent();
|
|
169
|
+
if (!stopResult.success) {
|
|
170
|
+
return { success: false, error: `Failed to stop: ${stopResult.error}` };
|
|
171
|
+
}
|
|
172
|
+
// Wait a moment before starting
|
|
173
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
174
|
+
return startAgentDaemon();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get agent health status by checking the API
|
|
178
|
+
*/
|
|
179
|
+
export async function getAgentHealth(port) {
|
|
180
|
+
try {
|
|
181
|
+
const response = await fetch(`http://localhost:${port}/api/sessions`);
|
|
182
|
+
if (!response.ok) {
|
|
183
|
+
return { healthy: false, error: `HTTP ${response.status}` };
|
|
184
|
+
}
|
|
185
|
+
const sessions = await response.json();
|
|
186
|
+
return { healthy: true, sessions: sessions.length };
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
return { healthy: false, error: err.message };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/lib/process.ts"],"names":[],"mappings":"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"}
|