@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.
- package/dist/adapter/claude-cli.d.ts +41 -0
- package/dist/adapter/claude-cli.d.ts.map +1 -0
- package/dist/adapter/claude-cli.js +525 -0
- package/dist/adapter/claude-cli.js.map +1 -0
- package/dist/adapter/events.d.ts +52 -0
- package/dist/adapter/events.d.ts.map +1 -0
- package/dist/adapter/events.js +134 -0
- package/dist/adapter/events.js.map +1 -0
- package/dist/client/messages.d.ts +140 -0
- package/dist/client/messages.d.ts.map +1 -0
- package/dist/client/messages.js +6 -0
- package/dist/client/messages.js.map +1 -0
- package/dist/client/websocket.d.ts +115 -0
- package/dist/client/websocket.d.ts.map +1 -0
- package/dist/client/websocket.js +434 -0
- package/dist/client/websocket.js.map +1 -0
- package/dist/commands/register.d.ts +10 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +175 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +54 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +38 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +5 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +59 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/unregister.d.ts +5 -0
- package/dist/commands/unregister.d.ts.map +1 -0
- package/dist/commands/unregister.js +28 -0
- package/dist/commands/unregister.js.map +1 -0
- package/dist/config/config.d.ts +68 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +193 -0
- package/dist/config/config.js.map +1 -0
- package/dist/handlers/context-handler.d.ts +37 -0
- package/dist/handlers/context-handler.d.ts.map +1 -0
- package/dist/handlers/context-handler.js +303 -0
- package/dist/handlers/context-handler.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/message-reader.d.ts +25 -0
- package/dist/message-reader.d.ts.map +1 -0
- package/dist/message-reader.js +454 -0
- package/dist/message-reader.js.map +1 -0
- package/dist/session-discovery.d.ts +48 -0
- package/dist/session-discovery.d.ts.map +1 -0
- package/dist/session-discovery.js +496 -0
- package/dist/session-discovery.js.map +1 -0
- package/dist/session-watcher.d.ts +92 -0
- package/dist/session-watcher.d.ts.map +1 -0
- package/dist/session-watcher.js +494 -0
- package/dist/session-watcher.js.map +1 -0
- package/dist/session-watcher.test.d.ts +9 -0
- package/dist/session-watcher.test.d.ts.map +1 -0
- package/dist/session-watcher.test.js +149 -0
- package/dist/session-watcher.test.js.map +1 -0
- package/jest.config.js +8 -0
- package/package.json +42 -0
- package/src/adapter/claude-cli.ts +591 -0
- package/src/adapter/events.ts +186 -0
- package/src/client/messages.ts +193 -0
- package/src/client/websocket.ts +509 -0
- package/src/commands/register.ts +201 -0
- package/src/commands/start.ts +70 -0
- package/src/commands/status.ts +47 -0
- package/src/commands/stop.ts +58 -0
- package/src/commands/unregister.ts +30 -0
- package/src/config/config.ts +163 -0
- package/src/handlers/context-handler.ts +337 -0
- package/src/index.ts +45 -0
- package/src/message-reader.ts +485 -0
- package/src/session-discovery.ts +557 -0
- package/src/session-watcher.test.ts +141 -0
- package/src/session-watcher.ts +560 -0
- 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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|