@cmdctrl/claude-code 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 (83) hide show
  1. package/dist/adapter/claude-cli.d.ts +41 -0
  2. package/dist/adapter/claude-cli.d.ts.map +1 -0
  3. package/dist/adapter/claude-cli.js +525 -0
  4. package/dist/adapter/claude-cli.js.map +1 -0
  5. package/dist/adapter/events.d.ts +52 -0
  6. package/dist/adapter/events.d.ts.map +1 -0
  7. package/dist/adapter/events.js +134 -0
  8. package/dist/adapter/events.js.map +1 -0
  9. package/dist/client/messages.d.ts +140 -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 +115 -0
  14. package/dist/client/websocket.d.ts.map +1 -0
  15. package/dist/client/websocket.js +434 -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 +54 -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 +38 -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/commands/unregister.d.ts +5 -0
  34. package/dist/commands/unregister.d.ts.map +1 -0
  35. package/dist/commands/unregister.js +28 -0
  36. package/dist/commands/unregister.js.map +1 -0
  37. package/dist/config/config.d.ts +68 -0
  38. package/dist/config/config.d.ts.map +1 -0
  39. package/dist/config/config.js +193 -0
  40. package/dist/config/config.js.map +1 -0
  41. package/dist/handlers/context-handler.d.ts +37 -0
  42. package/dist/handlers/context-handler.d.ts.map +1 -0
  43. package/dist/handlers/context-handler.js +303 -0
  44. package/dist/handlers/context-handler.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/message-reader.d.ts +25 -0
  50. package/dist/message-reader.d.ts.map +1 -0
  51. package/dist/message-reader.js +454 -0
  52. package/dist/message-reader.js.map +1 -0
  53. package/dist/session-discovery.d.ts +48 -0
  54. package/dist/session-discovery.d.ts.map +1 -0
  55. package/dist/session-discovery.js +496 -0
  56. package/dist/session-discovery.js.map +1 -0
  57. package/dist/session-watcher.d.ts +92 -0
  58. package/dist/session-watcher.d.ts.map +1 -0
  59. package/dist/session-watcher.js +494 -0
  60. package/dist/session-watcher.js.map +1 -0
  61. package/dist/session-watcher.test.d.ts +9 -0
  62. package/dist/session-watcher.test.d.ts.map +1 -0
  63. package/dist/session-watcher.test.js +149 -0
  64. package/dist/session-watcher.test.js.map +1 -0
  65. package/jest.config.js +8 -0
  66. package/package.json +42 -0
  67. package/src/adapter/claude-cli.ts +591 -0
  68. package/src/adapter/events.ts +186 -0
  69. package/src/client/messages.ts +193 -0
  70. package/src/client/websocket.ts +509 -0
  71. package/src/commands/register.ts +201 -0
  72. package/src/commands/start.ts +70 -0
  73. package/src/commands/status.ts +47 -0
  74. package/src/commands/stop.ts +58 -0
  75. package/src/commands/unregister.ts +30 -0
  76. package/src/config/config.ts +163 -0
  77. package/src/handlers/context-handler.ts +337 -0
  78. package/src/index.ts +45 -0
  79. package/src/message-reader.ts +485 -0
  80. package/src/session-discovery.ts +557 -0
  81. package/src/session-watcher.test.ts +141 -0
  82. package/src/session-watcher.ts +560 -0
  83. package/tsconfig.json +19 -0
