@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.
- package/dist/adapter/agentapi.d.ts +100 -0
- package/dist/adapter/agentapi.d.ts.map +1 -0
- package/dist/adapter/agentapi.js +578 -0
- package/dist/adapter/agentapi.js.map +1 -0
- package/dist/client/messages.d.ts +89 -0
- package/dist/client/messages.d.ts.map +1 -0
- package/dist/client/messages.js +6 -0
- package/dist/client/messages.js.map +1 -0
- package/dist/client/websocket.d.ts +66 -0
- package/dist/client/websocket.d.ts.map +1 -0
- package/dist/client/websocket.js +276 -0
- package/dist/client/websocket.js.map +1 -0
- package/dist/commands/register.d.ts +10 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +175 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +54 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +37 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +5 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +59 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config/config.d.ts +60 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +176 -0
- package/dist/config/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
- package/src/adapter/agentapi.ts +656 -0
- package/src/client/messages.ts +125 -0
- package/src/client/websocket.ts +317 -0
- package/src/commands/register.ts +201 -0
- package/src/commands/start.ts +70 -0
- package/src/commands/status.ts +45 -0
- package/src/commands/stop.ts +58 -0
- package/src/config/config.ts +146 -0
- package/src/index.ts +39 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|