@loom-framework/backend 0.1.0-alpha.3 → 0.1.0-alpha.30

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 (39) hide show
  1. package/dist/ai/button-resolver.d.ts +17 -0
  2. package/dist/ai/button-resolver.d.ts.map +1 -0
  3. package/dist/ai/button-resolver.js +40 -0
  4. package/dist/ai/button-resolver.js.map +1 -0
  5. package/dist/ai/engine.d.ts.map +1 -1
  6. package/dist/ai/engine.js +3 -1
  7. package/dist/ai/engine.js.map +1 -1
  8. package/dist/ai/index.d.ts +1 -0
  9. package/dist/ai/index.d.ts.map +1 -1
  10. package/dist/ai/index.js +1 -0
  11. package/dist/ai/index.js.map +1 -1
  12. package/dist/ai/output-parser.d.ts +8 -7
  13. package/dist/ai/output-parser.d.ts.map +1 -1
  14. package/dist/ai/output-parser.js +194 -133
  15. package/dist/ai/output-parser.js.map +1 -1
  16. package/dist/ai/session-manager.d.ts +19 -0
  17. package/dist/ai/session-manager.d.ts.map +1 -1
  18. package/dist/ai/session-manager.js +44 -0
  19. package/dist/ai/session-manager.js.map +1 -1
  20. package/dist/bin.js +0 -0
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -7
  24. package/dist/index.js.map +1 -1
  25. package/dist/routes/chat.d.ts +31 -0
  26. package/dist/routes/chat.d.ts.map +1 -0
  27. package/dist/routes/chat.js +279 -0
  28. package/dist/routes/chat.js.map +1 -0
  29. package/dist/routes/index.d.ts +2 -0
  30. package/dist/routes/index.d.ts.map +1 -1
  31. package/dist/routes/index.js +1 -0
  32. package/dist/routes/index.js.map +1 -1
  33. package/dist/routes/upload.d.ts +1 -1
  34. package/dist/routes/upload.js +1 -1
  35. package/package.json +12 -13
  36. package/dist/websocket/index.d.ts +0 -33
  37. package/dist/websocket/index.d.ts.map +0 -1
  38. package/dist/websocket/index.js +0 -373
  39. package/dist/websocket/index.js.map +0 -1
