Commit History
-
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 -
Create Hub artifact collections lazily (#245)
Unverified signature* Create Hub artifact collections lazily Co-authored-by: OpenAI Codex <codex@openai.com> * Cache lazy Hub collection slugs in child hooks Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>60474c1 -
Implement `/resume` command for CLI (#233)
Unverified signature* Add /resume command to CLI * Refine /resume feature * Refine /resume implementation * Address review comments --------- Co-authored-by: lewtun <lewis.c.tunstall@gmail.com>0321690
-
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 CLI local model support (#228)
Unverified signature* Add CLI local model support Co-authored-by: OpenAI Codex <codex@openai.com> * Add shared local model endpoint fallback Support LOCAL_LLM_BASE_URL and LOCAL_LLM_API_KEY as shared fallbacks while preserving provider-specific local overrides. Co-authored-by: OpenAI Codex <codex@openai.com> * Address local model review feedback Clarify local probe failure behavior, add regression coverage for rejected local switches, and simplify local model validation. Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>4668dbd -
Add backlog prioritization report tooling (#222)
Unverified signature* Add backlog prioritization script Co-authored-by: OpenAI Codex <codex@openai.com> * Fix backlog prioritizer LLM output handling Co-authored-by: OpenAI Codex <codex@openai.com> * Add backlog resolved-in-main checks Co-authored-by: OpenAI Codex <codex@openai.com> * Add GitHub issue publishing for backlog reports Co-authored-by: OpenAI Codex <codex@openai.com> * Address backlog prioritization review Handle GitHub rate limits gracefully, validate publish tokens early, and tighten resolution-link detection. Co-authored-by: OpenAI Codex <codex@openai.com> * Exclude generated backlog reports Apply a default label to generated report issues and skip that label during future GitHub backlog collection. Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>6aebbdf -
Force OAuth refresh after scope changes (#227)
Unverified signature* Force OAuth refresh after scope changes Co-authored-by: OpenAI Codex <codex@openai.com> * Address OAuth scope review comments Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>e90638c
-
Add collection OAuth scope (#226)
Unverified signature* Add collection OAuth scope Co-authored-by: OpenAI Codex <codex@openai.com> * Document GitHub PR-first workflow Co-authored-by: OpenAI Codex <codex@openai.com> * Document Space OAuth scope checks Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>8b35696 -
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 -
Preserve HF token across restored sessions (#218)
Unverified signature* Preserve HF token across restored sessions Carry the authenticated HF token internally through request dependencies without exposing it from auth/me, and retry CPU sandbox preload when a session previously failed only because the token was missing. Co-authored-by: OpenAI Codex <codex@openai.com> * Address HF token restore review feedback Only restart CPU sandbox preload after the specific missing-token failure and remove the dead user hf_token fallback. Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>5de6e8f -
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 -
Stop attaching timestamps to LLM messages (#209)
Unverified signature* Strip internal message metadata before LLM calls Co-authored-by: OpenAI Codex <codex@openai.com> * Simplify timestamp handling for provider messages Co-authored-by: OpenAI Codex <codex@openai.com> * Remove timestamp metadata regression test Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>93d536c -
fix(compaction): break infinite loop + truncate oversized messages (#213)
Guillaume SalouUnverified signature* fix(compaction): break the infinite-compaction loop, truncate oversized messages Sessions stuck in a compaction retry loop have been silently burning Bedrock budget while staying invisible in the session dataset. Pod logs from 2026-05-03 on prod-114 showed the pattern firing minute-after-minute on multiple replicas: Context compacted: 200001 -> 215566 tokens Context compacted: 215566 -> 215572 tokens ContextWindowExceededError — forcing compaction Context compacted: 200001 -> 215544 tokens ... Root cause: a single message in the "untouched" tail (typically a tool output of 80k+ tokens — bash dump, file content, CSV) keeps the post-compact context above the 90% threshold. Compaction triggers again, calls Bedrock again, gets the same 215k result, loops. ~$3 per Opus retry, indefinitely. Sessions never reach _run_session.finally → save_and_upload_detached never fires → cost is real but never lands in total_cost_usd. Cross-check: dataset Bedrock-only coverage on 2026-05-01 …d84b454
-
Fallback to free model for gated defaults (#208)
Unverified signature* Fallback to free model for gated defaults Co-authored-by: OpenAI Codex <codex@openai.com> * Cover explicit gated model access for HF users Co-authored-by: OpenAI Codex <codex@openai.com> * Seed model picker from created session Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>092f909 -
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 -
Add session YOLO auto-approval budget (#201)
Unverified signature* Add session YOLO auto-approval budget Co-authored-by: Codex <codex@openai.com> * Address YOLO approval review feedback Co-authored-by: Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>77324b8 -
Use HF username for personal trace uploads (#199)
Unverified signature* Use HF username for personal trace uploads Co-authored-by: OpenAI Codex <codex@openai.com> * Remove redundant HF token branch Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>71e1892 -
Auto-share session traces to a private HF dataset (#193)
Darshan Thakare +2: lewtun, Codex Unverified signature* feat: add share_traces toggle and per-user trace repo template * feat: support Claude Code JSONL format and per-target auth * feat: dual-upload sessions to private user trace dataset * chore: retry personal trace uploads on booting * feat: add /share-traces command to flip dataset visibility * docs: document HF trace auto-share and /share-traces * Use HF token owner for local dev auth Co-authored-by: Codex <codex@openai.com> * Rename personal session trace dataset Co-authored-by: Codex <codex@openai.com> * Add session dataset card metadata Co-authored-by: Codex <codex@openai.com> * Fix session trace upload review issues Co-authored-by: OpenAI Codex <codex@openai.com> * Preserve secret scrubbing before trace uploads Co-authored-by: OpenAI Codex <codex@openai.com> * Link ML Intern demo in dataset card Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: lewtun <lewis.c.tunstall@gmail.com> Co-authored-by: Codex <codex@openai.com>0bd7547
-
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 -
Expose OpenAI models in the UI & make Claude model picker configurable (#183)
Unverified signature* Add agent dev server notes * Make frontend model configurable * Support env-selected frontend models * Use Claude-specific model env var * Add GPT-5.5 to web model picker * Gate GPT-5.5 as a premium model * Avoid duplicate session model fetch * Remove legacy Claude quota aliases * Document GitHub CLI PR body workflow * Gate only deployed paid model IDs * Nits5db99fa
-
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 -
Persist Space sessions in MongoDB (#170)
Aksel Joonas ReediUnverified signature* Persist Space sessions across backend restarts The hosted Space lost active conversations because sessions, approval state, event streams, and Claude quotas only lived in process memory. This adds a shared optional Mongo store for frontend sessions while keeping local and CLI runs on the no-op/local path when Mongo is absent. Constraint: Space deployment needs durable state without making PyPI/local CLI users configure Mongo. Constraint: Frontend deletes must hide sessions with a visibility tag, not erase traces needed for recovery or SFT export. Rejected: Restore every active session at startup | large user counts would create a thundering herd after deploys. Rejected: Store one giant session document | Mongo document limits make per-message snapshot docs safer. Confidence: medium Scope-risk: broad Directive: Keep session_messages as compactable runtime snapshots and session_trace_messages/session_events as append-only raw traces; do not collapse them into one collection wit…d9d9785
-
Recognize Pro OAuth users via isPro flag (#164)
Aksel Joonas ReediUnverified signatureOAuth whoami responses set type="user" and only signal Pro status with the isPro boolean. The previous code matched the type key first and only fell through to isPro when no plan/type/accountType string was present, so type="user" + isPro=true was classified as free and Pro OAuth users got blocked from running Jobs. Reorder the check so isPro takes priority. Add a regression test for the OAuth shape. Reported in smolagents/ml-intern Space discussion #21.895c557 -
feat(kpis): per-tool counts, research engagement, surface split (#160)
Aksel Joonas ReediUnverified signature* feat(kpis): per-tool counts, research engagement, surface split Adds intra-session telemetry to the KPI rollup so the observatory dashboard can answer "is the agent reaching for research?" and "which tools dropped out of the mix?". Production data (Apr 21->27, 21k+ sessions) shows the sessions-with-research rate dropped from ~78% on Apr 21 to ~56% on Apr 27 — without per-tool counts in the rollup, that signal was invisible to the dashboard. Also resolves the long-standing drift between this repo's scripts/build_kpis.py and the observatory's backend/build_kpis.py (both pipelines write to smolagents/ml-intern-kpis; whichever ran last dropped the other's columns). The observatory copy was the superset; this PR brings scripts/ up to it. Going forward both copies are byte-identical. Drift fix (incoming from observatory): - cost_per_session_mean / _p50 / _p95 - tool_calls_total / _succeeded / _failed counts - successful_sessions / errored_sessions / regenerated_sessions counts - sandbox…f9305f6 -
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 -
Honor interactive model override after current CLI changes (#111)
Seunghyeon Kim +1: akseljoonas Unverified signatureThe interactive CLI accepted --model but did not pass it into main(), so the REPL used the configured default while headless mode honored the flag. Reapply the override on top of the current token/session plumbing by changing only the interactive main signature, config override, and CLI dispatch. Constraint: Current main already passes user_id into submission_loop and uses shared HF token resolution; this fix must preserve both paths. Rejected: Reuse the old PR diff verbatim | it drops newer user_id/session identity changes and conflicts with current main. Confidence: high Scope-risk: narrow Directive: Keep --model behavior identical for interactive and headless paths; banner should render the resolved model. Tested: python -m py_compile agent/main.py tests/unit/test_cli_rendering.py Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_cli_rendering.py -q Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_llm_params.py tests/uni…ae86333 -
Use `huggingface_hub.get_token()` for auth fallback (#126)
Unverified signature* Use cached HF login token for router auth fallback Let HF router requests resolve credentials from huggingface_hub's local login cache when INFERENCE_TOKEN, session token, and HF_TOKEN are absent. This keeps CLI and plugin flows working after `hf auth login` without requiring explicit env exports. Made-with: Cursor * Consolidate Hugging Face token resolution Centralize HF token cleanup and lookup so router calls, CLI startup, and backend request paths do not drift after adding huggingface_hub.get_token() fallback. The backend request helper intentionally keeps browser/user token precedence separate from local cached CLI auth. Constraint: huggingface_hub.get_token() already handles HF_TOKEN, HUGGING_FACE_HUB_TOKEN, and the local hf auth login cache. Rejected: Use cached login tokens for backend request auth | would let server-local credentials stand in for the browser user. Confidence: high Scope-risk: narrow Directive: Keep router-token fallback and request-user token extrac…7a76ad1 -
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 -
Preserve streamed thinking metadata with live model tests (#150)
Aksel Joonas ReediUnverified signature* Add opt-in live thinking model tests Add paid integration coverage for the concrete models requested for #143: Anthropic Opus 4.7 and OpenAI's current GPT-5.2 model. The tests load an explicit env file, run only behind ML_INTERN_LIVE_LLM_TESTS=1, and keep normal CI credential-free. Constraint: Live provider calls require local credentials and should not run by default in CI. Rejected: Make live provider tests unconditional | would fail or spend tokens anywhere credentials are absent. Confidence: high Scope-risk: narrow Tested: ML_INTERN_LIVE_LLM_TESTS=1 ML_INTERN_LIVE_ENV_FILE=/Users/akseljoonas/Documents/ml-intern/.env UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/integration/test_live_thinking_models.py -q -rs Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_thinking_history.py tests/integration/test_live_thinking_models.py -q * Preserve streamed Opus thinking metadata Live Opus 4.7 exposed that LiteLLM surfaces streamed thinking bl…d408a51 -
Preserve thinking state across tool turns (#143)
Aksel Joonas ReediUnverified signature* Preserve thinking state across tool turns Anthropic thinking responses need their thinking_blocks and reasoning_content replayed with assistant tool-call messages. The loop was rebuilding assistant history from only content and tool calls, causing LiteLLM to strip thinking on continuation turns. Constraint: Non-thinking providers and responses without reasoning fields must keep the existing message shape. Rejected: Disable extended thinking for tool-using runs | avoids the warning by removing the feature that improves reasoning quality. Confidence: high Scope-risk: moderate Directive: Any future assistant-message reconstruction must preserve provider reasoning fields when present. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_thinking_history.py tests/unit/test_dangling_tool_calls.py tests/unit/test_malformed_args_recovery.py * Replay thinking metadata only for Anthropic Review caught that reasoning_content is not safe to echo through OpenAI-co…59b2038 -
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 -
fix(doom_loop): normalize tool-call args before hashing (#119)
d 🔹 +2: d 🔹, Aksel Joonas ReediUnverified signatureThe doom-loop detector hashed raw `function.arguments` strings, so semantically-identical tool calls hashed differently when the LLM emitted them with different key orderings (`{"a":1,"b":2}` vs `{"b":2,"a":1}`) or whitespace (`{"a":1}` vs `{"a": 1}`). This silently broke `detect_identical_consecutive` and `detect_repeating_sequence`: the agent could be calling the same tool with the same args repeatedly and the detector would see three distinct signatures and stay quiet. Issue #61 P1 explicitly calls this out: > Add semantic-similarity or normalized-task matching for `research`. Fix: parse-and-redump JSON via `json.dumps(..., sort_keys=True, separators=(",", ":"))` before hashing. Falls back to the raw string when the input isn't valid JSON so non-JSON `arguments` strings (rare edge for some providers) keep the legacy behaviour and never raise. Tests: 23 new cases in `tests/unit/test_doom_loop.py` covering `_normalize_args`, `_hash_args`, `extract_recent_tool_signatures`, `detect_i…07c5699
-
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 -
Switch from Bedrock to Anthropic endpoint as default. Include support for gpt-5.5 (#118)
Unverified signature* Default ml-intern to Anthropic Co-authored-by: OpenAI Codex <codex@openai.com> * Add direct OpenAI GPT-5 model support Co-authored-by: OpenAI Codex <codex@openai.com> * Raise probe budget for GPT-5 models Co-authored-by: OpenAI Codex <codex@openai.com> * Fix deps * Fix stale xhigh provider messaging Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>0545e40
-
feat(observability)
Aksel Joonas ReediUnverified signature2a2e170
-
feat(quota): daily Opus cap + HF-org gate + cap dialog (#72)
Aksel Joonas ReediUnverified signature540437a
-
Remove stale tests directory
54049e9
-
fix: use correct HF API filter param and improve integration tests
b95477e -
feat: add hf_papers tool for paper discovery and reading
64bf289
-
Filter UV package installation output from HF Jobs logs
Adds filtering to reduce UV package installation noise in job logs while preserving the installation summary for context. Changes: - Add _filter_uv_install_output() function with regex pattern matching - Apply filter in _run_job() before returning logs to agent - Replace installation details with "[installs truncated]" message - Keep "Installed X packages in Y ms/s" summary line visible - Supports singular/plural, ms/s units, and decimal time values - Add comprehensive tests covering various edge cases Example output: [installs truncated] Installed 68 packages in 251ms Running main script... Hello from the job! 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>901eeae
-
ported the hf jobs tool to python
ee12938 -
custom hf jobs tool impl
aa207f7