oroute-cli 0.1.0 → 0.2.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.
Files changed (72) hide show
  1. package/bin/oroute.cjs +2 -0
  2. package/dist/oroute.cjs +244526 -0
  3. package/package.json +27 -6
  4. package/dist/agent.d.ts +0 -11
  5. package/dist/agent.js +0 -569
  6. package/dist/agent.js.map +0 -1
  7. package/dist/commands.d.ts +0 -24
  8. package/dist/commands.js +0 -173
  9. package/dist/commands.js.map +0 -1
  10. package/dist/context.d.ts +0 -13
  11. package/dist/context.js +0 -110
  12. package/dist/context.js.map +0 -1
  13. package/dist/cost.d.ts +0 -18
  14. package/dist/cost.js +0 -80
  15. package/dist/cost.js.map +0 -1
  16. package/dist/history.d.ts +0 -20
  17. package/dist/history.js +0 -49
  18. package/dist/history.js.map +0 -1
  19. package/dist/hooks.d.ts +0 -13
  20. package/dist/hooks.js +0 -101
  21. package/dist/hooks.js.map +0 -1
  22. package/dist/index.d.ts +0 -2
  23. package/dist/index.js +0 -475
  24. package/dist/index.js.map +0 -1
  25. package/dist/markdown.d.ts +0 -4
  26. package/dist/markdown.js +0 -126
  27. package/dist/markdown.js.map +0 -1
  28. package/dist/memory.d.ts +0 -27
  29. package/dist/memory.js +0 -208
  30. package/dist/memory.js.map +0 -1
  31. package/dist/session.d.ts +0 -43
  32. package/dist/session.js +0 -166
  33. package/dist/session.js.map +0 -1
  34. package/dist/streaming.d.ts +0 -27
  35. package/dist/streaming.js +0 -201
  36. package/dist/streaming.js.map +0 -1
  37. package/dist/tools/editFile.d.ts +0 -34
  38. package/dist/tools/editFile.js +0 -40
  39. package/dist/tools/editFile.js.map +0 -1
  40. package/dist/tools/executeCommand.d.ts +0 -32
  41. package/dist/tools/executeCommand.js +0 -75
  42. package/dist/tools/executeCommand.js.map +0 -1
  43. package/dist/tools/glob.d.ts +0 -24
  44. package/dist/tools/glob.js +0 -128
  45. package/dist/tools/glob.js.map +0 -1
  46. package/dist/tools/index.d.ts +0 -40
  47. package/dist/tools/index.js +0 -28
  48. package/dist/tools/index.js.map +0 -1
  49. package/dist/tools/listDirectory.d.ts +0 -23
  50. package/dist/tools/listDirectory.js +0 -57
  51. package/dist/tools/listDirectory.js.map +0 -1
  52. package/dist/tools/notebook.d.ts +0 -7
  53. package/dist/tools/notebook.js +0 -76
  54. package/dist/tools/notebook.js.map +0 -1
  55. package/dist/tools/readFile.d.ts +0 -28
  56. package/dist/tools/readFile.js +0 -40
  57. package/dist/tools/readFile.js.map +0 -1
  58. package/dist/tools/readImage.d.ts +0 -25
  59. package/dist/tools/readImage.js +0 -52
  60. package/dist/tools/readImage.js.map +0 -1
  61. package/dist/tools/searchFiles.d.ts +0 -33
  62. package/dist/tools/searchFiles.js +0 -95
  63. package/dist/tools/searchFiles.js.map +0 -1
  64. package/dist/tools/writeFile.d.ts +0 -30
  65. package/dist/tools/writeFile.js +0 -54
  66. package/dist/tools/writeFile.js.map +0 -1
  67. package/dist/ui.d.ts +0 -30
  68. package/dist/ui.js +0 -79
  69. package/dist/ui.js.map +0 -1
  70. package/dist/update.d.ts +0 -10
  71. package/dist/update.js +0 -93
  72. package/dist/update.js.map +0 -1
