@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,303 @@
1
+ "use strict";
2
+ /**
3
+ * Context handler for extracting session context for dashboard summaries
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.extractSessionContext = extractSessionContext;
40
+ exports.buildContextResponse = buildContextResponse;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const message_reader_1 = require("../message-reader");
44
+ /**
45
+ * Extract readable text from message content (handles string or array of content blocks)
46
+ */
47
+ function extractReadableText(content) {
48
+ if (typeof content === 'string') {
49
+ return content.trim();
50
+ }
51
+ if (Array.isArray(content)) {
52
+ const textParts = [];
53
+ for (const block of content) {
54
+ if (typeof block === 'string') {
55
+ textParts.push(block);
56
+ }
57
+ else if (block && typeof block === 'object') {
58
+ if (block.type === 'text' && typeof block.text === 'string') {
59
+ // Strip thinking tags
60
+ const text = block.text.replace(/<thinking>[\s\S]*?<\/thinking>\s*/g, '').trim();
61
+ if (text) {
62
+ textParts.push(text);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ return textParts.join(' ').trim();
68
+ }
69
+ if (content && typeof content === 'object' && 'text' in content) {
70
+ const text = content.text;
71
+ if (typeof text === 'string') {
72
+ return text.trim();
73
+ }
74
+ }
75
+ return '';
76
+ }
77
+ /**
78
+ * Detect if a message contains a question (agent asking user for input)
79
+ */
80
+ function isQuestionToUser(content) {
81
+ // Common question patterns
82
+ const questionPatterns = [
83
+ /\?$/m, // Ends with question mark
84
+ /^(should i|would you|do you|can you|shall i|which|what|how|where|when)/im,
85
+ /please (confirm|specify|provide|let me know|clarify)/i,
86
+ /waiting for (your|user) (input|response|confirmation)/i,
87
+ ];
88
+ for (const pattern of questionPatterns) {
89
+ if (pattern.test(content)) {
90
+ // Extract the first sentence/line that looks like a question
91
+ const lines = content.split('\n').filter(l => l.trim());
92
+ for (const line of lines) {
93
+ if (/\?$/.test(line.trim())) {
94
+ return { isQuestion: true, questionText: line.trim().slice(0, 100) };
95
+ }
96
+ }
97
+ return { isQuestion: true, questionText: content.slice(0, 100) };
98
+ }
99
+ }
100
+ return { isQuestion: false };
101
+ }
102
+ /**
103
+ * Extract context from a session JSONL file
104
+ */
105
+ function extractSessionContext(sessionId, options = {}) {
106
+ const { includeInitialPrompt = true, recentMessagesCount = 10, includeLastToolUse = true, } = options;
107
+ const filePath = (0, message_reader_1.findSessionFile)(sessionId);
108
+ if (!filePath) {
109
+ return null;
110
+ }
111
+ try {
112
+ const stat = fs.statSync(filePath);
113
+ const content = fs.readFileSync(filePath, 'utf-8');
114
+ const lines = content.split('\n').filter(l => l.trim());
115
+ let title = '';
116
+ let projectPath = '';
117
+ let initialPrompt;
118
+ let lastToolUse;
119
+ let startedAt;
120
+ let lastActivityAt = stat.mtime.toISOString();
121
+ let status = 'working';
122
+ let statusDetail;
123
+ const allMessages = [];
124
+ let messageCount = 0;
125
+ let lastEntry = null;
126
+ let lastAssistantContent = '';
127
+ for (const line of lines) {
128
+ try {
129
+ const entry = JSON.parse(line);
130
+ lastEntry = entry;
131
+ // Extract metadata
132
+ if (entry.cwd && !projectPath) {
133
+ projectPath = entry.cwd;
134
+ }
135
+ if (entry.timestamp && !startedAt) {
136
+ startedAt = entry.timestamp;
137
+ }
138
+ if (entry.timestamp) {
139
+ lastActivityAt = entry.timestamp;
140
+ }
141
+ // Count and extract messages
142
+ if (entry.type === 'user' || entry.type === 'assistant') {
143
+ messageCount++;
144
+ const text = extractReadableText(entry.message?.content);
145
+ if (text) {
146
+ const role = entry.type === 'user' ? 'USER' : 'AGENT';
147
+ allMessages.push({ role, content: text, timestamp: entry.timestamp });
148
+ // Track first user message for initial prompt
149
+ if (entry.type === 'user' && !initialPrompt && includeInitialPrompt) {
150
+ initialPrompt = text;
151
+ // Generate title from first user message
152
+ const firstLine = text.split('\n')[0].trim();
153
+ title = firstLine.length > 50 ? firstLine.slice(0, 50) + '...' : firstLine;
154
+ }
155
+ // Track last assistant content for status detection
156
+ if (entry.type === 'assistant') {
157
+ lastAssistantContent = text;
158
+ }
159
+ }
160
+ }
161
+ // Track tool use
162
+ if (entry.type === 'tool_use' && includeLastToolUse && entry.name) {
163
+ // Format: "Read file: src/main.ts" or "Edit: src/main.ts"
164
+ let toolDesc = entry.name;
165
+ if (entry.input && typeof entry.input === 'object') {
166
+ const input = entry.input;
167
+ if (input.file_path) {
168
+ toolDesc = `${entry.name}: ${input.file_path}`;
169
+ }
170
+ else if (input.path) {
171
+ toolDesc = `${entry.name}: ${input.path}`;
172
+ }
173
+ else if (input.command) {
174
+ const cmd = String(input.command).slice(0, 50);
175
+ toolDesc = `${entry.name}: ${cmd}`;
176
+ }
177
+ }
178
+ lastToolUse = toolDesc;
179
+ }
180
+ // Also check for tool_use blocks within assistant messages
181
+ if (entry.type === 'assistant' && Array.isArray(entry.message?.content)) {
182
+ for (const block of entry.message.content) {
183
+ if (block.type === 'tool_use' && block.name && includeLastToolUse) {
184
+ let toolDesc = block.name;
185
+ if (block.input && typeof block.input === 'object') {
186
+ const input = block.input;
187
+ if (input.file_path) {
188
+ toolDesc = `${block.name}: ${input.file_path}`;
189
+ }
190
+ else if (input.path) {
191
+ toolDesc = `${block.name}: ${input.path}`;
192
+ }
193
+ else if (input.command) {
194
+ const cmd = String(input.command).slice(0, 50);
195
+ toolDesc = `${block.name}: ${cmd}`;
196
+ }
197
+ }
198
+ lastToolUse = toolDesc;
199
+ }
200
+ }
201
+ }
202
+ }
203
+ catch {
204
+ // Skip invalid JSON lines
205
+ continue;
206
+ }
207
+ }
208
+ // Determine status based on last entry
209
+ if (lastEntry) {
210
+ // Check if there's an error event
211
+ if (lastEntry.type === 'error') {
212
+ status = 'errored';
213
+ statusDetail = extractReadableText(lastEntry.message?.content) || 'Error occurred';
214
+ }
215
+ // Check if last message is from assistant with a question
216
+ else if (lastEntry.type === 'assistant' && lastAssistantContent) {
217
+ const { isQuestion, questionText } = isQuestionToUser(lastAssistantContent);
218
+ if (isQuestion) {
219
+ status = 'waiting_for_input';
220
+ statusDetail = questionText ? `Asked: ${questionText}` : 'Waiting for user input';
221
+ }
222
+ else {
223
+ // Assistant responded without asking - could be completed or still working
224
+ const stopReason = lastEntry.message?.stop_reason;
225
+ if (stopReason === 'end_turn' || stopReason === null) {
226
+ // Check if it's a completion or still working based on tool use
227
+ const hasToolUse = Array.isArray(lastEntry.message?.content) &&
228
+ lastEntry.message.content.some(b => b.type === 'tool_use');
229
+ if (!hasToolUse && lastAssistantContent.length > 20) {
230
+ status = 'completed';
231
+ statusDetail = lastAssistantContent.slice(0, 100);
232
+ }
233
+ }
234
+ }
235
+ }
236
+ // Check for stale sessions (no activity in 30+ minutes)
237
+ const timeSinceActivity = Date.now() - stat.mtime.getTime();
238
+ if (timeSinceActivity > 30 * 60 * 1000 && status === 'working') {
239
+ status = 'stale';
240
+ }
241
+ }
242
+ // Get recent messages
243
+ const recentMessages = allMessages.slice(-recentMessagesCount).map(m => ({
244
+ role: m.role,
245
+ content: m.content.length > 500 ? m.content.slice(0, 500) + '...' : m.content,
246
+ }));
247
+ return {
248
+ title: title || sessionId.slice(0, 8),
249
+ projectPath: projectPath || path.dirname(filePath),
250
+ initialPrompt: includeInitialPrompt ? initialPrompt : undefined,
251
+ recentMessages,
252
+ lastToolUse: includeLastToolUse ? lastToolUse : undefined,
253
+ messageCount,
254
+ startedAt,
255
+ lastActivityAt,
256
+ status,
257
+ statusDetail,
258
+ };
259
+ }
260
+ catch (err) {
261
+ console.error(`[ContextHandler] Failed to extract context for session ${sessionId}:`, err);
262
+ return null;
263
+ }
264
+ }
265
+ /**
266
+ * Build a context response message
267
+ */
268
+ function buildContextResponse(requestId, sessionId, options = {}) {
269
+ const context = extractSessionContext(sessionId, options);
270
+ if (!context) {
271
+ return {
272
+ type: 'context_response',
273
+ request_id: requestId,
274
+ session_id: sessionId,
275
+ context: {
276
+ title: '',
277
+ project_path: '',
278
+ message_count: 0,
279
+ last_activity_at: new Date().toISOString(),
280
+ status: 'stale',
281
+ },
282
+ error: `Session ${sessionId} not found`,
283
+ };
284
+ }
285
+ return {
286
+ type: 'context_response',
287
+ request_id: requestId,
288
+ session_id: sessionId,
289
+ context: {
290
+ title: context.title,
291
+ project_path: context.projectPath,
292
+ initial_prompt: context.initialPrompt,
293
+ recent_messages: context.recentMessages,
294
+ last_tool_use: context.lastToolUse,
295
+ message_count: context.messageCount,
296
+ started_at: context.startedAt,
297
+ last_activity_at: context.lastActivityAt,
298
+ status: context.status,
299
+ status_detail: context.statusDetail,
300
+ },
301
+ };
302
+ }
303
+ //# sourceMappingURL=context-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-handler.js","sourceRoot":"","sources":["../../src/handlers/context-handler.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuGH,sDAsLC;AAKD,oDA4CC;AA5UD,uCAAyB;AACzB,2CAA6B;AAC7B,sDAAoD;AAgCpD;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5D,sBAAsB;oBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjF,IAAI,IAAI,EAAE,CAAC;wBACT,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,GAAI,OAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,2BAA2B;IAC3B,MAAM,gBAAgB,GAAG;QACvB,MAAM,EAAG,0BAA0B;QACnC,0EAA0E;QAC1E,uDAAuD;QACvD,wDAAwD;KACzD,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,6DAA6D;YAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC5B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBACvE,CAAC;YACH,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,SAAiB,EACjB,UAII,EAAE;IAEN,MAAM,EACJ,oBAAoB,GAAG,IAAI,EAC3B,mBAAmB,GAAG,EAAE,EACxB,kBAAkB,GAAG,IAAI,GAC1B,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,IAAA,gCAAe,EAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAExD,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,aAAiC,CAAC;QACtC,IAAI,WAA+B,CAAC;QACpC,IAAI,SAA6B,CAAC;QAClC,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,MAAM,GAAkB,SAAS,CAAC;QACtC,IAAI,YAAgC,CAAC;QAErC,MAAM,WAAW,GAA2E,EAAE,CAAC;QAC/F,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,SAAS,GAAwB,IAAI,CAAC;QAC1C,IAAI,oBAAoB,GAAG,EAAE,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAiB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7C,SAAS,GAAG,KAAK,CAAC;gBAElB,mBAAmB;gBACnB,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC9B,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC;gBAC1B,CAAC;gBAED,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;oBAClC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC9B,CAAC;gBAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACpB,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;gBACnC,CAAC;gBAED,6BAA6B;gBAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACxD,YAAY,EAAE,CAAC;oBAEf,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACzD,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM,IAAI,GAAqB,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;wBACxE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;wBAEtE,8CAA8C;wBAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,aAAa,IAAI,oBAAoB,EAAE,CAAC;4BACpE,aAAa,GAAG,IAAI,CAAC;4BACrB,yCAAyC;4BACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;4BAC7C,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC7E,CAAC;wBAED,oDAAoD;wBACpD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;4BAC/B,oBAAoB,GAAG,IAAI,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,iBAAiB;gBACjB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,kBAAkB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBAClE,0DAA0D;oBAC1D,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;oBAC1B,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAgC,CAAC;wBACrD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;4BACpB,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;wBACjD,CAAC;6BAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;4BACtB,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;wBAC5C,CAAC;6BAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC/C,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBACrC,CAAC;oBACH,CAAC;oBACD,WAAW,GAAG,QAAQ,CAAC;gBACzB,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;oBACxE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAkE,EAAE,CAAC;wBACrG,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,IAAI,kBAAkB,EAAE,CAAC;4BAClE,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;4BAC1B,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gCACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAgC,CAAC;gCACrD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oCACpB,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;gCACjD,CAAC;qCAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oCACtB,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gCAC5C,CAAC;qCAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oCACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCAC/C,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gCACrC,CAAC;4BACH,CAAC;4BACD,WAAW,GAAG,QAAQ,CAAC;wBACzB,CAAC;oBACH,CAAC;gBACH,CAAC;YAEH,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;gBAC1B,SAAS;YACX,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,SAAS,EAAE,CAAC;YACd,kCAAkC;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC/B,MAAM,GAAG,SAAS,CAAC;gBACnB,YAAY,GAAG,mBAAmB,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,gBAAgB,CAAC;YACrF,CAAC;YACD,0DAA0D;iBACrD,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,IAAI,oBAAoB,EAAE,CAAC;gBAChE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;gBAC5E,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,GAAG,mBAAmB,CAAC;oBAC7B,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,YAAY,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC;gBACpF,CAAC;qBAAM,CAAC;oBACN,2EAA2E;oBAC3E,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;oBAClD,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;wBACrD,gEAAgE;wBAChE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;4BACzD,SAAS,CAAC,OAAO,CAAC,OAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;wBAC1F,IAAI,CAAC,UAAU,IAAI,oBAAoB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;4BACpD,MAAM,GAAG,WAAW,CAAC;4BACrB,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBACpD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC5D,IAAI,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/D,MAAM,GAAG,OAAO,CAAC;YACnB,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvE,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;SAC9E,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,KAAK,EAAE,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClD,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YAC/D,cAAc;YACd,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YACzD,YAAY;YACZ,SAAS;YACT,cAAc;YACd,MAAM;YACN,YAAY;SACb,CAAC;IAEJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0DAA0D,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,SAAiB,EACjB,SAAiB,EACjB,UAII,EAAE;IAEN,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,EAAE;gBAChB,aAAa,EAAE,CAAC;gBAChB,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC1C,MAAM,EAAE,OAAO;aAChB;YACD,KAAK,EAAE,WAAW,SAAS,YAAY;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE;YACP,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,WAAW;YACjC,cAAc,EAAE,OAAO,CAAC,aAAa;YACrC,eAAe,EAAE,OAAO,CAAC,cAAc;YACvC,aAAa,EAAE,OAAO,CAAC,WAAW;YAClC,aAAa,EAAE,OAAO,CAAC,YAAY;YACnC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,gBAAgB,EAAE,OAAO,CAAC,cAAc;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,aAAa,EAAE,OAAO,CAAC,YAAY;SACpC;KACF,CAAC;AACJ,CAAC"}
@@ -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,39 @@
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 unregister_1 = require("./commands/unregister");
7
+ const start_1 = require("./commands/start");
8
+ const status_1 = require("./commands/status");
9
+ const stop_1 = require("./commands/stop");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('cmdctrl-claude-code')
13
+ .description('Claude Code daemon - connects your workstation to the CmdCtrl orchestration server')
14
+ .version('0.1.0');
15
+ program
16
+ .command('register')
17
+ .description('Register this device with a CmdCtrl server')
18
+ .option('-s, --server <url>', 'CmdCtrl server URL', 'http://localhost:4000')
19
+ .option('-n, --name <name>', 'Device name (defaults to hostname)')
20
+ .action(register_1.register);
21
+ program
22
+ .command('unregister')
23
+ .description('Remove local registration data')
24
+ .action(unregister_1.unregister);
25
+ program
26
+ .command('start')
27
+ .description('Start the daemon and connect to the CmdCtrl server')
28
+ .option('-f, --foreground', 'Run in foreground (don\'t daemonize)')
29
+ .action(start_1.start);
30
+ program
31
+ .command('status')
32
+ .description('Check daemon connection status')
33
+ .action(status_1.status);
34
+ program
35
+ .command('stop')
36
+ .description('Stop the running daemon')
37
+ .action(stop_1.stop);
38
+ program.parse();
39
+ //# 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,sDAAmD;AACnD,4CAAyC;AACzC,8CAA2C;AAC3C,0CAAuC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,qBAAqB,CAAC;KAC3B,WAAW,CAAC,oFAAoF,CAAC;KACjG,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,oCAAoC,CAAC;KACjE,MAAM,CAAC,mBAAQ,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,uBAAU,CAAC,CAAC;AAEtB,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,gCAAgC,CAAC;KAC7C,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,25 @@
1
+ /**
2
+ * JSONL message reader with pagination support
3
+ * Reads messages from Claude Code session files
4
+ */
5
+ import { MessageEntry } from './client/messages';
6
+ /**
7
+ * Find the JSONL file for a given session ID
8
+ */
9
+ export declare function findSessionFile(sessionId: string): string | null;
10
+ /**
11
+ * Read messages from a session JSONL file
12
+ *
13
+ * @param sessionId - The session ID to read
14
+ * @param limit - Maximum number of messages to return
15
+ * @param beforeUuid - Optional UUID cursor - returns messages before this one (for loading older)
16
+ * @param afterUuid - Optional UUID cursor - returns messages after this one (for loading newer)
17
+ * @returns Messages array, has_more flag, oldest/newest UUIDs
18
+ */
19
+ export declare function readMessages(sessionId: string, limit: number, beforeUuid?: string, afterUuid?: string): {
20
+ messages: MessageEntry[];
21
+ hasMore: boolean;
22
+ oldestUuid?: string;
23
+ newestUuid?: string;
24
+ };
25
+ //# sourceMappingURL=message-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-reader.d.ts","sourceRoot":"","sources":["../src/message-reader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiFjD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBhE;AAyPD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CA6G1F"}