@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.
Files changed (196) hide show
  1. package/README.md +122 -0
  2. package/agent/dist/config.d.ts +31 -0
  3. package/agent/dist/config.d.ts.map +1 -0
  4. package/agent/dist/config.js +81 -0
  5. package/agent/dist/config.js.map +1 -0
  6. package/agent/dist/db/commands.d.ts +25 -0
  7. package/agent/dist/db/commands.d.ts.map +1 -0
  8. package/agent/dist/db/commands.js +93 -0
  9. package/agent/dist/db/commands.js.map +1 -0
  10. package/agent/dist/db/index.d.ts +30 -0
  11. package/agent/dist/db/index.d.ts.map +1 -0
  12. package/agent/dist/db/index.js +368 -0
  13. package/agent/dist/db/index.js.map +1 -0
  14. package/agent/dist/db/schema.d.ts +74 -0
  15. package/agent/dist/db/schema.d.ts.map +1 -0
  16. package/agent/dist/db/schema.js +100 -0
  17. package/agent/dist/db/schema.js.map +1 -0
  18. package/agent/dist/db/sessions.d.ts +46 -0
  19. package/agent/dist/db/sessions.d.ts.map +1 -0
  20. package/agent/dist/db/sessions.js +198 -0
  21. package/agent/dist/db/sessions.js.map +1 -0
  22. package/agent/dist/index.d.ts +2 -0
  23. package/agent/dist/index.d.ts.map +1 -0
  24. package/agent/dist/index.js +19 -0
  25. package/agent/dist/index.js.map +1 -0
  26. package/agent/dist/lib/command-session.d.ts +20 -0
  27. package/agent/dist/lib/command-session.d.ts.map +1 -0
  28. package/agent/dist/lib/command-session.js +64 -0
  29. package/agent/dist/lib/command-session.js.map +1 -0
  30. package/agent/dist/lib/git.d.ts +8 -0
  31. package/agent/dist/lib/git.d.ts.map +1 -0
  32. package/agent/dist/lib/git.js +194 -0
  33. package/agent/dist/lib/git.js.map +1 -0
  34. package/agent/dist/lib/init-script.d.ts +33 -0
  35. package/agent/dist/lib/init-script.d.ts.map +1 -0
  36. package/agent/dist/lib/init-script.js +523 -0
  37. package/agent/dist/lib/init-script.js.map +1 -0
  38. package/agent/dist/lib/transcript.d.ts +16 -0
  39. package/agent/dist/lib/transcript.d.ts.map +1 -0
  40. package/agent/dist/lib/transcript.js +64 -0
  41. package/agent/dist/lib/transcript.js.map +1 -0
  42. package/agent/dist/logger.d.ts +12 -0
  43. package/agent/dist/logger.d.ts.map +1 -0
  44. package/agent/dist/logger.js +39 -0
  45. package/agent/dist/logger.js.map +1 -0
  46. package/agent/dist/middleware/auth.d.ts +15 -0
  47. package/agent/dist/middleware/auth.d.ts.map +1 -0
  48. package/agent/dist/middleware/auth.js +55 -0
  49. package/agent/dist/middleware/auth.js.map +1 -0
  50. package/agent/dist/routes/commands.d.ts +8 -0
  51. package/agent/dist/routes/commands.d.ts.map +1 -0
  52. package/agent/dist/routes/commands.js +229 -0
  53. package/agent/dist/routes/commands.js.map +1 -0
  54. package/agent/dist/routes/files.d.ts +7 -0
  55. package/agent/dist/routes/files.d.ts.map +1 -0
  56. package/agent/dist/routes/files.js +206 -0
  57. package/agent/dist/routes/files.js.map +1 -0
  58. package/agent/dist/routes/hooks.d.ts +7 -0
  59. package/agent/dist/routes/hooks.d.ts.map +1 -0
  60. package/agent/dist/routes/hooks.js +147 -0
  61. package/agent/dist/routes/hooks.js.map +1 -0
  62. package/agent/dist/routes/index.d.ts +10 -0
  63. package/agent/dist/routes/index.d.ts.map +1 -0
  64. package/agent/dist/routes/index.js +10 -0
  65. package/agent/dist/routes/index.js.map +1 -0
  66. package/agent/dist/routes/pair.d.ts +26 -0
  67. package/agent/dist/routes/pair.d.ts.map +1 -0
  68. package/agent/dist/routes/pair.js +384 -0
  69. package/agent/dist/routes/pair.js.map +1 -0
  70. package/agent/dist/routes/projects.d.ts +6 -0
  71. package/agent/dist/routes/projects.d.ts.map +1 -0
  72. package/agent/dist/routes/projects.js +121 -0
  73. package/agent/dist/routes/projects.js.map +1 -0
  74. package/agent/dist/routes/sessions-git.d.ts +7 -0
  75. package/agent/dist/routes/sessions-git.d.ts.map +1 -0
  76. package/agent/dist/routes/sessions-git.js +31 -0
  77. package/agent/dist/routes/sessions-git.js.map +1 -0
  78. package/agent/dist/routes/sessions-tmux.d.ts +7 -0
  79. package/agent/dist/routes/sessions-tmux.d.ts.map +1 -0
  80. package/agent/dist/routes/sessions-tmux.js +94 -0
  81. package/agent/dist/routes/sessions-tmux.js.map +1 -0
  82. package/agent/dist/routes/sessions.d.ts +7 -0
  83. package/agent/dist/routes/sessions.d.ts.map +1 -0
  84. package/agent/dist/routes/sessions.js +172 -0
  85. package/agent/dist/routes/sessions.js.map +1 -0
  86. package/agent/dist/server.d.ts +6 -0
  87. package/agent/dist/server.d.ts.map +1 -0
  88. package/agent/dist/server.js +95 -0
  89. package/agent/dist/server.js.map +1 -0
  90. package/agent/dist/terminal.d.ts +19 -0
  91. package/agent/dist/terminal.d.ts.map +1 -0
  92. package/agent/dist/terminal.js +175 -0
  93. package/agent/dist/terminal.js.map +1 -0
  94. package/agent/dist/updater.d.ts +18 -0
  95. package/agent/dist/updater.d.ts.map +1 -0
  96. package/agent/dist/updater.js +122 -0
  97. package/agent/dist/updater.js.map +1 -0
  98. package/agent/dist/version.d.ts +20 -0
  99. package/agent/dist/version.d.ts.map +1 -0
  100. package/agent/dist/version.js +66 -0
  101. package/agent/dist/version.js.map +1 -0
  102. package/agent/dist/websocket-handlers.d.ts +38 -0
  103. package/agent/dist/websocket-handlers.d.ts.map +1 -0
  104. package/agent/dist/websocket-handlers.js +389 -0
  105. package/agent/dist/websocket-handlers.js.map +1 -0
  106. package/agent/node_modules/@agentdeck/shared/dist/index.d.ts +2 -0
  107. package/agent/node_modules/@agentdeck/shared/dist/index.d.ts.map +1 -0
  108. package/agent/node_modules/@agentdeck/shared/dist/index.js +2 -0
  109. package/agent/node_modules/@agentdeck/shared/dist/index.js.map +1 -0
  110. package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts +235 -0
  111. package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts.map +1 -0
  112. package/agent/node_modules/@agentdeck/shared/dist/types/index.js +5 -0
  113. package/agent/node_modules/@agentdeck/shared/dist/types/index.js.map +1 -0
  114. package/agent/node_modules/@agentdeck/shared/package.json +29 -0
  115. package/dist/commands/doctor.d.ts +3 -0
  116. package/dist/commands/doctor.d.ts.map +1 -0
  117. package/dist/commands/doctor.js +304 -0
  118. package/dist/commands/doctor.js.map +1 -0
  119. package/dist/commands/hooks.d.ts +3 -0
  120. package/dist/commands/hooks.d.ts.map +1 -0
  121. package/dist/commands/hooks.js +187 -0
  122. package/dist/commands/hooks.js.map +1 -0
  123. package/dist/commands/init.d.ts +3 -0
  124. package/dist/commands/init.d.ts.map +1 -0
  125. package/dist/commands/init.js +109 -0
  126. package/dist/commands/init.js.map +1 -0
  127. package/dist/commands/logs.d.ts +3 -0
  128. package/dist/commands/logs.d.ts.map +1 -0
  129. package/dist/commands/logs.js +38 -0
  130. package/dist/commands/logs.js.map +1 -0
  131. package/dist/commands/profile.d.ts +3 -0
  132. package/dist/commands/profile.d.ts.map +1 -0
  133. package/dist/commands/profile.js +156 -0
  134. package/dist/commands/profile.js.map +1 -0
  135. package/dist/commands/service.d.ts +3 -0
  136. package/dist/commands/service.d.ts.map +1 -0
  137. package/dist/commands/service.js +235 -0
  138. package/dist/commands/service.js.map +1 -0
  139. package/dist/commands/start.d.ts +3 -0
  140. package/dist/commands/start.d.ts.map +1 -0
  141. package/dist/commands/start.js +122 -0
  142. package/dist/commands/start.js.map +1 -0
  143. package/dist/commands/status.d.ts +3 -0
  144. package/dist/commands/status.d.ts.map +1 -0
  145. package/dist/commands/status.js +48 -0
  146. package/dist/commands/status.js.map +1 -0
  147. package/dist/commands/stop.d.ts +3 -0
  148. package/dist/commands/stop.d.ts.map +1 -0
  149. package/dist/commands/stop.js +23 -0
  150. package/dist/commands/stop.js.map +1 -0
  151. package/dist/commands/update.d.ts +3 -0
  152. package/dist/commands/update.d.ts.map +1 -0
  153. package/dist/commands/update.js +129 -0
  154. package/dist/commands/update.js.map +1 -0
  155. package/dist/commands/version.d.ts +3 -0
  156. package/dist/commands/version.d.ts.map +1 -0
  157. package/dist/commands/version.js +39 -0
  158. package/dist/commands/version.js.map +1 -0
  159. package/dist/index.d.ts +5 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +45 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/lib/config.d.ts +68 -0
  164. package/dist/lib/config.d.ts.map +1 -0
  165. package/dist/lib/config.js +156 -0
  166. package/dist/lib/config.js.map +1 -0
  167. package/dist/lib/hooks.d.ts +67 -0
  168. package/dist/lib/hooks.d.ts.map +1 -0
  169. package/dist/lib/hooks.js +353 -0
  170. package/dist/lib/hooks.js.map +1 -0
  171. package/dist/lib/paths.d.ts +36 -0
  172. package/dist/lib/paths.d.ts.map +1 -0
  173. package/dist/lib/paths.js +77 -0
  174. package/dist/lib/paths.js.map +1 -0
  175. package/dist/lib/prerequisites.d.ts +60 -0
  176. package/dist/lib/prerequisites.d.ts.map +1 -0
  177. package/dist/lib/prerequisites.js +266 -0
  178. package/dist/lib/prerequisites.js.map +1 -0
  179. package/dist/lib/process.d.ts +40 -0
  180. package/dist/lib/process.d.ts.map +1 -0
  181. package/dist/lib/process.js +192 -0
  182. package/dist/lib/process.js.map +1 -0
  183. package/dist/service/index.d.ts +44 -0
  184. package/dist/service/index.d.ts.map +1 -0
  185. package/dist/service/index.js +18 -0
  186. package/dist/service/index.js.map +1 -0
  187. package/dist/service/launchd.d.ts +18 -0
  188. package/dist/service/launchd.d.ts.map +1 -0
  189. package/dist/service/launchd.js +208 -0
  190. package/dist/service/launchd.js.map +1 -0
  191. package/dist/service/systemd.d.ts +18 -0
  192. package/dist/service/systemd.d.ts.map +1 -0
  193. package/dist/service/systemd.js +196 -0
  194. package/dist/service/systemd.js.map +1 -0
  195. package/hooks/notify-agentdeck.sh +53 -0
  196. 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":"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"}
@@ -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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"}