Commit History
-
Add CLI sandbox runtime and fix HF Jobs script paths (#237)
Unverified signature* Resolve bare Python job scripts Co-authored-by: OpenAI Codex <codex@openai.com> * Update HF Jobs script description Co-authored-by: OpenAI Codex <codex@openai.com> * Clarify HF Jobs script path prompt Co-authored-by: OpenAI Codex <codex@openai.com> * Add CLI sandbox tool runtime Co-authored-by: OpenAI Codex <codex@openai.com> * Document CLI sandbox tool runtime Co-authored-by: OpenAI Codex <codex@openai.com> * Wait for initial CLI sandbox preload Co-authored-by: OpenAI Codex <codex@openai.com> * Strengthen GPU sandbox preflight guidance Co-authored-by: OpenAI Codex <codex@openai.com> * Guard against text-only stops with unfinished plans Co-authored-by: OpenAI Codex <codex@openai.com> * Route sandbox deletion logs through tool events Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>b05b6f5
-
Use hyphenated ml-intern Trackio prefixes (#250)
Unverified signature* Use hyphenated ml-intern Trackio prefixes Co-authored-by: OpenAI Codex <codex@openai.com> * Drop legacy Trackio prefix handling Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>11112c6 -
Use duplicate_repo for sandbox Spaces (#249)
Unverified signature* Use duplicate_repo for sandbox Spaces Co-authored-by: OpenAI Codex <codex@openai.com> * Tighten duplicate_repo sandbox fakes Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>d684c1a -
Fix GPU sandbox hardware OAuth failure (#246)
Unverified signature* Fix GPU sandbox hardware OAuth failure Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox sleep-time review Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>60f7188
-
Fix Pro entitlement checks (#239)
Unverified signature* Fix Pro entitlement checks Normalize HF Pro and paid org plan detection, allow premium model selection with quota enforcement, and clarify HF Jobs credit billing copy. Co-authored-by: OpenAI Codex <codex@openai.com> * Limit premium quota to personal Pro Ignore org membership for premium-model quota so users need personal HF Pro for the higher cap, while dev mode uses the Pro tier for local testing. Co-authored-by: OpenAI Codex <codex@openai.com> * Scope model switch errors to model picker Show model switch failures through local ChatInput state instead of rendering the shared agent error field globally. Co-authored-by: OpenAI Codex <codex@openai.com> * Restrict premium quota detection to Pro accounts Co-authored-by: OpenAI Codex <codex@openai.com> * Use boolean Pro signal for premium quota Co-authored-by: OpenAI Codex <codex@openai.com> * Use documented isPro field for quota tier Co-authored-by: OpenAI Codex <codex@openai.com> * Remove dead global chat error state Co-…d7637ba -
Skip sandbox spaces for artifact metadata (#241)
Unverified signature* Skip sandbox spaces for artifact metadata Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox metadata PR feedback Co-authored-by: OpenAI Codex <codex@openai.com> * Avoid sandbox title metadata updates Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>1e1fe1f
-
Add ML Intern Hub artifact metadata (#225)
Unverified signature* Add ML Intern Hub artifact metadata Co-authored-by: OpenAI Codex <codex@openai.com> * Extend Hub artifact hooks to sandbox bash Co-authored-by: OpenAI Codex <codex@openai.com> * Create Hub artifact collections at session start Co-authored-by: OpenAI Codex <codex@openai.com> * Address Hub artifact PR review comments Co-authored-by: OpenAI Codex <codex@openai.com> * Respect Hub collection title limits Co-authored-by: OpenAI Codex <codex@openai.com> * Shorten collection session UUID fragments Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>4fc6e96
-
Add CI for tests and Ruff (#217)
Unverified signature* Add CI for tests and Ruff Co-authored-by: OpenAI Codex <codex@openai.com> * Enforce Ruff formatting in CI Co-authored-by: OpenAI Codex <codex@openai.com> * Document Ruff pre-commit checks Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>754345f -
Skip redundant CPU sandbox hardware request (#216)
Unverified signature* Skip redundant CPU sandbox hardware request Avoid calling the Hub hardware endpoint for default cpu-basic sandboxes because duplicate_space already requests that tier. Keep the hardware retry path for non-default tiers. Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox hardware review feedback Use the CPU hardware constant as the Sandbox.create default and document why the auto-sleep guard still needs the hardware endpoint. Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>6ea1c42 -
Retry sandbox hardware requests (#210)
Unverified signature* Retry sandbox hardware requests Retry transient Hub errors when requesting hardware for a newly duplicated private sandbox Space. This covers the deployed OAuth path where duplicate succeeds but /hardware can briefly return 401/Repository Not Found before the private Space is manageable. Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox retry review feedback Narrow transient hardware retry handling to 401 and 404, add coverage for timeout propagation, and fix top-level spacing. Co-authored-by: OpenAI Codex <codex@openai.com> * Ensure auto CPU sandboxes are cleaned up Persist sandbox identity on session records, clean stale sandboxes during restore, skip preloading when delete/teardown restores a session, and clean live sandboxes during backend shutdown. Add a scheduled orphan sweeper workflow as a backstop. Co-authored-by: OpenAI Codex <codex@openai.com> * Remove scheduled sandbox sweeper Delete the GitHub Actions cron workflow for orphan sandbox cleanup and…7636865
-
Auto-start CPU sandboxes for sessions (#200)
Unverified signature* Auto-start CPU sandboxes for sessions Co-authored-by: Codex <codex@openai.com> * Retry sandbox runtime visibility checks Co-authored-by: Codex <codex@openai.com> * Stabilize auto CPU sandbox creation Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox PR review comments Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>8615c28 -
Steer agent to HF kernels instead of pip install flash-attn (#204)
Darshan ThakareUnverified signature* chore: update the agent system prompt * chore: update the tool documentation7599843
-
Make sandboxes private (#195)
Unverified signature* Make sandbox Spaces private Co-authored-by: Codex <codex@openai.com> * Remove legacy sandbox auth fallback Co-authored-by: Codex <codex@openai.com> * Address sandbox privacy review comments Co-authored-by: Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>15d6506
-
feat(telemetry): track 5 untracked Bedrock call sites for full cost attribution (#179)
Guillaume SalouUnverified signature* feat(telemetry): track 5 untracked Bedrock call sites for full cost attribution Cost Explorer ($78,738 over 6 days) vs the session dataset's total_cost_usd (~$354/day attributed) showed the dataset captures only ~33% of real Bedrock spend. Root cause: out of 9 acompletion() call sites, only 2 (in agent_loop.py) emit the llm_call event that total_cost_usd sums. This wires telemetry into the 5 Bedrock-billing call sites that were flying blind, with a `kind` tag on each call so analytics can split spend by category: - research_tool.py × 3 → kind="research" (sub-agent loop) - context_manager.py → kind="compaction" (history summary) - effort_probe.py → kind="effort_probe" (cascade walk) Plus a fourth tag for the session-restore summary path (session_manager.py → kind="restore"). Plumbing changes: - telemetry.record_llm_call now accepts kind="..." (default "main" preserves existing behavior). - summarize_messages() and ContextManager.compact() take optional ses…7867a7a
-
Track Pro conversions + credits top-up; emit user_id + new KPIs (#174)
Aksel Joonas ReediUnverified signatureAdds two telemetry events the dashboard needs to answer "how many users converted to Pro?" and "how many came back from a billing block?": - pro_conversion: per-user Pro state lives in a new Mongo `pro_users` collection. mark_pro_seen upserts on every authenticated request and uses an atomic find_one_and_update to fire at-most-once when a user first appears as Pro after having been seen as non-Pro. Wired through session_manager.create_session via the existing `is_pro` signal from /auth. - credits_topped_up: fires from jobs_tool when an hf_job submit succeeds in a session that previously hit a billing-required tool_state_change. Guarded against re-firing within a session. build_kpis aggregates both as plain count columns. CLI/local users with no Mongo silently skip via the NoopSessionStore stub.2715896 -
Bill HF Jobs by namespace credits, drop Pro and org-join gating (#172)
Aksel Joonas ReediUnverified signature* Bill HF Jobs by namespace credits, drop Pro and org-join gating - Drop the Pro/Team subscription pre-check on hf_jobs. Any namespace the caller belongs to is eligible; HF returns a billing error at job creation time if the wallet is empty, which the agent surfaces as a "top up to launch" dialog pointing at /settings/billing. - Remove the "Join ML Agent Explorers" onboarding step. The org-join hook, /auth/org-membership endpoint, and the OAuth orgIds suggestion are gone. - Rework JobsUpgradeDialog: namespace picker shows all eligible accounts/orgs with avatars + select rings; billing mode opens the HF billing page; "Skip this tool call" stays available for both. - Backend pre-flight only forces the picker when the caller has multiple eligible namespaces; single-namespace users default to their personal account silently. - jobs_tool now catches HfHubHTTPError, detects billing failures by pattern + 402 status, emits a tool_state_change(state=billing_required) so t…bed4e38 -
fix(sandbox): retry cleanup on transient failures + add backstop sweeper (#163)
Guillaume SalouUnverified signature* fix(sandbox): retry delete on transient failures + add backstop sweeper The agent creates a sandbox Space per session (template duplicated from burtenshaw/sandbox into the user's account). A scan on 2026-04-27 found 2,310 orphan sandbox-* Spaces — every sandbox ever created was still around. Two failure modes were causing the leak: 1. The cleanup in `_run_session.finally` doesn't fire if the pod is killed (OOM, deploy rollout, pre-emption) or if the WebSocket drops without a /shutdown. 2. When `sandbox.delete` itself failed (HF API 5xx, transient network blip, rate-limit), the previous code logged a warning and moved on. No retry, no recovery — the Space lived forever. This PR addresses both: - `_cleanup_sandbox` now retries 3× with exponential backoff (1s, 2s). Closes the transient-failure path. - New `scripts/sweep_orphan_sandboxes.py` is a standalone sweeper that finds sandbox-* forks of burtenshaw/sandbox older than N days and deletes them. Designed to run …1d50c78
-
Embed trackio dashboard in chat for jobs and sandboxes (#161)
Aksel Joonas ReediUnverified signature* Embed trackio dashboard in chat for jobs and sandboxes Wires `trackio_space_id` / `trackio_project` through hf_jobs and sandbox_create as optional tool args, then renders the resulting dashboard inline as an embedded iframe in the chat. The plumbing turned out to need four pieces, not two: 1. Inject TRACKIO_SPACE_ID / TRACKIO_PROJECT into job + sandbox env. 2. Surface the values in tool_state_change so the frontend can render the embed when the tool call is in flight. 3. Pre-seed the Space with our own README/requirements/app.py — without this, trackio's init() against an existing empty Space leaves the iframe stuck on the default Gradio template. We omit `hf_oauth: true` from the seeded README so the embed renders without a sign-in click; per-user privacy comes from HF namespace ownership. 4. Mount the metrics bucket on the dashboard Space at /data and set TRACKIO_DIR / TRACKIO_BUCKET_ID. trackio.init() in the job creates the bucket but o…6131fc8 -
Add web search so the agent can cite current sources (#159)
Aksel Joonas ReediUnverified signatureThe agent had research tools for papers, docs, and repositories, but no direct current-web lookup. This ports Claw Code's WebSearch behavior into a Python tool that searches DuckDuckGo HTML, extracts citeable title/URL hits, applies domain filters, and returns the same JSON-shaped result payload for model consumption. Constraint: The implementation was prepared in a writable checkout because the primary working tree was sandbox read-only during this session. Rejected: Add a new search API dependency | the Claw implementation uses the DuckDuckGo HTML endpoint and the repo already has requests. Confidence: medium Scope-risk: narrow Directive: Keep the output schema stable unless the agent prompt/tool consumers are updated together. Tested: pytest tests/unit/test_web_search_tool.py tests/unit/test_malformed_args_recovery.py -q Tested: python -m compileall agent/tools/web_search_tool.py agent/core/tools.py agent/tools/research_tool.py agent/tools/__init__.py tests/unit/test_web_sear…72f615f -
Add Slack gateway (#116)
Unverified signature* Add messaging gateway and notify tool Co-authored-by: OpenAI Codex <codex@openai.com> * Handle Bedrock streaming permission denials Co-authored-by: OpenAI Codex <codex@openai.com> * Revert "Handle Bedrock streaming permission denials" Co-authored-by: OpenAI Codex <codex@openai.com> * Add automatic completion notifications Co-authored-by: OpenAI Codex <codex@openai.com> * Auto-attach CLI notification destinations Co-authored-by: OpenAI Codex <codex@openai.com> * Defer CLI completion notifications until render Co-authored-by: OpenAI Codex <codex@openai.com> * Increase completion notification summary cap Co-authored-by: OpenAI Codex <codex@openai.com> * Add Slack user notification defaults Co-authored-by: Codex <codex@openai.com> * Increase Slack turn completion summary limit Co-authored-by: Codex <codex@openai.com> * Remove legacy auto notification event upgrade Co-authored-by: Codex <codex@openai.com> * Require session config instead of hard-coded model fallback C…6155b26 -
Protect sandbox control-plane routes (#142)
Aksel Joonas ReediUnverified signature* Protect sandbox control-plane routes The sandbox server exposed command and file APIs on public Spaces without validating the client. This adds bearer-token validation to every non-health endpoint and provisions a per-sandbox API secret so control-plane access is not coupled to URL knowledge. Constraint: Existing sandboxes may only have HF_TOKEN configured, so the server accepts SANDBOX_API_TOKEN first and falls back to HF_TOKEN for compatibility. Rejected: Make every sandbox private by default | that changes product behavior and still leaves the embedded API without a server-side auth boundary. Confidence: high Scope-risk: narrow Directive: Do not add new sandbox API routes without the auth dependency unless the route is intentionally public health/status only. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_sandbox_api_auth.py * Preserve sandbox reconnect with API token Review caught that Sandbox.connect would send only the HF token while newly…98e4465 -
Keep repetition guard internal (#144)
Aksel Joonas ReediUnverified signature* Clarify repetition guard messaging The loop breaker is intentional recovery behavior, but the user-facing 'doom loop' phrasing reads like a crash. Rename the visible log and system hint to a repetition guard while preserving the existing detector behavior and historical SFT tag compatibility. Constraint: Existing trajectories may still contain the old wording, so the tagger must recognize both labels. Rejected: Remove the event entirely | users would lose visibility into why the agent changed strategy. Confidence: high Scope-risk: narrow Directive: Keep user-facing recovery logs operational and non-alarming; reserve internal jargon for code, not UI events. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_doom_loop_polling.py tests/unit/test_sft_tagger.py * Hide repetition guard from user surfaces The repetition guard is an internal control-flow intervention, not a status event users need to act on. Remove the CLI/frontend tool_log emissions while …e8ed637
-
Run jobs under user or org accounts with upgrade / org-pick UX (#132)
Aksel Joonas ReediUnverified signature* agent/core/agent_loop.py: jobs access rewiring * agent/core/telemetry.py: jobs access rewiring * agent/tools/jobs_tool.py: jobs access rewiring * backend/dependencies.py: jobs access rewiring * backend/models.py: jobs access rewiring * backend/routes/agent.py: jobs access rewiring * frontend/src/components/Chat/ChatInput.tsx: jobs access rewiring * frontend/src/components/ClaudeCapDialog.tsx: jobs access rewiring * frontend/src/components/SessionChat.tsx: jobs access rewiring * frontend/src/hooks/useAgentChat.ts: jobs access rewiring * frontend/src/lib/sse-chat-transport.ts: jobs access rewiring * frontend/src/store/agentStore.ts: jobs access rewiring * frontend/src/types/agent.ts: jobs access rewiring * scripts/build_kpis.py: jobs access rewiring * tests/unit/test_build_kpis.py: jobs access rewiring * agent/core/hf_access.py: jobs access rewiring * frontend/src/components/JobsUpgradeDialog.tsx: jobs access rewiring * tests/unit/test_hf_access.py: jobs access rewirin…ff8c636
-
Fix CLI rendering corruption and split CLI/frontend model defaults (#121)
Aksel Joonas ReediUnverified signature* Stabilize CLI rendering and make surface defaults explicit The interactive CLI was interleaving live sub-agent redraws with streamed markdown output, which corrupted ANSI rendering and leaked raw control sequences into the terminal. The CLI and web app also shared one default model config even though they need different Anthropic routing defaults. Constraint: CLI default must use direct Anthropic credentials while web sessions must default to Bedrock Anthropic Constraint: Interactive terminal output must remain readable while sub-agent progress is live Rejected: Single shared config file with runtime overrides | keeps ownership of defaults implicit across surfaces Rejected: Keep background redraw ticker | concurrent terminal writers still corrupt streamed output Confidence: high Scope-risk: moderate Reversibility: clean Directive: Keep CLI and frontend default models in separate config files unless both surfaces intentionally converge again Tested: python -m compileall agent backen…3eec386
-
feat(observability)
Aksel Joonas ReediUnverified signature2a2e170
-
feat: route Claude via Bedrock inference profile (#82)
Guillaume SalouUnverified signatureSwitch the Claude endpoint IDs from the direct Anthropic API to the US cross-region inference profile. Extend the model-provider substring check so both prefixes keep hitting the HF-org gate, the daily Claude quota, and prompt caching.2fac9ff -
feat: enable Anthropic prompt caching on system prompt and tools (#69)
Unverified signature* feat: enable Anthropic prompt caching on system prompt and tools Mark the rendered system prompt and the tool block with cache_control breakpoints when calling Anthropic models. The static prefix (~4-5K tokens of system prompt + 15+ tool definitions) was being re-billed at full input rate on every turn, every retry, and every research sub-agent iteration (up to 60 per task). With ephemeral cache breakpoints, subsequent turns within the 5-minute TTL are billed at cache-read pricing (~10% of input cost). Expected savings: 40-50% input tokens on multi-turn conversations, 60-80% on research sub-agent loops. Caching is GA in the Anthropic API and natively supported by litellm 1.83+ via cache_control blocks (no beta header required). Non-Anthropic models (HF router, OpenAI) are passed through unchanged. The helper does not mutate the caller's message list or tool list, so the persisted ContextManager.items history stays in its original string-content form. * refactor: hoist prompt_cac…5d357ba
-
fix /model switcher with effort params
Aksel Joonas ReediUnverified signature* /model: probe effort combo on switch, stop passing reasoning_effort to litellm Switching to claude-opus-4-7 with /effort set would 400 with "thinking.type.enabled is not supported" because litellm 1.83.0's Anthropic adapter substring-matches "4.6" to decide which thinking API shape to send, and doesn't know about 4.7's adaptive + output_config.effort contract. Rather than maintain a per-model capability table that rots every time a new Claude family ships, this change trusts the API itself: - llm_params.py: for anthropic/*, bypass litellm's reasoning_effort -> thinking mapping and pass thinking={type: adaptive} plus output_config={effort: ...} as top-level kwargs directly. litellm forwards unknown top-level params into Anthropic request bodies (extra_body does NOT work here — Anthropic rejects it as "Extra inputs are not permitted"). One localized monkey-patch widens litellm 1.83's hardcoded _is_opus_4_6_model check so effort=max isn't rejected synchronously on 4.7 — re…e2552e8 -
Fix parallel-research display: per-call stats in CLI and web UI (#49)
Aksel Joonas Reedi +1: lee101 Unverified signatureWhen multiple research sub-agents ran concurrently, the CLI collapsed them into a single flickering slot and every web-UI tool card showed the aggregate across all agents — so 3 parallel calls looked like 1. CLI (agent/utils/terminal_display.py): - Replace the global SubAgentDisplay singleton with SubAgentDisplayManager that tracks each agent by agent_id and renders one block per agent with independent (tool count · tokens · elapsed). - 4 rolling tool-call lines per agent (was 2). - When 2+ agents are live, switch to a compact one-line-per-agent layout (label + stats + most-recent tool). Detailed 4-line rolling view only when a single agent is active. Keeps the live region small enough to fit on one terminal page so cursor-up/erase doesn't drift when content would otherwise scroll into scrollback. - Clip every live-region line to terminal width (ANSI-aware) so a wrapped line can't corrupt the cursor-up math on narrow terminals. - On completion, erase the live block and f…5ab7c4e -
Strip provider_specific_fields from research sub-agent messages
LiteLLM's response Message carries internal fields (provider_specific_fields, reasoning_content) that the HF router's strict OpenAI schema rejects when echoed back in a follow-up request. Rebuild the assistant Message with only role / content / tool_calls before appending to the research history. Reproduced on MiniMaxAI/MiniMax-M2.7 (the reported failure) and verified the fix across MiniMax, Kimi, GLM, Claude Opus, and GPT-5 in a multi-turn tool-calling loop.a2e8010 -
Route HF inference through /v1 auto-router + add reasoning_effort knob
Users paste bare HF model ids (MiniMaxAI/MiniMax-M2.7, moonshotai/Kimi-K2.6) with an optional :fastest|cheapest|preferred|<provider> suffix; the router picks a provider and handles failover. /model does a live preflight against /v1/models and prints providers, pricing, context, tool support — warn-and- allow for unknowns with fuzzy suggestions. Friendly messages replace LiteLLM's raw traceback for model/provider mismatches, and the noisy 'Give Feedback' banner is suppressed. Adds a reasoning_effort config + /effort command (default high). OpenAI and Anthropic get the top-level param natively; HF router gets it via extra_body with minimal->low normalization for models like MiniMax M2 that require reasoning. Frontend + backend model selectors updated to the bare-id format.0a9e96d
-
Fall back to user HF token for router when INFERENCE_TOKEN is unset (#39)
Aksel Joonas Reedi +1: Claude Opus 4.7 (1M context)Unverified signatureThe HF router code path only read INFERENCE_TOKEN, which is the shared server-side key set on the hosted Space so inference is free for users. On the CLI / self-hosted path that env var is absent, so requests went out with no bearer token and the router returned 401 — surfaced to users as "Authentication failed" even with a valid HF_TOKEN (issue #36). Resolve api_key in this order: 1. INFERENCE_TOKEN env (unchanged Space behavior — shared billing) 2. session.hf_token (user's OAuth / CLI token) 3. HF_TOKEN env (belt-and-suspenders for CLI) Applied to _resolve_hf_router_params, research_tool._resolve_llm_params, and ContextManager.compact. Fixes #36 Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>182ddee
-
Rename CLI entry and Space assets from ml-agent to ml-intern
ae4a534
-
Rewrite research workflow to lead with literature mining
Research sub-agent now starts from papers, not docs. Default workflow: anchor paper → citation graph crawl → read methodology sections → extract result-attributed recipes → validate datasets → then code. Output format requires ranked recipe table linking results to the exact dataset + method + hyperparams that produced them.3bf831e
-
Fix sandbox HF_TOKEN not available inside container
Secret was injected after the Space was already running, so the env var was never present in the container. Move secret injection to before the build/start cycle. Also bump OAuth token lifetime to 30 days.45e517a
-
Minimize S2 API calls: drop paper_details enrichment, add response cache, rate limit only with API key
84d6321 -
Add Semantic Scholar integration: citation graph, filtered search, snippet search, recommendations
Extends hf_papers with S2 backend: - citation_graph: references + citations with influence flags and intents - Smart search routing: date/category/citation filters via S2 bulk search - snippet_search: semantic full-text passage search across 12M+ papers - recommend: single/multi-paper recommendations with pos/neg examples - paper_details enriched with citation count, TL;DR, fields of study - Rate-limited S2 client with 2 retries on 429/5xx - Research prompt: paper analysis checklist, new tool guidance - Frontend shimmer labels for new operationsd81613f -
Use sandbox read endpoint for script resolution to avoid bash truncation
23be8d5 -
Remove outdated-API flagging line from research prompt
f91e520 -
Add SOTA-awareness to research sub-agent system prompt
bdd77ee -
Improve agent loop, tools, and research subagent for long-running autonomous tasks
- Add --no-stream and --max-iterations CLI flags for headless operation - Simplify context manager: remove staged pruning, track actual token usage - Add doom-loop detection and context budget to research subagent - Improve file tools: better enforcement, error messages, descriptions - Improve bash tool: longer timeouts, background execution guidance - Add training logging and HP sweep guidance to system prompt - Relax Python requirement to >=3.11 - Remove unused file_content_cache73882d9
-
Use Haiku 4.5 for research sub-agent
eba82cc -
Use Haiku for research sub-agent when main model is Anthropic
fd87f8e -
Research stats tick every second via background timer
9d8d295 -
Live research stats: tool count, tokens, elapsed time in header
a96af97 -
Revert "Sub-agent log: tool_name → output_preview on one line"
This reverts commit f362c920a30671ed78d07fa9ad8ad25f3b313005.a6c60ef -
Sub-agent log: tool_name → output_preview on one line
d1b62e5 -
Log 20-char output preview for sub-agent tool calls
53f2739 -
feat: add headless CLI mode with local filesystem tools and rich terminal rendering
- Add argparse-based headless mode: `python -m agent.main "prompt here"` - Local tool specs override sandbox /app references for CLI mode - System prompt injects CLI-specific context (working directory, no sandbox) - Extract streaming/non-streaming LLM call helpers with LLMResult dataclass - Add shimmer thinking animation (truecolor gradient sweep) - Progressive markdown rendering via rich Live display - Clean MCP shutdown sequence, suppress asyncio teardown noise - Add rich dependency to agent extras577ec48 -
Deduplicate file re-reads via content hashing for local and sandbox tools
6d4f619