import Anthropic from '@anthropic-ai/sdk';
import { MorphClient } from '@morphllm/morphsdk';
const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
const anthropic = new Anthropic();
const grepTool = morph.anthropic.createWarpGrepTool({ repoRoot: '.' });
async function askCodebase(question: string) {
const messages: Anthropic.MessageParam[] = [
{ role: 'user', content: question }
];
let maxTurns = 5;
while (maxTurns-- > 0) {
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-5-20250929',
max_tokens: 8192,
tools: [grepTool],
system: 'Use the search tool to find relevant code before answering. Cite file paths.',
messages
});
// Model is done — return the final text
if (response.stop_reason === 'end_turn') {
return response.content.find(c => c.type === 'text')?.text;
}
// Otherwise, execute tool calls and feed results back
messages.push({ role: 'assistant', content: response.content });
const toolResults = [];
for (const block of response.content) {
if (block.type === 'tool_use') {
const result = await grepTool.execute(block.input);
toolResults.push({
type: 'tool_result' as const,
tool_use_id: block.id,
content: grepTool.formatResult(result)
});
}
}
messages.push({ role: 'user', content: toolResults });
}
}
await askCodebase('How does authentication work in this project?');