@@ -1,33 +0,0 @@
1
- /**
2
- * WebSocket Handler - Transparent proxy between client and AIEngine
3
- *
4
- * Event protocol:
5
- * - user_message → AIEngine.call() → stream assistant_chunk / assistant_complete
6
- * - Session CRUD: new_session / load_session / list_sessions / delete_session
7
- */
8
- import type { FastifyInstance } from 'fastify';
9
- import type { AIEngine, LoomConfig } from '@loom-framework/core';
10
- import { SessionManager } from '../ai/session-manager.js';
11
- import { AIInteractionLogger } from '../observe/index.js';
12
- export interface WebSocketHandlerOptions {
13
- engine: AIEngine;
14
- sessionManager: SessionManager;
15
- config: LoomConfig;
16
- logger?: AIInteractionLogger;
17
- projectRoot: string;
18
- }
19
- /**
20
- * Register WebSocket route and event handlers on a Fastify instance
21
- */
22
- export declare function registerWebSocket(fastify: FastifyInstance, options: WebSocketHandlerOptions): void;
23
- /**
24
- * Resolve prompt from AI button configuration.
25
- * - Static buttons: return prompt directly
26
- * - Template buttons: substitute {{var}} with context values
27
- * Returns null if button not found or context is incomplete.
28
- */
29
- export declare function resolveButtonPrompt(buttonId: string, context: Record<string, string> | undefined, config: LoomConfig): {
30
- prompt: string;
31
- error?: string;
32
- } | null;
33
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/websocket/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EAMX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAuB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAyB,MAAM,qBAAqB,CAAC;AAGjF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,QAAQ,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,uBAAuB,GAC/B,IAAI,CA0CN;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,MAAM,EAAE,UAAU,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiC3C"}
@@ -1,373 +0,0 @@
1
- /**
2
- * WebSocket Handler - Transparent proxy between client and AIEngine
3
- *
4
- * Event protocol:
5
- * - user_message → AIEngine.call() → stream assistant_chunk / assistant_complete
6
- * - Session CRUD: new_session / load_session / list_sessions / delete_session
7
- */
8
- import { saveUploadedFile } from '../routes/upload.js';
9
- /**
10
- * Register WebSocket route and event handlers on a Fastify instance
11
- */
12
- export function registerWebSocket(fastify, options) {
13
- const { engine, sessionManager, config, logger, projectRoot } = options;
14
- fastify.register(async function (instance) {
15
- instance.get('/ws', { websocket: true }, (socket, _req) => {
16
- instance.log.info('WebSocket client connected');
17
- // Send welcome message on connection
18
- try {
19
- socket.send(JSON.stringify({
20
- type: 'welcome',
21
- content: '欢迎使用 Loom AI 助手!您可以向我提问或使用 AI 按钮触发功能。',
22
- message_id: `welcome_${Date.now()}`,
23
- session_id: '',
24
- }));
25
- }
26
- catch (err) {
27
- instance.log.error('Error sending welcome message: %s', err);
28
- }
29
- socket.on('message', async (raw) => {
30
- try {
31
- const event = JSON.parse(raw.toString());
32
- // Handle heartbeat ping
33
- if (event.type === 'ping') {
34
- socket.send(JSON.stringify({ type: 'pong', timestamp: Date.now() }));
35
- return;
36
- }
37
- await handleEvent(event, socket, instance, engine, sessionManager, config, logger, projectRoot);
38
- }
39
- catch (err) {
40
- instance.log.error('Error handling WebSocket message: %s', err);
41
- }
42
- });
43
- socket.on('close', () => {
44
- instance.log.info('WebSocket client disconnected');
45
- });
46
- socket.on('error', (err) => {
47
- instance.log.error('WebSocket error: %s', err);
48
- });
49
- });
50
- });
51
- }
52
- /**
53
- * Resolve prompt from AI button configuration.
54
- * - Static buttons: return prompt directly
55
- * - Template buttons: substitute {{var}} with context values
56
- * Returns null if button not found or context is incomplete.
57
- */
58
- export function resolveButtonPrompt(buttonId, context, config) {
59
- const button = config.aiButtons?.find((b) => b.id === buttonId);
60
- if (!button) {
61
- return null;
62
- }
63
- // Static prompt
64
- if (button.prompt) {
65
- return { prompt: button.prompt };
66
- }
67
- // Template prompt
68
- if (button.promptTemplate) {
69
- const missing = (button.contextVars || []).filter((v) => !context || context[v] === undefined);
70
- if (missing.length > 0) {
71
- return {
72
- prompt: '',
73
- error: `Missing context variables: ${missing.join(', ')}. Required: ${button.contextVars.join(', ')}`,
74
- };
75
- }
76
- let resolved = button.promptTemplate;
77
- if (context) {
78
- for (const [key, value] of Object.entries(context)) {
79
- resolved = resolved.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
80
- }
81
- }
82
- return { prompt: resolved };
83
- }
84
- return null;
85
- }
86
- /**
87
- * Route incoming WebSocket events to their handlers
88
- */
89
- async function handleEvent(event, socket, fastify, engine, sessionManager, config, logger, projectRoot) {
90
- switch (event.type) {
91
- case 'user_message':
92
- await handleUserMessage(event, socket, fastify, engine, sessionManager, config, logger, projectRoot);
93
- break;
94
- case 'new_session':
95
- await handleNewSession(socket, fastify, sessionManager);
96
- break;
97
- case 'load_session':
98
- await handleLoadSession(event, socket, fastify, sessionManager);
99
- break;
100
- case 'list_sessions':
101
- await handleListSessions(socket, fastify, sessionManager);
102
- break;
103
- case 'delete_session':
104
- await handleDeleteSession(event, socket, fastify, sessionManager);
105
- break;
106
- default:
107
- fastify.log.warn('Unknown WebSocket event type: %s', event.type);
108
- }
109
- }
110
- /**
111
- * Handle user_message: stream AI response back to client
112
- */
113
- async function handleUserMessage(event, socket, fastify, engine, sessionManager, config, logger, projectRoot) {
114
- const messageId = generateMessageId();
115
- const startTime = Date.now();
116
- fastify.log.info('User message on session %s', event.session_id);
117
- // Handle file uploads from event.files
118
- const uploadedFiles = [];
119
- if (event.files && event.files.length > 0 && projectRoot) {
120
- for (const file of event.files) {
121
- if (file.content) {
122
- try {
123
- const result = await saveUploadedFile(projectRoot, event.session_id, file.name, file.content);
124
- uploadedFiles.push({ name: file.name, path: result.path });
125
- }
126
- catch (err) {
127
- fastify.log.warn('Failed to save uploaded file %s: %s', file.name, err);
128
- }
129
- }
130
- }
131
- }
132
- // Resolve prompt: AI button or direct content
133
- let prompt;
134
- if (event.buttonId) {
135
- const resolved = resolveButtonPrompt(event.buttonId, event.context, config);
136
- if (!resolved) {
137
- socket.send(JSON.stringify({
138
- type: 'error',
139
- error: `AI button "${event.buttonId}" not found in configuration`,
140
- session_id: event.session_id,
141
- }));
142
- return;
143
- }
144
- if (resolved.error) {
145
- socket.send(JSON.stringify({
146
- type: 'error',
147
- error: resolved.error,
148
- session_id: event.session_id,
149
- }));
150
- return;
151
- }
152
- prompt = resolved.prompt;
153
- fastify.log.info('AI button "%s" resolved to prompt: %s', event.buttonId, prompt.slice(0, 80));
154
- }
155
- else {
156
- prompt = event.content;
157
- }
158
- // Get or create session
159
- const session = await sessionManager.getOrCreate(event.session_id);
160
- // Add user message to session
161
- const userMsg = {
162
- id: messageId,
163
- role: 'user',
164
- content: prompt,
165
- timestamp: new Date().toISOString(),
166
- };
167
- await sessionManager.addMessages(event.session_id, [userMsg]);
168
- // Send initial "processing" chunk
169
- sendChunk(socket, '正在处理...', messageId, event.session_id, false);
170
- // Call AI engine
171
- let aiContent = '';
172
- let claudeSessionId;
173
- let usage;
174
- try {
175
- for await (const chunk of engine.call(prompt, {
176
- sessionId: event.session_id,
177
- resumeSessionId: session.claudeSessionId,
178
- files: uploadedFiles.length > 0 ? uploadedFiles : undefined,
179
- })) {
180
- if (chunk.type === 'content' && chunk.content) {
181
- aiContent += chunk.content;
182
- sendChunk(socket, chunk.content, messageId, event.session_id, false);
183
- }
184
- else if (chunk.type === 'session_info') {
185
- claudeSessionId = chunk.sessionId;
186
- if (chunk.usage)
187
- usage = chunk.usage;
188
- }
189
- else if (chunk.type === 'error' && chunk.error) {
190
- fastify.log.error('AI engine error: %s', chunk.error);
191
- sendChunk(socket, `\n\nError: ${chunk.error}`, messageId, event.session_id, false);
192
- }
193
- else if (chunk.type === 'tool_call') {
194
- // Forward tool call events to frontend
195
- const toolCallEvent = {
196
- type: 'tool_call',
197
- tool: chunk.toolName || 'unknown',
198
- status: 'started',
199
- };
200
- socket.send(JSON.stringify(toolCallEvent));
201
- }
202
- else if (chunk.type === 'tool_result') {
203
- // Forward tool result events to frontend
204
- const toolResultEvent = {
205
- type: 'tool_call',
206
- tool: chunk.toolName || 'unknown',
207
- status: 'completed',
208
- result: chunk.toolResult,
209
- };
210
- socket.send(JSON.stringify(toolResultEvent));
211
- }
212
- }
213
- }
214
- catch (error) {
215
- fastify.log.error('AI engine exception: %s', error);
216
- recordLog(logger, event.session_id, messageId, prompt, '', startTime, [], [], error instanceof Error ? error.message : String(error), fastify);
217
- sendComplete(socket, `\n\nProcessing error: ${error}`, messageId, event.session_id, usage);
218
- return;
219
- }
220
- // Send completion event
221
- const completePayload = {
222
- type: 'assistant_complete',
223
- content: aiContent || '(empty response)',
224
- message_id: messageId,
225
- session_id: event.session_id,
226
- is_complete: true,
227
- };
228
- if (claudeSessionId) {
229
- completePayload.claude_session_id = claudeSessionId;
230
- }
231
- if (usage) {
232
- completePayload.usage = usage;
233
- }
234
- socket.send(JSON.stringify(completePayload));
235
- // Persist assistant message to session
236
- const assistantMsg = {
237
- id: messageId,
238
- role: 'assistant',
239
- content: aiContent || '(empty response)',
240
- timestamp: new Date().toISOString(),
241
- };
242
- await sessionManager.addMessages(event.session_id, [assistantMsg], claudeSessionId, usage);
243
- // Record interaction log
244
- recordLog(logger, event.session_id, messageId, prompt, aiContent || '(empty response)', startTime, [], [], undefined, fastify, usage);
245
- }
246
- /**
247
- * Handle new_session event
248
- */
249
- async function handleNewSession(socket, fastify, sessionManager) {
250
- const session = await sessionManager.createSession();
251
- fastify.log.info('Created new session: %s', session.id);
252
- socket.send(JSON.stringify({
253
- type: 'session_created',
254
- session_id: session.id,
255
- session: {
256
- id: session.id,
257
- title: session.title,
258
- createdAt: session.createdAt,
259
- updatedAt: session.updatedAt,
260
- messages: [],
261
- },
262
- }));
263
- }
264
- /**
265
- * Handle load_session event
266
- */
267
- async function handleLoadSession(event, socket, fastify, sessionManager) {
268
- const session = await sessionManager.readSession(event.session_id);
269
- if (session) {
270
- fastify.log.info('Loaded session: %s', event.session_id);
271
- socket.send(JSON.stringify({
272
- type: 'session_loaded',
273
- session_id: event.session_id,
274
- session: {
275
- id: session.id,
276
- title: session.title,
277
- createdAt: session.createdAt,
278
- updatedAt: session.updatedAt,
279
- messages: session.messages,
280
- usage: session.usage,
281
- },
282
- }));
283
- }
284
- else {
285
- fastify.log.warn('Session not found: %s', event.session_id);
286
- socket.send(JSON.stringify({
287
- type: 'error',
288
- error: 'Session not found',
289
- session_id: event.session_id,
290
- }));
291
- }
292
- }
293
- /**
294
- * Handle list_sessions event
295
- */
296
- async function handleListSessions(socket, _fastify, sessionManager) {
297
- const sessions = await sessionManager.listSessions();
298
- socket.send(JSON.stringify({
299
- type: 'sessions_list',
300
- sessions: sessions.map((s) => ({
301
- id: s.id,
302
- title: s.title,
303
- createdAt: s.createdAt,
304
- updatedAt: s.updatedAt,
305
- messageCount: s.messages.length,
306
- })),
307
- }));
308
- }
309
- /**
310
- * Handle delete_session event
311
- */
312
- async function handleDeleteSession(event, socket, fastify, sessionManager) {
313
- const success = await sessionManager.deleteSession(event.session_id);
314
- if (success) {
315
- fastify.log.info('Deleted session: %s', event.session_id);
316
- socket.send(JSON.stringify({
317
- type: 'session_deleted',
318
- session_id: event.session_id,
319
- }));
320
- }
321
- else {
322
- socket.send(JSON.stringify({
323
- type: 'error',
324
- error: 'Failed to delete session',
325
- session_id: event.session_id,
326
- }));
327
- }
328
- }
329
- // ── Helpers ──
330
- function sendChunk(socket, content, messageId, sessionId, isComplete) {
331
- const event = {
332
- type: 'assistant_chunk',
333
- content,
334
- message_id: messageId,
335
- session_id: sessionId,
336
- is_complete: isComplete,
337
- };
338
- socket.send(JSON.stringify(event));
339
- }
340
- function sendComplete(socket, content, messageId, sessionId, usage) {
341
- const event = {
342
- type: 'assistant_complete',
343
- content,
344
- message_id: messageId,
345
- session_id: sessionId,
346
- is_complete: true,
347
- usage,
348
- };
349
- socket.send(JSON.stringify(event));
350
- }
351
- function generateMessageId() {
352
- return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
353
- }
354
- function recordLog(logger, sessionId, messageId, prompt, response, startTime, mcpCalls, cliCalls, error, fastify, usage) {
355
- if (!logger)
356
- return;
357
- const logEntry = {
358
- sessionId,
359
- messageId,
360
- timestamp: new Date().toISOString(),
361
- prompt,
362
- response,
363
- duration: Date.now() - startTime,
364
- usage: usage ? { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens } : undefined,
365
- mcpCalls,
366
- cliCalls,
367
- error,
368
- };
369
- logger.log(logEntry).catch((err) => {
370
- fastify.log.warn('Failed to write interaction log: %s', err);
371
- });
372
- }
373
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/websocket/index.ts"],"names":[],"mappings":"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"}