Add Phase 5: ReAct-style agent loop with tool execution
Implement the core autonomy layer — AgentLoop streams LLM responses, parses tool calls, executes them with permission checks, feeds results back, and repeats until the task completes or finish is called. - Add FinishTool for explicit loop termination - Add tools parameter to LLMClient.stream_chat() for function calling - Add compact tool result display (status line, not full output) - Refactor REPL to delegate to AgentLoop.run_turn() - Fix Ollama null content rejection (always send content as string) - Add finish to auto_approve permissions - 9 unit tests for agent loop (34 total, zero regressions) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -35,8 +35,9 @@ class Message(BaseModel):
|
||||
"""
|
||||
data: dict[str, Any] = {"role": self.role}
|
||||
|
||||
if self.content is not None:
|
||||
data["content"] = self.content
|
||||
# Ollama requires content to be a string, never null/missing —
|
||||
# even on assistant messages that only contain tool_calls.
|
||||
data["content"] = self.content or ""
|
||||
|
||||
if self.tool_calls is not None:
|
||||
data["tool_calls"] = [tc.model_dump() for tc in self.tool_calls]
|
||||
|
||||
Reference in New Issue
Block a user