@sdsrs/codeagent 0.1.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 +21 -0
- package/README.md +116 -0
- package/dist/adapters/code-graph.d.ts +18 -0
- package/dist/adapters/code-graph.d.ts.map +1 -0
- package/dist/adapters/code-graph.js +151 -0
- package/dist/adapters/code-graph.js.map +1 -0
- package/dist/adapters/memory.d.ts +13 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +110 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/orchestration/gsd.d.ts +20 -0
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -0
- package/dist/adapters/orchestration/gsd.js +78 -0
- package/dist/adapters/orchestration/gsd.js.map +1 -0
- package/dist/adapters/orchestration/interface.d.ts +32 -0
- package/dist/adapters/orchestration/interface.d.ts.map +1 -0
- package/dist/adapters/orchestration/interface.js +2 -0
- package/dist/adapters/orchestration/interface.js.map +1 -0
- package/dist/adapters/orchestration/superpowers.d.ts +33 -0
- package/dist/adapters/orchestration/superpowers.d.ts.map +1 -0
- package/dist/adapters/orchestration/superpowers.js +117 -0
- package/dist/adapters/orchestration/superpowers.js.map +1 -0
- package/dist/broker/broker.d.ts +40 -0
- package/dist/broker/broker.d.ts.map +1 -0
- package/dist/broker/broker.js +181 -0
- package/dist/broker/broker.js.map +1 -0
- package/dist/broker/compressor.d.ts +7 -0
- package/dist/broker/compressor.d.ts.map +1 -0
- package/dist/broker/compressor.js +61 -0
- package/dist/broker/compressor.js.map +1 -0
- package/dist/broker/context-pack.d.ts +126 -0
- package/dist/broker/context-pack.d.ts.map +1 -0
- package/dist/broker/context-pack.js +103 -0
- package/dist/broker/context-pack.js.map +1 -0
- package/dist/broker/query-parser.d.ts +17 -0
- package/dist/broker/query-parser.d.ts.map +1 -0
- package/dist/broker/query-parser.js +127 -0
- package/dist/broker/query-parser.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +264 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +94 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +10 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +52 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/search.d.ts +9 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +45 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/session.d.ts +9 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +86 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +77 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/renderer.d.ts +47 -0
- package/dist/cli/tui/renderer.d.ts.map +1 -0
- package/dist/cli/tui/renderer.js +237 -0
- package/dist/cli/tui/renderer.js.map +1 -0
- package/dist/hooks/session-start.d.ts +11 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +51 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/stop.d.ts +11 -0
- package/dist/hooks/stop.d.ts.map +1 -0
- package/dist/hooks/stop.js +93 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/hooks/user-prompt.d.ts +12 -0
- package/dist/hooks/user-prompt.d.ts.map +1 -0
- package/dist/hooks/user-prompt.js +46 -0
- package/dist/hooks/user-prompt.js.map +1 -0
- package/dist/providers/anthropic-api.d.ts +25 -0
- package/dist/providers/anthropic-api.d.ts.map +1 -0
- package/dist/providers/anthropic-api.js +93 -0
- package/dist/providers/anthropic-api.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +16 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +72 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/claude-sdk.d.ts +18 -0
- package/dist/providers/claude-sdk.d.ts.map +1 -0
- package/dist/providers/claude-sdk.js +141 -0
- package/dist/providers/claude-sdk.js.map +1 -0
- package/dist/providers/interface.d.ts +36 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +2 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/scripts/install-hooks.d.ts +11 -0
- package/dist/scripts/install-hooks.d.ts.map +1 -0
- package/dist/scripts/install-hooks.js +86 -0
- package/dist/scripts/install-hooks.js.map +1 -0
- package/dist/session/manager.d.ts +65 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +143 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/schema.d.ts +7 -0
- package/dist/session/schema.d.ts.map +1 -0
- package/dist/session/schema.js +82 -0
- package/dist/session/schema.js.map +1 -0
- package/dist/utils/exec.d.ts +20 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +28 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/tokens.d.ts +12 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +38 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +90 -0
- package/src/skills/brainstorm.md +33 -0
- package/src/skills/review.md +41 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// --- ANSI color codes ---
|
|
2
|
+
const RESET = '\x1b[0m';
|
|
3
|
+
const BOLD = '\x1b[1m';
|
|
4
|
+
const DIM = '\x1b[2m';
|
|
5
|
+
const ITALIC = '\x1b[3m';
|
|
6
|
+
const CYAN = '\x1b[36m';
|
|
7
|
+
const GREEN = '\x1b[32m';
|
|
8
|
+
const YELLOW = '\x1b[33m';
|
|
9
|
+
const RED = '\x1b[31m';
|
|
10
|
+
const MAGENTA = '\x1b[35m';
|
|
11
|
+
const BLUE = '\x1b[34m';
|
|
12
|
+
const WHITE = '\x1b[37m';
|
|
13
|
+
const BG_DIM = '\x1b[48;5;236m';
|
|
14
|
+
// --- Spinner ---
|
|
15
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
16
|
+
// --- Stage icons ---
|
|
17
|
+
const STAGE_ICONS = {
|
|
18
|
+
brainstorm: '💡',
|
|
19
|
+
plan: '📋',
|
|
20
|
+
implement: '⚡',
|
|
21
|
+
review: '🔍',
|
|
22
|
+
debug: '🐛',
|
|
23
|
+
general: '💬',
|
|
24
|
+
};
|
|
25
|
+
export class TuiRenderer {
|
|
26
|
+
spinnerInterval = null;
|
|
27
|
+
spinnerFrame = 0;
|
|
28
|
+
currentStage = null;
|
|
29
|
+
totalCost = 0;
|
|
30
|
+
turnCount = 0;
|
|
31
|
+
/** Render the welcome banner */
|
|
32
|
+
banner() {
|
|
33
|
+
console.log(`${BOLD}${CYAN}
|
|
34
|
+
╔═══════════════════════════════════╗
|
|
35
|
+
║ CodeAgent v0.1.0 ║
|
|
36
|
+
║ Context-Aware Coding Assistant ║
|
|
37
|
+
╚═══════════════════════════════════╝${RESET}
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
/** Show the prompt for user input */
|
|
41
|
+
prompt() {
|
|
42
|
+
const icon = this.currentStage
|
|
43
|
+
? STAGE_ICONS[this.currentStage] || '💬'
|
|
44
|
+
: '💬';
|
|
45
|
+
const stageTag = this.currentStage
|
|
46
|
+
? `${DIM}[${this.currentStage}]${RESET} `
|
|
47
|
+
: '';
|
|
48
|
+
process.stdout.write(`${stageTag}${icon} ${BOLD}${GREEN}> ${RESET}`);
|
|
49
|
+
}
|
|
50
|
+
/** Start a thinking spinner */
|
|
51
|
+
startSpinner(label = 'Thinking') {
|
|
52
|
+
this.stopSpinner();
|
|
53
|
+
this.spinnerFrame = 0;
|
|
54
|
+
this.spinnerInterval = setInterval(() => {
|
|
55
|
+
const frame = SPINNER_FRAMES[this.spinnerFrame % SPINNER_FRAMES.length];
|
|
56
|
+
process.stdout.write(`\r${CYAN}${frame}${RESET} ${DIM}${label}...${RESET}`);
|
|
57
|
+
this.spinnerFrame++;
|
|
58
|
+
}, 80);
|
|
59
|
+
}
|
|
60
|
+
/** Stop the spinner */
|
|
61
|
+
stopSpinner() {
|
|
62
|
+
if (this.spinnerInterval) {
|
|
63
|
+
clearInterval(this.spinnerInterval);
|
|
64
|
+
this.spinnerInterval = null;
|
|
65
|
+
process.stdout.write('\r\x1b[K'); // Clear line
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Render a turn event from the provider */
|
|
69
|
+
renderEvent(event) {
|
|
70
|
+
switch (event.type) {
|
|
71
|
+
case 'text':
|
|
72
|
+
process.stdout.write(renderMarkdownInline(event.content));
|
|
73
|
+
break;
|
|
74
|
+
case 'tool_use': {
|
|
75
|
+
const toolName = event.metadata?.tool || 'tool';
|
|
76
|
+
console.log(`\n${YELLOW}▸ [${toolName}]${RESET} ${DIM}${truncate(event.content, 150)}${RESET}`);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'tool_result':
|
|
80
|
+
if (event.content) {
|
|
81
|
+
console.log(`${DIM} ${truncate(event.content, 200)}${RESET}`);
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case 'stage_change':
|
|
85
|
+
this.currentStage = event.content;
|
|
86
|
+
const icon = STAGE_ICONS[event.content] || '◆';
|
|
87
|
+
console.log(`\n${MAGENTA}${icon} Stage → ${BOLD}${event.content}${RESET}`);
|
|
88
|
+
break;
|
|
89
|
+
case 'error':
|
|
90
|
+
console.log(`\n${RED}✗ Error: ${event.content}${RESET}`);
|
|
91
|
+
break;
|
|
92
|
+
case 'done': {
|
|
93
|
+
this.turnCount++;
|
|
94
|
+
const cost = event.metadata?.cost;
|
|
95
|
+
if (cost && typeof cost === 'number') {
|
|
96
|
+
this.totalCost += cost;
|
|
97
|
+
}
|
|
98
|
+
const inputTokens = event.metadata?.inputTokens;
|
|
99
|
+
const outputTokens = event.metadata?.outputTokens;
|
|
100
|
+
const parts = [];
|
|
101
|
+
if (cost && typeof cost === 'number')
|
|
102
|
+
parts.push(`$${cost.toFixed(4)}`);
|
|
103
|
+
if (inputTokens)
|
|
104
|
+
parts.push(`in:${inputTokens}`);
|
|
105
|
+
if (outputTokens)
|
|
106
|
+
parts.push(`out:${outputTokens}`);
|
|
107
|
+
if (parts.length > 0) {
|
|
108
|
+
console.log(`\n${DIM}[${parts.join(' | ')}]${RESET}`);
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Render context injection indicator */
|
|
115
|
+
contextIndicator(pack) {
|
|
116
|
+
const parts = [];
|
|
117
|
+
if (pack.relevantFiles.length > 0)
|
|
118
|
+
parts.push(`${pack.relevantFiles.length} files`);
|
|
119
|
+
if (pack.relatedSymbols.length > 0)
|
|
120
|
+
parts.push(`${pack.relatedSymbols.length} symbols`);
|
|
121
|
+
if (pack.priorMemories.length > 0)
|
|
122
|
+
parts.push(`${pack.priorMemories.length} memories`);
|
|
123
|
+
if (pack.bugWarnings.length > 0)
|
|
124
|
+
parts.push(`${RED}${pack.bugWarnings.length} bugs${CYAN}`);
|
|
125
|
+
if (pack.pendingTasks.length > 0)
|
|
126
|
+
parts.push(`${pack.pendingTasks.length} tasks`);
|
|
127
|
+
if (parts.length > 0) {
|
|
128
|
+
console.log(`${CYAN}◈ Context: ${parts.join(', ')}${RESET}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** Render a stage panel with pending tasks */
|
|
132
|
+
stagePanel(stage, tasks, specTitle) {
|
|
133
|
+
const icon = STAGE_ICONS[stage] || '◆';
|
|
134
|
+
const width = 40;
|
|
135
|
+
const line = '─'.repeat(width);
|
|
136
|
+
console.log(`${DIM}┌${line}┐${RESET}`);
|
|
137
|
+
console.log(`${DIM}│${RESET} ${icon} ${BOLD}${stage.toUpperCase()}${RESET}${' '.repeat(Math.max(0, width - stage.length - 3))}${DIM}│${RESET}`);
|
|
138
|
+
if (specTitle) {
|
|
139
|
+
const truncSpec = truncate(specTitle, width - 4);
|
|
140
|
+
console.log(`${DIM}│${RESET} ${ITALIC}${truncSpec}${RESET}${' '.repeat(Math.max(0, width - truncSpec.length - 3))}${DIM}│${RESET}`);
|
|
141
|
+
}
|
|
142
|
+
if (tasks.length > 0) {
|
|
143
|
+
console.log(`${DIM}│${' '.repeat(width)}│${RESET}`);
|
|
144
|
+
for (const t of tasks.slice(0, 5)) {
|
|
145
|
+
const statusIcon = t.status === 'completed' ? `${GREEN}✓${RESET}` :
|
|
146
|
+
t.status === 'in_progress' ? `${YELLOW}▸${RESET}` : `${DIM}○${RESET}`;
|
|
147
|
+
const taskLine = `${statusIcon} ${truncate(t.title, width - 6)}`;
|
|
148
|
+
// Approximate visible length (ignoring ANSI codes)
|
|
149
|
+
console.log(`${DIM}│${RESET} ${taskLine}${DIM} │${RESET}`);
|
|
150
|
+
}
|
|
151
|
+
if (tasks.length > 5) {
|
|
152
|
+
console.log(`${DIM}│ +${tasks.length - 5} more${' '.repeat(Math.max(0, width - 10))}│${RESET}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
console.log(`${DIM}└${line}┘${RESET}`);
|
|
156
|
+
}
|
|
157
|
+
/** Render session info */
|
|
158
|
+
sessionInfo(info) {
|
|
159
|
+
console.log(`${DIM}Session: ${info.id}${RESET}`);
|
|
160
|
+
if (info.title)
|
|
161
|
+
console.log(`${DIM}Title: ${info.title}${RESET}`);
|
|
162
|
+
if (info.stage) {
|
|
163
|
+
this.currentStage = info.stage;
|
|
164
|
+
const icon = STAGE_ICONS[info.stage] || '◆';
|
|
165
|
+
console.log(`${DIM}Stage: ${icon} ${info.stage}${RESET}`);
|
|
166
|
+
}
|
|
167
|
+
if (info.provider)
|
|
168
|
+
console.log(`${DIM}Provider: ${info.provider}${RESET}`);
|
|
169
|
+
console.log();
|
|
170
|
+
}
|
|
171
|
+
/** Render cost summary */
|
|
172
|
+
costSummary() {
|
|
173
|
+
if (this.totalCost > 0) {
|
|
174
|
+
console.log(`${DIM}Total: ${this.turnCount} turns, $${this.totalCost.toFixed(4)}${RESET}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Render the help message */
|
|
178
|
+
help() {
|
|
179
|
+
console.log(`
|
|
180
|
+
${BOLD}Commands:${RESET}
|
|
181
|
+
${GREEN}/quit${RESET}, ${GREEN}/exit${RESET}, ${GREEN}/q${RESET} — End session
|
|
182
|
+
${GREEN}/status${RESET} — Show session info
|
|
183
|
+
${GREEN}/stage${RESET} — Show current stage
|
|
184
|
+
${GREEN}/cost${RESET} — Show cost summary
|
|
185
|
+
${GREEN}/context${RESET} — Show last injected context
|
|
186
|
+
${GREEN}/help${RESET} — Show this help
|
|
187
|
+
|
|
188
|
+
${BOLD}Stage Shortcuts:${RESET}
|
|
189
|
+
${MAGENTA}/brainstorm${RESET} — Switch to brainstorm mode
|
|
190
|
+
${MAGENTA}/plan${RESET} — Switch to planning mode
|
|
191
|
+
${MAGENTA}/implement${RESET} — Switch to implementation mode
|
|
192
|
+
${MAGENTA}/review${RESET} — Switch to review mode
|
|
193
|
+
${MAGENTA}/debug${RESET} — Switch to debug mode
|
|
194
|
+
`);
|
|
195
|
+
}
|
|
196
|
+
/** Render a system message */
|
|
197
|
+
system(msg) {
|
|
198
|
+
console.log(`${BLUE}ℹ ${msg}${RESET}`);
|
|
199
|
+
}
|
|
200
|
+
/** Render an error message */
|
|
201
|
+
error(msg) {
|
|
202
|
+
console.error(`${RED}✗ ${msg}${RESET}`);
|
|
203
|
+
}
|
|
204
|
+
/** Render a success message */
|
|
205
|
+
success(msg) {
|
|
206
|
+
console.log(`${GREEN}✓ ${msg}${RESET}`);
|
|
207
|
+
}
|
|
208
|
+
/** Render a warning message */
|
|
209
|
+
warn(msg) {
|
|
210
|
+
console.log(`${YELLOW}⚠ ${msg}${RESET}`);
|
|
211
|
+
}
|
|
212
|
+
/** Set the current stage */
|
|
213
|
+
setStage(stage) {
|
|
214
|
+
this.currentStage = stage;
|
|
215
|
+
}
|
|
216
|
+
/** Cleanup */
|
|
217
|
+
cleanup() {
|
|
218
|
+
this.stopSpinner();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// --- Helpers ---
|
|
222
|
+
function truncate(str, max) {
|
|
223
|
+
if (str.length <= max)
|
|
224
|
+
return str;
|
|
225
|
+
return str.slice(0, max - 3) + '...';
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Basic inline markdown rendering for terminal:
|
|
229
|
+
* **bold** → BOLD, `code` → highlighted, _italic_ → italic
|
|
230
|
+
*/
|
|
231
|
+
function renderMarkdownInline(text) {
|
|
232
|
+
return text
|
|
233
|
+
.replace(/\*\*(.+?)\*\*/g, `${BOLD}$1${RESET}`)
|
|
234
|
+
.replace(/`([^`]+)`/g, `${BG_DIM}${WHITE} $1 ${RESET}`)
|
|
235
|
+
.replace(/(?<!\w)_(.+?)_(?!\w)/g, `${ITALIC}$1${RESET}`);
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/cli/tui/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SessionStart hook — inject repo overview + active state at session start.
|
|
4
|
+
*
|
|
5
|
+
* Input: none (no stdin for SessionStart)
|
|
6
|
+
* Output: stdout plain text
|
|
7
|
+
*
|
|
8
|
+
* Runs once per session. Can be slower than UserPromptSubmit (5s budget).
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=session-start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SessionStart hook — inject repo overview + active state at session start.
|
|
4
|
+
*
|
|
5
|
+
* Input: none (no stdin for SessionStart)
|
|
6
|
+
* Output: stdout plain text
|
|
7
|
+
*
|
|
8
|
+
* Runs once per session. Can be slower than UserPromptSubmit (5s budget).
|
|
9
|
+
*/
|
|
10
|
+
import { ContextBroker } from '../broker/broker.js';
|
|
11
|
+
import { execQuiet } from '../utils/exec.js';
|
|
12
|
+
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
13
|
+
async function main() {
|
|
14
|
+
const repoRoot = process.cwd();
|
|
15
|
+
const broker = new ContextBroker(repoRoot);
|
|
16
|
+
// Get session context (repo map + orchestration state)
|
|
17
|
+
const pack = await broker.buildSessionContext();
|
|
18
|
+
// Also get recent memory summary
|
|
19
|
+
const recentMem = execQuiet('claude-mem-lite search "" --limit 5', { timeout: 2000 });
|
|
20
|
+
const sections = [];
|
|
21
|
+
// Repo overview
|
|
22
|
+
if (pack.repoSummary) {
|
|
23
|
+
sections.push(`## Project Overview\n${truncateToTokenBudget(pack.repoSummary, 500)}`);
|
|
24
|
+
}
|
|
25
|
+
// Active orchestration state
|
|
26
|
+
const orchLines = [];
|
|
27
|
+
if (pack.currentStage)
|
|
28
|
+
orchLines.push(`- Current Stage: ${pack.currentStage}`);
|
|
29
|
+
if (pack.activeSpec)
|
|
30
|
+
orchLines.push(`- Active Spec: ${pack.activeSpec.title}`);
|
|
31
|
+
if (pack.pendingTasks.length > 0) {
|
|
32
|
+
orchLines.push(`- Pending Tasks:`);
|
|
33
|
+
for (const t of pack.pendingTasks.slice(0, 5)) {
|
|
34
|
+
orchLines.push(` - [${t.status}] ${t.title}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (orchLines.length > 0) {
|
|
38
|
+
sections.push(`## Active Work\n${orchLines.join('\n')}`);
|
|
39
|
+
}
|
|
40
|
+
// Recent memories
|
|
41
|
+
if (recentMem) {
|
|
42
|
+
sections.push(`## Recent Memory\n${truncateToTokenBudget(recentMem, 300)}`);
|
|
43
|
+
}
|
|
44
|
+
if (sections.length > 0) {
|
|
45
|
+
process.stdout.write(`<codeagent-session>\n${sections.join('\n\n')}\n</codeagent-session>`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
main().catch(() => {
|
|
49
|
+
process.exit(0);
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=session-start.js.map
|
|
@@ -0,0 +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,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,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,uDAAuD;IACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAEhD,iCAAiC;IACjC,MAAM,SAAS,GAAG,SAAS,CACzB,qCAAqC,EACrC,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;IAEF,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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Stop hook — extract key discoveries from the session and save to memory.
|
|
4
|
+
*
|
|
5
|
+
* Input: stdin JSON { stop_hook_active: boolean, transcript_summary?: string }
|
|
6
|
+
* Output: none (writes to memory, no stdout)
|
|
7
|
+
*
|
|
8
|
+
* Extracts: file modifications, error resolutions, architecture decisions.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Stop hook — extract key discoveries from the session and save to memory.
|
|
4
|
+
*
|
|
5
|
+
* Input: stdin JSON { stop_hook_active: boolean, transcript_summary?: string }
|
|
6
|
+
* Output: none (writes to memory, no stdout)
|
|
7
|
+
*
|
|
8
|
+
* Extracts: file modifications, error resolutions, architecture decisions.
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import { execSafe } from '../utils/exec.js';
|
|
12
|
+
async function main() {
|
|
13
|
+
// Read input from stdin
|
|
14
|
+
let input;
|
|
15
|
+
try {
|
|
16
|
+
const raw = fs.readFileSync('/dev/stdin', 'utf8');
|
|
17
|
+
input = JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
const summary = input.transcript_summary;
|
|
23
|
+
if (!summary || summary.length < 50) {
|
|
24
|
+
// Not enough content to extract memories
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
// Extract potential memories using simple heuristics
|
|
28
|
+
const memories = extractMemories(summary);
|
|
29
|
+
// Save each memory
|
|
30
|
+
for (const mem of memories) {
|
|
31
|
+
execSafe(`claude-mem-lite save --type "${mem.type}" --title "${escapeShell(mem.title)}" --body "${escapeShell(mem.body)}"`, { timeout: 3000 });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function extractMemories(summary) {
|
|
35
|
+
const memories = [];
|
|
36
|
+
// Detect bug fixes
|
|
37
|
+
const bugPatterns = [
|
|
38
|
+
/(?:fixed|resolved|debugged|solved)\s+(.+?)(?:\.|$)/gi,
|
|
39
|
+
/(?:bug|error|issue)\s*(?:was|:)\s*(.+?)(?:\.|$)/gi,
|
|
40
|
+
/(?:修复|解决|排查)\s*[了]?\s*(.+?)(?:。|$)/gi,
|
|
41
|
+
];
|
|
42
|
+
for (const pattern of bugPatterns) {
|
|
43
|
+
const match = pattern.exec(summary);
|
|
44
|
+
if (match?.[1]) {
|
|
45
|
+
memories.push({
|
|
46
|
+
type: 'bugfix',
|
|
47
|
+
title: match[1].trim().slice(0, 100),
|
|
48
|
+
body: `Extracted from session summary: ${match[0].trim()}`,
|
|
49
|
+
});
|
|
50
|
+
break; // One bug memory per session max
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Detect architecture decisions
|
|
54
|
+
const decisionPatterns = [
|
|
55
|
+
/(?:decided|chose|selected|went with)\s+(.+?)(?:\.|$)/gi,
|
|
56
|
+
/(?:决定|选择|采用)\s*[了]?\s*(.+?)(?:。|$)/gi,
|
|
57
|
+
];
|
|
58
|
+
for (const pattern of decisionPatterns) {
|
|
59
|
+
const match = pattern.exec(summary);
|
|
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
|
+
});
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Detect discoveries
|
|
70
|
+
const discoveryPatterns = [
|
|
71
|
+
/(?:discovered|found out|learned|realized)\s+(.+?)(?:\.|$)/gi,
|
|
72
|
+
/(?:发现|了解到|学到)\s*[了]?\s*(.+?)(?:。|$)/gi,
|
|
73
|
+
];
|
|
74
|
+
for (const pattern of discoveryPatterns) {
|
|
75
|
+
const match = pattern.exec(summary);
|
|
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
|
+
});
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return memories;
|
|
86
|
+
}
|
|
87
|
+
function escapeShell(str) {
|
|
88
|
+
return str.replace(/["\\$`!]/g, '\\$&').replace(/\n/g, ' ');
|
|
89
|
+
}
|
|
90
|
+
main().catch(() => {
|
|
91
|
+
process.exit(0);
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* UserPromptSubmit hook — the core hook for CodeAgent.
|
|
4
|
+
*
|
|
5
|
+
* Input: stdin JSON { message: string }
|
|
6
|
+
* Output: stdout plain text (injected into Claude Code prompt)
|
|
7
|
+
*
|
|
8
|
+
* Pipeline: parse query → Context Broker → format → output
|
|
9
|
+
* Total execution time target: < 3s
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=user-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt.d.ts","sourceRoot":"","sources":["../../src/hooks/user-prompt.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* UserPromptSubmit hook — the core hook for CodeAgent.
|
|
4
|
+
*
|
|
5
|
+
* Input: stdin JSON { message: string }
|
|
6
|
+
* Output: stdout plain text (injected into Claude Code prompt)
|
|
7
|
+
*
|
|
8
|
+
* Pipeline: parse query → Context Broker → format → output
|
|
9
|
+
* Total execution time target: < 3s
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import { ContextBroker, formatContextPack } from '../broker/broker.js';
|
|
13
|
+
import { hasContent } from '../broker/context-pack.js';
|
|
14
|
+
async function main() {
|
|
15
|
+
// Read user message from stdin
|
|
16
|
+
let message;
|
|
17
|
+
try {
|
|
18
|
+
const raw = fs.readFileSync('/dev/stdin', 'utf8');
|
|
19
|
+
const input = JSON.parse(raw);
|
|
20
|
+
message = input?.message || '';
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
if (!message || message.trim().length < 8) {
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
// Build context pack
|
|
29
|
+
const broker = new ContextBroker(process.cwd());
|
|
30
|
+
const pack = await broker.buildContextPack({
|
|
31
|
+
repoRoot: process.cwd(),
|
|
32
|
+
userQuery: message,
|
|
33
|
+
});
|
|
34
|
+
// Output if there's content
|
|
35
|
+
if (hasContent(pack)) {
|
|
36
|
+
const formatted = formatContextPack(pack);
|
|
37
|
+
if (formatted) {
|
|
38
|
+
process.stdout.write(formatted);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
main().catch(() => {
|
|
43
|
+
// Silent failure — never block the user
|
|
44
|
+
process.exit(0);
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=user-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../src/hooks/user-prompt.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,KAAK,UAAU,IAAI;IACjB,+BAA+B;IAC/B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;QACzC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;QACvB,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;IAChB,wCAAwC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AgentProvider, SessionHandle, SessionOpts, TurnEvent, TurnInput } from './interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Anthropic API provider.
|
|
4
|
+
* Direct API calls — no tool execution, no agent loop.
|
|
5
|
+
*
|
|
6
|
+
* Best for:
|
|
7
|
+
* - Structured output (JSON schema)
|
|
8
|
+
* - Lightweight analysis/summary tasks
|
|
9
|
+
* - When you don't need file editing or bash execution
|
|
10
|
+
*/
|
|
11
|
+
export declare class AnthropicAPIProvider implements AgentProvider {
|
|
12
|
+
readonly name = "anthropic-api";
|
|
13
|
+
private client;
|
|
14
|
+
private model;
|
|
15
|
+
private messageHistory;
|
|
16
|
+
constructor(opts?: {
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
});
|
|
20
|
+
startSession(opts?: SessionOpts): Promise<SessionHandle>;
|
|
21
|
+
resumeSession(providerSessionId: string, opts?: SessionOpts): Promise<SessionHandle>;
|
|
22
|
+
sendTurn(handle: SessionHandle, input: TurnInput): AsyncIterable<TurnEvent>;
|
|
23
|
+
endSession(handle: SessionHandle): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=anthropic-api.d.ts.map
|
|
@@ -0,0 +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,KAAK,CAAS;IACtB,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;IAO5D,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;IAyDrB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAGvD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { formatContextPack } from '../broker/broker.js';
|
|
3
|
+
import { hasContent } from '../broker/context-pack.js';
|
|
4
|
+
/**
|
|
5
|
+
* Anthropic API provider.
|
|
6
|
+
* Direct API calls — no tool execution, no agent loop.
|
|
7
|
+
*
|
|
8
|
+
* Best for:
|
|
9
|
+
* - Structured output (JSON schema)
|
|
10
|
+
* - Lightweight analysis/summary tasks
|
|
11
|
+
* - When you don't need file editing or bash execution
|
|
12
|
+
*/
|
|
13
|
+
export class AnthropicAPIProvider {
|
|
14
|
+
name = 'anthropic-api';
|
|
15
|
+
client;
|
|
16
|
+
model;
|
|
17
|
+
messageHistory = new Map();
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.client = new Anthropic({
|
|
20
|
+
apiKey: opts?.apiKey || process.env.ANTHROPIC_API_KEY,
|
|
21
|
+
});
|
|
22
|
+
this.model = opts?.model || 'claude-sonnet-4-20250514';
|
|
23
|
+
}
|
|
24
|
+
async startSession(opts = {}) {
|
|
25
|
+
const sessionId = `api-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
26
|
+
this.messageHistory.set(sessionId, []);
|
|
27
|
+
if (opts.model)
|
|
28
|
+
this.model = opts.model;
|
|
29
|
+
return { sessionId };
|
|
30
|
+
}
|
|
31
|
+
async resumeSession(providerSessionId, opts = {}) {
|
|
32
|
+
// For API provider, resume just means we have existing history
|
|
33
|
+
if (opts.model)
|
|
34
|
+
this.model = opts.model;
|
|
35
|
+
if (!this.messageHistory.has(providerSessionId)) {
|
|
36
|
+
this.messageHistory.set(providerSessionId, []);
|
|
37
|
+
}
|
|
38
|
+
return { sessionId: providerSessionId, providerSessionId };
|
|
39
|
+
}
|
|
40
|
+
async *sendTurn(handle, input) {
|
|
41
|
+
// Build message with context
|
|
42
|
+
let userMessage = input.userMessage;
|
|
43
|
+
if (input.contextPack && hasContent(input.contextPack)) {
|
|
44
|
+
const contextStr = formatContextPack(input.contextPack);
|
|
45
|
+
if (contextStr) {
|
|
46
|
+
userMessage = `${contextStr}\n\n${input.userMessage}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Get or create message history
|
|
50
|
+
const history = this.messageHistory.get(handle.sessionId) || [];
|
|
51
|
+
history.push({ role: 'user', content: userMessage });
|
|
52
|
+
try {
|
|
53
|
+
// Stream the response
|
|
54
|
+
const stream = this.client.messages.stream({
|
|
55
|
+
model: this.model,
|
|
56
|
+
max_tokens: 4096,
|
|
57
|
+
system: input.systemPrompt || 'You are a helpful coding assistant with deep project context.',
|
|
58
|
+
messages: history,
|
|
59
|
+
});
|
|
60
|
+
let fullResponse = '';
|
|
61
|
+
for await (const event of stream) {
|
|
62
|
+
if (event.type === 'content_block_delta' &&
|
|
63
|
+
event.delta.type === 'text_delta') {
|
|
64
|
+
yield { type: 'text', content: event.delta.text };
|
|
65
|
+
fullResponse += event.delta.text;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Get final message for usage
|
|
69
|
+
const finalMessage = await stream.finalMessage();
|
|
70
|
+
history.push({ role: 'assistant', content: fullResponse });
|
|
71
|
+
this.messageHistory.set(handle.sessionId, history);
|
|
72
|
+
yield {
|
|
73
|
+
type: 'done',
|
|
74
|
+
content: fullResponse,
|
|
75
|
+
metadata: {
|
|
76
|
+
inputTokens: finalMessage.usage.input_tokens,
|
|
77
|
+
outputTokens: finalMessage.usage.output_tokens,
|
|
78
|
+
model: finalMessage.model,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
yield {
|
|
84
|
+
type: 'error',
|
|
85
|
+
content: err instanceof Error ? err.message : String(err),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async endSession(handle) {
|
|
90
|
+
this.messageHistory.delete(handle.sessionId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=anthropic-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-api.js","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"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"}
|