oroute-cli 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/dist/agent.d.ts +11 -0
- package/dist/agent.js +569 -0
- package/dist/agent.js.map +1 -0
- package/dist/commands.d.ts +24 -0
- package/dist/commands.js +173 -0
- package/dist/commands.js.map +1 -0
- package/dist/context.d.ts +13 -0
- package/dist/context.js +110 -0
- package/dist/context.js.map +1 -0
- package/dist/cost.d.ts +18 -0
- package/dist/cost.js +80 -0
- package/dist/cost.js.map +1 -0
- package/dist/history.d.ts +20 -0
- package/dist/history.js +49 -0
- package/dist/history.js.map +1 -0
- package/dist/hooks.d.ts +13 -0
- package/dist/hooks.js +101 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +475 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +4 -0
- package/dist/markdown.js +126 -0
- package/dist/markdown.js.map +1 -0
- package/dist/memory.d.ts +27 -0
- package/dist/memory.js +208 -0
- package/dist/memory.js.map +1 -0
- package/dist/session.d.ts +43 -0
- package/dist/session.js +166 -0
- package/dist/session.js.map +1 -0
- package/dist/streaming.d.ts +27 -0
- package/dist/streaming.js +201 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tools/editFile.d.ts +34 -0
- package/dist/tools/editFile.js +40 -0
- package/dist/tools/editFile.js.map +1 -0
- package/dist/tools/executeCommand.d.ts +32 -0
- package/dist/tools/executeCommand.js +75 -0
- package/dist/tools/executeCommand.js.map +1 -0
- package/dist/tools/glob.d.ts +24 -0
- package/dist/tools/glob.js +128 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/index.d.ts +40 -0
- package/dist/tools/index.js +28 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listDirectory.d.ts +23 -0
- package/dist/tools/listDirectory.js +57 -0
- package/dist/tools/listDirectory.js.map +1 -0
- package/dist/tools/notebook.d.ts +7 -0
- package/dist/tools/notebook.js +76 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/readFile.d.ts +28 -0
- package/dist/tools/readFile.js +40 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readImage.d.ts +25 -0
- package/dist/tools/readImage.js +52 -0
- package/dist/tools/readImage.js.map +1 -0
- package/dist/tools/searchFiles.d.ts +33 -0
- package/dist/tools/searchFiles.js +95 -0
- package/dist/tools/searchFiles.js.map +1 -0
- package/dist/tools/writeFile.d.ts +30 -0
- package/dist/tools/writeFile.js +54 -0
- package/dist/tools/writeFile.js.map +1 -0
- package/dist/ui.d.ts +30 -0
- package/dist/ui.js +79 -0
- package/dist/ui.js.map +1 -0
- package/dist/update.d.ts +10 -0
- package/dist/update.js +93 -0
- package/dist/update.js.map +1 -0
- package/package.json +33 -0
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface AgentConfig {
|
|
2
|
+
apiKey?: string;
|
|
3
|
+
apiUrl?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
confirmBeforeWrite?: boolean;
|
|
6
|
+
confirmBeforeExecute?: boolean;
|
|
7
|
+
skipConfirmations?: boolean;
|
|
8
|
+
planMode?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Main agent chat loop with tool use */
|
|
11
|
+
export declare function agentChat(config: AgentConfig): Promise<void>;
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent loop — send messages with tools, handle tool_use, stream responses.
|
|
3
|
+
* Integrates: A1 Streaming, A2 Context, A3 Markdown, A4 History, A5 Commands, A6 Multi-line, B1 Git, B6 Cost
|
|
4
|
+
* B2 Glob, B3 Notebook, B4 ReadImage, B7 Session, C1 Parallel, C3 Hooks, C5 Memory
|
|
5
|
+
*/
|
|
6
|
+
import * as os from 'node:os';
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as readline from 'node:readline';
|
|
10
|
+
import { readFileTool, readFileDefinition, writeFileTool, writeFileDefinition, generateDiff, listDirectoryTool, listDirectoryDefinition, searchFilesTool, searchFilesDefinition, executeCommandTool, executeCommandDefinition, editFileTool, editFileDefinition, generateEditDiff, globTool, globDefinition, readImageTool, readImageDefinition, } from './tools/index.js';
|
|
11
|
+
import { GREEN, GRAY, BOLD, DIM, RESET, YELLOW, RED, printToolUse, printToolResult, printError, printSuccess, confirm, createSpinner, } from './ui.js';
|
|
12
|
+
import { renderMarkdown } from './markdown.js';
|
|
13
|
+
import { loadProjectContext, buildContextString } from './context.js';
|
|
14
|
+
import { estimateTokens, TOKEN_THRESHOLD, compressHistory } from './history.js';
|
|
15
|
+
import { parseSSEStream, isSSEResponse } from './streaming.js';
|
|
16
|
+
import { handleSlashCommand } from './commands.js';
|
|
17
|
+
import { createSessionStats, updateStats, printExitSummary } from './cost.js';
|
|
18
|
+
import { loadHooks, runHooks } from './hooks.js';
|
|
19
|
+
import { buildMemoryContext } from './memory.js';
|
|
20
|
+
import { autoSaveSession } from './session.js';
|
|
21
|
+
const TOOL_DEFINITIONS = [
|
|
22
|
+
readFileDefinition,
|
|
23
|
+
writeFileDefinition,
|
|
24
|
+
listDirectoryDefinition,
|
|
25
|
+
searchFilesDefinition,
|
|
26
|
+
executeCommandDefinition,
|
|
27
|
+
editFileDefinition,
|
|
28
|
+
globDefinition,
|
|
29
|
+
readImageDefinition,
|
|
30
|
+
];
|
|
31
|
+
/** C1: Tools that are safe to run in parallel (read-only, no side effects) */
|
|
32
|
+
const PARALLEL_SAFE_TOOLS = new Set([
|
|
33
|
+
'read_file', 'list_directory', 'search_files', 'glob', 'read_image',
|
|
34
|
+
]);
|
|
35
|
+
/** Max chars to send as tool result to API (prevent token overflow) */
|
|
36
|
+
const MAX_TOOL_RESULT_CHARS = 4000;
|
|
37
|
+
/** Detect if a directory is a project (has package.json, .git, etc.) */
|
|
38
|
+
function detectProject(dir) {
|
|
39
|
+
const markers = ['package.json', 'Cargo.toml', 'pyproject.toml', 'go.mod', '.git'];
|
|
40
|
+
for (const m of markers) {
|
|
41
|
+
if (fs.existsSync(path.join(dir, m))) {
|
|
42
|
+
if (m === 'package.json') {
|
|
43
|
+
try {
|
|
44
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, m), 'utf-8'));
|
|
45
|
+
return { isProject: true, name: pkg.name ?? path.basename(dir) };
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return { isProject: true, name: path.basename(dir) };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { isProject: true, name: path.basename(dir) };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { isProject: false };
|
|
55
|
+
}
|
|
56
|
+
/** Find nearest project directory by walking up */
|
|
57
|
+
function findProjectRoot(startDir) {
|
|
58
|
+
let dir = startDir;
|
|
59
|
+
for (let i = 0; i < 10; i++) {
|
|
60
|
+
if (detectProject(dir).isProject)
|
|
61
|
+
return dir;
|
|
62
|
+
const parent = path.dirname(dir);
|
|
63
|
+
if (parent === dir)
|
|
64
|
+
break;
|
|
65
|
+
dir = parent;
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function buildSystemPrompt(cwd, contextStr, memoryStr) {
|
|
70
|
+
const project = detectProject(cwd);
|
|
71
|
+
const projectInfo = project.isProject
|
|
72
|
+
? `\nProject: ${project.name} (${cwd})`
|
|
73
|
+
: '\nNo project detected in current directory.';
|
|
74
|
+
const contextSection = contextStr
|
|
75
|
+
? `\n\n--- Project Context ---\n${contextStr}\n--- End Context ---`
|
|
76
|
+
: '';
|
|
77
|
+
const memorySection = memoryStr
|
|
78
|
+
? `\n\n${memoryStr}`
|
|
79
|
+
: '';
|
|
80
|
+
return `You are O'Route CLI Agent, an expert developer assistant with file system access.
|
|
81
|
+
|
|
82
|
+
Current working directory: ${cwd}${projectInfo}
|
|
83
|
+
OS: ${os.platform()} ${os.arch()}
|
|
84
|
+
Node: ${process.version}${contextSection}${memorySection}
|
|
85
|
+
|
|
86
|
+
You have access to file system tools:
|
|
87
|
+
- read_file: Read file contents (including .ipynb notebooks)
|
|
88
|
+
- write_file: Create or overwrite files
|
|
89
|
+
- edit_file: Replace a specific string in a file (str_replace)
|
|
90
|
+
- list_directory: List directory tree structure (use "." for current dir)
|
|
91
|
+
- search_files: Search for text patterns in files (grep-like)
|
|
92
|
+
- execute_command: Run whitelisted shell commands (npm, pnpm, git, node, etc.)
|
|
93
|
+
- glob: Find files matching glob patterns (e.g. "**/*.tsx")
|
|
94
|
+
- read_image: Read image files for visual analysis
|
|
95
|
+
|
|
96
|
+
Guidelines:
|
|
97
|
+
- Always use "." as the path for list_directory to show current project, not absolute paths.
|
|
98
|
+
- Keep tool results concise. If a directory has many files, use depth=1.
|
|
99
|
+
- When the user writes in Korean, respond in Korean.
|
|
100
|
+
- Be concise but thorough.
|
|
101
|
+
- If a task requires multiple steps, execute them one at a time.
|
|
102
|
+
- Always explain what you're doing before using tools.
|
|
103
|
+
- Format responses with markdown for readability.`;
|
|
104
|
+
}
|
|
105
|
+
/** Truncate tool result to prevent token overflow */
|
|
106
|
+
function truncateResult(result) {
|
|
107
|
+
if (result.length <= MAX_TOOL_RESULT_CHARS)
|
|
108
|
+
return result;
|
|
109
|
+
return result.slice(0, MAX_TOOL_RESULT_CHARS) + `\n... (truncated, ${result.length - MAX_TOOL_RESULT_CHARS} chars omitted)`;
|
|
110
|
+
}
|
|
111
|
+
/** Execute a single tool call and return the result */
|
|
112
|
+
async function executeTool(tool, cwd, config) {
|
|
113
|
+
const confirmWrite = config.skipConfirmations ? false : (config.confirmBeforeWrite !== false);
|
|
114
|
+
const confirmExec = config.skipConfirmations ? false : (config.confirmBeforeExecute !== false);
|
|
115
|
+
try {
|
|
116
|
+
switch (tool.name) {
|
|
117
|
+
case 'read_file': {
|
|
118
|
+
const input = tool.input;
|
|
119
|
+
printToolUse('read_file', input.path);
|
|
120
|
+
const result = readFileTool(input, cwd);
|
|
121
|
+
printToolResult(result.content);
|
|
122
|
+
return truncateResult(JSON.stringify({ content: result.content, lines: result.lines, size: result.size }));
|
|
123
|
+
}
|
|
124
|
+
case 'write_file': {
|
|
125
|
+
const input = tool.input;
|
|
126
|
+
printToolUse('write_file', input.path);
|
|
127
|
+
const diff = generateDiff(input.path, input.content, cwd);
|
|
128
|
+
console.log(`${GRAY}${diff}${RESET}`);
|
|
129
|
+
if (confirmWrite) {
|
|
130
|
+
const ok = await confirm(`Write to ${input.path}?`);
|
|
131
|
+
if (!ok)
|
|
132
|
+
return JSON.stringify({ success: false, reason: 'User declined' });
|
|
133
|
+
}
|
|
134
|
+
const result = writeFileTool(input, cwd);
|
|
135
|
+
printSuccess(`Written ${result.bytesWritten} bytes${result.isNew ? ' (new file)' : ''}`);
|
|
136
|
+
return JSON.stringify(result);
|
|
137
|
+
}
|
|
138
|
+
case 'list_directory': {
|
|
139
|
+
const input = tool.input;
|
|
140
|
+
printToolUse('list_directory', input.path);
|
|
141
|
+
const tree = listDirectoryTool(input, cwd);
|
|
142
|
+
printToolResult(tree);
|
|
143
|
+
return truncateResult(tree);
|
|
144
|
+
}
|
|
145
|
+
case 'search_files': {
|
|
146
|
+
const input = tool.input;
|
|
147
|
+
printToolUse('search_files', `"${input.pattern}" in ${input.path}`);
|
|
148
|
+
const results = searchFilesTool(input, cwd);
|
|
149
|
+
const formatted = results.map(r => `${r.file}:${r.line}: ${r.content}`).join('\n');
|
|
150
|
+
printToolResult(formatted || 'No matches found.');
|
|
151
|
+
return truncateResult(JSON.stringify(results));
|
|
152
|
+
}
|
|
153
|
+
case 'execute_command': {
|
|
154
|
+
const input = tool.input;
|
|
155
|
+
printToolUse('execute_command', input.command);
|
|
156
|
+
if (config.planMode) {
|
|
157
|
+
console.log(`${YELLOW} [PLAN MODE] Would execute: ${input.command}${RESET}`);
|
|
158
|
+
return JSON.stringify({ stdout: '[plan mode — not executed]', stderr: '', exitCode: 0 });
|
|
159
|
+
}
|
|
160
|
+
if (confirmExec) {
|
|
161
|
+
const ok = await confirm(`Execute: ${input.command}`);
|
|
162
|
+
if (!ok)
|
|
163
|
+
return JSON.stringify({ stdout: '', stderr: 'User declined', exitCode: -1 });
|
|
164
|
+
}
|
|
165
|
+
const result = executeCommandTool(input, cwd);
|
|
166
|
+
if (result.stdout)
|
|
167
|
+
printToolResult(result.stdout);
|
|
168
|
+
if (result.stderr)
|
|
169
|
+
console.log(`${RED}${result.stderr}${RESET}`);
|
|
170
|
+
if (result.exitCode === 0)
|
|
171
|
+
printSuccess('Command completed');
|
|
172
|
+
else
|
|
173
|
+
console.log(`${YELLOW} Exit code: ${result.exitCode}${RESET}`);
|
|
174
|
+
return truncateResult(JSON.stringify(result));
|
|
175
|
+
}
|
|
176
|
+
case 'edit_file': {
|
|
177
|
+
const input = tool.input;
|
|
178
|
+
printToolUse('edit_file', input.path);
|
|
179
|
+
const diff = generateEditDiff(input);
|
|
180
|
+
console.log(`${GRAY}${diff}${RESET}`);
|
|
181
|
+
if (config.planMode) {
|
|
182
|
+
console.log(`${YELLOW} [PLAN MODE] Would edit: ${input.path}${RESET}`);
|
|
183
|
+
return JSON.stringify({ success: true, note: 'plan mode — not executed' });
|
|
184
|
+
}
|
|
185
|
+
if (confirmWrite) {
|
|
186
|
+
const ok = await confirm(`Edit ${input.path}?`);
|
|
187
|
+
if (!ok)
|
|
188
|
+
return JSON.stringify({ success: false, reason: 'User declined' });
|
|
189
|
+
}
|
|
190
|
+
const result = editFileTool(input, cwd);
|
|
191
|
+
printSuccess('Edit applied');
|
|
192
|
+
return JSON.stringify(result);
|
|
193
|
+
}
|
|
194
|
+
case 'glob': {
|
|
195
|
+
const input = tool.input;
|
|
196
|
+
printToolUse('glob', input.pattern);
|
|
197
|
+
const results = globTool(input, cwd);
|
|
198
|
+
const formatted = results.join('\n');
|
|
199
|
+
printToolResult(formatted || 'No matches found.');
|
|
200
|
+
return truncateResult(JSON.stringify({ matches: results, count: results.length }));
|
|
201
|
+
}
|
|
202
|
+
case 'read_image': {
|
|
203
|
+
const input = tool.input;
|
|
204
|
+
printToolUse('read_image', input.path);
|
|
205
|
+
const result = readImageTool(input, cwd);
|
|
206
|
+
printSuccess(`Read image: ${result.media_type}, ${(result.size / 1024).toFixed(1)}KB`);
|
|
207
|
+
return JSON.stringify(result);
|
|
208
|
+
}
|
|
209
|
+
default:
|
|
210
|
+
return JSON.stringify({ error: `Unknown tool: ${tool.name}` });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
215
|
+
printError(msg);
|
|
216
|
+
return JSON.stringify({ error: msg });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** Execute tool with hooks (C3) */
|
|
220
|
+
async function executeToolWithHooks(tool, cwd, config, hooks) {
|
|
221
|
+
// C3: Run PreToolUse hooks
|
|
222
|
+
const shouldProceed = runHooks('PreToolUse', hooks, tool.name, tool.input, cwd);
|
|
223
|
+
if (!shouldProceed) {
|
|
224
|
+
return JSON.stringify({ error: 'Skipped by PreToolUse hook' });
|
|
225
|
+
}
|
|
226
|
+
const result = await executeTool(tool, cwd, config);
|
|
227
|
+
// C3: Run PostToolUse hooks
|
|
228
|
+
runHooks('PostToolUse', hooks, tool.name, tool.input, cwd);
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
/** Execute tool from streamed content block */
|
|
232
|
+
async function executeStreamedTool(block, cwd, config, hooks) {
|
|
233
|
+
const toolBlock = {
|
|
234
|
+
type: 'tool_use',
|
|
235
|
+
id: block.id ?? '',
|
|
236
|
+
name: block.name ?? '',
|
|
237
|
+
input: block.input ?? {},
|
|
238
|
+
};
|
|
239
|
+
return executeToolWithHooks(toolBlock, cwd, config, hooks);
|
|
240
|
+
}
|
|
241
|
+
/** C1: Execute tools with parallel optimization for read-only tools */
|
|
242
|
+
async function executeToolsParallel(blocks, cwd, config, hooks) {
|
|
243
|
+
const results = [];
|
|
244
|
+
// Group consecutive parallel-safe tools
|
|
245
|
+
let i = 0;
|
|
246
|
+
while (i < blocks.length) {
|
|
247
|
+
const block = blocks[i];
|
|
248
|
+
if (PARALLEL_SAFE_TOOLS.has(block.name ?? '')) {
|
|
249
|
+
// Collect consecutive parallel-safe tools
|
|
250
|
+
const parallelBatch = [block];
|
|
251
|
+
let j = i + 1;
|
|
252
|
+
while (j < blocks.length && PARALLEL_SAFE_TOOLS.has(blocks[j].name ?? '')) {
|
|
253
|
+
parallelBatch.push(blocks[j]);
|
|
254
|
+
j++;
|
|
255
|
+
}
|
|
256
|
+
if (parallelBatch.length > 1) {
|
|
257
|
+
// Execute in parallel
|
|
258
|
+
const batchResults = await Promise.all(parallelBatch.map(b => executeStreamedTool(b, cwd, config, hooks)));
|
|
259
|
+
for (let k = 0; k < parallelBatch.length; k++) {
|
|
260
|
+
results.push({
|
|
261
|
+
type: 'tool_result',
|
|
262
|
+
tool_use_id: parallelBatch[k].id ?? '',
|
|
263
|
+
content: batchResults[k],
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
// Single tool, execute normally
|
|
269
|
+
const result = await executeStreamedTool(block, cwd, config, hooks);
|
|
270
|
+
results.push({
|
|
271
|
+
type: 'tool_result',
|
|
272
|
+
tool_use_id: block.id ?? '',
|
|
273
|
+
content: result,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
i = j;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// Sequential tool (write, execute, edit)
|
|
280
|
+
const result = await executeStreamedTool(block, cwd, config, hooks);
|
|
281
|
+
results.push({
|
|
282
|
+
type: 'tool_result',
|
|
283
|
+
tool_use_id: block.id ?? '',
|
|
284
|
+
content: result,
|
|
285
|
+
});
|
|
286
|
+
i++;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return results;
|
|
290
|
+
}
|
|
291
|
+
/** A6: Read multi-line input (between """ or ''') */
|
|
292
|
+
async function readMultiLineInput(rl, delimiter) {
|
|
293
|
+
const lines = [];
|
|
294
|
+
return new Promise(resolve => {
|
|
295
|
+
const handler = (line) => {
|
|
296
|
+
if (line.trim() === delimiter) {
|
|
297
|
+
rl.removeListener('line', handler);
|
|
298
|
+
resolve(lines.join('\n'));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
lines.push(line);
|
|
302
|
+
process.stdout.write(`${GRAY}...${RESET} `);
|
|
303
|
+
};
|
|
304
|
+
process.stdout.write(`${GRAY}...${RESET} `);
|
|
305
|
+
rl.on('line', handler);
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/** Main agent chat loop with tool use */
|
|
309
|
+
export async function agentChat(config) {
|
|
310
|
+
const apiUrl = config.apiUrl ?? 'http://localhost:3001';
|
|
311
|
+
let model = config.model ?? 'auto';
|
|
312
|
+
let cwd = process.cwd();
|
|
313
|
+
const homeDir = os.homedir();
|
|
314
|
+
// Auto-detect project or warn if in home directory
|
|
315
|
+
if (cwd === homeDir) {
|
|
316
|
+
console.log(`${YELLOW} Warning: Running from home directory.${RESET}`);
|
|
317
|
+
console.log(`${GRAY} Tip: Run from a project folder, or specify: oroute /path/to/project${RESET}`);
|
|
318
|
+
console.log();
|
|
319
|
+
const projectRoot = findProjectRoot(cwd);
|
|
320
|
+
if (projectRoot && projectRoot !== homeDir) {
|
|
321
|
+
console.log(`${GREEN} Found project: ${projectRoot}${RESET}`);
|
|
322
|
+
process.chdir(projectRoot);
|
|
323
|
+
cwd = projectRoot;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const project = detectProject(cwd);
|
|
327
|
+
// A2: Load project context
|
|
328
|
+
const projectContext = loadProjectContext(cwd);
|
|
329
|
+
const contextStr = buildContextString(projectContext);
|
|
330
|
+
// C5: Load memory context
|
|
331
|
+
const memoryStr = buildMemoryContext(cwd);
|
|
332
|
+
// C3: Load hooks
|
|
333
|
+
const hooks = loadHooks(cwd);
|
|
334
|
+
// B6: Initialize session stats
|
|
335
|
+
let sessionStats = createSessionStats();
|
|
336
|
+
console.log(`${GREEN}${BOLD} O'Route Agent${RESET} v0.2.0`);
|
|
337
|
+
console.log(`${GRAY} model: ${model} (auto-routed) · agent mode${RESET}`);
|
|
338
|
+
if (project.isProject) {
|
|
339
|
+
console.log(`${GRAY} project: ${project.name}${RESET}`);
|
|
340
|
+
}
|
|
341
|
+
// B1: Show git info
|
|
342
|
+
if (projectContext.gitBranch) {
|
|
343
|
+
console.log(`${GRAY} git: ${projectContext.gitBranch}${projectContext.gitStatus ? ` (${projectContext.gitStatus})` : ''}${RESET}`);
|
|
344
|
+
}
|
|
345
|
+
console.log(`${GRAY} cwd: ${cwd}${RESET}`);
|
|
346
|
+
if (config.skipConfirmations) {
|
|
347
|
+
console.log(`${YELLOW} --yes mode: confirmations skipped${RESET}`);
|
|
348
|
+
}
|
|
349
|
+
if (config.planMode) {
|
|
350
|
+
console.log(`${YELLOW} --plan mode: tools shown but not executed${RESET}`);
|
|
351
|
+
}
|
|
352
|
+
console.log(`${GRAY} Type /help for commands, """ for multi-line${RESET}`);
|
|
353
|
+
console.log();
|
|
354
|
+
let messages = [];
|
|
355
|
+
const systemPrompt = buildSystemPrompt(cwd, contextStr, memoryStr);
|
|
356
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
357
|
+
const promptInput = () => new Promise(resolve => rl.question(`${GREEN}>${RESET} `, answer => resolve(answer.trim())));
|
|
358
|
+
while (true) {
|
|
359
|
+
const rawInput = await promptInput();
|
|
360
|
+
// A6: Multi-line input
|
|
361
|
+
let input = rawInput;
|
|
362
|
+
if (rawInput === '"""' || rawInput === "'''") {
|
|
363
|
+
input = await readMultiLineInput(rl, rawInput);
|
|
364
|
+
if (!input)
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (!input)
|
|
368
|
+
continue;
|
|
369
|
+
// A5: Slash commands
|
|
370
|
+
const cmdResult = handleSlashCommand(input, {
|
|
371
|
+
messages,
|
|
372
|
+
stats: sessionStats,
|
|
373
|
+
model,
|
|
374
|
+
cwd,
|
|
375
|
+
apiUrl,
|
|
376
|
+
apiKey: config.apiKey ?? '',
|
|
377
|
+
setModel: (m) => { model = m; },
|
|
378
|
+
setCwd: (d) => { cwd = d; },
|
|
379
|
+
setMessages: (m) => { messages = m; },
|
|
380
|
+
setStats: (s) => { sessionStats = s; },
|
|
381
|
+
});
|
|
382
|
+
if (cmdResult === 'exit') {
|
|
383
|
+
rl.close();
|
|
384
|
+
// B7: Auto-save session on exit
|
|
385
|
+
autoSaveSession(messages, sessionStats, cwd);
|
|
386
|
+
printExitSummary(sessionStats);
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
if (cmdResult === 'handled')
|
|
390
|
+
continue;
|
|
391
|
+
// exit/quit without slash
|
|
392
|
+
if (input === 'exit' || input === 'quit') {
|
|
393
|
+
rl.close();
|
|
394
|
+
autoSaveSession(messages, sessionStats, cwd);
|
|
395
|
+
printExitSummary(sessionStats);
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
messages.push({ role: 'user', content: input });
|
|
399
|
+
// A4: Auto-compress history before API call
|
|
400
|
+
const estimated = estimateTokens(messages);
|
|
401
|
+
if (estimated > TOKEN_THRESHOLD) {
|
|
402
|
+
const compressed = compressHistory(messages);
|
|
403
|
+
if (compressed.compressed) {
|
|
404
|
+
messages = compressed.messages;
|
|
405
|
+
console.log(`${DIM} (history compressed to ${messages.length} messages)${RESET}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// Agent loop: send -> process tool_use -> send results -> repeat
|
|
409
|
+
let continueLoop = true;
|
|
410
|
+
let retryCount = 0;
|
|
411
|
+
const maxRetries = 3;
|
|
412
|
+
while (continueLoop) {
|
|
413
|
+
const spinner = createSpinner('Thinking...');
|
|
414
|
+
try {
|
|
415
|
+
const res = await fetch(`${apiUrl}/v1/messages`, {
|
|
416
|
+
method: 'POST',
|
|
417
|
+
headers: {
|
|
418
|
+
'Authorization': `Bearer ${config.apiKey}`,
|
|
419
|
+
'Content-Type': 'application/json',
|
|
420
|
+
},
|
|
421
|
+
body: JSON.stringify({
|
|
422
|
+
model,
|
|
423
|
+
max_tokens: 8192,
|
|
424
|
+
system: systemPrompt,
|
|
425
|
+
messages,
|
|
426
|
+
tools: TOOL_DEFINITIONS,
|
|
427
|
+
stream: true,
|
|
428
|
+
}),
|
|
429
|
+
signal: AbortSignal.timeout(120000),
|
|
430
|
+
});
|
|
431
|
+
spinner.stop();
|
|
432
|
+
if (!res.ok) {
|
|
433
|
+
const errBody = await res.text().catch(() => '');
|
|
434
|
+
// Rate limit — wait and retry
|
|
435
|
+
if (res.status === 429 && retryCount < maxRetries) {
|
|
436
|
+
retryCount++;
|
|
437
|
+
const waitSec = retryCount * 3;
|
|
438
|
+
console.log(`${YELLOW} Rate limited. Retrying in ${waitSec}s... (${retryCount}/${maxRetries})${RESET}`);
|
|
439
|
+
await new Promise(r => setTimeout(r, waitSec * 1000));
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
// Parse error message
|
|
443
|
+
let errMsg = `HTTP ${res.status}`;
|
|
444
|
+
try {
|
|
445
|
+
const errObj = JSON.parse(errBody);
|
|
446
|
+
errMsg = typeof errObj.error === 'string'
|
|
447
|
+
? errObj.error
|
|
448
|
+
: errObj.error?.message ?? errMsg;
|
|
449
|
+
}
|
|
450
|
+
catch { /* use default */ }
|
|
451
|
+
printError(errMsg);
|
|
452
|
+
messages.pop();
|
|
453
|
+
continueLoop = false;
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
retryCount = 0;
|
|
457
|
+
// A1: Check if response is SSE streaming or regular JSON
|
|
458
|
+
if (isSSEResponse(res)) {
|
|
459
|
+
// Streaming response
|
|
460
|
+
let firstText = true;
|
|
461
|
+
const streamResult = await parseSSEStream(res, (text) => {
|
|
462
|
+
if (firstText) {
|
|
463
|
+
console.log(); // newline before first text
|
|
464
|
+
firstText = false;
|
|
465
|
+
}
|
|
466
|
+
process.stdout.write(text);
|
|
467
|
+
});
|
|
468
|
+
// After streaming text is done
|
|
469
|
+
if (!firstText) {
|
|
470
|
+
console.log(); // newline after streaming text
|
|
471
|
+
}
|
|
472
|
+
// B6: Update stats
|
|
473
|
+
sessionStats = updateStats(sessionStats, streamResult.usage, streamResult.routingMetadata?.provider);
|
|
474
|
+
// Build content blocks for history
|
|
475
|
+
const contentBlocksForHistory = [];
|
|
476
|
+
const toolBlocks = [];
|
|
477
|
+
for (const block of streamResult.contentBlocks) {
|
|
478
|
+
if (block.type === 'text') {
|
|
479
|
+
contentBlocksForHistory.push({ type: 'text', text: block.text ?? '' });
|
|
480
|
+
}
|
|
481
|
+
else if (block.type === 'tool_use') {
|
|
482
|
+
contentBlocksForHistory.push({
|
|
483
|
+
type: 'tool_use',
|
|
484
|
+
id: block.id ?? '',
|
|
485
|
+
name: block.name ?? '',
|
|
486
|
+
input: block.input ?? {},
|
|
487
|
+
});
|
|
488
|
+
toolBlocks.push(block);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
// Add assistant message to history
|
|
492
|
+
messages.push({ role: 'assistant', content: contentBlocksForHistory });
|
|
493
|
+
// C1: Execute tools (parallel for read-only, sequential for writes)
|
|
494
|
+
if (toolBlocks.length > 0) {
|
|
495
|
+
const toolResults = await executeToolsParallel(toolBlocks, cwd, config, hooks);
|
|
496
|
+
messages.push({ role: 'user', content: toolResults });
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
// Show metadata
|
|
500
|
+
const meta = streamResult.routingMetadata;
|
|
501
|
+
if (meta) {
|
|
502
|
+
console.log(`${DIM} - ${meta.provider} · L${meta.taskComplexity} · ${meta.totalLatencyMs.toFixed(0)}ms · ${streamResult.usage.input_tokens}+${streamResult.usage.output_tokens} tokens${RESET}`);
|
|
503
|
+
}
|
|
504
|
+
console.log();
|
|
505
|
+
continueLoop = false;
|
|
506
|
+
}
|
|
507
|
+
if (streamResult.stopReason === 'end_turn' && toolBlocks.length === 0) {
|
|
508
|
+
continueLoop = false;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
// Non-streaming fallback (regular JSON response)
|
|
513
|
+
const data = (await res.json());
|
|
514
|
+
// B6: Update stats
|
|
515
|
+
sessionStats = updateStats(sessionStats, data.usage, data.routing_metadata?.provider);
|
|
516
|
+
// Process response content blocks
|
|
517
|
+
const toolResults = [];
|
|
518
|
+
for (const block of data.content) {
|
|
519
|
+
if (block.type === 'text') {
|
|
520
|
+
const text = block.text;
|
|
521
|
+
if (text) {
|
|
522
|
+
console.log();
|
|
523
|
+
// A3: Render markdown
|
|
524
|
+
console.log(renderMarkdown(text));
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
else if (block.type === 'tool_use') {
|
|
528
|
+
const toolBlock = block;
|
|
529
|
+
const result = await executeToolWithHooks(toolBlock, cwd, config, hooks);
|
|
530
|
+
toolResults.push({
|
|
531
|
+
type: 'tool_result',
|
|
532
|
+
tool_use_id: toolBlock.id,
|
|
533
|
+
content: result,
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
// Add assistant message to history
|
|
538
|
+
messages.push({ role: 'assistant', content: data.content });
|
|
539
|
+
// If there were tool uses, send results back
|
|
540
|
+
if (toolResults.length > 0) {
|
|
541
|
+
messages.push({ role: 'user', content: toolResults });
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
// No tool use, show metadata and stop
|
|
545
|
+
const meta = data.routing_metadata;
|
|
546
|
+
if (meta) {
|
|
547
|
+
console.log();
|
|
548
|
+
console.log(`${DIM} - ${meta.provider} · L${meta.taskComplexity} · ${meta.totalLatencyMs.toFixed(0)}ms · ${data.usage.input_tokens}+${data.usage.output_tokens} tokens${RESET}`);
|
|
549
|
+
}
|
|
550
|
+
console.log();
|
|
551
|
+
continueLoop = false;
|
|
552
|
+
}
|
|
553
|
+
// Check stop reason
|
|
554
|
+
if (data.stop_reason === 'end_turn' && toolResults.length === 0) {
|
|
555
|
+
continueLoop = false;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
catch (err) {
|
|
560
|
+
spinner.stop();
|
|
561
|
+
const msg = err instanceof Error ? err.message : 'unknown error';
|
|
562
|
+
printError(`Request failed: ${msg}`);
|
|
563
|
+
messages.pop();
|
|
564
|
+
continueLoop = false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SessionStats } from './cost.js';
|
|
2
|
+
interface Message {
|
|
3
|
+
role: string;
|
|
4
|
+
content: string | Array<{
|
|
5
|
+
type: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
interface CommandContext {
|
|
10
|
+
messages: Message[];
|
|
11
|
+
stats: SessionStats;
|
|
12
|
+
model: string;
|
|
13
|
+
cwd: string;
|
|
14
|
+
apiUrl: string;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
setModel: (m: string) => void;
|
|
17
|
+
setCwd: (d: string) => void;
|
|
18
|
+
setMessages: (m: Message[]) => void;
|
|
19
|
+
setStats: (s: SessionStats) => void;
|
|
20
|
+
}
|
|
21
|
+
export type CommandResult = 'handled' | 'exit' | 'not_command';
|
|
22
|
+
/** Handle a slash command, returns whether it was handled */
|
|
23
|
+
export declare function handleSlashCommand(input: string, ctx: CommandContext): CommandResult;
|
|
24
|
+
export {};
|