@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,86 @@
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
+ const cdp_client_1 = require("../adapter/cdp-client");
7
+ /**
8
+ * Start command - launch the daemon and connect to server
9
+ */
10
+ async function start(options) {
11
+ // Set up global error handlers to catch silent crashes
12
+ process.on('uncaughtException', (err) => {
13
+ console.error('[FATAL] Uncaught exception:', err);
14
+ process.exit(1);
15
+ });
16
+ process.on('unhandledRejection', (reason, promise) => {
17
+ console.error('[FATAL] Unhandled promise rejection:', reason);
18
+ console.error('Promise:', promise);
19
+ process.exit(1);
20
+ });
21
+ // Check registration
22
+ if (!(0, config_1.isRegistered)()) {
23
+ console.error('Device not registered. Run "cmdctrl-cursor-ide register" first.');
24
+ process.exit(1);
25
+ }
26
+ // Check if already running
27
+ if ((0, config_1.isDaemonRunning)()) {
28
+ console.error('Daemon is already running. Run "cmdctrl-cursor-ide stop" first.');
29
+ process.exit(1);
30
+ }
31
+ const config = (0, config_1.readConfig)();
32
+ const credentials = (0, config_1.readCredentials)();
33
+ console.log(`Starting CmdCtrl Cursor IDE daemon...`);
34
+ console.log(`Server: ${config.serverUrl}`);
35
+ console.log(`Device: ${config.deviceName} (${config.deviceId})`);
36
+ // Check if Cursor database exists
37
+ if (!(0, config_1.cursorDbExists)()) {
38
+ console.warn('\nWarning: Cursor database not found.');
39
+ console.warn('Make sure Cursor has been run at least once.');
40
+ }
41
+ // Check CDP availability
42
+ const cdp = (0, cdp_client_1.getCDPClient)();
43
+ const cdpAvailable = await cdp.isAvailable();
44
+ if (!cdpAvailable) {
45
+ console.warn('\nWarning: Cursor CDP not available.');
46
+ console.warn('To enable message injection, start Cursor with:');
47
+ console.warn(' /Applications/Cursor.app/Contents/MacOS/Cursor --remote-debugging-port=9222');
48
+ console.warn('\nContinuing with observation-only mode...');
49
+ }
50
+ else {
51
+ console.log('\nCDP: Connected to Cursor');
52
+ const title = await cdp.getWindowTitle();
53
+ if (title) {
54
+ console.log(` Active project: ${title}`);
55
+ }
56
+ }
57
+ // Write PID file
58
+ (0, config_1.writePidFile)(process.pid);
59
+ // Create and start client
60
+ const client = new websocket_1.DaemonClient(config, credentials);
61
+ // Handle shutdown signals
62
+ const shutdown = async () => {
63
+ console.log('\nShutting down...');
64
+ await client.disconnect();
65
+ process.exit(0);
66
+ };
67
+ process.on('SIGINT', shutdown);
68
+ process.on('SIGTERM', shutdown);
69
+ // Connect and run
70
+ try {
71
+ await client.connect();
72
+ console.log('Connected to CmdCtrl server.');
73
+ if (options.foreground) {
74
+ console.log('Running in foreground. Press Ctrl+C to stop.\n');
75
+ }
76
+ // Keep process alive
77
+ await new Promise(() => {
78
+ // Never resolves - daemon runs until killed
79
+ });
80
+ }
81
+ catch (err) {
82
+ console.error('Failed to start daemon:', err);
83
+ process.exit(1);
84
+ }
85
+ }
86
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Status command - check daemon and CDP 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":"AAWA;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAoE5C"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.status = status;
4
+ const config_1 = require("../config/config");
5
+ const cdp_client_1 = require("../adapter/cdp-client");
6
+ const cursor_db_1 = require("../adapter/cursor-db");
7
+ /**
8
+ * Status command - check daemon and CDP connection status
9
+ */
10
+ async function status() {
11
+ console.log('CmdCtrl Cursor IDE Daemon Status\n');
12
+ // Registration status
13
+ if (!(0, config_1.isRegistered)()) {
14
+ console.log('Registration: Not registered');
15
+ console.log('\nRun "cmdctrl-cursor-ide register" to register this device.');
16
+ return;
17
+ }
18
+ const config = (0, config_1.readConfig)();
19
+ const credentials = (0, config_1.readCredentials)();
20
+ console.log('Registration: Registered');
21
+ console.log(` Server: ${config.serverUrl}`);
22
+ console.log(` Device: ${config.deviceName}`);
23
+ console.log(` Device ID: ${config.deviceId}`);
24
+ // Token status
25
+ const tokenExpired = credentials.expiresAt < Date.now();
26
+ console.log(`\nToken: ${tokenExpired ? 'Expired' : 'Valid'}`);
27
+ if (!tokenExpired) {
28
+ const expiresIn = Math.round((credentials.expiresAt - Date.now()) / 1000 / 60);
29
+ console.log(` Expires in: ${expiresIn} minutes`);
30
+ }
31
+ // Daemon status
32
+ const running = (0, config_1.isDaemonRunning)();
33
+ console.log(`\nDaemon: ${running ? 'Running' : 'Stopped'}`);
34
+ if (running) {
35
+ const pid = (0, config_1.readPidFile)();
36
+ console.log(` PID: ${pid}`);
37
+ }
38
+ // Cursor database status
39
+ const dbExists = (0, config_1.cursorDbExists)();
40
+ console.log(`\nCursor Database: ${dbExists ? 'Found' : 'Not found'}`);
41
+ if (dbExists) {
42
+ try {
43
+ const db = (0, cursor_db_1.getCursorDB)();
44
+ const composers = db.getComposers();
45
+ console.log(` Sessions: ${composers.length}`);
46
+ }
47
+ catch (err) {
48
+ console.log(` Error reading database: ${err.message}`);
49
+ }
50
+ }
51
+ // CDP status
52
+ console.log('\nCDP (Chrome DevTools Protocol):');
53
+ try {
54
+ const cdp = (0, cdp_client_1.getCDPClient)();
55
+ const available = await cdp.isAvailable();
56
+ if (available) {
57
+ console.log(' Status: Available');
58
+ const title = await cdp.getWindowTitle();
59
+ if (title) {
60
+ console.log(` Active project: ${title}`);
61
+ }
62
+ const composerOpen = await cdp.isComposerOpen();
63
+ console.log(` Composer panel: ${composerOpen ? 'Open' : 'Closed'}`);
64
+ }
65
+ else {
66
+ console.log(' Status: Not available');
67
+ console.log(' To enable, start Cursor with:');
68
+ console.log(' /Applications/Cursor.app/Contents/MacOS/Cursor --remote-debugging-port=9222');
69
+ }
70
+ }
71
+ catch (err) {
72
+ console.log(` Status: Error - ${err.message}`);
73
+ }
74
+ }
75
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -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,68 @@
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
+ export declare const CURSOR_GLOBAL_STORAGE: string;
16
+ export declare const CURSOR_WORKSPACE_STORAGE: string;
17
+ export declare const CDP_PORT = 9222;
18
+ export declare const CDP_URL = "http://localhost:9222";
19
+ /**
20
+ * Ensure the config directory exists with proper permissions
21
+ */
22
+ export declare function ensureConfigDir(): void;
23
+ /**
24
+ * Read the config file
25
+ */
26
+ export declare function readConfig(): CmdCtrlConfig | null;
27
+ /**
28
+ * Write the config file
29
+ */
30
+ export declare function writeConfig(config: CmdCtrlConfig): void;
31
+ /**
32
+ * Read credentials (access/refresh tokens)
33
+ */
34
+ export declare function readCredentials(): Credentials | null;
35
+ /**
36
+ * Write credentials with restrictive permissions (600)
37
+ */
38
+ export declare function writeCredentials(creds: Credentials): void;
39
+ /**
40
+ * Delete credentials (for logout/revoke)
41
+ */
42
+ export declare function deleteCredentials(): void;
43
+ /**
44
+ * Check if device is registered
45
+ */
46
+ export declare function isRegistered(): boolean;
47
+ /**
48
+ * Write daemon PID file
49
+ */
50
+ export declare function writePidFile(pid: number): void;
51
+ /**
52
+ * Read daemon PID
53
+ */
54
+ export declare function readPidFile(): number | null;
55
+ /**
56
+ * Delete PID file
57
+ */
58
+ export declare function deletePidFile(): void;
59
+ /**
60
+ * Check if daemon is running
61
+ */
62
+ export declare function isDaemonRunning(): boolean;
63
+ /**
64
+ * Check if Cursor global storage database exists
65
+ */
66
+ export declare function cursorDbExists(): boolean;
67
+ export { CONFIG_DIR, CONFIG_FILE, CREDENTIALS_FILE, PID_FILE };
68
+ //# 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,QAAiD,CAAC;AAClE,QAAA,MAAM,WAAW,QAAuC,CAAC;AACzD,QAAA,MAAM,gBAAgB,QAAuC,CAAC;AAC9D,QAAA,MAAM,QAAQ,QAAsC,CAAC;AAGrD,eAAO,MAAM,qBAAqB,QAGjC,CAAC;AACF,eAAO,MAAM,wBAAwB,QAGpC,CAAC;AAGF,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,OAAO,0BAAiC,CAAC;AAEtD;;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;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,189 @@
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 = exports.CDP_URL = exports.CDP_PORT = exports.CURSOR_WORKSPACE_STORAGE = exports.CURSOR_GLOBAL_STORAGE = 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
+ exports.cursorDbExists = cursorDbExists;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const os = __importStar(require("os"));
52
+ const CONFIG_DIR = path.join(os.homedir(), '.cmdctrl-cursor-ide');
53
+ exports.CONFIG_DIR = CONFIG_DIR;
54
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
55
+ exports.CONFIG_FILE = CONFIG_FILE;
56
+ const CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials');
57
+ exports.CREDENTIALS_FILE = CREDENTIALS_FILE;
58
+ const PID_FILE = path.join(CONFIG_DIR, 'daemon.pid');
59
+ exports.PID_FILE = PID_FILE;
60
+ // Cursor data paths (macOS)
61
+ exports.CURSOR_GLOBAL_STORAGE = path.join(os.homedir(), 'Library/Application Support/Cursor/User/globalStorage/state.vscdb');
62
+ exports.CURSOR_WORKSPACE_STORAGE = path.join(os.homedir(), 'Library/Application Support/Cursor/User/workspaceStorage');
63
+ // CDP default port
64
+ exports.CDP_PORT = 9222;
65
+ exports.CDP_URL = `http://localhost:${exports.CDP_PORT}`;
66
+ /**
67
+ * Ensure the config directory exists with proper permissions
68
+ */
69
+ function ensureConfigDir() {
70
+ if (!fs.existsSync(CONFIG_DIR)) {
71
+ fs.mkdirSync(CONFIG_DIR, { mode: 0o700 });
72
+ }
73
+ }
74
+ /**
75
+ * Read the config file
76
+ */
77
+ function readConfig() {
78
+ try {
79
+ if (!fs.existsSync(CONFIG_FILE)) {
80
+ return null;
81
+ }
82
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
83
+ return JSON.parse(content);
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ /**
90
+ * Write the config file
91
+ */
92
+ function writeConfig(config) {
93
+ ensureConfigDir();
94
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
95
+ }
96
+ /**
97
+ * Read credentials (access/refresh tokens)
98
+ */
99
+ function readCredentials() {
100
+ try {
101
+ if (!fs.existsSync(CREDENTIALS_FILE)) {
102
+ return null;
103
+ }
104
+ const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');
105
+ return JSON.parse(content);
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * Write credentials with restrictive permissions (600)
113
+ */
114
+ function writeCredentials(creds) {
115
+ ensureConfigDir();
116
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });
117
+ }
118
+ /**
119
+ * Delete credentials (for logout/revoke)
120
+ */
121
+ function deleteCredentials() {
122
+ if (fs.existsSync(CREDENTIALS_FILE)) {
123
+ fs.unlinkSync(CREDENTIALS_FILE);
124
+ }
125
+ }
126
+ /**
127
+ * Check if device is registered
128
+ */
129
+ function isRegistered() {
130
+ const config = readConfig();
131
+ const creds = readCredentials();
132
+ return config !== null && creds !== null && config.deviceId !== '';
133
+ }
134
+ /**
135
+ * Write daemon PID file
136
+ */
137
+ function writePidFile(pid) {
138
+ ensureConfigDir();
139
+ fs.writeFileSync(PID_FILE, pid.toString(), { mode: 0o600 });
140
+ }
141
+ /**
142
+ * Read daemon PID
143
+ */
144
+ function readPidFile() {
145
+ try {
146
+ if (!fs.existsSync(PID_FILE)) {
147
+ return null;
148
+ }
149
+ const content = fs.readFileSync(PID_FILE, 'utf-8');
150
+ return parseInt(content, 10);
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
156
+ /**
157
+ * Delete PID file
158
+ */
159
+ function deletePidFile() {
160
+ if (fs.existsSync(PID_FILE)) {
161
+ fs.unlinkSync(PID_FILE);
162
+ }
163
+ }
164
+ /**
165
+ * Check if daemon is running
166
+ */
167
+ function isDaemonRunning() {
168
+ const pid = readPidFile();
169
+ if (pid === null) {
170
+ return false;
171
+ }
172
+ try {
173
+ // Signal 0 doesn't kill, just checks if process exists
174
+ process.kill(pid, 0);
175
+ return true;
176
+ }
177
+ catch {
178
+ // Process doesn't exist, clean up stale PID file
179
+ deletePidFile();
180
+ return false;
181
+ }
182
+ }
183
+ /**
184
+ * Check if Cursor global storage database exists
185
+ */
186
+ function cursorDbExists() {
187
+ return fs.existsSync(exports.CURSOR_GLOBAL_STORAGE);
188
+ }
189
+ //# 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":""}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const register_1 = require("./commands/register");
6
+ const start_1 = require("./commands/start");
7
+ const status_1 = require("./commands/status");
8
+ const stop_1 = require("./commands/stop");
9
+ const program = new commander_1.Command();
10
+ program
11
+ .name('cmdctrl-cursor-ide')
12
+ .description('Cursor IDE daemon - connects Cursor sessions to the CmdCtrl orchestration server')
13
+ .version('0.1.0');
14
+ program
15
+ .command('register')
16
+ .description('Register this device with a CmdCtrl server')
17
+ .option('-s, --server <url>', 'CmdCtrl server URL', 'http://localhost:4000')
18
+ .option('-n, --name <name>', 'Device name (defaults to hostname-cursor)')
19
+ .action(register_1.register);
20
+ program
21
+ .command('start')
22
+ .description('Start the daemon and connect to the CmdCtrl server')
23
+ .option('-f, --foreground', 'Run in foreground (don\'t daemonize)')
24
+ .action(start_1.start);
25
+ program
26
+ .command('status')
27
+ .description('Check daemon and CDP connection status')
28
+ .action(status_1.status);
29
+ program
30
+ .command('stop')
31
+ .description('Stop the running daemon')
32
+ .action(stop_1.stop);
33
+ program.parse();
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,kDAA+C;AAC/C,4CAAyC;AACzC,8CAA2C;AAC3C,0CAAuC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,oBAAoB,CAAC;KAC1B,WAAW,CAAC,kFAAkF,CAAC;KAC/F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,CAAC;KAC3E,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,mBAAQ,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,kBAAkB,EAAE,sCAAsC,CAAC;KAClE,MAAM,CAAC,aAAK,CAAC,CAAC;AAEjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,eAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,WAAI,CAAC,CAAC;AAEhB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface ExternalSession {
2
+ session_id: string;
3
+ slug: string;
4
+ title: string;
5
+ project: string;
6
+ project_name: string;
7
+ file_path: string;
8
+ last_message: string;
9
+ last_activity: string;
10
+ is_active: boolean;
11
+ message_count: number;
12
+ }
13
+ /**
14
+ * Discover Cursor IDE sessions from the SQLite database
15
+ * Returns sessions in a format compatible with CmdCtrl's external session API
16
+ */
17
+ export declare function discoverSessions(excludeSessionIds?: Set<string>): ExternalSession[];
18
+ /**
19
+ * Get details for a specific session
20
+ */
21
+ export declare function getSessionDetails(sessionId: string): ExternalSession | null;
22
+ //# sourceMappingURL=session-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-discovery.d.ts","sourceRoot":"","sources":["../src/session-discovery.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,eAAe,EAAE,CA2C9F;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAmC3E"}