@loom-framework/backend 0.1.0-alpha.2 → 0.1.0-alpha.21
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/button-resolver.d.ts +17 -0
- package/dist/ai/button-resolver.d.ts.map +1 -0
- package/dist/ai/button-resolver.js +40 -0
- package/dist/ai/button-resolver.js.map +1 -0
- package/dist/ai/engine.d.ts +14 -0
- package/dist/ai/engine.d.ts.map +1 -1
- package/dist/ai/engine.js +74 -23
- package/dist/ai/engine.js.map +1 -1
- package/dist/ai/index.d.ts +3 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/output-parser.d.ts +17 -7
- package/dist/ai/output-parser.d.ts.map +1 -1
- package/dist/ai/output-parser.js +195 -117
- package/dist/ai/output-parser.js.map +1 -1
- package/dist/ai/session-manager.d.ts +11 -2
- package/dist/ai/session-manager.d.ts.map +1 -1
- package/dist/ai/session-manager.js +88 -12
- package/dist/ai/session-manager.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/routes/chat.d.ts +31 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +236 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/upload.d.ts +24 -0
- package/dist/routes/upload.d.ts.map +1 -0
- package/dist/routes/upload.js +67 -0
- package/dist/routes/upload.js.map +1 -0
- package/package.json +12 -13
- package/dist/websocket/index.d.ts +0 -32
- package/dist/websocket/index.d.ts.map +0 -1
- package/dist/websocket/index.js +0 -337
- package/dist/websocket/index.js.map +0 -1
package/dist/ai/output-parser.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Claude Code Output Parser
|
|
3
3
|
*
|
|
4
|
-
* Parses `claude -p --output-format json` output stream
|
|
5
|
-
*
|
|
4
|
+
* Parses `claude -p --output-format stream-json --verbose --include-partial-messages` output stream.
|
|
5
|
+
* Supports real-time streaming with thinking, tool calls, and text deltas.
|
|
6
|
+
*
|
|
7
|
+
* Key insight: Tool input comes via input_json_delta events, need to accumulate them.
|
|
6
8
|
*/
|
|
7
9
|
/** ANSI escape code pattern */
|
|
8
10
|
const ANSI_ESCAPE = /\x1b\[[0-9;]*m/g;
|
|
@@ -10,145 +12,221 @@ const ANSI_ESCAPE = /\x1b\[[0-9;]*m/g;
|
|
|
10
12
|
* Parse Claude Code stdout stream into typed AIChunk objects
|
|
11
13
|
*
|
|
12
14
|
* Strategy:
|
|
13
|
-
* 1.
|
|
15
|
+
* 1. Process lines as they arrive (true streaming)
|
|
14
16
|
* 2. Strip ANSI escape codes
|
|
15
|
-
* 3.
|
|
16
|
-
* 4.
|
|
17
|
-
* 5.
|
|
17
|
+
* 3. Parse each line as JSON
|
|
18
|
+
* 4. Map to appropriate AIChunk types
|
|
19
|
+
* 5. Accumulate tool input from input_json_delta events
|
|
18
20
|
*/
|
|
19
|
-
export async function* parseClaudeOutput(stdout) {
|
|
21
|
+
export async function* parseClaudeOutput(stdout, logger) {
|
|
20
22
|
let buffer = '';
|
|
23
|
+
const state = {
|
|
24
|
+
toolInputBuffers: new Map(),
|
|
25
|
+
activeToolId: null,
|
|
26
|
+
activeToolName: null,
|
|
27
|
+
};
|
|
21
28
|
for await (const chunk of stdout) {
|
|
22
29
|
buffer += chunk.toString();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
// Process complete lines
|
|
31
|
+
const lines = buffer.split('\n');
|
|
32
|
+
buffer = lines.pop() || '';
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
if (!trimmed)
|
|
36
|
+
continue;
|
|
37
|
+
const chunks = parseLine(trimmed, logger, state);
|
|
38
|
+
for (const c of chunks) {
|
|
39
|
+
yield c;
|
|
40
|
+
}
|
|
33
41
|
}
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
// Strategy 2: Try single JSON object
|
|
37
|
-
const singleChunk = tryParseSingleJson(cleanOutput);
|
|
38
|
-
if (singleChunk) {
|
|
39
|
-
yield singleChunk;
|
|
40
|
-
return;
|
|
41
42
|
}
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Attempt to parse multiple JSON lines into AIChunk objects
|
|
50
|
-
*/
|
|
51
|
-
function tryParseJsonLines(lines) {
|
|
52
|
-
const chunks = [];
|
|
53
|
-
let hasValidJson = false;
|
|
54
|
-
for (const line of lines) {
|
|
55
|
-
try {
|
|
56
|
-
const data = JSON.parse(line);
|
|
57
|
-
hasValidJson = true;
|
|
58
|
-
const chunk = mapJsonToChunk(data);
|
|
59
|
-
if (chunk)
|
|
60
|
-
chunks.push(chunk);
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
// Not valid JSON on this line, skip
|
|
64
|
-
}
|
|
43
|
+
// Process any remaining buffer
|
|
44
|
+
if (buffer.trim()) {
|
|
45
|
+
const cleanOutput = buffer.replace(ANSI_ESCAPE, '').trim();
|
|
46
|
+
const chunks = parseLine(cleanOutput, logger, state);
|
|
47
|
+
for (const c of chunks)
|
|
48
|
+
yield c;
|
|
65
49
|
}
|
|
66
|
-
return hasValidJson ? chunks : [];
|
|
67
50
|
}
|
|
68
|
-
|
|
69
|
-
* Attempt to parse the entire output as a single JSON object
|
|
70
|
-
*/
|
|
71
|
-
function tryParseSingleJson(output) {
|
|
51
|
+
function parseLine(line, logger, state) {
|
|
72
52
|
try {
|
|
73
|
-
const data = JSON.parse(
|
|
74
|
-
|
|
53
|
+
const data = JSON.parse(line);
|
|
54
|
+
logger?.({ type: 'LINE_PARSED', timestamp: new Date().toISOString(), message: `Parsed ${data.type}` });
|
|
55
|
+
return mapToChunks(data, state);
|
|
75
56
|
}
|
|
76
57
|
catch {
|
|
77
|
-
|
|
58
|
+
logger?.({ type: 'PARSE_ERROR', timestamp: new Date().toISOString(), message: 'Failed to parse line', data: line.slice(0, 200) });
|
|
59
|
+
return [];
|
|
78
60
|
}
|
|
79
61
|
}
|
|
80
|
-
|
|
81
|
-
* Map a parsed JSON object to an AIChunk
|
|
82
|
-
*/
|
|
83
|
-
function mapJsonToChunk(data) {
|
|
62
|
+
function mapToChunks(data, state) {
|
|
84
63
|
switch (data.type) {
|
|
85
|
-
case '
|
|
86
|
-
if (data.
|
|
87
|
-
return {
|
|
88
|
-
type: 'error',
|
|
89
|
-
error: data.result || 'Unknown error from Claude Code',
|
|
90
|
-
};
|
|
64
|
+
case 'system':
|
|
65
|
+
if (data.subtype === 'init' && data.session_id) {
|
|
66
|
+
return [{ type: 'session_info', sessionId: data.session_id }];
|
|
91
67
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
68
|
+
return [];
|
|
69
|
+
case 'stream_event':
|
|
70
|
+
return handleStreamEvent(data, state);
|
|
71
|
+
case 'assistant':
|
|
72
|
+
// Process assistant message - it contains complete tool_use with full input
|
|
73
|
+
return handleAssistantMessage(data, state);
|
|
74
|
+
case 'user':
|
|
75
|
+
return handleUserMessage(data);
|
|
76
|
+
case 'result':
|
|
77
|
+
return handleResult(data);
|
|
78
|
+
default:
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function handleStreamEvent(wrapper, state) {
|
|
83
|
+
const { event } = wrapper;
|
|
84
|
+
switch (event.type) {
|
|
85
|
+
case 'content_block_delta':
|
|
86
|
+
// Handle thinking and text deltas
|
|
87
|
+
if (event.delta?.type === 'thinking_delta' && event.delta.thinking) {
|
|
88
|
+
return [{ type: 'thinking', content: event.delta.thinking }];
|
|
101
89
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
case 'assistant': {
|
|
106
|
-
if (data.subtype === 'text' && data.content) {
|
|
107
|
-
return { type: 'content', content: data.content };
|
|
90
|
+
if (event.delta?.type === 'text_delta' && event.delta.text) {
|
|
91
|
+
return [{ type: 'content', content: event.delta.text }];
|
|
108
92
|
}
|
|
109
|
-
|
|
110
|
-
|
|
93
|
+
// Handle tool input JSON delta - accumulate it
|
|
94
|
+
if (event.delta?.type === 'input_json_delta' && event.delta.partial_json) {
|
|
95
|
+
if (state.activeToolId) {
|
|
96
|
+
const current = state.toolInputBuffers.get(state.activeToolId) || '';
|
|
97
|
+
state.toolInputBuffers.set(state.activeToolId, current + event.delta.partial_json);
|
|
98
|
+
}
|
|
99
|
+
return []; // Don't emit until tool call is complete
|
|
100
|
+
}
|
|
101
|
+
return [];
|
|
102
|
+
case 'content_block_start':
|
|
103
|
+
if (event.content_block?.type === 'tool_use') {
|
|
104
|
+
const toolUseId = event.content_block.id || '';
|
|
105
|
+
const toolName = event.content_block.name || 'unknown';
|
|
106
|
+
// Set active tool for accumulation
|
|
107
|
+
state.activeToolId = toolUseId;
|
|
108
|
+
state.activeToolName = toolName;
|
|
109
|
+
// Initialize buffer if there's already input
|
|
110
|
+
if (event.content_block.input !== undefined) {
|
|
111
|
+
state.toolInputBuffers.set(toolUseId, JSON.stringify(event.content_block.input));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
state.toolInputBuffers.set(toolUseId, '');
|
|
115
|
+
}
|
|
116
|
+
// Emit tool_call without input yet (will be updated later)
|
|
117
|
+
return [{
|
|
118
|
+
type: 'tool_call',
|
|
119
|
+
toolUseId,
|
|
120
|
+
toolName,
|
|
121
|
+
toolInput: event.content_block.input,
|
|
122
|
+
}];
|
|
123
|
+
}
|
|
124
|
+
return [];
|
|
125
|
+
case 'content_block_stop':
|
|
126
|
+
// When content block stops, emit the complete tool input if we have one
|
|
127
|
+
if (state.activeToolId && event.index !== undefined) {
|
|
128
|
+
const accumulatedInput = state.toolInputBuffers.get(state.activeToolId);
|
|
129
|
+
if (accumulatedInput && state.activeToolName) {
|
|
130
|
+
try {
|
|
131
|
+
const parsedInput = JSON.parse(accumulatedInput);
|
|
132
|
+
// Emit update with complete input
|
|
133
|
+
const chunks = [{
|
|
134
|
+
type: 'tool_call',
|
|
135
|
+
toolUseId: state.activeToolId,
|
|
136
|
+
toolName: state.activeToolName,
|
|
137
|
+
toolInput: parsedInput,
|
|
138
|
+
}];
|
|
139
|
+
state.activeToolId = null;
|
|
140
|
+
state.activeToolName = null;
|
|
141
|
+
return chunks;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// JSON not complete yet, keep state
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
state.activeToolId = null;
|
|
148
|
+
state.activeToolName = null;
|
|
149
|
+
}
|
|
150
|
+
return [];
|
|
111
151
|
default:
|
|
112
|
-
return
|
|
152
|
+
return [];
|
|
113
153
|
}
|
|
114
154
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
155
|
+
function handleAssistantMessage(data, state) {
|
|
156
|
+
const chunks = [];
|
|
157
|
+
for (const block of data.message.content || []) {
|
|
158
|
+
if (block.type === 'thinking' && block.thinking) {
|
|
159
|
+
// Skip - already sent via thinking_delta
|
|
160
|
+
}
|
|
161
|
+
if (block.type === 'text' && block.text) {
|
|
162
|
+
// Skip - already sent via text_delta
|
|
163
|
+
}
|
|
164
|
+
if (block.type === 'tool_use') {
|
|
165
|
+
// Assistant message contains complete tool_use with full input
|
|
166
|
+
// Use the accumulated input if we have it, otherwise use the block's input
|
|
167
|
+
const toolUseId = block.id || '';
|
|
168
|
+
const accumulatedInput = state.toolInputBuffers.get(toolUseId);
|
|
169
|
+
let toolInput;
|
|
170
|
+
if (accumulatedInput) {
|
|
171
|
+
try {
|
|
172
|
+
toolInput = JSON.parse(accumulatedInput);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
toolInput = block.input;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
toolInput = block.input;
|
|
180
|
+
}
|
|
181
|
+
chunks.push({
|
|
182
|
+
type: 'tool_call',
|
|
183
|
+
toolUseId,
|
|
184
|
+
toolName: block.name || 'unknown',
|
|
185
|
+
toolInput,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return chunks;
|
|
127
190
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
inputTokens: modelUsage.inputTokens,
|
|
139
|
-
outputTokens: modelUsage.outputTokens,
|
|
140
|
-
contextWindow: modelUsage.contextWindow,
|
|
141
|
-
};
|
|
191
|
+
function handleUserMessage(data) {
|
|
192
|
+
const chunks = [];
|
|
193
|
+
for (const block of data.message.content) {
|
|
194
|
+
if (block.type === 'tool_result') {
|
|
195
|
+
chunks.push({
|
|
196
|
+
type: 'tool_result',
|
|
197
|
+
toolUseId: block.tool_use_id,
|
|
198
|
+
toolResult: block.content,
|
|
199
|
+
});
|
|
142
200
|
}
|
|
143
201
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
202
|
+
return chunks;
|
|
203
|
+
}
|
|
204
|
+
function handleResult(data) {
|
|
205
|
+
const chunks = [];
|
|
206
|
+
if (data.session_id) {
|
|
207
|
+
chunks.push({
|
|
208
|
+
type: 'session_info',
|
|
209
|
+
sessionId: data.session_id,
|
|
210
|
+
usage: extractStreamUsage(data.usage),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
if (data.is_error) {
|
|
214
|
+
chunks.push({ type: 'error', error: data.result || 'Unknown error' });
|
|
151
215
|
}
|
|
152
|
-
|
|
216
|
+
chunks.push({ type: 'done' });
|
|
217
|
+
return chunks;
|
|
218
|
+
}
|
|
219
|
+
function extractStreamUsage(usage) {
|
|
220
|
+
if (!usage)
|
|
221
|
+
return undefined;
|
|
222
|
+
const firstKey = Object.keys(usage)[0];
|
|
223
|
+
const modelUsage = firstKey ? usage[firstKey] : undefined;
|
|
224
|
+
if (!modelUsage)
|
|
225
|
+
return undefined;
|
|
226
|
+
return {
|
|
227
|
+
inputTokens: modelUsage.inputTokens,
|
|
228
|
+
outputTokens: modelUsage.outputTokens,
|
|
229
|
+
contextWindow: 0,
|
|
230
|
+
};
|
|
153
231
|
}
|
|
154
232
|
//# sourceMappingURL=output-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-parser.js","sourceRoot":"","sources":["../../src/ai/output-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"output-parser.js","sourceRoot":"","sources":["../../src/ai/output-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,10 +33,12 @@ export declare class SessionManager {
|
|
|
33
33
|
private sessionsDir;
|
|
34
34
|
/** In-memory index of active sessions for stale detection */
|
|
35
35
|
private activeIndex;
|
|
36
|
+
/** In-memory session index for fast listing */
|
|
37
|
+
private sessionIndex;
|
|
36
38
|
private cleanupTimer?;
|
|
37
39
|
constructor(projectRoot: string);
|
|
38
40
|
/**
|
|
39
|
-
* Ensure sessions directory exists
|
|
41
|
+
* Ensure sessions directory exists and load index
|
|
40
42
|
*/
|
|
41
43
|
initialize(): Promise<void>;
|
|
42
44
|
/**
|
|
@@ -60,9 +62,13 @@ export declare class SessionManager {
|
|
|
60
62
|
*/
|
|
61
63
|
addMessages(id: string, messages: SessionMessage[], claudeSessionId?: string, usage?: AIUsage): Promise<SessionRecord>;
|
|
62
64
|
/**
|
|
63
|
-
* List all sessions sorted by most recent first
|
|
65
|
+
* List all sessions sorted by most recent first (from index, O(1))
|
|
64
66
|
*/
|
|
65
67
|
listSessions(): Promise<SessionRecord[]>;
|
|
68
|
+
/**
|
|
69
|
+
* List full session records from files (fallback, used during initialization)
|
|
70
|
+
*/
|
|
71
|
+
private listSessionsFromFiles;
|
|
66
72
|
/**
|
|
67
73
|
* Delete a session
|
|
68
74
|
*/
|
|
@@ -77,5 +83,8 @@ export declare class SessionManager {
|
|
|
77
83
|
private cleanStaleSessions;
|
|
78
84
|
private getSessionPath;
|
|
79
85
|
private writeSessionFile;
|
|
86
|
+
private getIndexFilePath;
|
|
87
|
+
private loadIndex;
|
|
88
|
+
private saveIndex;
|
|
80
89
|
}
|
|
81
90
|
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/ai/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/ai/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAmBnE,6BAA6B;AAC7B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,6DAA6D;IAC7D,OAAO,CAAC,WAAW,CAAyC;IAC5D,+CAA+C;IAC/C,OAAO,CAAC,YAAY,CAAmD;IACvE,OAAO,CAAC,YAAY,CAAC,CAAiC;gBAE1C,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BjC;;OAEG;IACH,YAAY,CAAC,UAAU,GAAE,MAAe,GAAG,IAAI;IAM/C;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACG,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAgCxD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAU5D;;OAEG;IACG,WAAW,CACf,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,eAAe,CAAC,EAAE,MAAM,EACxB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,aAAa,CAAC;IA8CzB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAiB9C;;OAEG;YACW,qBAAqB;IA2BnC;;OAEG;IACG,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBjD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAMrD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,cAAc;YAIR,gBAAgB;IAM9B,OAAO,CAAC,gBAAgB;YAIV,SAAS;YAUT,SAAS;CAYxB"}
|
|
@@ -12,24 +12,39 @@ export class SessionManager {
|
|
|
12
12
|
sessionsDir;
|
|
13
13
|
/** In-memory index of active sessions for stale detection */
|
|
14
14
|
activeIndex = new Map();
|
|
15
|
+
/** In-memory session index for fast listing */
|
|
16
|
+
sessionIndex = { sessions: [], lastUpdated: '' };
|
|
15
17
|
cleanupTimer;
|
|
16
18
|
constructor(projectRoot) {
|
|
17
19
|
this.sessionsDir = path.join(projectRoot, '.loom', 'sessions');
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
|
-
* Ensure sessions directory exists
|
|
22
|
+
* Ensure sessions directory exists and load index
|
|
21
23
|
*/
|
|
22
24
|
async initialize() {
|
|
23
25
|
await fs.mkdir(this.sessionsDir, { recursive: true });
|
|
24
|
-
//
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
// Try to load index from disk
|
|
27
|
+
const indexLoaded = await this.loadIndex();
|
|
28
|
+
if (!indexLoaded) {
|
|
29
|
+
// Fallback: rebuild index from session files
|
|
30
|
+
const sessions = await this.listSessionsFromFiles();
|
|
31
|
+
this.sessionIndex = {
|
|
32
|
+
sessions: sessions.map((s) => ({
|
|
33
|
+
id: s.id,
|
|
34
|
+
title: s.title,
|
|
35
|
+
updatedAt: s.updatedAt,
|
|
36
|
+
createdAt: s.createdAt,
|
|
37
|
+
})),
|
|
38
|
+
lastUpdated: new Date().toISOString(),
|
|
39
|
+
};
|
|
40
|
+
await this.saveIndex();
|
|
41
|
+
}
|
|
42
|
+
// Load into active index for stale detection
|
|
43
|
+
for (const entry of this.sessionIndex.sessions) {
|
|
44
|
+
this.activeIndex.set(entry.id, {
|
|
45
|
+
id: entry.id,
|
|
46
|
+
lastActivity: new Date(entry.updatedAt).getTime(),
|
|
47
|
+
createdAt: new Date(entry.createdAt).getTime(),
|
|
33
48
|
});
|
|
34
49
|
}
|
|
35
50
|
}
|
|
@@ -69,6 +84,15 @@ export class SessionManager {
|
|
|
69
84
|
lastActivity: Date.now(),
|
|
70
85
|
createdAt: Date.now(),
|
|
71
86
|
});
|
|
87
|
+
// Update index
|
|
88
|
+
this.sessionIndex.sessions.push({
|
|
89
|
+
id: sessionId,
|
|
90
|
+
title: session.title,
|
|
91
|
+
updatedAt: session.updatedAt,
|
|
92
|
+
createdAt: session.createdAt,
|
|
93
|
+
});
|
|
94
|
+
this.sessionIndex.lastUpdated = new Date().toISOString();
|
|
95
|
+
await this.saveIndex();
|
|
72
96
|
return session;
|
|
73
97
|
}
|
|
74
98
|
/**
|
|
@@ -115,16 +139,43 @@ export class SessionManager {
|
|
|
115
139
|
lastActivity: Date.now(),
|
|
116
140
|
createdAt: new Date(session.createdAt).getTime(),
|
|
117
141
|
});
|
|
142
|
+
// Sync index entry (title may have changed)
|
|
143
|
+
const idxEntry = this.sessionIndex.sessions.find((e) => e.id === id);
|
|
144
|
+
if (idxEntry) {
|
|
145
|
+
idxEntry.title = session.title;
|
|
146
|
+
idxEntry.updatedAt = session.updatedAt;
|
|
147
|
+
}
|
|
148
|
+
this.sessionIndex.lastUpdated = new Date().toISOString();
|
|
149
|
+
await this.saveIndex();
|
|
118
150
|
return session;
|
|
119
151
|
}
|
|
120
152
|
/**
|
|
121
|
-
* List all sessions sorted by most recent first
|
|
153
|
+
* List all sessions sorted by most recent first (from index, O(1))
|
|
122
154
|
*/
|
|
123
155
|
async listSessions() {
|
|
156
|
+
// Use index for fast path: only return summary data
|
|
157
|
+
// For full records, callers should use readSession(id)
|
|
158
|
+
const entries = [...this.sessionIndex.sessions];
|
|
159
|
+
entries.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
160
|
+
// Map index entries to minimal SessionRecord shape
|
|
161
|
+
return entries.map((e) => ({
|
|
162
|
+
id: e.id,
|
|
163
|
+
title: e.title,
|
|
164
|
+
createdAt: e.createdAt,
|
|
165
|
+
updatedAt: e.updatedAt,
|
|
166
|
+
messages: [],
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* List full session records from files (fallback, used during initialization)
|
|
171
|
+
*/
|
|
172
|
+
async listSessionsFromFiles() {
|
|
124
173
|
try {
|
|
125
174
|
const files = await fs.readdir(this.sessionsDir);
|
|
126
175
|
const sessions = [];
|
|
127
176
|
for (const file of files) {
|
|
177
|
+
if (file === 'index.json')
|
|
178
|
+
continue;
|
|
128
179
|
if (!file.endsWith('.json'))
|
|
129
180
|
continue;
|
|
130
181
|
const filePath = path.join(this.sessionsDir, file);
|
|
@@ -136,7 +187,6 @@ export class SessionManager {
|
|
|
136
187
|
// Skip malformed files
|
|
137
188
|
}
|
|
138
189
|
}
|
|
139
|
-
// Sort by updatedAt descending
|
|
140
190
|
sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
141
191
|
return sessions;
|
|
142
192
|
}
|
|
@@ -152,6 +202,10 @@ export class SessionManager {
|
|
|
152
202
|
try {
|
|
153
203
|
await fs.unlink(filePath);
|
|
154
204
|
this.activeIndex.delete(id);
|
|
205
|
+
// Sync index
|
|
206
|
+
this.sessionIndex.sessions = this.sessionIndex.sessions.filter((e) => e.id !== id);
|
|
207
|
+
this.sessionIndex.lastUpdated = new Date().toISOString();
|
|
208
|
+
await this.saveIndex();
|
|
155
209
|
return true;
|
|
156
210
|
}
|
|
157
211
|
catch {
|
|
@@ -186,6 +240,28 @@ export class SessionManager {
|
|
|
186
240
|
await fs.mkdir(this.sessionsDir, { recursive: true });
|
|
187
241
|
await fs.writeFile(filePath, JSON.stringify(session, null, 2), 'utf-8');
|
|
188
242
|
}
|
|
243
|
+
getIndexFilePath() {
|
|
244
|
+
return path.join(this.sessionsDir, 'index.json');
|
|
245
|
+
}
|
|
246
|
+
async loadIndex() {
|
|
247
|
+
try {
|
|
248
|
+
const content = await fs.readFile(this.getIndexFilePath(), 'utf-8');
|
|
249
|
+
this.sessionIndex = JSON.parse(content);
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async saveIndex() {
|
|
257
|
+
try {
|
|
258
|
+
await fs.mkdir(this.sessionsDir, { recursive: true });
|
|
259
|
+
await fs.writeFile(this.getIndexFilePath(), JSON.stringify(this.sessionIndex, null, 2), 'utf-8');
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Non-critical: index is in-memory, will rebuild on next init
|
|
263
|
+
}
|
|
264
|
+
}
|
|
189
265
|
}
|
|
190
266
|
function generateSessionId() {
|
|
191
267
|
return `session_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/ai/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,0CAA0C;AAC1C,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/ai/session-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @loom-framework/backend - Main Server
|
|
3
3
|
*
|
|
4
4
|
* Assembles Fastify server with:
|
|
5
|
-
* -
|
|
6
|
-
* - REST routes for DataAdapter CRUD + health check
|
|
5
|
+
* - HTTP SSE chat route (Ant Design X compatible)
|
|
6
|
+
* - REST routes for DataAdapter CRUD + health check + sessions
|
|
7
7
|
* - Static file serving for production mode
|
|
8
8
|
* - Configuration from loom.config.ts
|
|
9
9
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAK9B,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAS5F,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,kEAAkE;IAClE,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,iBAAiB;IAKtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2EjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,0CAA0C;IAC1C,UAAU,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC;IAIxC,gCAAgC;IAChC,SAAS,IAAI,UAAU;IAIvB,iCAAiC;IACjC,UAAU,IAAI,WAAW;IAIzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAUtB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAK1E"}
|