package/dist/hooks.js DELETED
@@ -1,101 +0,0 @@
1
- /**
2
- * C3: Hooks System — run pre/post tool hooks (Claude Code compatible).
3
- */
4
- import * as fs from 'node:fs';
5
- import * as path from 'node:path';
6
- import { execSync } from 'node:child_process';
7
- import { GRAY, YELLOW, DIM, RESET } from './ui.js';
8
- const HOOK_TIMEOUT_MS = 5000;
9
- /** Load hooks configuration from .oroute/hooks.json or .claude/settings.json */
10
- export function loadHooks(cwd) {
11
- // Try .oroute/hooks.json first
12
- const orouteHooksPath = path.join(cwd, '.oroute', 'hooks.json');
13
- const config = tryLoadJson(orouteHooksPath);
14
- if (config)
15
- return config;
16
- // Try .claude/settings.json (Claude Code compatible)
17
- const claudeSettingsPath = path.join(cwd, '.claude', 'settings.json');
18
- const claudeSettings = tryLoadJson(claudeSettingsPath);
19
- if (claudeSettings) {
20
- const result = {};
21
- if (Array.isArray(claudeSettings['PreToolUse'])) {
22
- result.PreToolUse = claudeSettings['PreToolUse'];
23
- }
24
- if (Array.isArray(claudeSettings['PostToolUse'])) {
25
- result.PostToolUse = claudeSettings['PostToolUse'];
26
- }
27
- if (result.PreToolUse || result.PostToolUse)
28
- return result;
29
- }
30
- return {};
31
- }
32
- function tryLoadJson(filePath) {
33
- try {
34
- if (!fs.existsSync(filePath))
35
- return null;
36
- return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
37
- }
38
- catch {
39
- return null;
40
- }
41
- }
42
- /** Run matching hooks for a given phase and tool */
43
- export function runHooks(phase, hooks, toolName, toolInput, cwd) {
44
- const phaseHooks = hooks[phase];
45
- if (!phaseHooks || phaseHooks.length === 0)
46
- return true;
47
- for (const hook of phaseHooks) {
48
- const matchRegex = new RegExp(hook.matcher);
49
- if (!matchRegex.test(toolName))
50
- continue;
51
- // Build environment variables for the hook
52
- const filePath = extractFilePath(toolInput);
53
- const env = {
54
- ...process.env,
55
- TOOL_NAME: toolName,
56
- TOOL_INPUT: JSON.stringify(toolInput),
57
- };
58
- if (filePath) {
59
- env['FILE_PATH'] = filePath;
60
- }
61
- try {
62
- const command = substituteEnvVars(hook.command, env);
63
- console.log(`${DIM} [${phase}] ${command}${RESET}`);
64
- execSync(command, {
65
- cwd,
66
- timeout: HOOK_TIMEOUT_MS,
67
- stdio: 'pipe',
68
- env,
69
- });
70
- }
71
- catch (err) {
72
- if (phase === 'PreToolUse') {
73
- const exitCode = err.status ?? 1;
74
- if (exitCode !== 0) {
75
- console.log(`${YELLOW} [${phase}] Hook failed (exit ${exitCode}), skipping tool.${RESET}`);
76
- return false;
77
- }
78
- }
79
- // PostToolUse hook failures are non-blocking
80
- if (phase === 'PostToolUse') {
81
- console.log(`${GRAY} [${phase}] Hook warning: ${err.message ?? 'unknown error'}${RESET}`);
82
- }
83
- }
84
- }
85
- return true;
86
- }
87
- /** Extract file path from tool input (if applicable) */
88
- function extractFilePath(input) {
89
- if (typeof input['path'] === 'string')
90
- return input['path'];
91
- if (typeof input['file_path'] === 'string')
92
- return input['file_path'];
93
- return null;
94
- }
95
- /** Substitute $VAR_NAME in command string with environment values */
96
- function substituteEnvVars(command, env) {
97
- return command.replace(/\$([A-Z_][A-Z0-9_]*)/g, (_match, varName) => {
98
- return env[varName] ?? '';
99
- });
100
- }
101
- //# sourceMappingURL=hooks.js.map
package/dist/hooks.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
package/dist/index.js DELETED
@@ -1,475 +0,0 @@
1
- #!/usr/bin/env node
2
- import * as readline from 'node:readline';
3
- import * as fs from 'node:fs';
4
- import * as path from 'node:path';
5
- import * as os from 'node:os';
6
- import { agentChat } from './agent.js';
7
- import { checkForUpdates } from './update.js';
8
- const GREEN = '\x1b[32m';
9
- const GRAY = '\x1b[90m';
10
- const BOLD = '\x1b[1m';
11
- const DIM = '\x1b[2m';
12
- const RESET = '\x1b[0m';
13
- const CYAN = '\x1b[36m';
14
- const YELLOW = '\x1b[33m';
15
- const WHITE = '\x1b[37m';
16
- const VERSION = '0.2.0';
17
- const CONFIG_DIR = path.join(os.homedir(), '.oroute');
18
- const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
19
- const DEFAULT_API_URL = 'https://api.oroute.itshin.com';
20
- const LOCAL_API_URL = 'http://localhost:3001';
21
- // ── ASCII Art fallback (for terminals without image support) ──
22
- const ASCII_CHARACTER = `
23
- ${GRAY} ▄▄███▄▄
24
- ▄█${WHITE}▓▓▓▓▓▓▓${GRAY}█▄ ${GREEN}O'Route${RESET}
25
- █${WHITE}▓▓${GRAY}█▄▄▄▄▄█${WHITE}▓▓${GRAY}█ ${GRAY}AI API Mediation${RESET}
26
- █${WHITE}▓${GRAY}█ █${WHITE}▓${GRAY}█
27
- █ ${GREEN}◉${GRAY} █ ${GREEN}◉${GRAY} █
28
- █ ${GREEN}▽${GRAY} █
29
- █ ${GREEN}╰───╯${GRAY} █
30
- █▄▄▄▄▄▄▄▄▄▄▄█
31
- ┌─────────────┐
32
- ┌──┤ ${GREEN}█████████████${GRAY} ├──┐
33
- │ │ ${GREEN}█████████████${GRAY} │ │
34
- └──┴─────────────┴──┘${RESET}`;
35
- /** Display inline image using iTerm2/WezTerm imgcat protocol */
36
- function displayInlineImage(imagePath, width = 20) {
37
- const termProgram = process.env['TERM_PROGRAM'] ?? '';
38
- const supportsImages = ['iTerm.app', 'WezTerm'].includes(termProgram);
39
- if (!supportsImages)
40
- return false;
41
- try {
42
- const imageData = fs.readFileSync(imagePath);
43
- const b64 = imageData.toString('base64');
44
- // iTerm2 inline image protocol: ESC ] 1337 ; File=[args] : base64data BEL
45
- const args = `inline=1;width=${width};preserveAspectRatio=1`;
46
- process.stdout.write(`\x1b]1337;File=${args}:${b64}\x07\n`);
47
- return true;
48
- }
49
- catch {
50
- return false;
51
- }
52
- }
53
- /** Detect if terminal is using dark background */
54
- function isDarkMode() {
55
- // Check COLORFGBG env (format: "foreground;background")
56
- const colorFgBg = process.env['COLORFGBG'];
57
- if (colorFgBg) {
58
- const bg = parseInt(colorFgBg.split(';').pop() ?? '0', 10);
59
- return bg < 8; // 0=black, 15=white
60
- }
61
- // Check iTerm2 profile
62
- const iTermProfile = process.env['ITERM_PROFILE'] ?? '';
63
- if (iTermProfile.toLowerCase().includes('light'))
64
- return false;
65
- // Default: assume dark (most dev terminals are dark)
66
- return true;
67
- }
68
- /** Get the path to the character image — dark or light version */
69
- function getCharacterImagePath() {
70
- const variant = isDarkMode() ? 'character-dark.png' : 'character-light.png';
71
- const fallback = 'character.png';
72
- const cliDir = path.dirname(new URL(import.meta.url).pathname);
73
- const candidates = [
74
- path.join(os.homedir(), '.oroute', variant),
75
- path.join(cliDir, '..', variant),
76
- path.join(os.homedir(), '.oroute', fallback),
77
- path.join(cliDir, '..', fallback),
78
- ];
79
- for (const p of candidates) {
80
- if (fs.existsSync(p))
81
- return p;
82
- }
83
- return '';
84
- }
85
- const LOGO = `${GREEN}${BOLD}
86
- ___ ' ____ _
87
- / _ \\ | _ \\ ___ _ _| |_ ___
88
- | | | | | |_) / _ \\| | | | __/ _ \\
89
- | |_| | | _ < (_) | |_| | || __/
90
- \\___/ |_| \\_\\___/ \\__,_|\\__\\___|${RESET}
91
- `;
92
- function loadConfig() {
93
- try {
94
- if (fs.existsSync(CONFIG_FILE)) {
95
- return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
96
- }
97
- }
98
- catch { }
99
- return {};
100
- }
101
- function saveConfig(config) {
102
- if (!fs.existsSync(CONFIG_DIR)) {
103
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
104
- }
105
- fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
106
- }
107
- function printWelcome() {
108
- // Try inline image first (iTerm2, WezTerm)
109
- const imgPath = getCharacterImagePath();
110
- const imageShown = imgPath ? displayInlineImage(imgPath, 18) : false;
111
- if (!imageShown) {
112
- // Fallback: ASCII art for VS Code, Terminal.app, etc.
113
- console.log(ASCII_CHARACTER);
114
- }
115
- console.log(LOGO);
116
- const termProgram = process.env['TERM_PROGRAM'] ?? 'unknown';
117
- console.log(`${GRAY} v${VERSION} · oroute.itshin.com · ${termProgram}${RESET}`);
118
- console.log();
119
- }
120
- function printMenu() {
121
- console.log(`${BOLD} What would you like to do?${RESET}`);
122
- console.log();
123
- console.log(` ${GREEN}1.${RESET} Login with Google (browser) ${GRAY}← 추천${RESET}`);
124
- console.log(` ${GREEN}2.${RESET} Login with API Key`);
125
- console.log(` ${GREEN}3.${RESET} Agent mode (file access + commands)`);
126
- console.log(` ${GREEN}4.${RESET} Check status`);
127
- console.log(` ${GREEN}5.${RESET} Settings`);
128
- console.log(` ${GREEN}q.${RESET} Quit`);
129
- console.log();
130
- }
131
- /** Parse CLI arguments — B5: --yes and --plan flags */
132
- function parseArgs(args) {
133
- let command;
134
- let targetPath;
135
- let prompt;
136
- let debug = false;
137
- let skipConfirmations = false;
138
- let planMode = false;
139
- for (let i = 0; i < args.length; i++) {
140
- const arg = args[i];
141
- if (arg === '--debug') {
142
- debug = true;
143
- continue;
144
- }
145
- if (arg === '--yes' || arg === '-y') {
146
- skipConfirmations = true;
147
- continue;
148
- }
149
- if (arg === '--plan') {
150
- planMode = true;
151
- continue;
152
- }
153
- if (arg === '-p' && args[i + 1]) {
154
- prompt = args[++i];
155
- continue;
156
- }
157
- if (['login', 'chat', 'status', 'agent'].includes(arg)) {
158
- command = arg;
159
- continue;
160
- }
161
- if (arg.startsWith('-'))
162
- continue;
163
- // Treat as path argument
164
- targetPath = arg;
165
- }
166
- return { command, path: targetPath, prompt, debug, skipConfirmations, planMode };
167
- }
168
- async function promptInput(prompt) {
169
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
170
- return new Promise(resolve => {
171
- rl.question(prompt, answer => {
172
- rl.close();
173
- resolve(answer.trim());
174
- });
175
- });
176
- }
177
- async function loginWithApiKey(config) {
178
- const key = await promptInput(`${GREEN}›${RESET} Enter your O'Route API Key (or-...): `);
179
- if (!key.startsWith('or-')) {
180
- console.log(`${YELLOW} Invalid key format. O'Route keys start with "or-"${RESET}`);
181
- return;
182
- }
183
- const apiUrl = config.apiUrl ?? LOCAL_API_URL;
184
- console.log(`${GRAY} Verifying key...${RESET}`);
185
- try {
186
- const res = await fetch(`${apiUrl}/v1/providers/status`, {
187
- headers: { 'Authorization': `Bearer ${key}` },
188
- signal: AbortSignal.timeout(5000),
189
- });
190
- config.apiKey = key;
191
- saveConfig(config);
192
- if (res.ok) {
193
- console.log(`${GREEN} ✓ API Key verified and saved!${RESET}`);
194
- }
195
- else {
196
- console.log(`${YELLOW} Key saved (server returned ${res.status}).${RESET}`);
197
- }
198
- console.log();
199
- await chat(config);
200
- return;
201
- }
202
- catch {
203
- config.apiKey = key;
204
- saveConfig(config);
205
- console.log(`${YELLOW} Saved (server offline). Starting chat...${RESET}`);
206
- console.log();
207
- await chat(config);
208
- }
209
- }
210
- async function loginWithGoogle(config) {
211
- const apiUrl = config.apiUrl ?? LOCAL_API_URL;
212
- console.log(`${GRAY} Requesting device code...${RESET}`);
213
- try {
214
- // 1. Request device code
215
- const res = await fetch(`${apiUrl}/v1/auth/device`, {
216
- method: 'POST',
217
- headers: { 'Content-Type': 'application/json' },
218
- signal: AbortSignal.timeout(5000),
219
- });
220
- if (!res.ok)
221
- throw new Error(`Server error: ${res.status}`);
222
- const data = await res.json();
223
- // 2. Open browser
224
- console.log();
225
- console.log(`${GREEN} ▶ 브라우저에서 Google 로그인하세요${RESET}`);
226
- console.log(`${GRAY} ${data.loginUrl}${RESET}`);
227
- console.log();
228
- console.log(`${GRAY} 확인 코드: ${WHITE}${BOLD}${data.userCode}${RESET}`);
229
- console.log(`${GRAY} 브라우저가 열립니다... 로그인 후 자동으로 연결됩니다.${RESET}`);
230
- console.log();
231
- const { exec } = await import('node:child_process');
232
- exec(`open "${data.loginUrl}" || xdg-open "${data.loginUrl}" || start "${data.loginUrl}"`);
233
- // 3. Poll for approval
234
- const maxAttempts = 150; // 5 min at 2s intervals
235
- for (let i = 0; i < maxAttempts; i++) {
236
- await new Promise(r => setTimeout(r, 2000));
237
- const pollRes = await fetch(`${apiUrl}/v1/auth/device/${data.deviceCode}`, {
238
- signal: AbortSignal.timeout(5000),
239
- });
240
- const pollData = await pollRes.json();
241
- if (pollData.status === 'approved' && pollData.apiKey) {
242
- config.apiKey = pollData.apiKey;
243
- saveConfig(config);
244
- console.log(`\n${GREEN} ✓ Logged in!${RESET} ${GRAY}(${pollData.email})${RESET}`);
245
- console.log(`${GREEN} ✓ API Key saved${RESET}`);
246
- console.log();
247
- // Auto-enter chat mode like Claude Code
248
- await chat(config);
249
- return;
250
- }
251
- if (pollData.status === 'expired') {
252
- console.log(`${YELLOW} 인증 코드가 만료되었습니다. 다시 시도해주세요.${RESET}`);
253
- return;
254
- }
255
- // Show waiting dots
256
- process.stdout.write(`\r${GRAY} 대기 중${'·'.repeat((i % 3) + 1).padEnd(3)}${RESET}`);
257
- }
258
- console.log(`\n${YELLOW} 시간 초과. 다시 시도해주세요.${RESET}`);
259
- }
260
- catch (err) {
261
- console.log(`${YELLOW} 서버에 연결할 수 없습니다. API Key로 로그인하세요 (옵션 1).${RESET}`);
262
- }
263
- }
264
- async function chat(config) {
265
- if (!config.apiKey) {
266
- console.log(`${YELLOW} No API Key configured. Run option 1 first.${RESET}`);
267
- return;
268
- }
269
- const apiUrl = config.apiUrl ?? LOCAL_API_URL;
270
- const model = config.model ?? 'auto';
271
- const cwd = process.cwd();
272
- console.log(`${GREEN}${BOLD} O'Route${RESET} v${VERSION}`);
273
- console.log(`${GRAY} model: ${model} (auto-routed) · 13 models${RESET}`);
274
- console.log(`${GRAY} ${cwd}${RESET}`);
275
- console.log();
276
- const messages = [];
277
- while (true) {
278
- const input = await promptInput(`${GREEN}›${RESET} `);
279
- if (!input || input === 'exit' || input === 'quit')
280
- break;
281
- messages.push({ role: 'user', content: input });
282
- try {
283
- const res = await fetch(`${apiUrl}/v1/messages`, {
284
- method: 'POST',
285
- headers: {
286
- 'Authorization': `Bearer ${config.apiKey}`,
287
- 'Content-Type': 'application/json',
288
- },
289
- body: JSON.stringify({
290
- model,
291
- max_tokens: 4096,
292
- messages,
293
- }),
294
- signal: AbortSignal.timeout(60000),
295
- });
296
- if (!res.ok) {
297
- const errBody = await res.json().catch(() => ({ error: { message: `HTTP ${res.status}` } }));
298
- const errMsg = typeof errBody.error === 'string' ? errBody.error : errBody.error?.message ?? `HTTP ${res.status}`;
299
- console.log(`${YELLOW} Error: ${errMsg}${RESET}`);
300
- messages.pop();
301
- continue;
302
- }
303
- const data = await res.json();
304
- const text = data.content[0]?.text ?? '';
305
- const meta = data.routing_metadata;
306
- console.log();
307
- console.log(`${WHITE}${text}${RESET}`);
308
- console.log();
309
- console.log(`${DIM} ─ ${meta.provider} · L${meta.taskComplexity} · ${meta.totalLatencyMs.toFixed(0)}ms · ${data.usage.input_tokens}+${data.usage.output_tokens} tokens${RESET}`);
310
- console.log();
311
- messages.push({ role: 'assistant', content: text });
312
- }
313
- catch (err) {
314
- console.log(`${YELLOW} Request failed: ${err instanceof Error ? err.message : 'unknown'}${RESET}`);
315
- messages.pop();
316
- }
317
- }
318
- }
319
- async function checkStatus(config) {
320
- const apiUrl = config.apiUrl ?? LOCAL_API_URL;
321
- console.log(`${GRAY} Checking O'Route status...${RESET}`);
322
- try {
323
- const res = await fetch(`${apiUrl}/health`, { signal: AbortSignal.timeout(5000) });
324
- const data = await res.json();
325
- console.log(`${GREEN} ✓ Server: ${data.status} (v${data.version})${RESET}`);
326
- console.log(`${GRAY} URL: ${apiUrl}${RESET}`);
327
- console.log(`${GRAY} Key: ${config.apiKey ? config.apiKey.slice(0, 11) + '...' : 'not set'}${RESET}`);
328
- console.log(`${GRAY} Model: ${config.model ?? 'auto'}${RESET}`);
329
- }
330
- catch {
331
- console.log(`${YELLOW} ✗ Server unreachable at ${apiUrl}${RESET}`);
332
- }
333
- }
334
- async function settings(config) {
335
- console.log(`${BOLD} Settings${RESET}`);
336
- console.log(`${GRAY} 1. API URL: ${config.apiUrl ?? LOCAL_API_URL}${RESET}`);
337
- console.log(`${GRAY} 2. Default model: ${config.model ?? 'auto'}${RESET}`);
338
- console.log(`${GRAY} 3. Reset config${RESET}`);
339
- console.log(`${GRAY} b. Back${RESET}`);
340
- const choice = await promptInput(`${GREEN}›${RESET} `);
341
- switch (choice) {
342
- case '1': {
343
- const url = await promptInput(`${GREEN}›${RESET} API URL: `);
344
- if (url) {
345
- config.apiUrl = url;
346
- saveConfig(config);
347
- }
348
- break;
349
- }
350
- case '2': {
351
- console.log(`${GRAY} Options: auto, anthropic/claude-sonnet-4-6, openai/gpt-4o, etc.${RESET}`);
352
- const model = await promptInput(`${GREEN}›${RESET} Model: `);
353
- if (model) {
354
- config.model = model;
355
- saveConfig(config);
356
- }
357
- break;
358
- }
359
- case '3':
360
- fs.unlinkSync(CONFIG_FILE);
361
- console.log(`${GREEN} ✓ Config reset${RESET}`);
362
- break;
363
- }
364
- }
365
- // ── Main ──
366
- async function main() {
367
- const rawArgs = process.argv.slice(2);
368
- const config = loadConfig();
369
- const parsed = parseArgs(rawArgs);
370
- // C6: Auto-update check (non-blocking, background)
371
- checkForUpdates(VERSION);
372
- // Handle --debug
373
- if (parsed.debug) {
374
- console.log(`${GRAY} Debug mode: config=${JSON.stringify(config)}${RESET}`);
375
- }
376
- // Handle path argument — change cwd
377
- if (parsed.path) {
378
- const resolved = path.resolve(process.cwd(), parsed.path);
379
- if (!fs.existsSync(resolved)) {
380
- console.log(`${YELLOW} 디렉토리를 찾을 수 없습니다: ${resolved}${RESET}`);
381
- process.exit(1);
382
- }
383
- const stat = fs.statSync(resolved);
384
- if (!stat.isDirectory()) {
385
- console.log(`${YELLOW} 디렉토리가 아닙니다: ${resolved}${RESET}`);
386
- process.exit(1);
387
- }
388
- process.chdir(resolved);
389
- }
390
- // Build agent config with flags
391
- const agentConfig = {
392
- ...config,
393
- skipConfirmations: parsed.skipConfirmations,
394
- planMode: parsed.planMode,
395
- };
396
- // Direct command shortcuts
397
- if (parsed.command === 'login') {
398
- printWelcome();
399
- await loginWithApiKey(config);
400
- return;
401
- }
402
- if (parsed.command === 'chat' || parsed.command === 'agent') {
403
- await agentChat(agentConfig);
404
- return;
405
- }
406
- if (parsed.command === 'status') {
407
- await checkStatus(config);
408
- return;
409
- }
410
- // -p "prompt" → one-shot agent execution
411
- if (parsed.prompt) {
412
- if (!config.apiKey) {
413
- console.log(`${YELLOW}No API Key. Run: oroute login${RESET}`);
414
- process.exit(1);
415
- }
416
- const apiUrl = config.apiUrl ?? LOCAL_API_URL;
417
- try {
418
- const res = await fetch(`${apiUrl}/v1/messages`, {
419
- method: 'POST',
420
- headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json' },
421
- body: JSON.stringify({ model: config.model ?? 'auto', max_tokens: 4096, messages: [{ role: 'user', content: parsed.prompt }] }),
422
- signal: AbortSignal.timeout(60000),
423
- });
424
- const data = await res.json();
425
- console.log(data.content[0]?.text ?? '');
426
- }
427
- catch (err) {
428
- const msg = err instanceof Error ? err.message : String(err);
429
- console.log(`${YELLOW} Error: ${msg}${RESET}`);
430
- }
431
- return;
432
- }
433
- // If already logged in → go straight to agent mode (like Claude Code)
434
- printWelcome();
435
- if (config.apiKey) {
436
- await agentChat(agentConfig);
437
- return;
438
- }
439
- // Not logged in → show menu
440
- while (true) {
441
- printMenu();
442
- const choice = await promptInput(`${GREEN}›${RESET} `);
443
- switch (choice) {
444
- case '1':
445
- await loginWithGoogle(config);
446
- break;
447
- case '2':
448
- await loginWithApiKey(config);
449
- break;
450
- case '3':
451
- await agentChat(agentConfig);
452
- break;
453
- case '4':
454
- await checkStatus(config);
455
- break;
456
- case '5':
457
- await settings(config);
458
- break;
459
- case 'q':
460
- case 'quit':
461
- case 'exit':
462
- console.log(`${GRAY} Bye!${RESET}`);
463
- process.exit(0);
464
- default:
465
- console.log(`${YELLOW} Unknown option: ${choice}${RESET}`);
466
- }
467
- console.log();
468
- }
469
- }
470
- main().catch((err) => {
471
- const msg = err instanceof Error ? err.message : String(err);
472
- console.error(`${YELLOW} Error: ${msg}${RESET}`);
473
- process.exit(1);
474
- });
475
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Render markdown text with ANSI escape codes for terminal display.
3
- */
4
- export declare function renderMarkdown(text: string): string;