@cmdctrl/aider 0.1.0

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 (47) hide show
  1. package/dist/adapter/agentapi.d.ts +100 -0
  2. package/dist/adapter/agentapi.d.ts.map +1 -0
  3. package/dist/adapter/agentapi.js +578 -0
  4. package/dist/adapter/agentapi.js.map +1 -0
  5. package/dist/client/messages.d.ts +89 -0
  6. package/dist/client/messages.d.ts.map +1 -0
  7. package/dist/client/messages.js +6 -0
  8. package/dist/client/messages.js.map +1 -0
  9. package/dist/client/websocket.d.ts +66 -0
  10. package/dist/client/websocket.d.ts.map +1 -0
  11. package/dist/client/websocket.js +276 -0
  12. package/dist/client/websocket.js.map +1 -0
  13. package/dist/commands/register.d.ts +10 -0
  14. package/dist/commands/register.d.ts.map +1 -0
  15. package/dist/commands/register.js +175 -0
  16. package/dist/commands/register.js.map +1 -0
  17. package/dist/commands/start.d.ts +9 -0
  18. package/dist/commands/start.d.ts.map +1 -0
  19. package/dist/commands/start.js +54 -0
  20. package/dist/commands/start.js.map +1 -0
  21. package/dist/commands/status.d.ts +5 -0
  22. package/dist/commands/status.d.ts.map +1 -0
  23. package/dist/commands/status.js +37 -0
  24. package/dist/commands/status.js.map +1 -0
  25. package/dist/commands/stop.d.ts +5 -0
  26. package/dist/commands/stop.d.ts.map +1 -0
  27. package/dist/commands/stop.js +59 -0
  28. package/dist/commands/stop.js.map +1 -0
  29. package/dist/config/config.d.ts +60 -0
  30. package/dist/config/config.d.ts.map +1 -0
  31. package/dist/config/config.js +176 -0
  32. package/dist/config/config.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +34 -0
  36. package/dist/index.js.map +1 -0
  37. package/package.json +42 -0
  38. package/src/adapter/agentapi.ts +656 -0
  39. package/src/client/messages.ts +125 -0
  40. package/src/client/websocket.ts +317 -0
  41. package/src/commands/register.ts +201 -0
  42. package/src/commands/start.ts +70 -0
  43. package/src/commands/status.ts +45 -0
  44. package/src/commands/stop.ts +58 -0
  45. package/src/config/config.ts +146 -0
  46. package/src/index.ts +39 -0
  47. package/tsconfig.json +19 -0
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.register = register;
37
+ const os = __importStar(require("os"));
38
+ const http = __importStar(require("http"));
39
+ const https = __importStar(require("https"));
40
+ const url_1 = require("url");
41
+ const config_1 = require("../config/config");
42
+ /**
43
+ * Make an HTTP(S) request
44
+ */
45
+ function request(url, method, body) {
46
+ return new Promise((resolve, reject) => {
47
+ const parsed = new url_1.URL(url);
48
+ const client = parsed.protocol === 'https:' ? https : http;
49
+ const options = {
50
+ hostname: parsed.hostname,
51
+ port: parsed.port || (parsed.protocol === 'https:' ? 443 : 80),
52
+ path: parsed.pathname + parsed.search,
53
+ method,
54
+ headers: {
55
+ 'Content-Type': 'application/json',
56
+ Accept: 'application/json'
57
+ }
58
+ };
59
+ const req = client.request(options, (res) => {
60
+ let data = '';
61
+ res.on('data', (chunk) => (data += chunk));
62
+ res.on('end', () => {
63
+ try {
64
+ const parsed = data ? JSON.parse(data) : {};
65
+ resolve({ status: res.statusCode || 0, data: parsed });
66
+ }
67
+ catch {
68
+ resolve({ status: res.statusCode || 0, data: {} });
69
+ }
70
+ });
71
+ });
72
+ req.on('error', reject);
73
+ if (body) {
74
+ req.write(JSON.stringify(body));
75
+ }
76
+ req.end();
77
+ });
78
+ }
79
+ /**
80
+ * Poll for token completion (after user verifies in browser)
81
+ */
82
+ async function pollForToken(serverUrl, deviceCode, interval, expiresIn) {
83
+ const startTime = Date.now();
84
+ const expiresAt = startTime + expiresIn * 1000;
85
+ while (Date.now() < expiresAt) {
86
+ await new Promise((resolve) => setTimeout(resolve, interval * 1000));
87
+ try {
88
+ const response = await request(`${serverUrl}/api/devices/token`, 'POST', {
89
+ deviceCode
90
+ });
91
+ if (response.status === 200) {
92
+ return response.data;
93
+ }
94
+ // 400 with "authorization_pending" means keep polling
95
+ const data = response.data;
96
+ if (response.status === 400 && data.error === 'authorization_pending') {
97
+ process.stdout.write('.');
98
+ continue;
99
+ }
100
+ // Other errors should stop polling
101
+ if (response.status >= 400) {
102
+ console.error('\nError polling for token:', data);
103
+ return null;
104
+ }
105
+ }
106
+ catch (err) {
107
+ console.error('\nError polling for token:', err);
108
+ return null;
109
+ }
110
+ }
111
+ console.error('\nDevice code expired. Please try again.');
112
+ return null;
113
+ }
114
+ /**
115
+ * Register command - implements GitHub CLI style device auth flow
116
+ */
117
+ async function register(options) {
118
+ const serverUrl = options.server.replace(/\/$/, '');
119
+ const deviceName = options.name || `${os.hostname()}-aider`;
120
+ // Check if already registered
121
+ if ((0, config_1.isRegistered)()) {
122
+ const config = (0, config_1.readConfig)();
123
+ console.log(`Already registered as "${config?.deviceName}" (${config?.deviceId})`);
124
+ console.log(`Server: ${config?.serverUrl}`);
125
+ console.log('\nTo re-register, delete ~/.cmdctrl-aider/config.json and ~/.cmdctrl-aider/credentials');
126
+ return;
127
+ }
128
+ console.log(`Registering Aider device "${deviceName}" with ${serverUrl}...\n`);
129
+ // Step 1: Request device code
130
+ let codeResponse;
131
+ try {
132
+ const response = await request(`${serverUrl}/api/devices/code`, 'POST', {
133
+ deviceName,
134
+ hostname: os.hostname(),
135
+ agentType: 'aider'
136
+ });
137
+ if (response.status !== 200) {
138
+ console.error('Failed to get device code:', response.data);
139
+ process.exit(1);
140
+ }
141
+ codeResponse = response.data;
142
+ }
143
+ catch (err) {
144
+ console.error('Failed to connect to server:', err);
145
+ process.exit(1);
146
+ }
147
+ // Step 2: Display instructions to user
148
+ console.log('To complete registration, open this URL in your browser:\n');
149
+ console.log(` ${codeResponse.verificationUrl}\n`);
150
+ console.log('Then enter this code:\n');
151
+ console.log(` ${codeResponse.userCode}\n`);
152
+ console.log('Waiting for verification...');
153
+ // Step 3: Poll for completion
154
+ const tokenResponse = await pollForToken(serverUrl, codeResponse.deviceCode, codeResponse.interval, codeResponse.expiresIn);
155
+ if (!tokenResponse) {
156
+ process.exit(1);
157
+ }
158
+ // Step 4: Save config and credentials
159
+ const config = {
160
+ serverUrl,
161
+ deviceId: tokenResponse.deviceId,
162
+ deviceName
163
+ };
164
+ const credentials = {
165
+ accessToken: tokenResponse.accessToken,
166
+ refreshToken: tokenResponse.refreshToken,
167
+ expiresAt: Date.now() + tokenResponse.expiresIn * 1000
168
+ };
169
+ (0, config_1.writeConfig)(config);
170
+ (0, config_1.writeCredentials)(credentials);
171
+ console.log('\n\nRegistration complete!');
172
+ console.log(`Device ID: ${tokenResponse.deviceId}`);
173
+ console.log(`\nRun 'cmdctrl-aider start' to connect to the server.`);
174
+ }
175
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+HA,4BAyEC;AAxMD,uCAAyB;AACzB,2CAA6B;AAC7B,6CAA+B;AAC/B,6BAA0B;AAC1B,6CAO0B;AAsB1B;;GAEG;AACH,SAAS,OAAO,CACd,GAAW,EACX,MAAc,EACd,IAAa;IAEb,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3D,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,IAAI,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM;YACrC,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1C,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;YAC3C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5C,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAExB,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,SAAiB,EACjB,UAAkB,EAClB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IAE/C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,SAAS,oBAAoB,EAAE,MAAM,EAAE;gBACvE,UAAU;aACX,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,QAAQ,CAAC,IAAqB,CAAC;YACxC,CAAC;YAED,sDAAsD;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA0B,CAAC;YACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,uBAAuB,EAAE,CAAC;gBACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,mCAAmC;YACnC,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5D,8BAA8B;IAC9B,IAAI,IAAA,qBAAY,GAAE,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,EAAE,UAAU,MAAM,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;QACtG,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,UAAU,SAAS,OAAO,CAAC,CAAC;IAE/E,8BAA8B;IAC9B,IAAI,YAAgC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,SAAS,mBAAmB,EAAE,MAAM,EAAE;YACtE,UAAU;YACV,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,YAAY,GAAG,QAAQ,CAAC,IAA0B,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,eAAe,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,8BAA8B;IAC9B,MAAM,aAAa,GAAG,MAAM,YAAY,CACtC,SAAS,EACT,YAAY,CAAC,UAAU,EACvB,YAAY,CAAC,QAAQ,EACrB,YAAY,CAAC,SAAS,CACvB,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,MAAM,MAAM,GAAkB;QAC5B,SAAS;QACT,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,UAAU;KACX,CAAC;IAEF,MAAM,WAAW,GAAgB;QAC/B,WAAW,EAAE,aAAa,CAAC,WAAW;QACtC,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,GAAG,IAAI;KACvD,CAAC;IAEF,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IACpB,IAAA,yBAAgB,EAAC,WAAW,CAAC,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface StartOptions {
2
+ foreground?: boolean;
3
+ }
4
+ /**
5
+ * Start command - launch the daemon and connect to server
6
+ */
7
+ export declare function start(options: StartOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDhE"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.start = start;
4
+ const config_1 = require("../config/config");
5
+ const websocket_1 = require("../client/websocket");
6
+ /**
7
+ * Start command - launch the daemon and connect to server
8
+ */
9
+ async function start(options) {
10
+ // Check registration
11
+ if (!(0, config_1.isRegistered)()) {
12
+ console.error('Device not registered. Run "cmdctrl-aider register" first.');
13
+ process.exit(1);
14
+ }
15
+ // Check if already running
16
+ if ((0, config_1.isDaemonRunning)()) {
17
+ console.error('Daemon is already running. Run "cmdctrl-aider stop" first.');
18
+ process.exit(1);
19
+ }
20
+ const config = (0, config_1.readConfig)();
21
+ const credentials = (0, config_1.readCredentials)();
22
+ console.log(`Starting CmdCtrl Aider daemon...`);
23
+ console.log(`Server: ${config.serverUrl}`);
24
+ console.log(`Device: ${config.deviceName} (${config.deviceId})`);
25
+ // Write PID file
26
+ (0, config_1.writePidFile)(process.pid);
27
+ // Create and start client
28
+ const client = new websocket_1.DaemonClient(config, credentials);
29
+ // Handle shutdown signals
30
+ const shutdown = async () => {
31
+ console.log('\nShutting down...');
32
+ await client.disconnect();
33
+ process.exit(0);
34
+ };
35
+ process.on('SIGINT', shutdown);
36
+ process.on('SIGTERM', shutdown);
37
+ // Connect and run
38
+ try {
39
+ await client.connect();
40
+ console.log('Connected to server.');
41
+ if (options.foreground) {
42
+ console.log('Running in foreground. Press Ctrl+C to stop.\n');
43
+ }
44
+ // Keep process alive - the WebSocket client handles events
45
+ await new Promise(() => {
46
+ // Never resolves - daemon runs until killed
47
+ });
48
+ }
49
+ catch (err) {
50
+ console.error('Failed to start daemon:', err);
51
+ process.exit(1);
52
+ }
53
+ }
54
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":";;AAgBA,sBAqDC;AArED,6CAM0B;AAC1B,mDAAmD;AAMnD;;GAEG;AACI,KAAK,UAAU,KAAK,CAAC,OAAqB;IAC/C,qBAAqB;IACrB,IAAI,CAAC,IAAA,qBAAY,GAAE,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,IAAI,IAAA,wBAAe,GAAE,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAG,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAA,wBAAe,GAAG,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IAEjE,iBAAiB;IACjB,IAAA,qBAAY,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1B,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,wBAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAErD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,kBAAkB;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAChE,CAAC;QAED,2DAA2D;QAC3D,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE;YACrB,4CAA4C;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Status command - check daemon and connection status
3
+ */
4
+ export declare function status(): Promise<void>;
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC5C"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.status = status;
4
+ const config_1 = require("../config/config");
5
+ /**
6
+ * Status command - check daemon and connection status
7
+ */
8
+ async function status() {
9
+ console.log('CmdCtrl Aider Daemon Status\n');
10
+ // Registration status
11
+ if (!(0, config_1.isRegistered)()) {
12
+ console.log('Registration: Not registered');
13
+ console.log('\nRun "cmdctrl-aider register" to register this device.');
14
+ return;
15
+ }
16
+ const config = (0, config_1.readConfig)();
17
+ const credentials = (0, config_1.readCredentials)();
18
+ console.log('Registration: Registered');
19
+ console.log(` Server: ${config.serverUrl}`);
20
+ console.log(` Device: ${config.deviceName}`);
21
+ console.log(` Device ID: ${config.deviceId}`);
22
+ // Token status
23
+ const tokenExpired = credentials.expiresAt < Date.now();
24
+ console.log(`\nToken: ${tokenExpired ? 'Expired' : 'Valid'}`);
25
+ if (!tokenExpired) {
26
+ const expiresIn = Math.round((credentials.expiresAt - Date.now()) / 1000 / 60);
27
+ console.log(` Expires in: ${expiresIn} minutes`);
28
+ }
29
+ // Daemon status
30
+ const running = (0, config_1.isDaemonRunning)();
31
+ console.log(`\nDaemon: ${running ? 'Running' : 'Stopped'}`);
32
+ if (running) {
33
+ const pid = (0, config_1.readPidFile)();
34
+ console.log(` PID: ${pid}`);
35
+ }
36
+ }
37
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;AAWA,wBAiCC;AA5CD,6CAM0B;AAE1B;;GAEG;AACI,KAAK,UAAU,MAAM;IAC1B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,sBAAsB;IACtB,IAAI,CAAC,IAAA,qBAAY,GAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAG,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAA,wBAAe,GAAG,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/C,eAAe;IACf,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAA,wBAAe,GAAE,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAA,oBAAW,GAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Stop command - stop the running daemon
3
+ */
4
+ export declare function stop(): Promise<void>;
5
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAoD1C"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stop = stop;
4
+ const config_1 = require("../config/config");
5
+ /**
6
+ * Stop command - stop the running daemon
7
+ */
8
+ async function stop() {
9
+ if (!(0, config_1.isDaemonRunning)()) {
10
+ console.log('Daemon is not running.');
11
+ return;
12
+ }
13
+ const pid = (0, config_1.readPidFile)();
14
+ if (pid === null) {
15
+ console.log('No PID file found.');
16
+ return;
17
+ }
18
+ console.log(`Stopping daemon (PID ${pid})...`);
19
+ try {
20
+ // Send SIGTERM for graceful shutdown
21
+ process.kill(pid, 'SIGTERM');
22
+ // Wait for process to exit (up to 5 seconds)
23
+ let attempts = 0;
24
+ while (attempts < 50) {
25
+ await new Promise((resolve) => setTimeout(resolve, 100));
26
+ try {
27
+ process.kill(pid, 0); // Check if still running
28
+ attempts++;
29
+ }
30
+ catch {
31
+ // Process has exited
32
+ break;
33
+ }
34
+ }
35
+ // If still running after 5 seconds, force kill
36
+ try {
37
+ process.kill(pid, 0);
38
+ console.log('Daemon did not stop gracefully, sending SIGKILL...');
39
+ process.kill(pid, 'SIGKILL');
40
+ }
41
+ catch {
42
+ // Already dead, good
43
+ }
44
+ (0, config_1.deletePidFile)();
45
+ console.log('Daemon stopped.');
46
+ }
47
+ catch (err) {
48
+ if (err.code === 'ESRCH') {
49
+ // Process doesn't exist
50
+ (0, config_1.deletePidFile)();
51
+ console.log('Daemon was not running (stale PID file removed).');
52
+ }
53
+ else {
54
+ console.error('Failed to stop daemon:', err);
55
+ process.exit(1);
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";;AAKA,oBAoDC;AAzDD,6CAA+E;AAE/E;;GAEG;AACI,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC,IAAA,wBAAe,GAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,MAAM,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,qCAAqC;QACrC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE7B,6CAA6C;QAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,QAAQ,GAAG,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAyB;gBAC/C,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;gBACrB,MAAM;YACR,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QAED,IAAA,sBAAa,GAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACpD,wBAAwB;YACxB,IAAA,sBAAa,GAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,60 @@
1
+ export interface CmdCtrlConfig {
2
+ serverUrl: string;
3
+ deviceId: string;
4
+ deviceName: string;
5
+ }
6
+ export interface Credentials {
7
+ accessToken: string;
8
+ refreshToken: string;
9
+ expiresAt: number;
10
+ }
11
+ declare const CONFIG_DIR: string;
12
+ declare const CONFIG_FILE: string;
13
+ declare const CREDENTIALS_FILE: string;
14
+ declare const PID_FILE: string;
15
+ /**
16
+ * Ensure the config directory exists with proper permissions
17
+ */
18
+ export declare function ensureConfigDir(): void;
19
+ /**
20
+ * Read the config file
21
+ */
22
+ export declare function readConfig(): CmdCtrlConfig | null;
23
+ /**
24
+ * Write the config file
25
+ */
26
+ export declare function writeConfig(config: CmdCtrlConfig): void;
27
+ /**
28
+ * Read credentials (access/refresh tokens)
29
+ */
30
+ export declare function readCredentials(): Credentials | null;
31
+ /**
32
+ * Write credentials with restrictive permissions (600)
33
+ */
34
+ export declare function writeCredentials(creds: Credentials): void;
35
+ /**
36
+ * Delete credentials (for logout/revoke)
37
+ */
38
+ export declare function deleteCredentials(): void;
39
+ /**
40
+ * Check if device is registered
41
+ */
42
+ export declare function isRegistered(): boolean;
43
+ /**
44
+ * Write daemon PID file
45
+ */
46
+ export declare function writePidFile(pid: number): void;
47
+ /**
48
+ * Read daemon PID
49
+ */
50
+ export declare function readPidFile(): number | null;
51
+ /**
52
+ * Delete PID file
53
+ */
54
+ export declare function deletePidFile(): void;
55
+ /**
56
+ * Check if daemon is running
57
+ */
58
+ export declare function isDaemonRunning(): boolean;
59
+ export { CONFIG_DIR, CONFIG_FILE, CREDENTIALS_FILE, PID_FILE };
60
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,QAAA,MAAM,UAAU,QAA4C,CAAC;AAC7D,QAAA,MAAM,WAAW,QAAuC,CAAC;AACzD,QAAA,MAAM,gBAAgB,QAAuC,CAAC;AAC9D,QAAA,MAAM,QAAQ,QAAsC,CAAC;AAErD;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,aAAa,GAAG,IAAI,CAUjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGvD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAUpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAItC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAU3C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAczC;AAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PID_FILE = exports.CREDENTIALS_FILE = exports.CONFIG_FILE = exports.CONFIG_DIR = void 0;
37
+ exports.ensureConfigDir = ensureConfigDir;
38
+ exports.readConfig = readConfig;
39
+ exports.writeConfig = writeConfig;
40
+ exports.readCredentials = readCredentials;
41
+ exports.writeCredentials = writeCredentials;
42
+ exports.deleteCredentials = deleteCredentials;
43
+ exports.isRegistered = isRegistered;
44
+ exports.writePidFile = writePidFile;
45
+ exports.readPidFile = readPidFile;
46
+ exports.deletePidFile = deletePidFile;
47
+ exports.isDaemonRunning = isDaemonRunning;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const os = __importStar(require("os"));
51
+ const CONFIG_DIR = path.join(os.homedir(), '.cmdctrl-aider');
52
+ exports.CONFIG_DIR = CONFIG_DIR;
53
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
54
+ exports.CONFIG_FILE = CONFIG_FILE;
55
+ const CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials');
56
+ exports.CREDENTIALS_FILE = CREDENTIALS_FILE;
57
+ const PID_FILE = path.join(CONFIG_DIR, 'daemon.pid');
58
+ exports.PID_FILE = PID_FILE;
59
+ /**
60
+ * Ensure the config directory exists with proper permissions
61
+ */
62
+ function ensureConfigDir() {
63
+ if (!fs.existsSync(CONFIG_DIR)) {
64
+ fs.mkdirSync(CONFIG_DIR, { mode: 0o700 });
65
+ }
66
+ }
67
+ /**
68
+ * Read the config file
69
+ */
70
+ function readConfig() {
71
+ try {
72
+ if (!fs.existsSync(CONFIG_FILE)) {
73
+ return null;
74
+ }
75
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
76
+ return JSON.parse(content);
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ /**
83
+ * Write the config file
84
+ */
85
+ function writeConfig(config) {
86
+ ensureConfigDir();
87
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
88
+ }
89
+ /**
90
+ * Read credentials (access/refresh tokens)
91
+ */
92
+ function readCredentials() {
93
+ try {
94
+ if (!fs.existsSync(CREDENTIALS_FILE)) {
95
+ return null;
96
+ }
97
+ const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');
98
+ return JSON.parse(content);
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ /**
105
+ * Write credentials with restrictive permissions (600)
106
+ */
107
+ function writeCredentials(creds) {
108
+ ensureConfigDir();
109
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });
110
+ }
111
+ /**
112
+ * Delete credentials (for logout/revoke)
113
+ */
114
+ function deleteCredentials() {
115
+ if (fs.existsSync(CREDENTIALS_FILE)) {
116
+ fs.unlinkSync(CREDENTIALS_FILE);
117
+ }
118
+ }
119
+ /**
120
+ * Check if device is registered
121
+ */
122
+ function isRegistered() {
123
+ const config = readConfig();
124
+ const creds = readCredentials();
125
+ return config !== null && creds !== null && config.deviceId !== '';
126
+ }
127
+ /**
128
+ * Write daemon PID file
129
+ */
130
+ function writePidFile(pid) {
131
+ ensureConfigDir();
132
+ fs.writeFileSync(PID_FILE, pid.toString(), { mode: 0o600 });
133
+ }
134
+ /**
135
+ * Read daemon PID
136
+ */
137
+ function readPidFile() {
138
+ try {
139
+ if (!fs.existsSync(PID_FILE)) {
140
+ return null;
141
+ }
142
+ const content = fs.readFileSync(PID_FILE, 'utf-8');
143
+ return parseInt(content, 10);
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * Delete PID file
151
+ */
152
+ function deletePidFile() {
153
+ if (fs.existsSync(PID_FILE)) {
154
+ fs.unlinkSync(PID_FILE);
155
+ }
156
+ }
157
+ /**
158
+ * Check if daemon is running
159
+ */
160
+ function isDaemonRunning() {
161
+ const pid = readPidFile();
162
+ if (pid === null) {
163
+ return false;
164
+ }
165
+ try {
166
+ // Signal 0 doesn't kill, just checks if process exists
167
+ process.kill(pid, 0);
168
+ return true;
169
+ }
170
+ catch {
171
+ // Process doesn't exist, clean up stale PID file
172
+ deletePidFile();
173
+ return false;
174
+ }
175
+ }
176
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}