(parsed: {
model?: string
systemPrompt?: string
appendSystemPrompt?: string
})
| 169 | } |
| 170 | |
| 171 | async function runInteractive(parsed: { |
| 172 | model?: string |
| 173 | systemPrompt?: string |
| 174 | appendSystemPrompt?: string |
| 175 | }): Promise<void> { |
| 176 | const apiKey = process.env.ANTHROPIC_API_KEY |
| 177 | const authToken = process.env.ANTHROPIC_AUTH_TOKEN |
| 178 | if (!apiKey && !authToken) { |
| 179 | process.stderr.write('Error: set ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN\n') |
| 180 | process.exitCode = 1 |
| 181 | return |
| 182 | } |
| 183 | |
| 184 | const model = parsed.model || process.env.ANTHROPIC_DEFAULT_SONNET_MODEL || process.env.ANTHROPIC_MODEL |
| 185 | if (!model) { |
| 186 | process.stderr.write('Error: model is required\n') |
| 187 | process.exitCode = 1 |
| 188 | return |
| 189 | } |
| 190 | |
| 191 | const client = new Anthropic({ |
| 192 | apiKey: apiKey ?? undefined, |
| 193 | authToken: authToken ?? undefined, |
| 194 | baseURL: process.env.ANTHROPIC_BASE_URL || undefined, |
| 195 | timeout: parseInt(process.env.API_TIMEOUT_MS || String(600_000), 10), |
| 196 | maxRetries: 0, |
| 197 | }) |
| 198 | |
| 199 | const system = getSystemPrompt(parsed.systemPrompt, parsed.appendSystemPrompt) |
| 200 | const messages: Array<{ role: 'user' | 'assistant'; content: string }> = [] |
| 201 | const rl = createInterface({ input: process.stdin, output: process.stdout, prompt: 'you> ' }) |
| 202 | |
| 203 | process.stdout.write(`Claude Code local interactive mode\nmodel: ${model}\ncommands: /exit, /clear\n\n`) |
| 204 | rl.prompt() |
| 205 | |
| 206 | for await (const line of rl) { |
| 207 | const input = line.trim() |
| 208 | if (!input) { rl.prompt(); continue } |
| 209 | if (input === '/exit' || input === '/quit') { rl.close(); break } |
| 210 | if (input === '/clear') { messages.length = 0; process.stdout.write('history cleared\n'); rl.prompt(); continue } |
| 211 | |
| 212 | messages.push({ role: 'user', content: input }) |
| 213 | try { |
| 214 | const response = await client.messages.create({ model, max_tokens: 4096, system, messages }) |
| 215 | const text = response.content.filter(block => block.type === 'text').map(block => block.text).join('\n') |
| 216 | process.stdout.write(`claude> ${text}\n\n`) |
| 217 | messages.push({ role: 'assistant', content: text }) |
| 218 | } catch (error) { |
| 219 | const message = error instanceof Error ? error.message : String(error) |
| 220 | process.stderr.write(`error: ${message}\n`) |
| 221 | } |
| 222 | rl.prompt() |
| 223 | } |
| 224 | } |
| 225 | |
| 226 | void run().catch(error => { |
| 227 | const message = error instanceof Error ? error.stack || error.message : String(error) |
no test coverage detected