@loom-framework/backend 0.1.0-alpha.3 → 0.1.0-alpha.31
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.map +1 -1
- package/dist/ai/engine.js +3 -1
- package/dist/ai/engine.js.map +1 -1
- package/dist/ai/index.d.ts +1 -0
- 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 +8 -7
- package/dist/ai/output-parser.d.ts.map +1 -1
- package/dist/ai/output-parser.js +194 -133
- package/dist/ai/output-parser.js.map +1 -1
- package/dist/ai/session-manager.d.ts +19 -0
- package/dist/ai/session-manager.d.ts.map +1 -1
- package/dist/ai/session-manager.js +44 -0
- package/dist/ai/session-manager.js.map +1 -1
- package/dist/bin.js +0 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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 +279 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/index.d.ts +2 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/upload.d.ts +1 -1
- package/dist/routes/upload.js +1 -1
- package/package.json +12 -13
- package/dist/websocket/index.d.ts +0 -33
- package/dist/websocket/index.d.ts.map +0 -1
- package/dist/websocket/index.js +0 -373
- package/dist/websocket/index.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button Resolver - Resolve AI button prompts from configuration
|
|
3
|
+
*
|
|
4
|
+
* Shared between the SSE chat route and other modules.
|
|
5
|
+
*/
|
|
6
|
+
import type { LoomConfig } from '@loom-framework/core';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve prompt from AI button configuration.
|
|
9
|
+
* - Static buttons: return prompt directly
|
|
10
|
+
* - Template buttons: substitute {{var}} with context values
|
|
11
|
+
* Returns null if button not found or context is incomplete.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveButtonPrompt(buttonId: string, context: Record<string, string> | undefined, config: LoomConfig): {
|
|
14
|
+
prompt: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
} | null;
|
|
17
|
+
//# sourceMappingURL=button-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-resolver.d.ts","sourceRoot":"","sources":["../../src/ai/button-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button Resolver - Resolve AI button prompts from configuration
|
|
3
|
+
*
|
|
4
|
+
* Shared between the SSE chat route and other modules.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Resolve prompt from AI button configuration.
|
|
8
|
+
* - Static buttons: return prompt directly
|
|
9
|
+
* - Template buttons: substitute {{var}} with context values
|
|
10
|
+
* Returns null if button not found or context is incomplete.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveButtonPrompt(buttonId, context, config) {
|
|
13
|
+
const button = config.aiButtons?.find((b) => b.id === buttonId);
|
|
14
|
+
if (!button) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
// Static prompt
|
|
18
|
+
if (button.prompt) {
|
|
19
|
+
return { prompt: button.prompt };
|
|
20
|
+
}
|
|
21
|
+
// Template prompt
|
|
22
|
+
if (button.promptTemplate) {
|
|
23
|
+
const missing = (button.contextVars || []).filter((v) => !context || context[v] === undefined);
|
|
24
|
+
if (missing.length > 0) {
|
|
25
|
+
return {
|
|
26
|
+
prompt: '',
|
|
27
|
+
error: `Missing context variables: ${missing.join(', ')}. Required: ${button.contextVars.join(', ')}`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
let resolved = button.promptTemplate;
|
|
31
|
+
if (context) {
|
|
32
|
+
for (const [key, value] of Object.entries(context)) {
|
|
33
|
+
resolved = resolved.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { prompt: resolved };
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=button-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-resolver.js","sourceRoot":"","sources":["../../src/ai/button-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,OAA2C,EAC3C,MAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAC5C,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,8BAA8B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACvG,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/ai/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/ai/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM/F,wCAAwC;AACxC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEnH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,MAAM,CAAC,CAAe;gBAElB,OAAO,EAAE,uBAAuB;IAM5C,OAAO,CAAC,GAAG;IAUX;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/ai/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM/F,wCAAwC;AACxC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEnH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,MAAM,CAAC,CAAe;gBAElB,OAAO,EAAE,uBAAuB;IAM5C,OAAO,CAAC,GAAG;IAUX;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC;IAkI5E;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAUvC;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB"}
|
package/dist/ai/engine.js
CHANGED
|
@@ -47,7 +47,9 @@ export class ClaudeCodeEngine {
|
|
|
47
47
|
const fullPrompt = buildPromptWithFiles(prompt, options.files);
|
|
48
48
|
const args = [
|
|
49
49
|
'-p',
|
|
50
|
-
'--output-format', 'json',
|
|
50
|
+
'--output-format', 'stream-json',
|
|
51
|
+
'--verbose',
|
|
52
|
+
'--include-partial-messages',
|
|
51
53
|
'--mcp-config', mcpConfigPath,
|
|
52
54
|
'--strict-mcp-config',
|
|
53
55
|
];
|
package/dist/ai/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/ai/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAuB,MAAM,oBAAoB,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAsB3C;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,aAAa,CAAC;IAEtB,MAAM,CAAmB;IACzB,WAAW,CAAS;IACpB,eAAe,GAA8B,IAAI,GAAG,EAAE,CAAC;IACvD,MAAM,CAAgB;IAE9B,YAAY,OAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAEO,GAAG,CAAC,KAAqB,EAAE,SAAiB,EAAE,OAAe,EAAE,IAAc;QACnF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK;YACL,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO;YACP,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,IAAI,CAAC,MAAc,EAAE,OAAsB;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,0BAA0B,CAAC;QACrF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACpF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAEvE,gDAAgD;QAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG;YACX,IAAI;YACJ,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/ai/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export { SessionManager } from './session-manager.js';
|
|
|
7
7
|
export type { SessionRecord, SessionMessage, SessionFileRef } from './session-manager.js';
|
|
8
8
|
export { parseClaudeOutput } from './output-parser.js';
|
|
9
9
|
export type { ParserLogger, ParserLogEntry } from './output-parser.js';
|
|
10
|
+
export { resolveButtonPrompt } from './button-resolver.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ai/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,uBAAuB,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,uBAAuB,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/ai/index.js
CHANGED
package/dist/ai/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Claude Code Output Parser
|
|
3
3
|
*
|
|
4
|
-
* Parses `claude -p --output-format json` output stream
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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.
|
|
7
8
|
*/
|
|
8
9
|
import type { AIChunk } from '@loom-framework/core';
|
|
9
10
|
/** Parser log entry for diagnostics */
|
|
@@ -18,11 +19,11 @@ export type ParserLogger = (entry: ParserLogEntry) => void;
|
|
|
18
19
|
* Parse Claude Code stdout stream into typed AIChunk objects
|
|
19
20
|
*
|
|
20
21
|
* Strategy:
|
|
21
|
-
* 1.
|
|
22
|
+
* 1. Process lines as they arrive (true streaming)
|
|
22
23
|
* 2. Strip ANSI escape codes
|
|
23
|
-
* 3.
|
|
24
|
-
* 4.
|
|
25
|
-
* 5.
|
|
24
|
+
* 3. Parse each line as JSON
|
|
25
|
+
* 4. Map to appropriate AIChunk types
|
|
26
|
+
* 5. Accumulate tool input from input_json_delta events
|
|
26
27
|
*/
|
|
27
28
|
export declare function parseClaudeOutput(stdout: NodeJS.ReadableStream, logger?: ParserLogger): AsyncGenerator<AIChunk>;
|
|
28
29
|
//# sourceMappingURL=output-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../../src/ai/output-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../../src/ai/output-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAW,MAAM,sBAAsB,CAAC;AAE7D,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AA0F3D;;;;;;;;;GASG;AACH,wBAAuB,iBAAiB,CACtC,MAAM,EAAE,MAAM,CAAC,cAAc,EAC7B,MAAM,CAAC,EAAE,YAAY,GACpB,cAAc,CAAC,OAAO,CAAC,CAgCzB"}
|
package/dist/ai/output-parser.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Claude Code Output Parser
|
|
3
3
|
*
|
|
4
|
-
* Parses `claude -p --output-format json` output stream
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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.
|
|
7
8
|
*/
|
|
8
9
|
/** ANSI escape code pattern */
|
|
9
10
|
const ANSI_ESCAPE = /\x1b\[[0-9;]*m/g;
|
|
@@ -11,161 +12,221 @@ const ANSI_ESCAPE = /\x1b\[[0-9;]*m/g;
|
|
|
11
12
|
* Parse Claude Code stdout stream into typed AIChunk objects
|
|
12
13
|
*
|
|
13
14
|
* Strategy:
|
|
14
|
-
* 1.
|
|
15
|
+
* 1. Process lines as they arrive (true streaming)
|
|
15
16
|
* 2. Strip ANSI escape codes
|
|
16
|
-
* 3.
|
|
17
|
-
* 4.
|
|
18
|
-
* 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
|
|
19
20
|
*/
|
|
20
21
|
export async function* parseClaudeOutput(stdout, logger) {
|
|
21
22
|
let buffer = '';
|
|
23
|
+
const state = {
|
|
24
|
+
toolInputBuffers: new Map(),
|
|
25
|
+
activeToolId: null,
|
|
26
|
+
activeToolName: null,
|
|
27
|
+
};
|
|
22
28
|
for await (const chunk of stdout) {
|
|
23
29
|
buffer += chunk.toString();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
+
}
|
|
35
41
|
}
|
|
36
|
-
return;
|
|
37
42
|
}
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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;
|
|
43
49
|
}
|
|
44
|
-
// Strategy 3: Raw text fallback
|
|
45
|
-
yield {
|
|
46
|
-
type: 'content',
|
|
47
|
-
content: cleanOutput,
|
|
48
|
-
};
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
* Attempt to parse multiple JSON lines into AIChunk objects
|
|
52
|
-
*/
|
|
53
|
-
function tryParseJsonLines(lines) {
|
|
54
|
-
const chunks = [];
|
|
55
|
-
let hasValidJson = false;
|
|
56
|
-
for (const line of lines) {
|
|
57
|
-
try {
|
|
58
|
-
const data = JSON.parse(line);
|
|
59
|
-
hasValidJson = true;
|
|
60
|
-
const chunk = mapJsonToChunk(data);
|
|
61
|
-
if (chunk)
|
|
62
|
-
chunks.push(chunk);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// Not valid JSON on this line, skip
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return hasValidJson ? chunks : [];
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Attempt to parse the entire output as a single JSON object
|
|
72
|
-
*/
|
|
73
|
-
function tryParseSingleJson(output) {
|
|
51
|
+
function parseLine(line, logger, state) {
|
|
74
52
|
try {
|
|
75
|
-
const data = JSON.parse(
|
|
76
|
-
|
|
53
|
+
const data = JSON.parse(line);
|
|
54
|
+
logger?.({ type: 'LINE_PARSED', timestamp: new Date().toISOString(), message: `Parsed ${data.type}` });
|
|
55
|
+
return mapToChunks(data, state);
|
|
77
56
|
}
|
|
78
57
|
catch {
|
|
79
|
-
|
|
58
|
+
logger?.({ type: 'PARSE_ERROR', timestamp: new Date().toISOString(), message: 'Failed to parse line', data: line.slice(0, 200) });
|
|
59
|
+
return [];
|
|
80
60
|
}
|
|
81
61
|
}
|
|
82
|
-
|
|
83
|
-
* Map a parsed JSON object to an AIChunk
|
|
84
|
-
*/
|
|
85
|
-
function mapJsonToChunk(data) {
|
|
62
|
+
function mapToChunks(data, state) {
|
|
86
63
|
switch (data.type) {
|
|
87
|
-
case '
|
|
88
|
-
|
|
89
|
-
type: '
|
|
90
|
-
toolUseId: data.tool_use_id || '',
|
|
91
|
-
toolName: data.tool_name || 'unknown',
|
|
92
|
-
toolInput: data.tool_input,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
case 'tool_result': {
|
|
96
|
-
return {
|
|
97
|
-
type: 'tool_result',
|
|
98
|
-
toolUseId: data.tool_use_id || '',
|
|
99
|
-
toolResult: data.tool_result,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
case 'result': {
|
|
103
|
-
if (data.is_error) {
|
|
104
|
-
return {
|
|
105
|
-
type: 'error',
|
|
106
|
-
error: data.result || 'Unknown error from Claude Code',
|
|
107
|
-
};
|
|
64
|
+
case 'system':
|
|
65
|
+
if (data.subtype === 'init' && data.session_id) {
|
|
66
|
+
return [{ type: 'session_info', sessionId: data.session_id }];
|
|
108
67
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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 }];
|
|
118
89
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
case 'assistant': {
|
|
123
|
-
if (data.subtype === 'text' && data.content) {
|
|
124
|
-
return { type: 'content', content: data.content };
|
|
90
|
+
if (event.delta?.type === 'text_delta' && event.delta.text) {
|
|
91
|
+
return [{ type: 'content', content: event.delta.text }];
|
|
125
92
|
}
|
|
126
|
-
|
|
127
|
-
|
|
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 [];
|
|
128
151
|
default:
|
|
129
|
-
return
|
|
152
|
+
return [];
|
|
130
153
|
}
|
|
131
154
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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;
|
|
144
190
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return {
|
|
155
|
-
inputTokens: modelUsage.inputTokens,
|
|
156
|
-
outputTokens: modelUsage.outputTokens,
|
|
157
|
-
contextWindow: modelUsage.contextWindow,
|
|
158
|
-
};
|
|
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
|
+
});
|
|
159
200
|
}
|
|
160
201
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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' });
|
|
168
215
|
}
|
|
169
|
-
|
|
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
|
+
};
|
|
170
231
|
}
|
|
171
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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"}
|
|
@@ -15,12 +15,22 @@ export interface SessionRecord {
|
|
|
15
15
|
messages: SessionMessage[];
|
|
16
16
|
usage?: AIUsage;
|
|
17
17
|
}
|
|
18
|
+
export interface SerializedToolCall {
|
|
19
|
+
tool: string;
|
|
20
|
+
toolUseId: string;
|
|
21
|
+
status: 'started' | 'completed' | 'error';
|
|
22
|
+
toolInput?: unknown;
|
|
23
|
+
result?: unknown;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
18
26
|
export interface SessionMessage {
|
|
19
27
|
id: string;
|
|
20
28
|
role: 'user' | 'assistant';
|
|
21
29
|
content: string;
|
|
22
30
|
timestamp: string;
|
|
23
31
|
files?: SessionFileRef[];
|
|
32
|
+
thinking?: string;
|
|
33
|
+
toolCalls?: SerializedToolCall[];
|
|
24
34
|
}
|
|
25
35
|
export interface SessionFileRef {
|
|
26
36
|
uid: string;
|
|
@@ -69,6 +79,15 @@ export declare class SessionManager {
|
|
|
69
79
|
* List full session records from files (fallback, used during initialization)
|
|
70
80
|
*/
|
|
71
81
|
private listSessionsFromFiles;
|
|
82
|
+
/**
|
|
83
|
+
* Delete a single message from a session
|
|
84
|
+
*/
|
|
85
|
+
deleteMessage(sessionId: string, messageId: string): Promise<SessionRecord | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Truncate all messages from a given message index onward (inclusive).
|
|
88
|
+
* Returns the updated session, or null if session not found.
|
|
89
|
+
*/
|
|
90
|
+
truncateMessagesFromIndex(sessionId: string, fromIndex: number): Promise<SessionRecord | null>;
|
|
72
91
|
/**
|
|
73
92
|
* Delete a session
|
|
74
93
|
*/
|