@sumicom/quicksave 0.5.2 → 0.6.1
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/ai/asyncQueue.d.ts +17 -0
- package/dist/ai/asyncQueue.d.ts.map +1 -0
- package/dist/ai/asyncQueue.js +49 -0
- package/dist/ai/asyncQueue.js.map +1 -0
- package/dist/ai/asyncQueue.test.d.ts +2 -0
- package/dist/ai/asyncQueue.test.d.ts.map +1 -0
- package/dist/ai/asyncQueue.test.js +56 -0
- package/dist/ai/asyncQueue.test.js.map +1 -0
- package/dist/ai/cardBuilder.d.ts +73 -0
- package/dist/ai/cardBuilder.d.ts.map +1 -0
- package/dist/ai/cardBuilder.js +595 -0
- package/dist/ai/cardBuilder.js.map +1 -0
- package/dist/ai/claudeCliProvider.d.ts +19 -0
- package/dist/ai/claudeCliProvider.d.ts.map +1 -0
- package/dist/ai/claudeCliProvider.js +466 -0
- package/dist/ai/claudeCliProvider.js.map +1 -0
- package/dist/ai/claudeSdkProvider.d.ts +18 -0
- package/dist/ai/claudeSdkProvider.d.ts.map +1 -0
- package/dist/ai/claudeSdkProvider.js +418 -0
- package/dist/ai/claudeSdkProvider.js.map +1 -0
- package/dist/ai/commitSummary.d.ts +4 -0
- package/dist/ai/commitSummary.d.ts.map +1 -1
- package/dist/ai/commitSummary.js +80 -40
- package/dist/ai/commitSummary.js.map +1 -1
- package/dist/ai/provider.d.ts +54 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +2 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/sandboxMcp.d.ts +12 -0
- package/dist/ai/sandboxMcp.d.ts.map +1 -0
- package/dist/ai/sandboxMcp.js +12 -0
- package/dist/ai/sandboxMcp.js.map +1 -0
- package/dist/ai/sandboxMcpStdio.d.ts +16 -0
- package/dist/ai/sandboxMcpStdio.d.ts.map +1 -0
- package/dist/ai/sandboxMcpStdio.js +127 -0
- package/dist/ai/sandboxMcpStdio.js.map +1 -0
- package/dist/ai/sessionManager.d.ts +100 -0
- package/dist/ai/sessionManager.d.ts.map +1 -0
- package/dist/ai/sessionManager.js +595 -0
- package/dist/ai/sessionManager.js.map +1 -0
- package/dist/ai/sessionRegistry.d.ts +28 -0
- package/dist/ai/sessionRegistry.d.ts.map +1 -0
- package/dist/ai/sessionRegistry.js +148 -0
- package/dist/ai/sessionRegistry.js.map +1 -0
- package/dist/connection/connection.d.ts +24 -6
- package/dist/connection/connection.d.ts.map +1 -1
- package/dist/connection/connection.js +85 -13
- package/dist/connection/connection.js.map +1 -1
- package/dist/connection/pubsub.d.ts +41 -0
- package/dist/connection/pubsub.d.ts.map +1 -0
- package/dist/connection/pubsub.js +101 -0
- package/dist/connection/pubsub.js.map +1 -0
- package/dist/connection/pubsub.test.d.ts +2 -0
- package/dist/connection/pubsub.test.d.ts.map +1 -0
- package/dist/connection/pubsub.test.js +96 -0
- package/dist/connection/pubsub.test.js.map +1 -0
- package/dist/git/operations.d.ts +6 -1
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +31 -2
- package/dist/git/operations.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +25 -5
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +266 -29
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/handlers/messageHandler.test.js +1 -1
- package/dist/index.js +192 -41
- package/dist/index.js.map +1 -1
- package/dist/service/ensureDaemon.d.ts.map +1 -1
- package/dist/service/ensureDaemon.js +15 -2
- package/dist/service/ensureDaemon.js.map +1 -1
- package/dist/service/ipc.test.js +6 -6
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +120 -11
- package/dist/service/run.js.map +1 -1
- package/dist/service/singleton.d.ts +4 -0
- package/dist/service/singleton.d.ts.map +1 -1
- package/dist/service/singleton.js +28 -2
- package/dist/service/singleton.js.map +1 -1
- package/dist/service/singleton.test.js +1 -1
- package/dist/service/types.d.ts +29 -0
- package/dist/service/types.d.ts.map +1 -1
- package/dist/service/types.js +11 -0
- package/dist/service/types.js.map +1 -1
- package/package.json +5 -3
- package/dist/ai/claudeCodeService.d.ts +0 -111
- package/dist/ai/claudeCodeService.d.ts.map +0 -1
- package/dist/ai/claudeCodeService.js +0 -764
- package/dist/ai/claudeCodeService.js.map +0 -1
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
import { readFile, readdir } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
const TOOL_RESULT_TRUNCATE_LENGTH = 500;
|
|
6
|
+
// ── Direct JSONL file reading (replaces SDK getSessionMessages/listSubagents) ──
|
|
7
|
+
function encodeCwdPath(cwd) {
|
|
8
|
+
return cwd.replace(/\//g, '-');
|
|
9
|
+
}
|
|
10
|
+
function claudeProjectDir(cwd) {
|
|
11
|
+
return join(homedir(), '.claude', 'projects', encodeCwdPath(cwd));
|
|
12
|
+
}
|
|
13
|
+
/** Read the last `tailLines` lines from a file (or all if file is small). */
|
|
14
|
+
async function readTailLines(filePath, tailLines) {
|
|
15
|
+
const { open, stat } = await import('fs/promises');
|
|
16
|
+
const { size } = await stat(filePath);
|
|
17
|
+
if (size === 0)
|
|
18
|
+
return [];
|
|
19
|
+
// For small files, just read the whole thing
|
|
20
|
+
if (size < 256 * 1024) {
|
|
21
|
+
const content = await readFile(filePath, 'utf-8');
|
|
22
|
+
return content.split('\n');
|
|
23
|
+
}
|
|
24
|
+
// Read from the end in chunks until we have enough lines
|
|
25
|
+
const chunkSize = Math.min(size, 512 * 1024); // 512KB chunks
|
|
26
|
+
const fh = await open(filePath, 'r');
|
|
27
|
+
try {
|
|
28
|
+
let collected = '';
|
|
29
|
+
let pos = size;
|
|
30
|
+
while (pos > 0) {
|
|
31
|
+
const readSize = Math.min(chunkSize, pos);
|
|
32
|
+
pos -= readSize;
|
|
33
|
+
const buf = Buffer.alloc(readSize);
|
|
34
|
+
await fh.read(buf, 0, readSize, pos);
|
|
35
|
+
collected = buf.toString('utf-8') + collected;
|
|
36
|
+
// Count newlines — stop when we have enough
|
|
37
|
+
const lineCount = collected.split('\n').length;
|
|
38
|
+
if (lineCount > tailLines + 10)
|
|
39
|
+
break; // +10 margin for filtered lines
|
|
40
|
+
}
|
|
41
|
+
return collected.split('\n');
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await fh.close();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function readMessagesFromJSONL(sessionId, cwd, tail) {
|
|
48
|
+
const p = join(claudeProjectDir(cwd), sessionId + '.jsonl');
|
|
49
|
+
if (!existsSync(p))
|
|
50
|
+
return [];
|
|
51
|
+
const lines = tail != null
|
|
52
|
+
? await readTailLines(p, tail)
|
|
53
|
+
: (await readFile(p, 'utf-8')).split('\n');
|
|
54
|
+
const msgs = [];
|
|
55
|
+
for (const line of lines) {
|
|
56
|
+
if (!line.trim())
|
|
57
|
+
continue;
|
|
58
|
+
try {
|
|
59
|
+
const m = JSON.parse(line);
|
|
60
|
+
if (m.type === 'user' || m.type === 'assistant' || m.type === 'system')
|
|
61
|
+
msgs.push(m);
|
|
62
|
+
}
|
|
63
|
+
catch { /* skip */ }
|
|
64
|
+
}
|
|
65
|
+
return msgs;
|
|
66
|
+
}
|
|
67
|
+
async function listSubagentIdsFromDisk(sessionId, cwd) {
|
|
68
|
+
const d = join(claudeProjectDir(cwd), sessionId, 'subagents');
|
|
69
|
+
if (!existsSync(d))
|
|
70
|
+
return [];
|
|
71
|
+
try {
|
|
72
|
+
return (await readdir(d)).filter(f => f.endsWith('.meta.json')).map(f => f.replace('.meta.json', ''));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Extract readable text from tool_result content (string or array of blocks). */
|
|
79
|
+
function extractToolResultText(content) {
|
|
80
|
+
if (typeof content === 'string')
|
|
81
|
+
return content;
|
|
82
|
+
if (Array.isArray(content)) {
|
|
83
|
+
return content
|
|
84
|
+
.filter((b) => b.type === 'text')
|
|
85
|
+
.map((b) => b.text || '')
|
|
86
|
+
.join('\n');
|
|
87
|
+
}
|
|
88
|
+
return JSON.stringify(content);
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// StreamCardBuilder — streaming session, emits CardEvents
|
|
92
|
+
// ============================================================================
|
|
93
|
+
export class StreamCardBuilder {
|
|
94
|
+
sessionId;
|
|
95
|
+
streamId;
|
|
96
|
+
cwd;
|
|
97
|
+
seq = 0;
|
|
98
|
+
cards = new Map();
|
|
99
|
+
/** tool_use_id → CardId, for pairing tool_result to ToolCallCard */
|
|
100
|
+
toolUseIdToCardId = new Map();
|
|
101
|
+
/** agentId (task_id) → CardId, for matching subagent updates */
|
|
102
|
+
agentIdToCardId = new Map();
|
|
103
|
+
/** Cards created for subagent permissions — removed after resolution. */
|
|
104
|
+
ephemeralCards = new Set();
|
|
105
|
+
/** Current streaming assistant_text card (for append_text events) */
|
|
106
|
+
currentTextCardId = null;
|
|
107
|
+
/** JSONL message count at the start of the current turn — history reads stop here. */
|
|
108
|
+
_jsonlCutoff = null;
|
|
109
|
+
constructor(sessionId, streamId, cwd) {
|
|
110
|
+
this.sessionId = sessionId;
|
|
111
|
+
this.streamId = streamId;
|
|
112
|
+
this.cwd = cwd;
|
|
113
|
+
}
|
|
114
|
+
updateSessionId(sessionId) {
|
|
115
|
+
this.sessionId = sessionId;
|
|
116
|
+
}
|
|
117
|
+
/** Start a new turn: update streamId and reset per-turn state, keep accumulated cards. */
|
|
118
|
+
startNewTurn(streamId) {
|
|
119
|
+
this.streamId = streamId;
|
|
120
|
+
this.currentTextCardId = null;
|
|
121
|
+
}
|
|
122
|
+
/** Clear all accumulated cards. Call after a turn completes and JSONL is flushed. */
|
|
123
|
+
clearCards() {
|
|
124
|
+
this.cards.clear();
|
|
125
|
+
this.toolUseIdToCardId.clear();
|
|
126
|
+
this.agentIdToCardId.clear();
|
|
127
|
+
this.ephemeralCards.clear();
|
|
128
|
+
this.currentTextCardId = null;
|
|
129
|
+
}
|
|
130
|
+
/** Snapshot current JSONL message count so history reads stop before the active turn. */
|
|
131
|
+
async snapshotCutoff() {
|
|
132
|
+
const msgs = (await readMessagesFromJSONL(this.sessionId, this.cwd))
|
|
133
|
+
.filter((m) => !m.isSidechain);
|
|
134
|
+
this._jsonlCutoff = msgs.length;
|
|
135
|
+
}
|
|
136
|
+
get jsonlCutoff() {
|
|
137
|
+
return this._jsonlCutoff;
|
|
138
|
+
}
|
|
139
|
+
set jsonlCutoff(value) {
|
|
140
|
+
this._jsonlCutoff = value;
|
|
141
|
+
}
|
|
142
|
+
nextId() {
|
|
143
|
+
return `${this.sessionId}:${this.streamId}:${++this.seq}`;
|
|
144
|
+
}
|
|
145
|
+
addEvent(card, afterCardId) {
|
|
146
|
+
this.cards.set(card.id, card);
|
|
147
|
+
return { type: 'add', streamId: this.streamId, sessionId: this.sessionId, card, afterCardId };
|
|
148
|
+
}
|
|
149
|
+
updateEvent(cardId, patch) {
|
|
150
|
+
const existing = this.cards.get(cardId);
|
|
151
|
+
if (existing) {
|
|
152
|
+
Object.assign(existing, patch);
|
|
153
|
+
}
|
|
154
|
+
return { type: 'update', streamId: this.streamId, sessionId: this.sessionId, cardId, patch };
|
|
155
|
+
}
|
|
156
|
+
appendTextEvent(cardId, text) {
|
|
157
|
+
const existing = this.cards.get(cardId);
|
|
158
|
+
if (existing && 'text' in existing) {
|
|
159
|
+
existing.text += text;
|
|
160
|
+
}
|
|
161
|
+
return { type: 'append_text', streamId: this.streamId, sessionId: this.sessionId, cardId, text };
|
|
162
|
+
}
|
|
163
|
+
removeEvent(cardId) {
|
|
164
|
+
this.cards.delete(cardId);
|
|
165
|
+
return { type: 'remove', streamId: this.streamId, sessionId: this.sessionId, cardId };
|
|
166
|
+
}
|
|
167
|
+
// ── Public: produce CardEvents from SDK data ────────────────────────────
|
|
168
|
+
userMessage(text) {
|
|
169
|
+
this.currentTextCardId = null;
|
|
170
|
+
const card = { type: 'user', id: this.nextId(), timestamp: Date.now(), text };
|
|
171
|
+
return this.addEvent(card);
|
|
172
|
+
}
|
|
173
|
+
thinkingBlock(text) {
|
|
174
|
+
this.currentTextCardId = null;
|
|
175
|
+
const card = { type: 'thinking', id: this.nextId(), timestamp: Date.now(), text };
|
|
176
|
+
return this.addEvent(card);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Append text to current assistant_text card, or create a new one.
|
|
180
|
+
* Returns append_text event (hot path) or add event (new card).
|
|
181
|
+
*/
|
|
182
|
+
assistantText(text) {
|
|
183
|
+
if (this.currentTextCardId) {
|
|
184
|
+
return this.appendTextEvent(this.currentTextCardId, text);
|
|
185
|
+
}
|
|
186
|
+
const id = this.nextId();
|
|
187
|
+
const card = { type: 'assistant_text', id, timestamp: Date.now(), text, streaming: true };
|
|
188
|
+
this.currentTextCardId = id;
|
|
189
|
+
return this.addEvent(card);
|
|
190
|
+
}
|
|
191
|
+
/** Mark the current assistant_text card as done streaming. */
|
|
192
|
+
finalizeAssistantText() {
|
|
193
|
+
if (!this.currentTextCardId)
|
|
194
|
+
return null;
|
|
195
|
+
const id = this.currentTextCardId;
|
|
196
|
+
this.currentTextCardId = null;
|
|
197
|
+
return this.updateEvent(id, { streaming: false });
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Handle tool_use block from SDK stream.
|
|
201
|
+
* If the card was already pre-created via `toolCallFromPermission()`, confirm it.
|
|
202
|
+
* Otherwise create a new ToolCallCard.
|
|
203
|
+
*/
|
|
204
|
+
toolUse(toolName, toolInput, toolUseId) {
|
|
205
|
+
this.currentTextCardId = null;
|
|
206
|
+
// Check if card was pre-created from canUseTool
|
|
207
|
+
const existingCardId = this.toolUseIdToCardId.get(toolUseId);
|
|
208
|
+
if (existingCardId) {
|
|
209
|
+
// Confirm with real data (input may differ if updatedInput was returned)
|
|
210
|
+
return this.updateEvent(existingCardId, { toolInput });
|
|
211
|
+
}
|
|
212
|
+
const id = this.nextId();
|
|
213
|
+
const card = {
|
|
214
|
+
type: 'tool_call', id, timestamp: Date.now(),
|
|
215
|
+
toolName, toolInput, toolUseId,
|
|
216
|
+
};
|
|
217
|
+
this.toolUseIdToCardId.set(toolUseId, id);
|
|
218
|
+
return this.addEvent(card);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Pre-create a ToolCallCard from canUseTool (fires before tool_use stream event).
|
|
222
|
+
* This eliminates the synthetic message hack.
|
|
223
|
+
*/
|
|
224
|
+
toolCallFromPermission(toolName, toolInput, toolUseId, pendingInput,
|
|
225
|
+
/** Ephemeral cards are removed after permission is resolved (subagent permissions). */
|
|
226
|
+
ephemeral = false) {
|
|
227
|
+
this.currentTextCardId = null;
|
|
228
|
+
// If the card was already created by the assistant message's tool_use block
|
|
229
|
+
// (which arrives in the stream BEFORE canUseTool fires), update it with pendingInput.
|
|
230
|
+
const existingCardId = this.toolUseIdToCardId.get(toolUseId);
|
|
231
|
+
if (existingCardId) {
|
|
232
|
+
if (ephemeral)
|
|
233
|
+
this.ephemeralCards.add(existingCardId);
|
|
234
|
+
return this.updateEvent(existingCardId, { pendingInput });
|
|
235
|
+
}
|
|
236
|
+
const id = this.nextId();
|
|
237
|
+
const card = {
|
|
238
|
+
type: 'tool_call', id, timestamp: Date.now(),
|
|
239
|
+
toolName, toolInput, toolUseId, pendingInput,
|
|
240
|
+
};
|
|
241
|
+
this.toolUseIdToCardId.set(toolUseId, id);
|
|
242
|
+
if (ephemeral)
|
|
243
|
+
this.ephemeralCards.add(id);
|
|
244
|
+
return this.addEvent(card);
|
|
245
|
+
}
|
|
246
|
+
/** Attach a pending input to a subagent card (subagent permission). */
|
|
247
|
+
attachPendingToSubagent(agentId, pendingInput) {
|
|
248
|
+
const cardId = this.agentIdToCardId.get(agentId);
|
|
249
|
+
if (!cardId)
|
|
250
|
+
return null;
|
|
251
|
+
return this.updateEvent(cardId, { pendingInput });
|
|
252
|
+
}
|
|
253
|
+
/** Clear pending input from a card. Ephemeral cards are removed entirely. */
|
|
254
|
+
clearPendingInput(requestId) {
|
|
255
|
+
for (const [, card] of this.cards) {
|
|
256
|
+
if (card.pendingInput?.requestId === requestId) {
|
|
257
|
+
if (this.ephemeralCards.has(card.id)) {
|
|
258
|
+
this.ephemeralCards.delete(card.id);
|
|
259
|
+
return this.removeEvent(card.id);
|
|
260
|
+
}
|
|
261
|
+
return this.updateEvent(card.id, { pendingInput: undefined });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
/** Find the card ID for a given requestId. */
|
|
267
|
+
findCardByRequestId(requestId) {
|
|
268
|
+
for (const [, card] of this.cards) {
|
|
269
|
+
if (card.pendingInput?.requestId === requestId)
|
|
270
|
+
return card.id;
|
|
271
|
+
}
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
/** Check if a tool card already exists for the given tool_use_id. */
|
|
275
|
+
hasToolCard(toolUseId) {
|
|
276
|
+
return this.toolUseIdToCardId.has(toolUseId);
|
|
277
|
+
}
|
|
278
|
+
/** Return all live cards (insertion order). Cards carry pendingInput if set. */
|
|
279
|
+
getCards() {
|
|
280
|
+
return Array.from(this.cards.values());
|
|
281
|
+
}
|
|
282
|
+
toolResult(toolUseId, content, isError) {
|
|
283
|
+
const cardId = this.toolUseIdToCardId.get(toolUseId);
|
|
284
|
+
if (!cardId)
|
|
285
|
+
return null;
|
|
286
|
+
const truncated = content.length > TOOL_RESULT_TRUNCATE_LENGTH;
|
|
287
|
+
const resultContent = truncated
|
|
288
|
+
? content.slice(0, TOOL_RESULT_TRUNCATE_LENGTH) + ' [truncated]'
|
|
289
|
+
: content;
|
|
290
|
+
return this.updateEvent(cardId, {
|
|
291
|
+
result: { content: resultContent, isError, truncated },
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
subagentStart(description, agentId, toolUseId) {
|
|
295
|
+
this.currentTextCardId = null;
|
|
296
|
+
const id = this.nextId();
|
|
297
|
+
const card = {
|
|
298
|
+
type: 'subagent', id, timestamp: Date.now(),
|
|
299
|
+
description,
|
|
300
|
+
toolUseId: toolUseId ?? agentId,
|
|
301
|
+
agentId,
|
|
302
|
+
status: 'running',
|
|
303
|
+
toolUseCount: 0,
|
|
304
|
+
};
|
|
305
|
+
this.agentIdToCardId.set(agentId, id);
|
|
306
|
+
// Position after the parent ToolCallCard if we have the toolUseId
|
|
307
|
+
const afterCardId = toolUseId ? this.toolUseIdToCardId.get(toolUseId) : undefined;
|
|
308
|
+
return this.addEvent(card, afterCardId);
|
|
309
|
+
}
|
|
310
|
+
subagentProgress(agentId, toolUseId, toolUseCount, lastToolName) {
|
|
311
|
+
const cardId = this.agentIdToCardId.get(agentId)
|
|
312
|
+
?? (toolUseId ? this.agentIdToCardId.get(toolUseId) : undefined);
|
|
313
|
+
if (!cardId)
|
|
314
|
+
return null;
|
|
315
|
+
const patch = {};
|
|
316
|
+
if (toolUseCount !== undefined)
|
|
317
|
+
patch.toolUseCount = toolUseCount;
|
|
318
|
+
if (lastToolName !== undefined)
|
|
319
|
+
patch.lastToolName = lastToolName;
|
|
320
|
+
return this.updateEvent(cardId, patch);
|
|
321
|
+
}
|
|
322
|
+
subagentEnd(agentId, toolUseId, status, summary) {
|
|
323
|
+
const cardId = this.agentIdToCardId.get(agentId)
|
|
324
|
+
?? (toolUseId ? this.agentIdToCardId.get(toolUseId) : undefined);
|
|
325
|
+
if (!cardId)
|
|
326
|
+
return null;
|
|
327
|
+
return this.updateEvent(cardId, { status, summary });
|
|
328
|
+
}
|
|
329
|
+
systemMessage(text, subtype) {
|
|
330
|
+
const card = { type: 'system', id: this.nextId(), timestamp: Date.now(), text, subtype };
|
|
331
|
+
return this.addEvent(card);
|
|
332
|
+
}
|
|
333
|
+
errorMessage(text) {
|
|
334
|
+
return this.systemMessage(`Error: ${text}`, 'error');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// ============================================================================
|
|
338
|
+
// buildCardsFromHistory — convert JSONL history into Card[]
|
|
339
|
+
// ============================================================================
|
|
340
|
+
export async function buildCardsFromHistory(sessionId, cwd, offset = 0, limit = 50, maxMessages) {
|
|
341
|
+
// For initial load (offset=0), read only the tail of the JSONL to avoid parsing
|
|
342
|
+
// multi-MB files. We read extra lines for tool_result pairing (Pass 1 index).
|
|
343
|
+
// For pagination (offset>0), read more to reach earlier messages.
|
|
344
|
+
const neededMessages = (maxMessages != null) ? maxMessages : undefined;
|
|
345
|
+
const tailCount = neededMessages ?? (offset + limit) * 3; // 3x for index building margin
|
|
346
|
+
let allMessages = (await readMessagesFromJSONL(sessionId, cwd, tailCount))
|
|
347
|
+
.filter((m) => !m.isSidechain);
|
|
348
|
+
if (maxMessages != null) {
|
|
349
|
+
allMessages = allMessages.slice(0, maxMessages);
|
|
350
|
+
}
|
|
351
|
+
const total = allMessages.length;
|
|
352
|
+
const tailStart = Math.max(0, total - offset - limit);
|
|
353
|
+
const tailEnd = Math.max(0, total - offset);
|
|
354
|
+
const sliced = allMessages.slice(tailStart, tailEnd);
|
|
355
|
+
// ── Pass 1: Build indexes from ALL messages ────────────────────────────
|
|
356
|
+
// toolUseId → toolName (for tool_result lookup across pages)
|
|
357
|
+
const agentToolUseIds = new Set();
|
|
358
|
+
// toolUseId → tool_result data (for pairing)
|
|
359
|
+
const toolResults = new Map();
|
|
360
|
+
for (const msg of allMessages) {
|
|
361
|
+
const rawMsg = msg.message;
|
|
362
|
+
if (!Array.isArray(rawMsg?.content))
|
|
363
|
+
continue;
|
|
364
|
+
for (const block of rawMsg.content) {
|
|
365
|
+
if (block.type === 'tool_use' && block.name === 'Agent' && block.id) {
|
|
366
|
+
agentToolUseIds.add(block.id);
|
|
367
|
+
}
|
|
368
|
+
if (block.type === 'tool_result' && block.tool_use_id) {
|
|
369
|
+
const text = extractToolResultText(block.content);
|
|
370
|
+
toolResults.set(block.tool_use_id, { content: text, isError: !!block.is_error });
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// ── Get real agentIds from SDK listSubagents ───────────────────────────
|
|
375
|
+
// System messages (task_started) are NOT reliably present in the JSONL.
|
|
376
|
+
// Instead, read subagent meta.json files and match by description to the
|
|
377
|
+
// Agent tool_use input.description.
|
|
378
|
+
// Build description → toolUseId map from Agent tool_use blocks
|
|
379
|
+
const descToToolUseId = new Map();
|
|
380
|
+
for (const msg of allMessages) {
|
|
381
|
+
const rawMsg = msg.message;
|
|
382
|
+
if (!Array.isArray(rawMsg?.content))
|
|
383
|
+
continue;
|
|
384
|
+
for (const block of rawMsg.content) {
|
|
385
|
+
if (block.type === 'tool_use' && block.name === 'Agent' && block.id) {
|
|
386
|
+
const desc = block.input?.description ?? '';
|
|
387
|
+
if (desc)
|
|
388
|
+
descToToolUseId.set(desc, block.id);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
const toolUseIdToAgentId = new Map();
|
|
393
|
+
try {
|
|
394
|
+
const agentIds = await listSubagentIdsFromDisk(sessionId, cwd);
|
|
395
|
+
const subagentsDir = join(claudeProjectDir(cwd), sessionId, 'subagents');
|
|
396
|
+
for (const agentId of agentIds) {
|
|
397
|
+
try {
|
|
398
|
+
const meta = JSON.parse(await readFile(join(subagentsDir, `${agentId}.meta.json`), 'utf-8'));
|
|
399
|
+
if (meta?.description && descToToolUseId.has(meta.description)) {
|
|
400
|
+
toolUseIdToAgentId.set(descToToolUseId.get(meta.description), agentId);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
catch { /* skip this agent */ }
|
|
404
|
+
}
|
|
405
|
+
// Fallback for any unmatched Agent tool_use IDs
|
|
406
|
+
for (const toolUseId of agentToolUseIds) {
|
|
407
|
+
if (!toolUseIdToAgentId.has(toolUseId)) {
|
|
408
|
+
toolUseIdToAgentId.set(toolUseId, toolUseId);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
// No subagents or SDK error — fallback: agentId = toolUseId
|
|
414
|
+
for (const toolUseId of agentToolUseIds) {
|
|
415
|
+
toolUseIdToAgentId.set(toolUseId, toolUseId);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// ── Pass 2: Build Cards from sliced messages ───────────────────────────
|
|
419
|
+
let seq = tailStart;
|
|
420
|
+
const nextId = () => `${sessionId}:h:${++seq}`;
|
|
421
|
+
const cards = [];
|
|
422
|
+
for (const msg of sliced) {
|
|
423
|
+
// ── System messages ──
|
|
424
|
+
if (msg.type === 'system') {
|
|
425
|
+
const subtype = msg.subtype;
|
|
426
|
+
// Skip subagent lifecycle events (handled via subagentCards below)
|
|
427
|
+
if (subtype === 'task_started' || subtype === 'task_progress' || subtype === 'task_notification')
|
|
428
|
+
continue;
|
|
429
|
+
// Skip init and status messages (not useful in history)
|
|
430
|
+
if (subtype === 'init' || subtype === 'status' || subtype === 'session_state_changed')
|
|
431
|
+
continue;
|
|
432
|
+
if (subtype === 'compact_boundary') {
|
|
433
|
+
cards.push({ type: 'system', id: nextId(), timestamp: Date.now(), text: 'Context compacted', subtype: 'compacted' });
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
// Unknown system subtype — show as info
|
|
437
|
+
cards.push({ type: 'system', id: nextId(), timestamp: Date.now(), text: subtype ?? 'System event', subtype: 'info' });
|
|
438
|
+
}
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
const rawMessage = msg.message;
|
|
442
|
+
if (!rawMessage?.content) {
|
|
443
|
+
// Empty message — skip
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
// ── User messages ──
|
|
447
|
+
if (msg.type === 'user') {
|
|
448
|
+
if (typeof rawMessage.content === 'string') {
|
|
449
|
+
cards.push({ type: 'user', id: nextId(), timestamp: Date.now(), text: rawMessage.content });
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
if (Array.isArray(rawMessage.content)) {
|
|
453
|
+
for (const block of rawMessage.content) {
|
|
454
|
+
if (block.type === 'text') {
|
|
455
|
+
cards.push({ type: 'user', id: nextId(), timestamp: Date.now(), text: block.text });
|
|
456
|
+
}
|
|
457
|
+
// tool_result blocks are paired into ToolCallCard.result (handled below)
|
|
458
|
+
// Skip them here — they don't need separate cards
|
|
459
|
+
}
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
// ── Assistant messages ──
|
|
465
|
+
if (msg.type === 'assistant') {
|
|
466
|
+
const blocks = rawMessage.content;
|
|
467
|
+
if (!Array.isArray(blocks))
|
|
468
|
+
continue;
|
|
469
|
+
for (const block of blocks) {
|
|
470
|
+
switch (block.type) {
|
|
471
|
+
case 'text':
|
|
472
|
+
if (block.text) {
|
|
473
|
+
cards.push({ type: 'assistant_text', id: nextId(), timestamp: Date.now(), text: block.text });
|
|
474
|
+
}
|
|
475
|
+
break;
|
|
476
|
+
case 'thinking':
|
|
477
|
+
if (block.thinking) {
|
|
478
|
+
cards.push({ type: 'thinking', id: nextId(), timestamp: Date.now(), text: block.thinking });
|
|
479
|
+
}
|
|
480
|
+
break;
|
|
481
|
+
case 'redacted_thinking':
|
|
482
|
+
cards.push({ type: 'thinking', id: nextId(), timestamp: Date.now(), text: '[Redacted thinking]' });
|
|
483
|
+
break;
|
|
484
|
+
case 'tool_use': {
|
|
485
|
+
if (agentToolUseIds.has(block.id)) {
|
|
486
|
+
// Agent tool_use → create a ToolCallCard as anchor, then SubagentCard
|
|
487
|
+
const agentId = toolUseIdToAgentId.get(block.id) ?? block.id;
|
|
488
|
+
const result = toolResults.get(block.id);
|
|
489
|
+
const description = block.input?.description ?? '';
|
|
490
|
+
const summary = result ? result.content.slice(0, 200) : undefined;
|
|
491
|
+
// Insert SubagentCard
|
|
492
|
+
const subagentCard = {
|
|
493
|
+
type: 'subagent',
|
|
494
|
+
id: nextId(),
|
|
495
|
+
timestamp: Date.now(),
|
|
496
|
+
description,
|
|
497
|
+
toolUseId: block.id,
|
|
498
|
+
agentId,
|
|
499
|
+
status: result ? 'completed' : 'running',
|
|
500
|
+
summary,
|
|
501
|
+
toolUseCount: 0,
|
|
502
|
+
};
|
|
503
|
+
cards.push(subagentCard);
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
// Normal tool call
|
|
507
|
+
const toolInput = typeof block.input === 'object' && block.input !== null
|
|
508
|
+
? block.input
|
|
509
|
+
: {};
|
|
510
|
+
const result = toolResults.get(block.id);
|
|
511
|
+
let pairedResult;
|
|
512
|
+
if (result) {
|
|
513
|
+
const truncated = result.content.length > TOOL_RESULT_TRUNCATE_LENGTH;
|
|
514
|
+
pairedResult = {
|
|
515
|
+
content: truncated
|
|
516
|
+
? result.content.slice(0, TOOL_RESULT_TRUNCATE_LENGTH) + ' [truncated]'
|
|
517
|
+
: result.content,
|
|
518
|
+
isError: result.isError,
|
|
519
|
+
truncated,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
cards.push({
|
|
523
|
+
type: 'tool_call',
|
|
524
|
+
id: nextId(),
|
|
525
|
+
timestamp: Date.now(),
|
|
526
|
+
toolName: block.name,
|
|
527
|
+
toolInput,
|
|
528
|
+
toolUseId: block.id,
|
|
529
|
+
result: pairedResult,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
// Server tool blocks — show as generic tool calls
|
|
535
|
+
case 'server_tool_use':
|
|
536
|
+
case 'mcp_tool_use': {
|
|
537
|
+
const toolInput = typeof block.input === 'object' && block.input !== null
|
|
538
|
+
? block.input
|
|
539
|
+
: {};
|
|
540
|
+
cards.push({
|
|
541
|
+
type: 'tool_call',
|
|
542
|
+
id: nextId(),
|
|
543
|
+
timestamp: Date.now(),
|
|
544
|
+
toolName: block.name ?? block.type,
|
|
545
|
+
toolInput,
|
|
546
|
+
toolUseId: block.id ?? nextId(),
|
|
547
|
+
});
|
|
548
|
+
break;
|
|
549
|
+
}
|
|
550
|
+
// Server/MCP tool results — show as system info
|
|
551
|
+
case 'web_search_tool_result':
|
|
552
|
+
case 'web_fetch_tool_result':
|
|
553
|
+
case 'mcp_tool_result':
|
|
554
|
+
case 'code_execution_tool_result':
|
|
555
|
+
case 'bash_code_execution_tool_result':
|
|
556
|
+
case 'text_editor_code_execution_tool_result':
|
|
557
|
+
case 'tool_search_tool_result': {
|
|
558
|
+
const resultText = extractToolResultText(block.content ?? block.text ?? '');
|
|
559
|
+
const parentToolUseId = block.tool_use_id;
|
|
560
|
+
// Try to pair with a previously emitted tool_call card
|
|
561
|
+
if (parentToolUseId) {
|
|
562
|
+
const parentCard = cards.find((c) => c.type === 'tool_call' && c.toolUseId === parentToolUseId);
|
|
563
|
+
if (parentCard && !parentCard.result) {
|
|
564
|
+
const truncated = resultText.length > TOOL_RESULT_TRUNCATE_LENGTH;
|
|
565
|
+
parentCard.result = {
|
|
566
|
+
content: truncated ? resultText.slice(0, TOOL_RESULT_TRUNCATE_LENGTH) + ' [truncated]' : resultText,
|
|
567
|
+
isError: !!block.is_error,
|
|
568
|
+
truncated,
|
|
569
|
+
};
|
|
570
|
+
break;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
// Fallback: show as system info
|
|
574
|
+
if (resultText) {
|
|
575
|
+
cards.push({ type: 'system', id: nextId(), timestamp: Date.now(), text: `${block.type}: ${resultText.slice(0, 200)}`, subtype: 'info' });
|
|
576
|
+
}
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
case 'container_upload':
|
|
580
|
+
cards.push({ type: 'system', id: nextId(), timestamp: Date.now(), text: 'Container upload', subtype: 'info' });
|
|
581
|
+
break;
|
|
582
|
+
// Unknown block types — skip silently
|
|
583
|
+
default:
|
|
584
|
+
break;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
return {
|
|
590
|
+
cards,
|
|
591
|
+
total,
|
|
592
|
+
hasMore: tailStart > 0,
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=cardBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cardBuilder.js","sourceRoot":"","sources":["../../src/ai/cardBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { StreamCardBuilder } from './cardBuilder.js';
|
|
2
|
+
import type { CodingAgentProvider, ProviderSession, ProviderCallbacks, StartSessionOpts, ResumeSessionOpts } from './provider.js';
|
|
3
|
+
export declare class ClaudeCliProvider implements CodingAgentProvider {
|
|
4
|
+
startSession(opts: StartSessionOpts, cardBuilder: StreamCardBuilder, callbacks: ProviderCallbacks): Promise<{
|
|
5
|
+
sessionId: string;
|
|
6
|
+
session: ProviderSession;
|
|
7
|
+
}>;
|
|
8
|
+
resumeSession(opts: ResumeSessionOpts, cardBuilder: StreamCardBuilder, callbacks: ProviderCallbacks): Promise<{
|
|
9
|
+
sessionId: string;
|
|
10
|
+
session: ProviderSession;
|
|
11
|
+
}>;
|
|
12
|
+
private buildCliArgs;
|
|
13
|
+
private spawnAndConsume;
|
|
14
|
+
private consumeStream;
|
|
15
|
+
private routeMessage;
|
|
16
|
+
private handleControlRequest;
|
|
17
|
+
private sendControlResponse;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=claudeCliProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeCliProvider.d.ts","sourceRoot":"","sources":["../../src/ai/claudeCliProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,eAAe,CAAC;AAqEvB,qBAAa,iBAAkB,YAAW,mBAAmB;IAErD,YAAY,CAChB,IAAI,EAAE,gBAAgB,EACtB,WAAW,EAAE,iBAAiB,EAC9B,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC;IAYrD,aAAa,CACjB,IAAI,EAAE,iBAAiB,EACvB,WAAW,EAAE,iBAAiB,EAC9B,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC;IAc3D,OAAO,CAAC,YAAY;YA0DN,eAAe;YAmFf,aAAa;YA6Eb,YAAY;YAqKZ,oBAAoB;IA8BlC,OAAO,CAAC,mBAAmB;CAwB5B"}
|