MCPcopy Create free account
hub / github.com/claude-code-internals/claude-code-runnable / runInteractive

Function runInteractive

src/localRecoveryCli.ts:171–224  ·  view source on GitHub ↗
(parsed: {
  model?: string
  systemPrompt?: string
  appendSystemPrompt?: string
})

Source from the content-addressed store, hash-verified

169}
170
171async 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
226void run().catch(error => {
227 const message = error instanceof Error ? error.stack || error.message : String(error)

Callers 1

runFunction · 0.85

Calls 4

getSystemPromptFunction · 0.70
createMethod · 0.65
writeMethod · 0.45
closeMethod · 0.45

Tested by

no test coverage detected