@@ -0,0 +1,434 @@
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 claude_cli_1 = require("../adapter/claude-cli");
10
+ const session_discovery_1 = require("../session-discovery");
11
+ const message_reader_1 = require("../message-reader");
12
+ const session_watcher_1 = require("../session-watcher");
13
+ const context_handler_1 = require("../handlers/context-handler");
14
+ const MAX_RECONNECT_DELAY = 30000; // 30 seconds
15
+ const INITIAL_RECONNECT_DELAY = 1000; // 1 second
16
+ const PING_INTERVAL = 30000; // 30 seconds
17
+ const SESSION_REFRESH_INTERVAL = 30000; // 30 seconds
18
+ class DaemonClient {
19
+ ws = null;
20
+ config;
21
+ credentials;
22
+ reconnectDelay = INITIAL_RECONNECT_DELAY;
23
+ reconnectTimer = null;
24
+ pingTimer = null;
25
+ sessionRefreshTimer = null;
26
+ shouldReconnect = true;
27
+ adapter;
28
+ managedSessionIds = new Set(); // Sessions managed by this daemon
29
+ lastReportedSessionCount = -1; // Track for change detection
30
+ sessionWatcher;
31
+ constructor(config, credentials) {
32
+ this.config = config;
33
+ this.credentials = credentials;
34
+ this.adapter = new claude_cli_1.ClaudeAdapter(this.sendEvent.bind(this));
35
+ this.sessionWatcher = new session_watcher_1.SessionWatcher(this.handleSessionEvent.bind(this), this.handleSessionCompletion.bind(this));
36
+ }
37
+ /**
38
+ * Handle session events from the JSONL watcher and forward to server
39
+ * Converts SessionEvent to EventMessage format
40
+ */
41
+ handleSessionEvent(event) {
42
+ // Send as an event message to the server
43
+ this.send({
44
+ type: 'event',
45
+ task_id: '', // No task_id for watched session events (file-based, not daemon-spawned)
46
+ event_type: event.type,
47
+ session_id: event.sessionId,
48
+ uuid: event.uuid,
49
+ content: event.content,
50
+ timestamp: event.timestamp,
51
+ });
52
+ }
53
+ /**
54
+ * Handle session completion events from the JSONL watcher
55
+ * Sends session_activity message with is_completion=true to trigger push notifications
56
+ */
57
+ handleSessionCompletion(event) {
58
+ console.log(`[WS] Sending session_activity completion for session ${event.sessionId.slice(-8)}`);
59
+ const message = {
60
+ type: 'session_activity',
61
+ session_id: event.sessionId,
62
+ file_path: event.filePath,
63
+ last_message: event.lastMessage,
64
+ message_count: event.messageCount,
65
+ is_completion: true,
66
+ last_activity: new Date().toISOString(),
67
+ };
68
+ this.send(message);
69
+ }
70
+ /**
71
+ * Connect to the CmdCtrl server via WebSocket
72
+ */
73
+ async connect() {
74
+ return new Promise((resolve, reject) => {
75
+ const serverUrl = new url_1.URL(this.config.serverUrl);
76
+ const wsProtocol = serverUrl.protocol === 'https:' ? 'wss:' : 'ws:';
77
+ const wsUrl = `${wsProtocol}//${serverUrl.host}/ws/daemon`;
78
+ console.log(`Connecting to ${wsUrl}...`);
79
+ this.ws = new ws_1.default(wsUrl, {
80
+ headers: {
81
+ Authorization: `Bearer ${this.credentials.refreshToken}`,
82
+ 'X-Device-ID': this.config.deviceId
83
+ }
84
+ });
85
+ this.ws.on('open', () => {
86
+ console.log('WebSocket connected');
87
+ this.reconnectDelay = INITIAL_RECONNECT_DELAY;
88
+ this.startPingInterval();
89
+ this.startSessionRefreshInterval();
90
+ this.sendStatus();
91
+ this.reportSessions();
92
+ resolve();
93
+ });
94
+ this.ws.on('message', (data) => {
95
+ this.handleMessage(data.toString());
96
+ });
97
+ this.ws.on('close', (code, reason) => {
98
+ console.log(`WebSocket closed: ${code} ${reason}`);
99
+ this.stopPingInterval();
100
+ this.stopSessionRefreshInterval();
101
+ this.scheduleReconnect();
102
+ });
103
+ this.ws.on('error', (err) => {
104
+ console.error('WebSocket error:', err.message);
105
+ // Don't reject on error - let close handler deal with reconnection
106
+ if (this.ws?.readyState === ws_1.default.CONNECTING) {
107
+ reject(err);
108
+ }
109
+ // For established connections, the 'close' event usually follows 'error',
110
+ // but if the connection was killed abruptly, we may not get a clean close.
111
+ // Force close the socket to ensure 'close' event fires and triggers reconnect.
112
+ if (this.ws?.readyState === ws_1.default.OPEN) {
113
+ this.ws.terminate();
114
+ }
115
+ });
116
+ });
117
+ }
118
+ /**
119
+ * Disconnect from server
120
+ */
121
+ async disconnect() {
122
+ this.shouldReconnect = false;
123
+ if (this.reconnectTimer) {
124
+ clearTimeout(this.reconnectTimer);
125
+ this.reconnectTimer = null;
126
+ }
127
+ this.stopPingInterval();
128
+ this.stopSessionRefreshInterval();
129
+ // Stop all running tasks
130
+ await this.adapter.stopAll();
131
+ // Stop all session watchers
132
+ this.sessionWatcher.unwatchAll();
133
+ if (this.ws) {
134
+ this.ws.close(1000, 'Daemon shutting down');
135
+ this.ws = null;
136
+ }
137
+ }
138
+ /**
139
+ * Send a message to the server
140
+ */
141
+ send(message) {
142
+ if (this.ws?.readyState === ws_1.default.OPEN) {
143
+ const json = JSON.stringify(message);
144
+ // Log all outgoing messages except pong (too noisy)
145
+ if (message.type !== 'pong') {
146
+ console.log(`[WS OUT] ${message.type}:`, json.length > 200 ? json.substring(0, 200) + '...' : json);
147
+ }
148
+ this.ws.send(json);
149
+ }
150
+ }
151
+ /**
152
+ * Send an event for a task
153
+ */
154
+ sendEvent(taskId, eventType, data) {
155
+ // Auto-watch session file when we learn the session_id
156
+ // This enables unified notification path via session_activity
157
+ const sessionId = data.session_id;
158
+ if (sessionId) {
159
+ const filePath = (0, message_reader_1.findSessionFile)(sessionId);
160
+ if (filePath) {
161
+ console.log(`[WS] Auto-watching session ${sessionId} for unified notifications`);
162
+ this.sessionWatcher.watchSession(sessionId, filePath);
163
+ }
164
+ }
165
+ this.send({
166
+ type: 'event',
167
+ task_id: taskId,
168
+ event_type: eventType,
169
+ ...data
170
+ });
171
+ }
172
+ /**
173
+ * Send current status to server
174
+ */
175
+ sendStatus() {
176
+ this.send({
177
+ type: 'status',
178
+ running_tasks: this.adapter.getRunningTasks()
179
+ });
180
+ }
181
+ /**
182
+ * Handle incoming message from server
183
+ */
184
+ handleMessage(raw) {
185
+ let msg;
186
+ try {
187
+ msg = JSON.parse(raw);
188
+ }
189
+ catch {
190
+ console.error('Failed to parse message:', raw);
191
+ return;
192
+ }
193
+ // Log all incoming messages except ping (too noisy)
194
+ if (msg.type !== 'ping') {
195
+ console.log(`[WS IN] ${msg.type}:`, raw.length > 200 ? raw.substring(0, 200) + '...' : raw);
196
+ }
197
+ switch (msg.type) {
198
+ case 'ping':
199
+ this.send({ type: 'pong' });
200
+ break;
201
+ case 'task_start':
202
+ this.handleTaskStart(msg);
203
+ break;
204
+ case 'task_resume':
205
+ this.handleTaskResume(msg);
206
+ break;
207
+ case 'task_cancel':
208
+ this.handleTaskCancel(msg);
209
+ break;
210
+ case 'get_messages':
211
+ this.handleGetMessages(msg);
212
+ break;
213
+ case 'watch_session':
214
+ this.handleWatchSession(msg);
215
+ break;
216
+ case 'unwatch_session':
217
+ this.handleUnwatchSession(msg);
218
+ break;
219
+ case 'context_request':
220
+ this.handleContextRequest(msg);
221
+ break;
222
+ default:
223
+ console.warn('Unknown message type:', msg.type);
224
+ }
225
+ }
226
+ /**
227
+ * Handle task_start message
228
+ */
229
+ async handleTaskStart(msg) {
230
+ console.log(`Starting task ${msg.task_id}: ${msg.instruction.substring(0, 50)}...`);
231
+ try {
232
+ await this.adapter.startTask(msg.task_id, msg.instruction, msg.project_path);
233
+ }
234
+ catch (err) {
235
+ console.error(`Failed to start task ${msg.task_id}:`, err);
236
+ this.sendEvent(msg.task_id, 'ERROR', {
237
+ error: err.message
238
+ });
239
+ }
240
+ }
241
+ /**
242
+ * Handle task_resume message
243
+ */
244
+ async handleTaskResume(msg) {
245
+ console.log(`Resuming task ${msg.task_id} with session ${msg.session_id}`);
246
+ try {
247
+ await this.adapter.resumeTask(msg.task_id, msg.session_id, msg.message, msg.project_path);
248
+ }
249
+ catch (err) {
250
+ console.error(`Failed to resume task ${msg.task_id}:`, err);
251
+ this.sendEvent(msg.task_id, 'ERROR', {
252
+ error: err.message
253
+ });
254
+ }
255
+ }
256
+ /**
257
+ * Handle task_cancel message
258
+ */
259
+ async handleTaskCancel(msg) {
260
+ console.log(`Cancelling task ${msg.task_id}`);
261
+ await this.adapter.cancelTask(msg.task_id);
262
+ }
263
+ /**
264
+ * Handle get_messages request
265
+ */
266
+ handleGetMessages(msg) {
267
+ console.log(`Getting messages for session ${msg.session_id}, limit=${msg.limit}, before=${msg.before_uuid || 'none'}, after=${msg.after_uuid || 'none'}`);
268
+ try {
269
+ const result = (0, message_reader_1.readMessages)(msg.session_id, msg.limit, msg.before_uuid, msg.after_uuid);
270
+ this.send({
271
+ type: 'messages',
272
+ request_id: msg.request_id,
273
+ session_id: msg.session_id,
274
+ messages: result.messages,
275
+ has_more: result.hasMore,
276
+ oldest_uuid: result.oldestUuid,
277
+ newest_uuid: result.newestUuid,
278
+ });
279
+ console.log(`Sent ${result.messages.length} messages, has_more=${result.hasMore}`);
280
+ }
281
+ catch (err) {
282
+ console.error(`Failed to get messages for session ${msg.session_id}:`, err);
283
+ this.send({
284
+ type: 'messages',
285
+ request_id: msg.request_id,
286
+ session_id: msg.session_id,
287
+ messages: [],
288
+ has_more: false,
289
+ error: err.message,
290
+ });
291
+ }
292
+ }
293
+ /**
294
+ * Handle watch_session request - start monitoring a session file for changes
295
+ */
296
+ handleWatchSession(msg) {
297
+ console.log(`Starting to watch session ${msg.session_id} at ${msg.file_path}`);
298
+ this.sessionWatcher.watchSession(msg.session_id, msg.file_path);
299
+ }
300
+ /**
301
+ * Handle unwatch_session request - stop monitoring a session file
302
+ */
303
+ handleUnwatchSession(msg) {
304
+ console.log(`Stopping watch for session ${msg.session_id}`);
305
+ this.sessionWatcher.unwatchSession(msg.session_id);
306
+ }
307
+ /**
308
+ * Handle context_request - extract session context for dashboard summaries
309
+ */
310
+ handleContextRequest(msg) {
311
+ console.log(`Context request for session ${msg.session_id}`);
312
+ const response = (0, context_handler_1.buildContextResponse)(msg.request_id, msg.session_id, {
313
+ includeInitialPrompt: msg.include.initial_prompt,
314
+ recentMessagesCount: msg.include.recent_messages,
315
+ includeLastToolUse: msg.include.last_tool_use,
316
+ });
317
+ this.send(response);
318
+ if (response.error) {
319
+ console.log(`Context request failed: ${response.error}`);
320
+ }
321
+ else {
322
+ console.log(`Sent context for session ${msg.session_id}: status=${response.context.status}, messages=${response.context.message_count}`);
323
+ }
324
+ }
325
+ /**
326
+ * Schedule reconnection with exponential backoff
327
+ */
328
+ scheduleReconnect() {
329
+ if (!this.shouldReconnect) {
330
+ return;
331
+ }
332
+ console.log(`Reconnecting in ${this.reconnectDelay / 1000}s...`);
333
+ this.reconnectTimer = setTimeout(async () => {
334
+ try {
335
+ await this.connect();
336
+ }
337
+ catch {
338
+ // Increase delay with exponential backoff
339
+ this.reconnectDelay = Math.min(this.reconnectDelay * 2, MAX_RECONNECT_DELAY);
340
+ this.scheduleReconnect();
341
+ }
342
+ }, this.reconnectDelay);
343
+ }
344
+ /**
345
+ * Start ping interval to keep connection alive
346
+ */
347
+ startPingInterval() {
348
+ this.pingTimer = setInterval(() => {
349
+ if (this.ws?.readyState === ws_1.default.OPEN) {
350
+ this.ws.ping();
351
+ }
352
+ }, PING_INTERVAL);
353
+ }
354
+ /**
355
+ * Stop ping interval
356
+ */
357
+ stopPingInterval() {
358
+ if (this.pingTimer) {
359
+ clearInterval(this.pingTimer);
360
+ this.pingTimer = null;
361
+ }
362
+ }
363
+ /**
364
+ * Report discovered external sessions to server
365
+ */
366
+ async reportSessions() {
367
+ try {
368
+ // Discover sessions, excluding any we're currently managing
369
+ const sessions = await (0, session_discovery_1.discoverSessions)(this.managedSessionIds);
370
+ // Convert to SessionInfo format
371
+ const sessionInfos = sessions.map((s) => ({
372
+ session_id: s.session_id,
373
+ slug: s.slug,
374
+ title: s.title,
375
+ project: s.project,
376
+ project_name: s.project_name,
377
+ file_path: s.file_path,
378
+ last_message: s.last_message,
379
+ last_activity: s.last_activity,
380
+ is_active: s.is_active,
381
+ message_count: s.message_count
382
+ }));
383
+ this.send({
384
+ type: 'report_sessions',
385
+ sessions: sessionInfos
386
+ });
387
+ console.log(`Reported ${sessionInfos.length} external sessions`);
388
+ }
389
+ catch (err) {
390
+ console.error('Failed to report sessions:', err);
391
+ }
392
+ }
393
+ /**
394
+ * Start periodic session refresh
395
+ */
396
+ startSessionRefreshInterval() {
397
+ this.sessionRefreshTimer = setInterval(() => {
398
+ this.reportSessions();
399
+ }, SESSION_REFRESH_INTERVAL);
400
+ }
401
+ /**
402
+ * Stop session refresh interval
403
+ */
404
+ stopSessionRefreshInterval() {
405
+ if (this.sessionRefreshTimer) {
406
+ clearInterval(this.sessionRefreshTimer);
407
+ this.sessionRefreshTimer = null;
408
+ }
409
+ }
410
+ /**
411
+ * Add a session ID to the managed set (sessions started via this daemon)
412
+ */
413
+ addManagedSession(sessionId) {
414
+ this.managedSessionIds.add(sessionId);
415
+ }
416
+ /**
417
+ * Remove a session ID from the managed set
418
+ */
419
+ removeManagedSession(sessionId) {
420
+ this.managedSessionIds.delete(sessionId);
421
+ }
422
+ /**
423
+ * Refresh access token using refresh token
424
+ */
425
+ async refreshToken() {
426
+ // TODO: Implement token refresh
427
+ // POST to server with refresh token, get new access token
428
+ // Update credentials file
429
+ console.log('Token refresh not yet implemented');
430
+ return false;
431
+ }
432
+ }
433
+ exports.DaemonClient = DaemonClient;
434
+ //# 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;AA4GD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEtE"}
@@ -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(/\/$/, ''); // Remove trailing slash
119
+ const deviceName = options.name || os.hostname();
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-claude-code/config.json and ~/.cmdctrl-claude-code/credentials');
126
+ return;
127
+ }
128
+ console.log(`Registering 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: 'claude_code',
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-claude-code 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,9 @@
1
+ interface StartOptions {
2
+ foreground?: boolean;
3
+ }
4
+ /**
5
+ * Start command - launch the daemon and connect to server
6
+ */
7
+ export declare function start(options: StartOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDhE"}