@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,438 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.CursorDB = void 0;
40
+ exports.getCursorDB = getCursorDB;
41
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const config_1 = require("../config/config");
45
+ /**
46
+ * Cursor SQLite Database Reader
47
+ * Reads conversation data from Cursor's local storage
48
+ */
49
+ class CursorDB {
50
+ globalDb = null;
51
+ lastOpenAttempt = 0;
52
+ lastRefresh = 0;
53
+ RETRY_INTERVAL = 5000; // 5 seconds between retries
54
+ REFRESH_INTERVAL = 2000; // 2s - refresh connection to see WAL updates
55
+ /**
56
+ * Check if the Cursor database exists
57
+ */
58
+ static exists() {
59
+ return fs.existsSync(config_1.CURSOR_GLOBAL_STORAGE);
60
+ }
61
+ /**
62
+ * Open the global storage database (read-only)
63
+ * Periodically refreshes the connection to see WAL updates from Cursor
64
+ */
65
+ openGlobalDb() {
66
+ const now = Date.now();
67
+ // If we have a connection but it's stale, refresh it to see WAL updates
68
+ if (this.globalDb && now - this.lastRefresh > this.REFRESH_INTERVAL) {
69
+ this.globalDb.close();
70
+ this.globalDb = null;
71
+ // Reset lastOpenAttempt so we don't hit the retry cooldown after refresh
72
+ this.lastOpenAttempt = 0;
73
+ }
74
+ if (this.globalDb) {
75
+ return this.globalDb;
76
+ }
77
+ // Don't retry too frequently after FAILED open attempts (not refreshes)
78
+ if (this.lastOpenAttempt > 0 && now - this.lastOpenAttempt < this.RETRY_INTERVAL) {
79
+ return null;
80
+ }
81
+ if (!CursorDB.exists()) {
82
+ console.warn('[CursorDB] Database not found:', config_1.CURSOR_GLOBAL_STORAGE);
83
+ return null;
84
+ }
85
+ try {
86
+ this.globalDb = new better_sqlite3_1.default(config_1.CURSOR_GLOBAL_STORAGE, {
87
+ readonly: true,
88
+ fileMustExist: true,
89
+ });
90
+ // Force WAL checkpoint to see latest changes
91
+ try {
92
+ this.globalDb.pragma('wal_checkpoint(PASSIVE)');
93
+ }
94
+ catch {
95
+ // Checkpoint may fail on readonly, that's ok
96
+ }
97
+ this.lastRefresh = now;
98
+ this.lastOpenAttempt = now;
99
+ return this.globalDb;
100
+ }
101
+ catch (err) {
102
+ console.error('[CursorDB] Failed to open database:', err);
103
+ return null;
104
+ }
105
+ }
106
+ /**
107
+ * Close database connections
108
+ */
109
+ close() {
110
+ if (this.globalDb) {
111
+ this.globalDb.close();
112
+ this.globalDb = null;
113
+ }
114
+ }
115
+ /**
116
+ * Extract project path from composer context
117
+ * Looks at fileSelections and folderSelections for path info
118
+ */
119
+ extractProjectPath(context) {
120
+ if (!context || typeof context !== 'object') {
121
+ return undefined;
122
+ }
123
+ const ctx = context;
124
+ // Try folderSelections first
125
+ const folderSelections = ctx.folderSelections;
126
+ if (folderSelections?.length) {
127
+ const firstFolder = folderSelections[0]?.uri?.fsPath;
128
+ if (firstFolder) {
129
+ return firstFolder;
130
+ }
131
+ }
132
+ // Try fileSelections - extract directory from first file
133
+ const fileSelections = ctx.fileSelections;
134
+ if (fileSelections?.length) {
135
+ const firstFile = fileSelections[0]?.uri?.fsPath;
136
+ if (firstFile) {
137
+ // Find a reasonable project root (go up to find common patterns)
138
+ return this.findProjectRoot(firstFile);
139
+ }
140
+ }
141
+ return undefined;
142
+ }
143
+ /**
144
+ * Find project root from a file path
145
+ * Looks for common project markers (package.json, .git, go.mod, etc.)
146
+ */
147
+ findProjectRoot(filePath) {
148
+ let dir = path.dirname(filePath);
149
+ const markers = ['package.json', '.git', 'go.mod', 'Cargo.toml', 'pyproject.toml', 'pom.xml'];
150
+ // Walk up max 10 levels
151
+ for (let i = 0; i < 10 && dir !== '/'; i++) {
152
+ for (const marker of markers) {
153
+ if (fs.existsSync(path.join(dir, marker))) {
154
+ return dir;
155
+ }
156
+ }
157
+ dir = path.dirname(dir);
158
+ }
159
+ // If no marker found, return the parent of the file
160
+ return path.dirname(filePath);
161
+ }
162
+ /**
163
+ * Get all composers (conversation sessions)
164
+ */
165
+ getComposers() {
166
+ const db = this.openGlobalDb();
167
+ if (!db)
168
+ return [];
169
+ try {
170
+ const stmt = db.prepare(`
171
+ SELECT key, value FROM cursorDiskKV
172
+ WHERE key LIKE 'composerData:%'
173
+ `);
174
+ const rows = stmt.all();
175
+ const allComposers = [];
176
+ for (const row of rows) {
177
+ try {
178
+ const valueStr = typeof row.value === 'string'
179
+ ? row.value
180
+ : row.value.toString('utf-8');
181
+ const data = JSON.parse(valueStr);
182
+ // Each composerData:* key contains ONE composer directly
183
+ // Format: { _v, composerId, name, createdAt, lastUpdatedAt, context, ... }
184
+ if (data.composerId) {
185
+ const composerId = data.composerId;
186
+ const createdAt = data.createdAt || Date.now();
187
+ // Use lastUpdatedAt if present, otherwise fall back to createdAt
188
+ const lastUpdatedAt = data.lastUpdatedAt || createdAt;
189
+ // Try to extract project path from file context
190
+ const projectPath = this.extractProjectPath(data.context);
191
+ allComposers.push({
192
+ composerId,
193
+ name: data.name || 'Untitled Session',
194
+ createdAt,
195
+ lastUpdatedAt,
196
+ unifiedMode: data.unifiedMode || 'unknown',
197
+ contextUsagePercent: data.contextUsagePercent || 0,
198
+ projectPath,
199
+ });
200
+ }
201
+ }
202
+ catch {
203
+ // Skip malformed entries
204
+ }
205
+ }
206
+ return allComposers.sort((a, b) => b.lastUpdatedAt - a.lastUpdatedAt);
207
+ }
208
+ catch (err) {
209
+ console.error('[CursorDB] Error getting composers:', err);
210
+ return [];
211
+ }
212
+ }
213
+ /**
214
+ * Get composer data including conversation headers
215
+ */
216
+ getComposerData(composerId) {
217
+ const db = this.openGlobalDb();
218
+ if (!db)
219
+ return null;
220
+ try {
221
+ const stmt = db.prepare(`
222
+ SELECT value FROM cursorDiskKV
223
+ WHERE key = ?
224
+ `);
225
+ const row = stmt.get(`composerData:${composerId}`);
226
+ if (!row)
227
+ return null;
228
+ const valueStr = typeof row.value === 'string'
229
+ ? row.value
230
+ : row.value.toString('utf-8');
231
+ return JSON.parse(valueStr);
232
+ }
233
+ catch (err) {
234
+ console.error('[CursorDB] Error getting composer data:', err);
235
+ return null;
236
+ }
237
+ }
238
+ /**
239
+ * Get all bubbles (messages) for a composer
240
+ */
241
+ getBubbles(composerId) {
242
+ const db = this.openGlobalDb();
243
+ if (!db)
244
+ return [];
245
+ try {
246
+ const stmt = db.prepare(`
247
+ SELECT key, value FROM cursorDiskKV
248
+ WHERE key LIKE ?
249
+ `);
250
+ const pattern = `bubbleId:${composerId}:%`;
251
+ const rows = stmt.all(pattern);
252
+ const bubbles = [];
253
+ for (const row of rows) {
254
+ try {
255
+ const valueStr = typeof row.value === 'string'
256
+ ? row.value
257
+ : row.value.toString('utf-8');
258
+ const bubble = JSON.parse(valueStr);
259
+ bubbles.push(bubble);
260
+ }
261
+ catch {
262
+ // Skip malformed entries
263
+ }
264
+ }
265
+ // Sort by creation time
266
+ return bubbles.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
267
+ }
268
+ catch (err) {
269
+ console.error('[CursorDB] Error getting bubbles:', err);
270
+ return [];
271
+ }
272
+ }
273
+ /**
274
+ * Get the latest bubble for a composer (optimized - uses SQL sorting)
275
+ */
276
+ getLatestBubble(composerId) {
277
+ const db = this.openGlobalDb();
278
+ if (!db)
279
+ return null;
280
+ try {
281
+ // Use json_extract to sort by createdAt directly in SQL
282
+ const stmt = db.prepare(`
283
+ SELECT key, value FROM cursorDiskKV
284
+ WHERE key LIKE ?
285
+ ORDER BY json_extract(value, '$.createdAt') DESC
286
+ LIMIT 1
287
+ `);
288
+ const pattern = `bubbleId:${composerId}:%`;
289
+ const row = stmt.get(pattern);
290
+ if (!row || !row.value)
291
+ return null;
292
+ const valueStr = typeof row.value === 'string'
293
+ ? row.value
294
+ : row.value.toString('utf-8');
295
+ return JSON.parse(valueStr);
296
+ }
297
+ catch (err) {
298
+ console.error('[CursorDB] Error getting latest bubble:', err);
299
+ return null;
300
+ }
301
+ }
302
+ /**
303
+ * Get messages for a session in a format compatible with CmdCtrl API
304
+ * @param composerId The composer/session ID
305
+ * @param limit Maximum number of messages to return
306
+ * @param beforeUuid Return messages before this UUID (for backward pagination)
307
+ * @param afterUuid Return messages after this UUID (for incremental/forward fetches)
308
+ */
309
+ getMessages(composerId, limit = 30, beforeUuid, afterUuid) {
310
+ const bubbles = this.getBubbles(composerId);
311
+ // Handle afterUuid for incremental fetches (messages AFTER the given UUID)
312
+ if (afterUuid) {
313
+ const afterIdx = bubbles.findIndex(b => b.bubbleId === afterUuid);
314
+ if (afterIdx !== -1) {
315
+ // Get all bubbles after the cursor
316
+ const rawSlice = bubbles.slice(afterIdx + 1, afterIdx + 1 + limit);
317
+ // Filter out empty bubbles - Cursor creates entries BEFORE populating text
318
+ const slice = rawSlice.filter(b => b.text && b.text.trim().length > 0);
319
+ const messages = slice.map(b => ({
320
+ uuid: b.bubbleId,
321
+ role: b.type === 1 ? 'USER' : 'AGENT',
322
+ content: b.text || '',
323
+ timestamp: b.createdAt,
324
+ }));
325
+ return {
326
+ messages,
327
+ hasMore: afterIdx + 1 + limit < bubbles.length,
328
+ oldestUuid: slice.length > 0 ? slice[0].bubbleId : undefined,
329
+ newestUuid: slice.length > 0 ? slice[slice.length - 1].bubbleId : undefined,
330
+ };
331
+ }
332
+ // If afterUuid not found, fall through to return all messages
333
+ }
334
+ // Handle beforeUuid for backward pagination
335
+ let startIndex = bubbles.length;
336
+ if (beforeUuid) {
337
+ const idx = bubbles.findIndex(b => b.bubbleId === beforeUuid);
338
+ if (idx !== -1) {
339
+ startIndex = idx;
340
+ }
341
+ }
342
+ // Get messages before the cursor, limited to `limit`
343
+ // Filter out empty bubbles (Cursor creates entries before text is populated)
344
+ const startFrom = Math.max(0, startIndex - limit);
345
+ const slice = bubbles
346
+ .slice(startFrom, startIndex)
347
+ .filter(b => b.text && b.text.trim().length > 0);
348
+ const messages = slice.map(b => ({
349
+ uuid: b.bubbleId,
350
+ role: b.type === 1 ? 'USER' : 'AGENT',
351
+ content: b.text || '',
352
+ timestamp: b.createdAt,
353
+ }));
354
+ // Return oldest-first (chronological order) to match Claude Code daemon
355
+ return {
356
+ messages,
357
+ hasMore: startFrom > 0,
358
+ oldestUuid: slice.length > 0 ? slice[0].bubbleId : undefined,
359
+ newestUuid: slice.length > 0 ? slice[slice.length - 1].bubbleId : undefined,
360
+ };
361
+ }
362
+ /**
363
+ * Get the count of bubbles for a composer
364
+ */
365
+ getBubbleCount(composerId) {
366
+ const db = this.openGlobalDb();
367
+ if (!db)
368
+ return 0;
369
+ try {
370
+ const stmt = db.prepare(`
371
+ SELECT COUNT(*) as count FROM cursorDiskKV
372
+ WHERE key LIKE ?
373
+ `);
374
+ const pattern = `bubbleId:${composerId}:%`;
375
+ const row = stmt.get(pattern);
376
+ return row.count;
377
+ }
378
+ catch (err) {
379
+ console.error('[CursorDB] Error counting bubbles:', err);
380
+ return 0;
381
+ }
382
+ }
383
+ /**
384
+ * Get workspace storage paths that contain state.vscdb files
385
+ */
386
+ getWorkspaceStoragePaths() {
387
+ const paths = [];
388
+ if (!fs.existsSync(config_1.CURSOR_WORKSPACE_STORAGE)) {
389
+ return paths;
390
+ }
391
+ try {
392
+ const entries = fs.readdirSync(config_1.CURSOR_WORKSPACE_STORAGE);
393
+ for (const entry of entries) {
394
+ const dbPath = path.join(config_1.CURSOR_WORKSPACE_STORAGE, entry, 'state.vscdb');
395
+ if (fs.existsSync(dbPath)) {
396
+ paths.push(dbPath);
397
+ }
398
+ }
399
+ }
400
+ catch (err) {
401
+ console.error('[CursorDB] Error reading workspace storage:', err);
402
+ }
403
+ return paths;
404
+ }
405
+ /**
406
+ * Try to determine the project path for a workspace storage hash
407
+ * This is a best-effort attempt based on workspace.json if it exists
408
+ */
409
+ getWorkspaceProjectPath(workspaceHash) {
410
+ const workspaceJsonPath = path.join(config_1.CURSOR_WORKSPACE_STORAGE, workspaceHash, 'workspace.json');
411
+ if (!fs.existsSync(workspaceJsonPath)) {
412
+ return null;
413
+ }
414
+ try {
415
+ const content = fs.readFileSync(workspaceJsonPath, 'utf-8');
416
+ const data = JSON.parse(content);
417
+ // workspace.json typically contains a "folder" property with the URI
418
+ if (data.folder) {
419
+ // Convert file:// URI to path
420
+ return data.folder.replace('file://', '');
421
+ }
422
+ }
423
+ catch {
424
+ // Ignore errors
425
+ }
426
+ return null;
427
+ }
428
+ }
429
+ exports.CursorDB = CursorDB;
430
+ // Singleton instance
431
+ let cursorDbInstance = null;
432
+ function getCursorDB() {
433
+ if (!cursorDbInstance) {
434
+ cursorDbInstance = new CursorDB();
435
+ }
436
+ return cursorDbInstance;
437
+ }
438
+ //# sourceMappingURL=cursor-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-db.js","sourceRoot":"","sources":["../../src/adapter/cursor-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Message types for daemon <-> server communication
3
+ */
4
+ export interface PingMessage {
5
+ type: 'ping';
6
+ }
7
+ export interface TaskStartMessage {
8
+ type: 'task_start';
9
+ task_id: string;
10
+ instruction: string;
11
+ project_path?: string;
12
+ }
13
+ export interface TaskResumeMessage {
14
+ type: 'task_resume';
15
+ task_id: string;
16
+ session_id: string;
17
+ message: string;
18
+ project_path?: string;
19
+ }
20
+ export interface TaskCancelMessage {
21
+ type: 'task_cancel';
22
+ task_id: string;
23
+ }
24
+ export interface GetMessagesMessage {
25
+ type: 'get_messages';
26
+ request_id: string;
27
+ session_id: string;
28
+ limit: number;
29
+ before_uuid?: string;
30
+ after_uuid?: string;
31
+ }
32
+ export interface WatchSessionMessage {
33
+ type: 'watch_session';
34
+ session_id: string;
35
+ file_path: string;
36
+ }
37
+ export interface UnwatchSessionMessage {
38
+ type: 'unwatch_session';
39
+ session_id: string;
40
+ }
41
+ export type ServerMessage = PingMessage | TaskStartMessage | TaskResumeMessage | TaskCancelMessage | GetMessagesMessage | WatchSessionMessage | UnwatchSessionMessage;
42
+ export interface PongMessage {
43
+ type: 'pong';
44
+ }
45
+ export interface StatusMessage {
46
+ type: 'status';
47
+ running_tasks: string[];
48
+ }
49
+ export interface EventMessage {
50
+ type: 'event';
51
+ task_id: string;
52
+ event_type: string;
53
+ [key: string]: unknown;
54
+ }
55
+ export interface SessionInfo {
56
+ session_id: string;
57
+ slug: string;
58
+ title: string;
59
+ project: string;
60
+ project_name: string;
61
+ file_path: string;
62
+ last_message: string;
63
+ last_activity: string;
64
+ is_active: boolean;
65
+ message_count: number;
66
+ }
67
+ export interface ReportSessionsMessage {
68
+ type: 'report_sessions';
69
+ sessions: SessionInfo[];
70
+ }
71
+ export interface MessageEntry {
72
+ uuid: string;
73
+ role: 'USER' | 'AGENT';
74
+ content: string;
75
+ timestamp: string;
76
+ }
77
+ export interface MessagesResponseMessage {
78
+ type: 'messages';
79
+ request_id: string;
80
+ session_id: string;
81
+ messages: MessageEntry[];
82
+ has_more: boolean;
83
+ oldest_uuid?: string;
84
+ newest_uuid?: string;
85
+ error?: string;
86
+ }
87
+ export interface SessionActivityMessage {
88
+ type: 'session_activity';
89
+ session_id: string;
90
+ file_path: string;
91
+ last_message: string;
92
+ message_count: number;
93
+ is_completion: boolean;
94
+ user_message_uuid?: string;
95
+ }
96
+ export type DaemonMessage = PongMessage | StatusMessage | EventMessage | ReportSessionsMessage | MessagesResponseMessage | SessionActivityMessage;
97
+ export type EventType = 'WAIT_FOR_USER' | 'TASK_COMPLETE' | 'OUTPUT' | 'PROGRESS' | 'ERROR';
98
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/client/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Message types for daemon <-> server communication
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/client/messages.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,103 @@
1
+ import { CmdCtrlConfig, Credentials } from '../config/config';
2
+ export declare class DaemonClient {
3
+ private ws;
4
+ private config;
5
+ private credentials;
6
+ private reconnectDelay;
7
+ private reconnectTimer;
8
+ private pingTimer;
9
+ private sessionRefreshTimer;
10
+ private shouldReconnect;
11
+ private managedSessionIds;
12
+ private runningTasks;
13
+ constructor(config: CmdCtrlConfig, credentials: Credentials);
14
+ /**
15
+ * Handle session activity from the watcher and forward to server
16
+ */
17
+ private handleSessionActivity;
18
+ /**
19
+ * Connect to the CmdCtrl server via WebSocket
20
+ */
21
+ connect(): Promise<void>;
22
+ /**
23
+ * Disconnect from server
24
+ */
25
+ disconnect(): Promise<void>;
26
+ /**
27
+ * Send a message to the server
28
+ */
29
+ private send;
30
+ /**
31
+ * Send an event for a task
32
+ */
33
+ private sendEvent;
34
+ /**
35
+ * Send current status to server
36
+ */
37
+ private sendStatus;
38
+ /**
39
+ * Handle incoming message from server
40
+ */
41
+ private handleMessage;
42
+ /**
43
+ * Handle task_start message - send message to Cursor via CDP
44
+ */
45
+ private handleTaskStart;
46
+ /**
47
+ * Handle task_resume message - send follow-up message to Cursor
48
+ */
49
+ private handleTaskResume;
50
+ /**
51
+ * Handle get_messages request - read from Cursor SQLite database
52
+ */
53
+ private handleGetMessages;
54
+ /**
55
+ * Handle watch_session request
56
+ */
57
+ private handleWatchSession;
58
+ /**
59
+ * Handle unwatch_session request
60
+ */
61
+ private handleUnwatchSession;
62
+ /**
63
+ * Schedule reconnection with exponential backoff
64
+ */
65
+ private scheduleReconnect;
66
+ /**
67
+ * Start ping interval
68
+ */
69
+ private startPingInterval;
70
+ /**
71
+ * Stop ping interval
72
+ */
73
+ private stopPingInterval;
74
+ /**
75
+ * Start the session watcher
76
+ */
77
+ private startSessionWatcher;
78
+ /**
79
+ * Stop the session watcher
80
+ */
81
+ private stopSessionWatcher;
82
+ /**
83
+ * Report discovered external sessions to server
84
+ */
85
+ private reportSessions;
86
+ /**
87
+ * Start periodic session refresh
88
+ */
89
+ private startSessionRefreshInterval;
90
+ /**
91
+ * Stop session refresh interval
92
+ */
93
+ private stopSessionRefreshInterval;
94
+ /**
95
+ * Add a session ID to the managed set
96
+ */
97
+ addManagedSession(sessionId: string): void;
98
+ /**
99
+ * Remove a session ID from the managed set
100
+ */
101
+ removeManagedSession(sessionId: string): void;
102
+ }
103
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/client/websocket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAqB9D,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,YAAY,CAA0B;gBAElC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW;IAK3D;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC;;OAEG;IACH,OAAO,CAAC,IAAI;IAUZ;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgDrB;;OAEG;YACW,eAAe;IAsD7B;;OAEG;YACW,gBAAgB;IA2B9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,cAAc;IA4BtB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAOlC;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAG9C"}