@cmdctrl/cursor-ide 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 (62) hide show
  1. package/dist/adapter/cdp-client.d.ts +66 -0
  2. package/dist/adapter/cdp-client.d.ts.map +1 -0
  3. package/dist/adapter/cdp-client.js +304 -0
  4. package/dist/adapter/cdp-client.js.map +1 -0
  5. package/dist/adapter/cursor-db.d.ts +114 -0
  6. package/dist/adapter/cursor-db.d.ts.map +1 -0
  7. package/dist/adapter/cursor-db.js +438 -0
  8. package/dist/adapter/cursor-db.js.map +1 -0
  9. package/dist/client/messages.d.ts +98 -0
  10. package/dist/client/messages.d.ts.map +1 -0
  11. package/dist/client/messages.js +6 -0
  12. package/dist/client/messages.js.map +1 -0
  13. package/dist/client/websocket.d.ts +103 -0
  14. package/dist/client/websocket.d.ts.map +1 -0
  15. package/dist/client/websocket.js +428 -0
  16. package/dist/client/websocket.js.map +1 -0
  17. package/dist/commands/register.d.ts +10 -0
  18. package/dist/commands/register.d.ts.map +1 -0
  19. package/dist/commands/register.js +175 -0
  20. package/dist/commands/register.js.map +1 -0
  21. package/dist/commands/start.d.ts +9 -0
  22. package/dist/commands/start.d.ts.map +1 -0
  23. package/dist/commands/start.js +86 -0
  24. package/dist/commands/start.js.map +1 -0
  25. package/dist/commands/status.d.ts +5 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +75 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/stop.d.ts +5 -0
  30. package/dist/commands/stop.d.ts.map +1 -0
  31. package/dist/commands/stop.js +59 -0
  32. package/dist/commands/stop.js.map +1 -0
  33. package/dist/config/config.d.ts +68 -0
  34. package/dist/config/config.d.ts.map +1 -0
  35. package/dist/config/config.js +189 -0
  36. package/dist/config/config.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +34 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/session-discovery.d.ts +22 -0
  42. package/dist/session-discovery.d.ts.map +1 -0
  43. package/dist/session-discovery.js +90 -0
  44. package/dist/session-discovery.js.map +1 -0
  45. package/dist/session-watcher.d.ts +62 -0
  46. package/dist/session-watcher.d.ts.map +1 -0
  47. package/dist/session-watcher.js +210 -0
  48. package/dist/session-watcher.js.map +1 -0
  49. package/package.json +40 -0
  50. package/src/adapter/cdp-client.ts +296 -0
  51. package/src/adapter/cursor-db.ts +486 -0
  52. package/src/client/messages.ts +138 -0
  53. package/src/client/websocket.ts +486 -0
  54. package/src/commands/register.ts +201 -0
  55. package/src/commands/start.ts +106 -0
  56. package/src/commands/status.ts +83 -0
  57. package/src/commands/stop.ts +58 -0
  58. package/src/config/config.ts +167 -0
  59. package/src/index.ts +39 -0
  60. package/src/session-discovery.ts +115 -0
  61. package/src/session-watcher.ts +253 -0
  62. package/tsconfig.json +19 -0
