diff --git a/src/agent_box/agents/claude_code.py b/src/agent_box/agents/claude_code.py index b9c66c9..de23f58 100644 --- a/src/agent_box/agents/claude_code.py +++ b/src/agent_box/agents/claude_code.py @@ -4,11 +4,13 @@ import json import logging +import os import re from collections.abc import AsyncIterator from typing import Any import anyio +from anthropic import AsyncAnthropic from claude_agent_sdk import ( AssistantMessage, @@ -101,9 +103,6 @@ def _shorten_path(path: str, prefixes: tuple[str, ...]) -> str: return path -import re - - def _shorten_paths_in_cmd(cmd: str, prefixes: tuple[str, ...]) -> str: """Replace known path prefixes inside a shell command string. @@ -258,6 +257,57 @@ def _format_recent_rounds(messages: list[SessionMessage], n: int = 2) -> str: return "\n".join(lines) +# ── AskUserQuestion answer parser ── + +_answer_client: AsyncAnthropic | None = None + + +def _get_answer_client() -> AsyncAnthropic: + global _answer_client + if _answer_client is None: + _answer_client = AsyncAnthropic( + api_key=os.environ.get("ANTHROPIC_API_KEY"), + base_url=os.environ.get("ANTHROPIC_BASE_URL") or None, + ) + return _answer_client + + +async def _parse_user_answer(questions: list[dict], user_reply: str) -> dict: + """Map free-text user reply to structured AskUserQuestion answers via LLM. + + Returns ``{"answers": {"": "