@sdsrs/codeagent 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +0 -0
- package/README.md +18 -6
- package/dist/adapters/__tests__/code-graph.test.d.ts +2 -0
- package/dist/adapters/__tests__/code-graph.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/code-graph.test.js +118 -0
- package/dist/adapters/__tests__/code-graph.test.js.map +1 -0
- package/dist/adapters/__tests__/memory.test.d.ts +2 -0
- package/dist/adapters/__tests__/memory.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/memory.test.js +168 -0
- package/dist/adapters/__tests__/memory.test.js.map +1 -0
- package/dist/adapters/code-graph.d.ts +7 -1
- package/dist/adapters/code-graph.d.ts.map +1 -1
- package/dist/adapters/code-graph.js +69 -33
- package/dist/adapters/code-graph.js.map +1 -1
- package/dist/adapters/memory.d.ts +1 -1
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +23 -14
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/orchestration/gsd.d.ts +0 -0
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -1
- package/dist/adapters/orchestration/gsd.js +18 -1
- package/dist/adapters/orchestration/gsd.js.map +1 -1
- package/dist/adapters/orchestration/interface.d.ts +0 -0
- package/dist/adapters/orchestration/interface.d.ts.map +0 -0
- package/dist/adapters/orchestration/interface.js +0 -0
- package/dist/adapters/orchestration/interface.js.map +0 -0
- package/dist/adapters/orchestration/superpowers.d.ts +0 -0
- package/dist/adapters/orchestration/superpowers.d.ts.map +0 -0
- package/dist/adapters/orchestration/superpowers.js +0 -0
- package/dist/adapters/orchestration/superpowers.js.map +0 -0
- package/dist/broker/__tests__/broker.test.d.ts +2 -0
- package/dist/broker/__tests__/broker.test.d.ts.map +1 -0
- package/dist/broker/__tests__/broker.test.js +207 -0
- package/dist/broker/__tests__/broker.test.js.map +1 -0
- package/dist/broker/__tests__/compressor.test.d.ts +2 -0
- package/dist/broker/__tests__/compressor.test.d.ts.map +1 -0
- package/dist/broker/__tests__/compressor.test.js +278 -0
- package/dist/broker/__tests__/compressor.test.js.map +1 -0
- package/dist/broker/__tests__/query-parser.test.d.ts +2 -0
- package/dist/broker/__tests__/query-parser.test.d.ts.map +1 -0
- package/dist/broker/__tests__/query-parser.test.js +101 -0
- package/dist/broker/__tests__/query-parser.test.js.map +1 -0
- package/dist/broker/broker.d.ts +1 -1
- package/dist/broker/broker.d.ts.map +1 -1
- package/dist/broker/broker.js +45 -29
- package/dist/broker/broker.js.map +1 -1
- package/dist/broker/compressor.d.ts +0 -0
- package/dist/broker/compressor.d.ts.map +1 -1
- package/dist/broker/compressor.js +82 -2
- package/dist/broker/compressor.js.map +1 -1
- package/dist/broker/context-pack.d.ts +3 -0
- package/dist/broker/context-pack.d.ts.map +1 -1
- package/dist/broker/context-pack.js +18 -0
- package/dist/broker/context-pack.js.map +1 -1
- package/dist/broker/query-parser.d.ts +0 -0
- package/dist/broker/query-parser.d.ts.map +0 -0
- package/dist/broker/query-parser.js +0 -0
- package/dist/broker/query-parser.js.map +0 -0
- package/dist/cli/commands/chat.d.ts +0 -0
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +14 -1
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/config.d.ts +1 -2
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +0 -0
- package/dist/cli/commands/config.js.map +0 -0
- package/dist/cli/commands/memory.d.ts +0 -0
- package/dist/cli/commands/memory.d.ts.map +0 -0
- package/dist/cli/commands/memory.js +0 -0
- package/dist/cli/commands/memory.js.map +0 -0
- package/dist/cli/commands/search.d.ts +0 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +6 -2
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/session.d.ts +0 -0
- package/dist/cli/commands/session.d.ts.map +0 -0
- package/dist/cli/commands/session.js +0 -0
- package/dist/cli/commands/session.js.map +0 -0
- package/dist/cli/index.d.ts +0 -0
- package/dist/cli/index.d.ts.map +0 -0
- package/dist/cli/index.js +6 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui/renderer.d.ts +0 -0
- package/dist/cli/tui/renderer.d.ts.map +0 -0
- package/dist/cli/tui/renderer.js +0 -0
- package/dist/cli/tui/renderer.js.map +0 -0
- package/dist/hooks/__tests__/stop.test.d.ts +2 -0
- package/dist/hooks/__tests__/stop.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/stop.test.js +88 -0
- package/dist/hooks/__tests__/stop.test.js.map +1 -0
- package/dist/hooks/post-compact.d.ts +0 -0
- package/dist/hooks/post-compact.d.ts.map +0 -0
- package/dist/hooks/post-compact.js +8 -7
- package/dist/hooks/post-compact.js.map +1 -1
- package/dist/hooks/session-start.d.ts +0 -0
- package/dist/hooks/session-start.d.ts.map +0 -0
- package/dist/hooks/session-start.js +6 -5
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.d.ts +6 -0
- package/dist/hooks/stop.d.ts.map +1 -1
- package/dist/hooks/stop.js +59 -42
- package/dist/hooks/stop.js.map +1 -1
- package/dist/hooks/user-prompt.d.ts +0 -0
- package/dist/hooks/user-prompt.d.ts.map +0 -0
- package/dist/hooks/user-prompt.js +0 -0
- package/dist/hooks/user-prompt.js.map +0 -0
- package/dist/providers/__tests__/anthropic-api.test.d.ts +2 -0
- package/dist/providers/__tests__/anthropic-api.test.d.ts.map +1 -0
- package/dist/providers/__tests__/anthropic-api.test.js +113 -0
- package/dist/providers/__tests__/anthropic-api.test.js.map +1 -0
- package/dist/providers/__tests__/claude-sdk.test.d.ts +2 -0
- package/dist/providers/__tests__/claude-sdk.test.d.ts.map +1 -0
- package/dist/providers/__tests__/claude-sdk.test.js +121 -0
- package/dist/providers/__tests__/claude-sdk.test.js.map +1 -0
- package/dist/providers/anthropic-api.d.ts +1 -0
- package/dist/providers/anthropic-api.d.ts.map +1 -1
- package/dist/providers/anthropic-api.js +18 -12
- package/dist/providers/anthropic-api.js.map +1 -1
- package/dist/providers/claude-cli.d.ts +0 -0
- package/dist/providers/claude-cli.d.ts.map +1 -1
- package/dist/providers/claude-cli.js +4 -16
- package/dist/providers/claude-cli.js.map +1 -1
- package/dist/providers/claude-sdk.d.ts +3 -2
- package/dist/providers/claude-sdk.d.ts.map +1 -1
- package/dist/providers/claude-sdk.js +12 -11
- package/dist/providers/claude-sdk.js.map +1 -1
- package/dist/providers/interface.d.ts +1 -0
- package/dist/providers/interface.d.ts.map +1 -1
- package/dist/providers/interface.js +0 -0
- package/dist/providers/interface.js.map +0 -0
- package/dist/scripts/install-hooks.d.ts +2 -2
- package/dist/scripts/install-hooks.d.ts.map +0 -0
- package/dist/scripts/install-hooks.js +6 -9
- package/dist/scripts/install-hooks.js.map +1 -1
- package/dist/session/__tests__/manager.test.d.ts +2 -0
- package/dist/session/__tests__/manager.test.d.ts.map +1 -0
- package/dist/session/__tests__/manager.test.js +108 -0
- package/dist/session/__tests__/manager.test.js.map +1 -0
- package/dist/session/manager.d.ts +0 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +2 -1
- package/dist/session/manager.js.map +1 -1
- package/dist/session/schema.d.ts +0 -0
- package/dist/session/schema.d.ts.map +1 -1
- package/dist/session/schema.js +2 -1
- package/dist/session/schema.js.map +1 -1
- package/dist/utils/__tests__/exec.test.d.ts +2 -0
- package/dist/utils/__tests__/exec.test.d.ts.map +1 -0
- package/dist/utils/__tests__/exec.test.js +104 -0
- package/dist/utils/__tests__/exec.test.js.map +1 -0
- package/dist/utils/__tests__/tokens.test.d.ts +2 -0
- package/dist/utils/__tests__/tokens.test.d.ts.map +1 -0
- package/dist/utils/__tests__/tokens.test.js +64 -0
- package/dist/utils/__tests__/tokens.test.js.map +1 -0
- package/dist/utils/exec.d.ts +16 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +33 -3
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/tokens.d.ts +0 -0
- package/dist/utils/tokens.d.ts.map +0 -0
- package/dist/utils/tokens.js +0 -0
- package/dist/utils/tokens.js.map +0 -0
- package/package.json +1 -1
- package/src/skills/brainstorm.md +0 -0
- package/src/skills/remember.md +0 -0
- package/src/skills/review.md +0 -0
- package/src/skills/spec.md +0 -0
|
@@ -8,15 +8,16 @@
|
|
|
8
8
|
* Runs once per session. Can be slower than UserPromptSubmit (5s budget).
|
|
9
9
|
*/
|
|
10
10
|
import { ContextBroker } from '../broker/broker.js';
|
|
11
|
-
import {
|
|
11
|
+
import { execQuietAsync } from '../utils/exec.js';
|
|
12
12
|
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
13
13
|
async function main() {
|
|
14
14
|
const repoRoot = process.cwd();
|
|
15
15
|
const broker = new ContextBroker(repoRoot);
|
|
16
|
-
//
|
|
17
|
-
const pack = await
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
// Run session context and recent memory in parallel
|
|
17
|
+
const [pack, recentMem] = await Promise.all([
|
|
18
|
+
broker.buildSessionContext(),
|
|
19
|
+
execQuietAsync('claude-mem-lite', ['timeline', '--limit', '5'], { timeout: 2000 }),
|
|
20
|
+
]);
|
|
20
21
|
const sections = [];
|
|
21
22
|
// Repo overview
|
|
22
23
|
if (pack.repoSummary) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE3C,oDAAoD;IACpD,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1C,MAAM,CAAC,mBAAmB,EAAE;QAC5B,cAAc,CAAC,iBAAiB,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACnF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,gBAAgB;IAChB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,wBAAwB,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,YAAY;QAAE,SAAS,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,UAAU;QAAE,SAAS,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,kBAAkB;IAClB,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,qBAAqB,qBAAqB,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/hooks/stop.d.ts
CHANGED
|
@@ -7,5 +7,11 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Extracts: file modifications, error resolutions, architecture decisions.
|
|
9
9
|
*/
|
|
10
|
+
interface MemoryCandidate {
|
|
11
|
+
type: string;
|
|
12
|
+
title: string;
|
|
13
|
+
body: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function extractMemories(summary: string): MemoryCandidate[];
|
|
10
16
|
export {};
|
|
11
17
|
//# sourceMappingURL=stop.d.ts.map
|
package/dist/hooks/stop.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAyCH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAoElE"}
|
package/dist/hooks/stop.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Extracts: file modifications, error resolutions, architecture decisions.
|
|
9
9
|
*/
|
|
10
10
|
import fs from 'node:fs';
|
|
11
|
-
import {
|
|
11
|
+
import { execSafeAsync } from '../utils/exec.js';
|
|
12
12
|
async function main() {
|
|
13
13
|
// Read input from stdin
|
|
14
14
|
let input = {};
|
|
@@ -26,65 +26,82 @@ async function main() {
|
|
|
26
26
|
}
|
|
27
27
|
// Extract potential memories using simple heuristics
|
|
28
28
|
const memories = extractMemories(summary);
|
|
29
|
-
// Save
|
|
30
|
-
|
|
31
|
-
execSafe('claude-mem-lite', ['save', '--type', mem.type, '--title', mem.title, '--body', mem.body], { timeout: 3000 });
|
|
32
|
-
}
|
|
29
|
+
// Save all memories in parallel
|
|
30
|
+
await Promise.allSettled(memories.map((mem) => execSafeAsync('claude-mem-lite', ['save', '--type', mem.type, '--title', mem.title, '--body', mem.body], { timeout: 3000 })));
|
|
33
31
|
}
|
|
34
|
-
function extractMemories(summary) {
|
|
32
|
+
export function extractMemories(summary) {
|
|
35
33
|
const memories = [];
|
|
36
|
-
//
|
|
34
|
+
// Split on sentence boundaries (period/Chinese period followed by whitespace and uppercase/CJK)
|
|
35
|
+
// More conservative than splitting on every period (avoids breaking on file paths, versions)
|
|
36
|
+
const sentences = summary.split(/(?<=[.。])\s+(?=[A-Z\u4e00-\u9fff])/);
|
|
37
|
+
// Detect bug fixes — search across sentences
|
|
37
38
|
const bugPatterns = [
|
|
38
|
-
/(?:fixed|resolved|debugged|solved)\s+(
|
|
39
|
-
/(?:bug|error|issue)\s*(?:was|:)\s*(
|
|
40
|
-
/(?:修复|解决|排查)\s*[了]?\s*(
|
|
39
|
+
/(?:fixed|resolved|debugged|solved)\s+(.+)/i,
|
|
40
|
+
/(?:bug|error|issue)\s*(?:was|:)\s*(.+)/i,
|
|
41
|
+
/(?:修复|解决|排查)\s*[了]?\s*(.+)/i,
|
|
41
42
|
];
|
|
42
|
-
for (const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
for (const sentence of sentences) {
|
|
44
|
+
if (memories.some((m) => m.type === 'bugfix'))
|
|
45
|
+
break;
|
|
46
|
+
for (const pattern of bugPatterns) {
|
|
47
|
+
const match = pattern.exec(sentence);
|
|
48
|
+
if (match?.[1]) {
|
|
49
|
+
memories.push({
|
|
50
|
+
type: 'bugfix',
|
|
51
|
+
title: match[1].trim().slice(0, 100),
|
|
52
|
+
body: `Session discovery: ${sentence.trim().slice(0, 300)}`,
|
|
53
|
+
});
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
58
|
// Detect architecture decisions
|
|
54
59
|
const decisionPatterns = [
|
|
55
|
-
/(?:decided|chose|selected|went with)\s+(
|
|
56
|
-
/(?:决定|选择|采用)\s*[了]?\s*(
|
|
60
|
+
/(?:decided|chose|selected|went with)\s+(.+)/i,
|
|
61
|
+
/(?:决定|选择|采用)\s*[了]?\s*(.+)/i,
|
|
57
62
|
];
|
|
58
|
-
for (const
|
|
59
|
-
|
|
60
|
-
if (match?.[1]) {
|
|
61
|
-
memories.push({
|
|
62
|
-
type: 'decision',
|
|
63
|
-
title: match[1].trim().slice(0, 100),
|
|
64
|
-
body: `Extracted from session summary: ${match[0].trim()}`,
|
|
65
|
-
});
|
|
63
|
+
for (const sentence of sentences) {
|
|
64
|
+
if (memories.some((m) => m.type === 'decision'))
|
|
66
65
|
break;
|
|
66
|
+
for (const pattern of decisionPatterns) {
|
|
67
|
+
const match = pattern.exec(sentence);
|
|
68
|
+
if (match?.[1]) {
|
|
69
|
+
memories.push({
|
|
70
|
+
type: 'decision',
|
|
71
|
+
title: match[1].trim().slice(0, 100),
|
|
72
|
+
body: `Session discovery: ${sentence.trim().slice(0, 300)}`,
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
67
76
|
}
|
|
68
77
|
}
|
|
69
78
|
// Detect discoveries
|
|
70
79
|
const discoveryPatterns = [
|
|
71
|
-
/(?:discovered|found out|learned|realized)\s+(
|
|
72
|
-
/(?:发现|了解到|学到)\s*[了]?\s*(
|
|
80
|
+
/(?:discovered|found out|learned|realized)\s+(.+)/i,
|
|
81
|
+
/(?:发现|了解到|学到)\s*[了]?\s*(.+)/i,
|
|
73
82
|
];
|
|
74
|
-
for (const
|
|
75
|
-
|
|
76
|
-
if (match?.[1]) {
|
|
77
|
-
memories.push({
|
|
78
|
-
type: 'discovery',
|
|
79
|
-
title: match[1].trim().slice(0, 100),
|
|
80
|
-
body: `Extracted from session summary: ${match[0].trim()}`,
|
|
81
|
-
});
|
|
83
|
+
for (const sentence of sentences) {
|
|
84
|
+
if (memories.some((m) => m.type === 'discovery'))
|
|
82
85
|
break;
|
|
86
|
+
for (const pattern of discoveryPatterns) {
|
|
87
|
+
const match = pattern.exec(sentence);
|
|
88
|
+
if (match?.[1]) {
|
|
89
|
+
memories.push({
|
|
90
|
+
type: 'discovery',
|
|
91
|
+
title: match[1].trim().slice(0, 100),
|
|
92
|
+
body: `Session discovery: ${sentence.trim().slice(0, 300)}`,
|
|
93
|
+
});
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
83
96
|
}
|
|
84
97
|
}
|
|
85
98
|
return memories;
|
|
86
99
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
100
|
+
// Only run when executed directly (not when imported for testing)
|
|
101
|
+
const isMain = import.meta.url === new URL(process.argv[1] ?? '', 'file://').href;
|
|
102
|
+
if (isMain) {
|
|
103
|
+
main().catch(() => {
|
|
104
|
+
process.exit(0);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
90
107
|
//# sourceMappingURL=stop.js.map
|
package/dist/hooks/stop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,KAAK,UAAU,IAAI;IACjB,wBAAwB;IACxB,IAAI,KAAK,GAAc,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACpC,yCAAyC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,gCAAgC;IAChC,MAAM,OAAO,CAAC,UAAU,CACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACnB,aAAa,CACX,iBAAiB,EACjB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EACtE,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CACF,CACF,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,gGAAgG;IAChG,6FAA6F;IAC7F,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAEtE,6CAA6C;IAC7C,MAAM,WAAW,GAAG;QAClB,4CAA4C;QAC5C,yCAAyC;QACzC,6BAA6B;KAC9B,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;YAAE,MAAM;QACrD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACpC,IAAI,EAAE,sBAAsB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;iBAC5D,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,gBAAgB,GAAG;QACvB,8CAA8C;QAC9C,6BAA6B;KAC9B,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;YAAE,MAAM;QACvD,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACpC,IAAI,EAAE,sBAAsB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;iBAC5D,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,iBAAiB,GAAG;QACxB,mDAAmD;QACnD,8BAA8B;KAC/B,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;YAAE,MAAM;QACxD,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACpC,IAAI,EAAE,sBAAsB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;iBAC5D,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kEAAkE;AAClE,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC;AACrE,IAAI,MAAM,EAAE,CAAC;IACX,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-api.test.d.ts","sourceRoot":"","sources":["../../../src/providers/__tests__/anthropic-api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
// Mock the Anthropic SDK
|
|
3
|
+
vi.mock('@anthropic-ai/sdk', () => {
|
|
4
|
+
return {
|
|
5
|
+
default: vi.fn().mockImplementation(() => ({
|
|
6
|
+
messages: {
|
|
7
|
+
stream: vi.fn(),
|
|
8
|
+
},
|
|
9
|
+
})),
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
import { AnthropicAPIProvider } from '../anthropic-api.js';
|
|
13
|
+
function createMockStream(text, usage = { input_tokens: 100, output_tokens: 50 }) {
|
|
14
|
+
const events = [
|
|
15
|
+
{ type: 'content_block_delta', delta: { type: 'text_delta', text } },
|
|
16
|
+
];
|
|
17
|
+
return {
|
|
18
|
+
[Symbol.asyncIterator]: async function* () {
|
|
19
|
+
for (const e of events)
|
|
20
|
+
yield e;
|
|
21
|
+
},
|
|
22
|
+
finalMessage: async () => ({
|
|
23
|
+
usage,
|
|
24
|
+
model: 'claude-sonnet-4-20250514',
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
describe('AnthropicAPIProvider', () => {
|
|
29
|
+
let provider;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
vi.clearAllMocks();
|
|
32
|
+
provider = new AnthropicAPIProvider({ apiKey: 'test-key' });
|
|
33
|
+
});
|
|
34
|
+
it('starts a session with api- prefix', async () => {
|
|
35
|
+
const handle = await provider.startSession();
|
|
36
|
+
expect(handle.sessionId).toMatch(/^api-/);
|
|
37
|
+
});
|
|
38
|
+
it('streams text from API response', async () => {
|
|
39
|
+
const handle = await provider.startSession();
|
|
40
|
+
// Get the mock client from the provider
|
|
41
|
+
const client = provider.client;
|
|
42
|
+
client.messages.stream.mockReturnValue(createMockStream('Hello from API'));
|
|
43
|
+
const events = [];
|
|
44
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'hello' })) {
|
|
45
|
+
events.push(event);
|
|
46
|
+
}
|
|
47
|
+
expect(events.find((e) => e.type === 'text')).toBeDefined();
|
|
48
|
+
expect(events.find((e) => e.type === 'text').content).toBe('Hello from API');
|
|
49
|
+
const done = events.find((e) => e.type === 'done');
|
|
50
|
+
expect(done).toBeDefined();
|
|
51
|
+
expect(done.metadata?.inputTokens).toBe(100);
|
|
52
|
+
expect(done.metadata?.outputTokens).toBe(50);
|
|
53
|
+
});
|
|
54
|
+
it('maintains message history per session', async () => {
|
|
55
|
+
const handle = await provider.startSession();
|
|
56
|
+
const client = provider.client;
|
|
57
|
+
// First turn
|
|
58
|
+
client.messages.stream.mockReturnValue(createMockStream('First response'));
|
|
59
|
+
for await (const _ of provider.sendTurn(handle, { userMessage: 'first' })) { /* consume */ }
|
|
60
|
+
// Second turn — should include history
|
|
61
|
+
client.messages.stream.mockReturnValue(createMockStream('Second response'));
|
|
62
|
+
for await (const _ of provider.sendTurn(handle, { userMessage: 'second' })) { /* consume */ }
|
|
63
|
+
// Check that the second call included history
|
|
64
|
+
const calls = client.messages.stream.mock.calls;
|
|
65
|
+
expect(calls).toHaveLength(2);
|
|
66
|
+
expect(calls[1][0].messages).toHaveLength(4); // user, assistant, user, assistant accumulated
|
|
67
|
+
});
|
|
68
|
+
it('uses per-session model', async () => {
|
|
69
|
+
const handle1 = await provider.startSession({ model: 'claude-opus-4-6' });
|
|
70
|
+
const handle2 = await provider.startSession({ model: 'claude-haiku-4-5-20251001' });
|
|
71
|
+
const client = provider.client;
|
|
72
|
+
client.messages.stream.mockReturnValue(createMockStream('r'));
|
|
73
|
+
for await (const _ of provider.sendTurn(handle1, { userMessage: 'x' })) { /* consume */ }
|
|
74
|
+
expect(client.messages.stream.mock.calls[0][0].model).toBe('claude-opus-4-6');
|
|
75
|
+
client.messages.stream.mockReturnValue(createMockStream('r'));
|
|
76
|
+
for await (const _ of provider.sendTurn(handle2, { userMessage: 'x' })) { /* consume */ }
|
|
77
|
+
expect(client.messages.stream.mock.calls[1][0].model).toBe('claude-haiku-4-5-20251001');
|
|
78
|
+
});
|
|
79
|
+
it('handles API errors gracefully', async () => {
|
|
80
|
+
const handle = await provider.startSession();
|
|
81
|
+
const client = provider.client;
|
|
82
|
+
client.messages.stream.mockImplementation(() => {
|
|
83
|
+
throw new Error('Rate limited');
|
|
84
|
+
});
|
|
85
|
+
const events = [];
|
|
86
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'test' })) {
|
|
87
|
+
events.push(event);
|
|
88
|
+
}
|
|
89
|
+
expect(events[0].type).toBe('error');
|
|
90
|
+
expect(events[0].content).toContain('Rate limited');
|
|
91
|
+
});
|
|
92
|
+
it('cleans up on endSession', async () => {
|
|
93
|
+
const handle = await provider.startSession();
|
|
94
|
+
await provider.endSession(handle);
|
|
95
|
+
// Verify internal maps are cleaned
|
|
96
|
+
const history = provider.messageHistory;
|
|
97
|
+
const models = provider.sessionModels;
|
|
98
|
+
expect(history.has(handle.sessionId)).toBe(false);
|
|
99
|
+
expect(models.has(handle.sessionId)).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('caps message history at 50', async () => {
|
|
102
|
+
const handle = await provider.startSession();
|
|
103
|
+
const client = provider.client;
|
|
104
|
+
// Simulate 30 turns (60 messages)
|
|
105
|
+
for (let i = 0; i < 30; i++) {
|
|
106
|
+
client.messages.stream.mockReturnValue(createMockStream(`r${i}`));
|
|
107
|
+
for await (const _ of provider.sendTurn(handle, { userMessage: `m${i}` })) { /* consume */ }
|
|
108
|
+
}
|
|
109
|
+
const history = provider.messageHistory;
|
|
110
|
+
expect(history.get(handle.sessionId).length).toBeLessThanOrEqual(50);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=anthropic-api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-api.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/anthropic-api.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.test.d.ts","sourceRoot":"","sources":["../../../src/providers/__tests__/claude-sdk.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { ClaudeSDKProvider } from '../claude-sdk.js';
|
|
3
|
+
// Mock the Agent SDK — query() returns an async generator
|
|
4
|
+
vi.mock('@anthropic-ai/claude-agent-sdk', () => ({
|
|
5
|
+
query: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
8
|
+
const mockQuery = vi.mocked(query);
|
|
9
|
+
function createMockQuery(messages) {
|
|
10
|
+
const gen = (async function* () {
|
|
11
|
+
for (const msg of messages)
|
|
12
|
+
yield msg;
|
|
13
|
+
})();
|
|
14
|
+
return Object.assign(gen, {
|
|
15
|
+
close: vi.fn(),
|
|
16
|
+
interrupt: vi.fn(),
|
|
17
|
+
rewindFiles: vi.fn(),
|
|
18
|
+
setPermissionMode: vi.fn(),
|
|
19
|
+
setModel: vi.fn(),
|
|
20
|
+
initializationResult: vi.fn(),
|
|
21
|
+
supportedCommands: vi.fn(),
|
|
22
|
+
supportedModels: vi.fn(),
|
|
23
|
+
supportedAgents: vi.fn(),
|
|
24
|
+
mcpServerStatus: vi.fn(),
|
|
25
|
+
reconnectMcpServer: vi.fn(),
|
|
26
|
+
toggleMcpServer: vi.fn(),
|
|
27
|
+
setMcpServers: vi.fn(),
|
|
28
|
+
streamInput: vi.fn(),
|
|
29
|
+
stopTask: vi.fn(),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
describe('ClaudeSDKProvider', () => {
|
|
33
|
+
let provider;
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
provider = new ClaudeSDKProvider();
|
|
37
|
+
});
|
|
38
|
+
it('starts a session with sdk- prefix ID', async () => {
|
|
39
|
+
const handle = await provider.startSession();
|
|
40
|
+
expect(handle.sessionId).toMatch(/^sdk-/);
|
|
41
|
+
});
|
|
42
|
+
it('resumes a session preserving provider ID', async () => {
|
|
43
|
+
const handle = await provider.resumeSession('prev-session-123');
|
|
44
|
+
expect(handle.providerSessionId).toBe('prev-session-123');
|
|
45
|
+
});
|
|
46
|
+
it('streams text events from assistant messages', async () => {
|
|
47
|
+
const q = createMockQuery([
|
|
48
|
+
{ type: 'system', session_id: 'real-id-123' },
|
|
49
|
+
{
|
|
50
|
+
type: 'assistant',
|
|
51
|
+
message: {
|
|
52
|
+
content: [{ type: 'text', text: 'Hello world' }],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{ type: 'result', subtype: 'success', result: 'Done', total_cost_usd: 0.01 },
|
|
56
|
+
]);
|
|
57
|
+
mockQuery.mockReturnValue(q);
|
|
58
|
+
const handle = await provider.startSession();
|
|
59
|
+
const events = [];
|
|
60
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'hi' })) {
|
|
61
|
+
events.push(event);
|
|
62
|
+
}
|
|
63
|
+
expect(events).toContainEqual({ type: 'text', content: 'Hello world' });
|
|
64
|
+
expect(events.find((e) => e.type === 'done')).toBeDefined();
|
|
65
|
+
expect(handle.providerSessionId).toBe('real-id-123');
|
|
66
|
+
});
|
|
67
|
+
it('streams tool_use events', async () => {
|
|
68
|
+
const q = createMockQuery([
|
|
69
|
+
{
|
|
70
|
+
type: 'assistant',
|
|
71
|
+
message: {
|
|
72
|
+
content: [{ type: 'tool_use', name: 'Read', id: 'tool-1', input: { file: 'foo.ts' } }],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{ type: 'result', subtype: 'success', result: '' },
|
|
76
|
+
]);
|
|
77
|
+
mockQuery.mockReturnValue(q);
|
|
78
|
+
const handle = await provider.startSession();
|
|
79
|
+
const events = [];
|
|
80
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'read foo' })) {
|
|
81
|
+
events.push(event);
|
|
82
|
+
}
|
|
83
|
+
const toolEvent = events.find((e) => e.type === 'tool_use');
|
|
84
|
+
expect(toolEvent).toBeDefined();
|
|
85
|
+
expect(toolEvent.content).toContain('Read');
|
|
86
|
+
});
|
|
87
|
+
it('handles error results', async () => {
|
|
88
|
+
const q = createMockQuery([
|
|
89
|
+
{ type: 'result', subtype: 'error_api', errors: ['API rate limited'] },
|
|
90
|
+
]);
|
|
91
|
+
mockQuery.mockReturnValue(q);
|
|
92
|
+
const handle = await provider.startSession();
|
|
93
|
+
const events = [];
|
|
94
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'test' })) {
|
|
95
|
+
events.push(event);
|
|
96
|
+
}
|
|
97
|
+
expect(events.find((e) => e.type === 'error')).toBeDefined();
|
|
98
|
+
});
|
|
99
|
+
it('yields error when query() throws', async () => {
|
|
100
|
+
mockQuery.mockImplementation(() => { throw new Error('SDK unavailable'); });
|
|
101
|
+
const handle = await provider.startSession();
|
|
102
|
+
const events = [];
|
|
103
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'test' })) {
|
|
104
|
+
events.push(event);
|
|
105
|
+
}
|
|
106
|
+
expect(events[0].type).toBe('error');
|
|
107
|
+
expect(events[0].content).toContain('SDK unavailable');
|
|
108
|
+
});
|
|
109
|
+
it('cleans up on endSession', async () => {
|
|
110
|
+
const q = createMockQuery([]);
|
|
111
|
+
mockQuery.mockReturnValue(q);
|
|
112
|
+
const handle = await provider.startSession();
|
|
113
|
+
// Consume the turn to register the query
|
|
114
|
+
for await (const _event of provider.sendTurn(handle, { userMessage: 'x' })) {
|
|
115
|
+
// consume
|
|
116
|
+
}
|
|
117
|
+
await provider.endSession(handle);
|
|
118
|
+
// Should not throw
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=claude-sdk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/claude-sdk.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-api.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,cAAc,CAA6E;gBAEvF,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAOhD,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-api.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,cAAc,CAA6E;gBAEvF,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAOhD,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQ5D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,aAAa,CAAC;IASlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;IAoErB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvD"}
|
|
@@ -15,6 +15,7 @@ export class AnthropicAPIProvider {
|
|
|
15
15
|
client;
|
|
16
16
|
defaultModel;
|
|
17
17
|
sessionModels = new Map();
|
|
18
|
+
sessionMaxTokens = new Map();
|
|
18
19
|
messageHistory = new Map();
|
|
19
20
|
constructor(opts) {
|
|
20
21
|
this.client = new Anthropic({
|
|
@@ -27,45 +28,49 @@ export class AnthropicAPIProvider {
|
|
|
27
28
|
this.messageHistory.set(sessionId, []);
|
|
28
29
|
if (opts.model)
|
|
29
30
|
this.sessionModels.set(sessionId, opts.model);
|
|
31
|
+
if (opts.maxOutputTokens != null)
|
|
32
|
+
this.sessionMaxTokens.set(sessionId, opts.maxOutputTokens);
|
|
30
33
|
return { sessionId };
|
|
31
34
|
}
|
|
32
35
|
async resumeSession(providerSessionId, opts = {}) {
|
|
33
36
|
if (opts.model)
|
|
34
37
|
this.sessionModels.set(providerSessionId, opts.model);
|
|
38
|
+
if (opts.maxOutputTokens != null)
|
|
39
|
+
this.sessionMaxTokens.set(providerSessionId, opts.maxOutputTokens);
|
|
35
40
|
if (!this.messageHistory.has(providerSessionId)) {
|
|
36
41
|
this.messageHistory.set(providerSessionId, []);
|
|
37
42
|
}
|
|
38
43
|
return { sessionId: providerSessionId, providerSessionId };
|
|
39
44
|
}
|
|
40
45
|
async *sendTurn(handle, input) {
|
|
41
|
-
// Build
|
|
42
|
-
let
|
|
46
|
+
// Build dynamic system prompt with context
|
|
47
|
+
let systemPrompt = input.systemPrompt || 'You are a helpful coding assistant with deep project context.';
|
|
43
48
|
if (input.contextPack && hasContent(input.contextPack)) {
|
|
44
49
|
const contextStr = formatContextPack(input.contextPack);
|
|
45
50
|
if (contextStr) {
|
|
46
|
-
|
|
51
|
+
systemPrompt = `${systemPrompt}\n\n${contextStr}`;
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
// Get or create message history (cap at 50 messages to prevent unbounded growth)
|
|
50
55
|
const MAX_HISTORY = 50;
|
|
56
|
+
const TRIM_TARGET = 40; // Trim to 40 so we don't re-trim every turn at cap
|
|
51
57
|
let history = this.messageHistory.get(handle.sessionId) || [];
|
|
52
58
|
if (history.length >= MAX_HISTORY) {
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// Ensure trimmed history starts with a user message (even indices are user)
|
|
57
|
-
if (startIdx >= 0 && history[startIdx]?.role !== 'user') {
|
|
59
|
+
// Trim to TRIM_TARGET, ensure we start on a user message
|
|
60
|
+
let startIdx = history.length - TRIM_TARGET;
|
|
61
|
+
while (startIdx < history.length && history[startIdx]?.role !== 'user') {
|
|
58
62
|
startIdx++;
|
|
59
63
|
}
|
|
60
64
|
history = history.slice(startIdx);
|
|
65
|
+
this.messageHistory.set(handle.sessionId, history);
|
|
61
66
|
}
|
|
62
|
-
|
|
67
|
+
// Store only raw user message in history (no context injection)
|
|
68
|
+
history.push({ role: 'user', content: input.userMessage });
|
|
63
69
|
try {
|
|
64
|
-
// Stream the response
|
|
65
70
|
const stream = this.client.messages.stream({
|
|
66
71
|
model: this.sessionModels.get(handle.sessionId) || this.defaultModel,
|
|
67
|
-
max_tokens: 4096,
|
|
68
|
-
system:
|
|
72
|
+
max_tokens: this.sessionMaxTokens.get(handle.sessionId) || 4096,
|
|
73
|
+
system: systemPrompt,
|
|
69
74
|
messages: history,
|
|
70
75
|
});
|
|
71
76
|
let fullResponse = '';
|
|
@@ -100,6 +105,7 @@ export class AnthropicAPIProvider {
|
|
|
100
105
|
async endSession(handle) {
|
|
101
106
|
this.messageHistory.delete(handle.sessionId);
|
|
102
107
|
this.sessionModels.delete(handle.sessionId);
|
|
108
|
+
this.sessionMaxTokens.delete(handle.sessionId);
|
|
103
109
|
}
|
|
104
110
|
}
|
|
105
111
|
//# sourceMappingURL=anthropic-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-api.js","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AASvD;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,eAAe,CAAC;IACxB,MAAM,CAAY;IAClB,YAAY,CAAS;IACrB,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,cAAc,GAAG,IAAI,GAAG,EAAkE,CAAC;IAEnG,YAAY,IAA0C;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,KAAK,IAAI,0BAA0B,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE;QACvC,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,iBAAyB,EACzB,OAAoB,EAAE;QAEtB,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,CAAC,QAAQ,CACb,MAAqB,EACrB,KAAgB;QAEhB,
|
|
1
|
+
{"version":3,"file":"anthropic-api.js","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAEvB,YAAY,CAAC,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAM7D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,GAAE,WAAgB,GACtB,OAAO,CAAC,aAAa,CAAC;IAOlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAEvB,YAAY,CAAC,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAM7D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,GAAE,WAAgB,GACtB,OAAO,CAAC,aAAa,CAAC;IAOlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;IA0CrB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxD"}
|