@@ -0,0 +1,428 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DaemonClient = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const url_1 = require("url");
9
+ const cdp_client_1 = require("../adapter/cdp-client");
10
+ const cursor_db_1 = require("../adapter/cursor-db");
11
+ const session_discovery_1 = require("../session-discovery");
12
+ const session_watcher_1 = require("../session-watcher");
13
+ const MAX_RECONNECT_DELAY = 30000; // 30 seconds
14
+ const INITIAL_RECONNECT_DELAY = 1000; // 1 second
15
+ const PING_INTERVAL = 30000; // 30 seconds
16
+ const SESSION_REFRESH_INTERVAL = 300000; // 5 minutes
17
+ class DaemonClient {
18
+ ws = null;
19
+ config;
20
+ credentials;
21
+ reconnectDelay = INITIAL_RECONNECT_DELAY;
22
+ reconnectTimer = null;
23
+ pingTimer = null;
24
+ sessionRefreshTimer = null;
25
+ shouldReconnect = true;
26
+ managedSessionIds = new Set();
27
+ runningTasks = new Set();
28
+ constructor(config, credentials) {
29
+ this.config = config;
30
+ this.credentials = credentials;
31
+ }
32
+ /**
33
+ * Handle session activity from the watcher and forward to server
34
+ */
35
+ handleSessionActivity(event) {
36
+ console.log(`[SessionWatcher] Sending activity for session ${event.session_id}`);
37
+ this.send({
38
+ type: 'session_activity',
39
+ session_id: event.session_id,
40
+ file_path: event.file_path,
41
+ last_message: event.last_message,
42
+ message_count: event.message_count,
43
+ is_completion: event.is_completion,
44
+ user_message_uuid: event.user_message_uuid,
45
+ });
46
+ }
47
+ /**
48
+ * Connect to the CmdCtrl server via WebSocket
49
+ */
50
+ async connect() {
51
+ return new Promise((resolve, reject) => {
52
+ const serverUrl = new url_1.URL(this.config.serverUrl);
53
+ const wsProtocol = serverUrl.protocol === 'https:' ? 'wss:' : 'ws:';
54
+ const wsUrl = `${wsProtocol}//${serverUrl.host}/ws/daemon`;
55
+ console.log(`Connecting to ${wsUrl}...`);
56
+ this.ws = new ws_1.default(wsUrl, {
57
+ headers: {
58
+ Authorization: `Bearer ${this.credentials.refreshToken}`,
59
+ 'X-Device-ID': this.config.deviceId,
60
+ },
61
+ });
62
+ this.ws.on('open', () => {
63
+ console.log('WebSocket connected');
64
+ this.reconnectDelay = INITIAL_RECONNECT_DELAY;
65
+ this.startPingInterval();
66
+ this.startSessionRefreshInterval();
67
+ this.startSessionWatcher();
68
+ this.sendStatus();
69
+ this.reportSessions();
70
+ resolve();
71
+ });
72
+ this.ws.on('message', (data) => {
73
+ this.handleMessage(data.toString());
74
+ });
75
+ this.ws.on('close', (code, reason) => {
76
+ console.log(`WebSocket closed: ${code} ${reason}`);
77
+ this.stopPingInterval();
78
+ this.stopSessionRefreshInterval();
79
+ this.stopSessionWatcher();
80
+ this.scheduleReconnect();
81
+ });
82
+ this.ws.on('error', (err) => {
83
+ console.error('WebSocket error:', err.message);
84
+ if (this.ws?.readyState === ws_1.default.CONNECTING) {
85
+ reject(err);
86
+ }
87
+ // For established connections, the 'close' event usually follows 'error',
88
+ // but if the connection was killed abruptly, we may not get a clean close.
89
+ // Force close the socket to ensure 'close' event fires and triggers reconnect.
90
+ if (this.ws?.readyState === ws_1.default.OPEN) {
91
+ this.ws.terminate();
92
+ }
93
+ });
94
+ });
95
+ }
96
+ /**
97
+ * Disconnect from server
98
+ */
99
+ async disconnect() {
100
+ this.shouldReconnect = false;
101
+ if (this.reconnectTimer) {
102
+ clearTimeout(this.reconnectTimer);
103
+ this.reconnectTimer = null;
104
+ }
105
+ this.stopPingInterval();
106
+ this.stopSessionRefreshInterval();
107
+ this.stopSessionWatcher();
108
+ // Disconnect CDP client
109
+ (0, cdp_client_1.getCDPClient)().disconnect();
110
+ // Close cursor DB
111
+ (0, cursor_db_1.getCursorDB)().close();
112
+ if (this.ws) {
113
+ this.ws.close(1000, 'Daemon shutting down');
114
+ this.ws = null;
115
+ }
116
+ }
117
+ /**
118
+ * Send a message to the server
119
+ */
120
+ send(message) {
121
+ if (this.ws?.readyState === ws_1.default.OPEN) {
122
+ const json = JSON.stringify(message);
123
+ if (message.type !== 'pong') {
124
+ console.log(`[WS OUT] ${message.type}:`, json.length > 200 ? json.substring(0, 200) + '...' : json);
125
+ }
126
+ this.ws.send(json);
127
+ }
128
+ }
129
+ /**
130
+ * Send an event for a task
131
+ */
132
+ sendEvent(taskId, eventType, data) {
133
+ this.send({
134
+ type: 'event',
135
+ task_id: taskId,
136
+ event_type: eventType,
137
+ ...data,
138
+ });
139
+ }
140
+ /**
141
+ * Send current status to server
142
+ */
143
+ sendStatus() {
144
+ this.send({
145
+ type: 'status',
146
+ running_tasks: Array.from(this.runningTasks),
147
+ });
148
+ }
149
+ /**
150
+ * Handle incoming message from server
151
+ */
152
+ handleMessage(raw) {
153
+ let msg;
154
+ try {
155
+ msg = JSON.parse(raw);
156
+ }
157
+ catch {
158
+ console.error('Failed to parse message:', raw);
159
+ return;
160
+ }
161
+ if (msg.type !== 'ping') {
162
+ console.log(`[WS IN] ${msg.type}:`, raw.length > 200 ? raw.substring(0, 200) + '...' : raw);
163
+ }
164
+ switch (msg.type) {
165
+ case 'ping':
166
+ this.send({ type: 'pong' });
167
+ break;
168
+ case 'task_start':
169
+ this.handleTaskStart(msg);
170
+ break;
171
+ case 'task_resume':
172
+ this.handleTaskResume(msg);
173
+ break;
174
+ case 'task_cancel':
175
+ // For Cursor, we can't really cancel a running AI response
176
+ console.log(`Task cancel requested for ${msg.task_id} (not implemented for Cursor)`);
177
+ break;
178
+ case 'get_messages':
179
+ this.handleGetMessages(msg);
180
+ break;
181
+ case 'watch_session':
182
+ this.handleWatchSession(msg);
183
+ break;
184
+ case 'unwatch_session':
185
+ this.handleUnwatchSession(msg);
186
+ break;
187
+ default:
188
+ console.warn('Unknown message type:', msg.type);
189
+ }
190
+ }
191
+ /**
192
+ * Handle task_start message - send message to Cursor via CDP
193
+ */
194
+ async handleTaskStart(msg) {
195
+ console.log(`Starting task ${msg.task_id}: ${msg.instruction.substring(0, 50)}...`);
196
+ const cdp = (0, cdp_client_1.getCDPClient)();
197
+ // Check if CDP is available
198
+ const available = await cdp.isAvailable();
199
+ if (!available) {
200
+ console.error('CDP not available - Cursor not running with debug port?');
201
+ this.sendEvent(msg.task_id, 'ERROR', {
202
+ error: 'Cursor not available. Please start Cursor with: /Applications/Cursor.app/Contents/MacOS/Cursor --remote-debugging-port=9222',
203
+ });
204
+ return;
205
+ }
206
+ try {
207
+ // Connect to CDP
208
+ await cdp.connect();
209
+ // Check if composer is open
210
+ const composerOpen = await cdp.isComposerOpen();
211
+ if (!composerOpen) {
212
+ console.log('Opening composer panel...');
213
+ await cdp.toggleComposer();
214
+ // Wait a bit for panel to open
215
+ await new Promise((resolve) => setTimeout(resolve, 500));
216
+ }
217
+ // Send the message
218
+ const success = await cdp.sendMessage(msg.instruction);
219
+ if (success) {
220
+ this.runningTasks.add(msg.task_id);
221
+ // For Cursor, we emit TASK_COMPLETE immediately since we can't track
222
+ // when the AI finishes responding. The session watcher will detect
223
+ // activity and send session_activity events.
224
+ this.sendEvent(msg.task_id, 'TASK_COMPLETE', {
225
+ result: 'Message sent to Cursor',
226
+ session_id: '', // We don't know the session ID yet
227
+ });
228
+ this.runningTasks.delete(msg.task_id);
229
+ }
230
+ else {
231
+ this.sendEvent(msg.task_id, 'ERROR', {
232
+ error: 'Failed to send message to Cursor',
233
+ });
234
+ }
235
+ }
236
+ catch (err) {
237
+ console.error(`Failed to start task ${msg.task_id}:`, err);
238
+ this.sendEvent(msg.task_id, 'ERROR', {
239
+ error: err.message,
240
+ });
241
+ }
242
+ }
243
+ /**
244
+ * Handle task_resume message - send follow-up message to Cursor
245
+ */
246
+ async handleTaskResume(msg) {
247
+ console.log(`Resuming task ${msg.task_id} with message`);
248
+ const cdp = (0, cdp_client_1.getCDPClient)();
249
+ try {
250
+ await cdp.connect();
251
+ const success = await cdp.sendMessage(msg.message);
252
+ if (success) {
253
+ this.sendEvent(msg.task_id, 'TASK_COMPLETE', {
254
+ result: 'Follow-up message sent to Cursor',
255
+ session_id: msg.session_id,
256
+ });
257
+ }
258
+ else {
259
+ this.sendEvent(msg.task_id, 'ERROR', {
260
+ error: 'Failed to send follow-up message to Cursor',
261
+ });
262
+ }
263
+ }
264
+ catch (err) {
265
+ console.error(`Failed to resume task ${msg.task_id}:`, err);
266
+ this.sendEvent(msg.task_id, 'ERROR', {
267
+ error: err.message,
268
+ });
269
+ }
270
+ }
271
+ /**
272
+ * Handle get_messages request - read from Cursor SQLite database
273
+ */
274
+ handleGetMessages(msg) {
275
+ console.log(`Getting messages for session ${msg.session_id}, limit=${msg.limit}, after=${msg.after_uuid || 'none'}`);
276
+ try {
277
+ const cursorDb = (0, cursor_db_1.getCursorDB)();
278
+ const result = cursorDb.getMessages(msg.session_id, msg.limit, msg.before_uuid, msg.after_uuid);
279
+ this.send({
280
+ type: 'messages',
281
+ request_id: msg.request_id,
282
+ session_id: msg.session_id,
283
+ messages: result.messages,
284
+ has_more: result.hasMore,
285
+ oldest_uuid: result.oldestUuid,
286
+ newest_uuid: result.newestUuid,
287
+ });
288
+ console.log(`Sent ${result.messages.length} messages, has_more=${result.hasMore}`);
289
+ }
290
+ catch (err) {
291
+ console.error(`Failed to get messages for session ${msg.session_id}:`, err);
292
+ this.send({
293
+ type: 'messages',
294
+ request_id: msg.request_id,
295
+ session_id: msg.session_id,
296
+ messages: [],
297
+ has_more: false,
298
+ error: err.message,
299
+ });
300
+ }
301
+ }
302
+ /**
303
+ * Handle watch_session request
304
+ */
305
+ handleWatchSession(msg) {
306
+ console.log(`Starting to watch session ${msg.session_id}`);
307
+ const watcher = (0, session_watcher_1.getSessionWatcher)();
308
+ watcher.watchSession(msg.session_id);
309
+ }
310
+ /**
311
+ * Handle unwatch_session request
312
+ */
313
+ handleUnwatchSession(msg) {
314
+ console.log(`Stopping watch for session ${msg.session_id}`);
315
+ const watcher = (0, session_watcher_1.getSessionWatcher)();
316
+ watcher.unwatchSession(msg.session_id);
317
+ }
318
+ /**
319
+ * Schedule reconnection with exponential backoff
320
+ */
321
+ scheduleReconnect() {
322
+ if (!this.shouldReconnect) {
323
+ return;
324
+ }
325
+ console.log(`Reconnecting in ${this.reconnectDelay / 1000}s...`);
326
+ this.reconnectTimer = setTimeout(async () => {
327
+ try {
328
+ await this.connect();
329
+ }
330
+ catch {
331
+ this.reconnectDelay = Math.min(this.reconnectDelay * 2, MAX_RECONNECT_DELAY);
332
+ this.scheduleReconnect();
333
+ }
334
+ }, this.reconnectDelay);
335
+ }
336
+ /**
337
+ * Start ping interval
338
+ */
339
+ startPingInterval() {
340
+ this.pingTimer = setInterval(() => {
341
+ if (this.ws?.readyState === ws_1.default.OPEN) {
342
+ this.ws.ping();
343
+ }
344
+ }, PING_INTERVAL);
345
+ }
346
+ /**
347
+ * Stop ping interval
348
+ */
349
+ stopPingInterval() {
350
+ if (this.pingTimer) {
351
+ clearInterval(this.pingTimer);
352
+ this.pingTimer = null;
353
+ }
354
+ }
355
+ /**
356
+ * Start the session watcher
357
+ */
358
+ startSessionWatcher() {
359
+ const watcher = (0, session_watcher_1.getSessionWatcher)();
360
+ watcher.start(this.handleSessionActivity.bind(this));
361
+ }
362
+ /**
363
+ * Stop the session watcher
364
+ */
365
+ stopSessionWatcher() {
366
+ const watcher = (0, session_watcher_1.getSessionWatcher)();
367
+ watcher.stop();
368
+ }
369
+ /**
370
+ * Report discovered external sessions to server
371
+ */
372
+ reportSessions() {
373
+ try {
374
+ const sessions = (0, session_discovery_1.discoverSessions)(this.managedSessionIds);
375
+ const sessionInfos = sessions.map((s) => ({
376
+ session_id: s.session_id,
377
+ slug: s.slug,
378
+ title: s.title,
379
+ project: s.project,
380
+ project_name: s.project_name,
381
+ file_path: s.file_path,
382
+ last_message: s.last_message,
383
+ last_activity: s.last_activity,
384
+ is_active: s.is_active,
385
+ message_count: s.message_count,
386
+ }));
387
+ this.send({
388
+ type: 'report_sessions',
389
+ sessions: sessionInfos,
390
+ });
391
+ console.log(`Reported ${sessionInfos.length} external sessions`);
392
+ }
393
+ catch (err) {
394
+ console.error('Failed to report sessions:', err);
395
+ }
396
+ }
397
+ /**
398
+ * Start periodic session refresh
399
+ */
400
+ startSessionRefreshInterval() {
401
+ this.sessionRefreshTimer = setInterval(() => {
402
+ this.reportSessions();
403
+ }, SESSION_REFRESH_INTERVAL);
404
+ }
405
+ /**
406
+ * Stop session refresh interval
407
+ */
408
+ stopSessionRefreshInterval() {
409
+ if (this.sessionRefreshTimer) {
410
+ clearInterval(this.sessionRefreshTimer);
411
+ this.sessionRefreshTimer = null;
412
+ }
413
+ }
414
+ /**
415
+ * Add a session ID to the managed set
416
+ */
417
+ addManagedSession(sessionId) {
418
+ this.managedSessionIds.add(sessionId);
419
+ }
420
+ /**
421
+ * Remove a session ID from the managed set
422
+ */
423
+ removeManagedSession(sessionId) {
424
+ this.managedSessionIds.delete(sessionId);
425
+ }
426
+ }
427
+ exports.DaemonClient = DaemonClient;
428
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/client/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface RegisterOptions {
2
+ server: string;
3
+ name?: string;
4
+ }
5
+ /**
6
+ * Register command - implements GitHub CLI style device auth flow
7
+ */
8
+ export declare function register(options: RegisterOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAaA,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0GD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EtE"}
@@ -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
+ const data = response.data;
95
+ if (response.status === 400 && data.error === 'authorization_pending') {
96
+ process.stdout.write('.');
97
+ continue;
98
+ }
99
+ if (response.status >= 400) {
100
+ console.error('\nError polling for token:', data);
101
+ return null;
102
+ }
103
+ }
104
+ catch (err) {
105
+ console.error('\nError polling for token:', err);
106
+ return null;
107
+ }
108
+ }
109
+ console.error('\nDevice code expired. Please try again.');
110
+ return null;
111
+ }
112
+ /**
113
+ * Register command - implements GitHub CLI style device auth flow
114
+ */
115
+ async function register(options) {
116
+ const serverUrl = options.server.replace(/\/$/, '');
117
+ // Use hostname as device name - agent_type field distinguishes daemon types
118
+ const deviceName = options.name || os.hostname();
119
+ if ((0, config_1.isRegistered)()) {
120
+ const config = (0, config_1.readConfig)();
121
+ console.log(`Already registered as "${config?.deviceName}" (${config?.deviceId})`);
122
+ console.log(`Server: ${config?.serverUrl}`);
123
+ console.log('\nTo re-register, delete ~/.cmdctrl-cursor-ide/config.json and ~/.cmdctrl-cursor-ide/credentials');
124
+ return;
125
+ }
126
+ console.log(`Registering device "${deviceName}" with ${serverUrl}...\n`);
127
+ // Step 1: Request device code
128
+ let codeResponse;
129
+ try {
130
+ const response = await request(`${serverUrl}/api/devices/code`, 'POST', {
131
+ deviceName,
132
+ hostname: os.hostname(),
133
+ agentType: 'cursor_ide', // Identify as Cursor IDE daemon
134
+ });
135
+ if (response.status !== 200) {
136
+ console.error('Failed to get device code:', response.data);
137
+ process.exit(1);
138
+ }
139
+ codeResponse = response.data;
140
+ }
141
+ catch (err) {
142
+ console.error('Failed to connect to server:', err);
143
+ process.exit(1);
144
+ }
145
+ // Step 2: Display instructions to user
146
+ console.log('To complete registration, open this URL in your browser:\n');
147
+ console.log(` ${codeResponse.verificationUrl}\n`);
148
+ console.log('Then enter this code:\n');
149
+ console.log(` ${codeResponse.userCode}\n`);
150
+ console.log('Waiting for verification...');
151
+ // Step 3: Poll for completion
152
+ const tokenResponse = await pollForToken(serverUrl, codeResponse.deviceCode, codeResponse.interval, codeResponse.expiresIn);
153
+ if (!tokenResponse) {
154
+ process.exit(1);
155
+ }
156
+ // Step 4: Save config and credentials
157
+ const config = {
158
+ serverUrl,
159
+ deviceId: tokenResponse.deviceId,
160
+ deviceName,
161
+ };
162
+ const credentials = {
163
+ accessToken: tokenResponse.accessToken,
164
+ refreshToken: tokenResponse.refreshToken,
165
+ expiresAt: Date.now() + tokenResponse.expiresIn * 1000,
166
+ };
167
+ (0, config_1.writeConfig)(config);
168
+ (0, config_1.writeCredentials)(credentials);
169
+ console.log('\n\nRegistration complete!');
170
+ console.log(`Device ID: ${tokenResponse.deviceId}`);
171
+ console.log(`\nRun 'cmdctrl-cursor-ide start' to connect to the server.`);
172
+ console.log(`\nIMPORTANT: Make sure to start Cursor with:`);
173
+ console.log(` /Applications/Cursor.app/Contents/MacOS/Cursor --remote-debugging-port=9222`);
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,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":"AAWA,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFhE"}