Source Code
The runnable TypeScript source for this lesson is in
lessons/01-core-loop/
Lesson 1: The Core Agent Loop¶
What You'll Learn¶
The fundamental pattern behind every AI coding agent is surprisingly simple: a loop.
while (task not complete):
1. AI decides what action to take
2. Execute that action
3. Show the AI the result
4. Loop back to step 1
In this lesson, we'll build this loop from scratch in TypeScript with proper types.
Key Concepts¶
The Agent Loop¶
An agent is different from a chatbot because it can act. A chatbot just responds; an agent: - Takes actions (reads files, runs commands) - Observes results - Decides what to do next - Repeats until the task is done
Why TypeScript?¶
Unlike the original Python examples, we start with TypeScript because: 1. Type safety: Catch errors at compile time, not runtime 2. Better tooling: Autocomplete, refactoring, documentation 3. Same language as tools: Most of our codebase is TypeScript
Files in This Lesson¶
types.ts- Core type definitionsloop.ts- The agent loop implementationmain.ts- Entry point to run the agent
Running This Lesson¶
# From the course root
npm run lesson:1
# Or directly
npx tsx 01-core-loop/main.ts "Create a hello world file"
The Minimal Agent¶
Here's the entire concept in pseudocode:
async function runAgent(task: string) {
const messages = [{ role: 'user', content: task }];
while (true) {
// 1. Ask the LLM what to do
const response = await llm.chat(messages);
messages.push({ role: 'assistant', content: response });
// 2. Check if it wants to use a tool
const toolCall = parseToolCall(response);
if (!toolCall) {
// No tool call = task is complete
console.log('Done:', response);
break;
}
// 3. Execute the tool
const result = await executeTool(toolCall);
// 4. Add result to conversation and loop
messages.push({ role: 'user', content: `Result: ${result}` });
}
}
That's it. Everything else is refinement.
Next Steps¶
After completing this lesson, move on to: - Lesson 2: Provider Abstraction - Support multiple LLM providers