Commit graph

5137 commits

Author SHA1 Message Date
Bryan Helmkamp
f0f1baa813
Merge pull request #701 from fabro-sh/fix/quota-error-classification
fix(llm): classify exceeded quota errors
2026-08-01 08:42:57 -04:00
Bryan Helmkamp
bf913ec58e
Merge pull request #685 from fabro-sh/fabro/run/01KYQMV1VW6139EGNHEM1RGF2G
Reject invalid run events before write; clarify append commit status
2026-08-01 08:21:59 -04:00
fabro-releases[bot]
d0ebc856b7 Bump version to 0.312.0-nightly.0 2026-08-01 09:55:00 +00:00
Bryan Helmkamp
5111f0e556
Merge pull request #707 from swerner/fix/bedrock-tool-sanitization
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (push) Waiting to run
Rust / Generated Docs (push) Waiting to run
Rust / Test (Linux) (push) Waiting to run
Rust / Test (macOS) (push) Waiting to run
TypeScript / Typecheck (push) Waiting to run
TypeScript / Test (push) Waiting to run
TypeScript / Build (push) Waiting to run
Sanitize Bedrock tool identifiers during encoding
2026-07-31 18:09:33 -04:00
Scott Werner
594bf6e632 refactor(llm): simplify Bedrock tool sanitization internals
- Return String from the sanitize helpers instead of Cow: every call
  site feeds the result into json!, which allocates anyway, so the
  borrowed fast path only cost extra branches and Cow-variant tests.
- Route all toolUse/toolResult construction through private
  tool_use_block/tool_result_block constructors that own the sanitize
  calls, so the toolUse/toolResult pairing invariant is enforced by
  construction rather than by call-site discipline.
- Drop a test assertion the type system already guarantees (encoding
  takes &Request, so it cannot mutate the input) and assert wiring
  tests against the sanitize helpers instead of re-pinning the exact
  replacement literals in a second file.

No wire-format changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 17:43:22 -04:00
Bryan Helmkamp
9ef8742d5d
Merge pull request #687 from fabro-sh/fabro/run/01KYQN78K19NY7PNSCDYP6CG9G
Extract a source-neutral run-compiler boundary in fabro-server
2026-07-31 17:11:33 -04:00
Bryan Helmkamp
cb45e176ac
Merge pull request #704 from fabro-sh/feat/deepseek-v4-flash
feat(llm): support DeepSeek V4 Flash
2026-07-31 16:52:50 -04:00
Bryan Helmkamp
f75c7a1ba3
fix: make structured output repair errors actionable 2026-07-31 16:33:20 -04:00
Scott Werner
913cb190b7 Sanitize Bedrock tool identifiers during encoding 2026-07-31 15:06:05 -04:00
Fabro
8282581ac7 fabro(01KYQN78K19NY7PNSCDYP6CG9G): verify (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 10

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:14:25 -04:00
Fabro
4b56aa4f1a fabro(01KYQN78K19NY7PNSCDYP6CG9G): fixup (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 9

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:32 -04:00
Fabro
61764bf15b fabro(01KYQN78K19NY7PNSCDYP6CG9G): verify (failed)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 8

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:32 -04:00
Fabro
bca63e75c6 fabro(01KYQN78K19NY7PNSCDYP6CG9G): simplify_sol (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 7

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:32 -04:00
Fabro
76f61f163b fabro(01KYQN78K19NY7PNSCDYP6CG9G): simplify_fable (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 6
Fabro-Checkpoint: 1254f4ca92f7b1f822cdfa7ca549ef8595a50fed

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:32 -04:00
Fabro
ac6e3ced6a fabro(01KYQN78K19NY7PNSCDYP6CG9G): implement (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 5
Fabro-Checkpoint: 879008d9d5

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:32 -04:00
Fabro
0815f9fa8f fabro(01KYQN78K19NY7PNSCDYP6CG9G): preflight_lint (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 4
Fabro-Checkpoint: 3149893056

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:11 -04:00
Fabro
ffc26328ee fabro(01KYQN78K19NY7PNSCDYP6CG9G): preflight_compile (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 3
Fabro-Checkpoint: 9b9950dd2d

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:11 -04:00
Fabro
bf347b3e0d fabro(01KYQN78K19NY7PNSCDYP6CG9G): toolchain (succeeded)
Fabro-Run: 01KYQN78K19NY7PNSCDYP6CG9G
Fabro-Completed: 2
Fabro-Checkpoint: f5ac83dc54

⚒️ Generated with [Fabro](https://fabro.sh)
2026-07-31 14:09:11 -04:00
Bryan Helmkamp
980aabc543
feat: download latest artifacts as zip 2026-07-31 13:23:35 -04:00
Bryan Helmkamp
f868734f27
Fix stale MCP servers after upgrades 2026-07-31 13:18:12 -04:00
Release Repro
799fac1d3b
style(models): group DeepSeek price digits 2026-07-31 13:17:44 -04:00
Release Repro
40391ac3ac
fix(models): use exact DeepSeek context window 2026-07-31 13:17:08 -04:00
Release Repro
1016f995c4
chore(models): pin DeepSeek agent profile 2026-07-31 13:16:37 -04:00
Release Repro
76dae568f5
feat(reasoning): expose DeepSeek effort controls 2026-07-31 13:14:11 -04:00
Release Repro
f613821bfb
feat(llm): add direct DeepSeek provider 2026-07-31 13:10:08 -04:00
Release Repro
8864e0f0cf
feat(models): refresh DeepSeek V4 Flash metadata 2026-07-31 13:02:58 -04:00
Bryan Helmkamp
7e6d758fa0
fix(llm): classify exceeded quota errors 2026-07-31 12:59:59 -04:00
Release Repro
0afd3a43b6
feat(models): add portable DeepSeek aliases to Fireworks 2026-07-31 12:59:40 -04:00
Release Repro
8bae35398f
fix(models): point DeepSeek aliases to V4 Flash 2026-07-31 12:59:00 -04:00
Bryan Helmkamp
e8c4020432
Collapse the steering bar by default and expand it on bar click
The steering dock on run pages now starts collapsed, staying out of
the way until the operator opens it. A run that is interrupted and
waiting for steering still forces the dock open.

While collapsed, the whole dock header is a click target that expands
it. Clicks on buttons in the bar (Interrupt, the chevron) keep their
own behavior, and the chevron remains the keyboard/assistive-tech
toggle. The interview dock shares the shell, so it gets the same
click-to-open behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 12:46:13 -04:00
Bryan Helmkamp
8881bcab3e
Log run event persistence failures as errors 2026-07-31 12:44:24 -04:00
Bryan Helmkamp
e9694644bc
Fix canceled parallel stage duration 2026-07-31 12:35:36 -04:00
Bryan Helmkamp
900396e7fc
fix(daytona): accept newer permission scopes 2026-07-31 12:22:08 -04:00
Release Repro
1c9ca55d21
fix: expose output schemas to agents 2026-07-31 09:51:27 -04:00
Bryan Helmkamp
fd55ff03ad
fix(model): prefer MOONSHOT_API_KEY
Keep KIMI_API_KEY as a legacy fallback for env and vault credentials.
2026-07-31 09:14:58 -04:00
Bryan Helmkamp
24f9ac6bd1
refactor(model): rename Kimi provider to Moonshot 2026-07-31 09:00:52 -04:00
Bryan Helmkamp
d4cefb16c9
fix(web): update Modal and OpenRouter logos
Render Modal with the theme color and replace the legacy OpenRouter mark with the current 2026 brand glyph.
2026-07-31 08:47:00 -04:00
Bryan Helmkamp
a2b64dea2a
fix(model): prioritize Modal over Kimi 2026-07-31 08:44:43 -04:00
Bryan Helmkamp
8b5106902c
feat: reuse completed subagent sessions 2026-07-31 08:19:10 -04:00
Bryan Helmkamp
5208399e82
fix(workflow): pause timeouts for human input 2026-07-31 08:19:10 -04:00
fabro-releases[bot]
14fc5d446c Bump version to 0.311.0-nightly.0 2026-07-31 10:12:11 +00:00
Bryan Helmkamp
f098fb9104
fix(llm): decode Modal reasoning token usage 2026-07-30 17:28:24 -04:00
Bryan Helmkamp
5eb36d148d
Merge pull request #690 from fabro-sh/fix/fork-resume-materializes-sandbox
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (push) Waiting to run
Rust / Generated Docs (push) Waiting to run
Rust / Test (Linux) (push) Waiting to run
Rust / Test (macOS) (push) Waiting to run
TypeScript / Typecheck (push) Waiting to run
TypeScript / Test (push) Waiting to run
TypeScript / Build (push) Waiting to run
fix: materialize a fresh sandbox when resuming a forked run
2026-07-30 16:26:06 -04:00
Bryan Helmkamp
a0de8f422b
fix: materialize a fresh sandbox when resuming a forked run
A fork carries a checkpoint from its source run, but its first
run.created event contains only a sandbox plan. Resume previously tried
to reconnect that planned sandbox and failed because no instance
exists. Now a fork resume with a Planned sandbox record builds a fresh
sandbox instead; later fork resumes still reconnect the ready instance,
and a same-run resume with an uninitialized sandbox still fails the
precondition check.

Also consolidates the test module's three near-identical InitOptions
literals into a shared test_init_options helper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 16:18:23 -04:00
fabro-releases[bot]
e072ddafb9 Bump version to 0.310.0-nightly.3 2026-07-30 20:13:18 +00:00
Bryan Helmkamp
6a1ec11f86
Fix forked run sandbox initialization 2026-07-30 16:05:18 -04:00
Bryan Helmkamp
38a609f543
Merge pull request #689 from fabro-sh/feat/model-keyed-fallbacks
feat: add fixed model-keyed fallback policies
2026-07-30 13:57:02 -04:00
Bryan Helmkamp
d4119cee77
fix: keep stored run events from older releases deserializable
Copilot review flagged two backward-compatibility breaks with events
persisted by pre-model-keyed releases; both are stored data that can
never be rewritten, so accept the old shapes on read:

- FailoverProps: original_provider/original_model/attempt are Option
  again with serde defaults. New events always set them; failover events
  recorded before model-keyed fallbacks lack them. Restores the
  historical-event test.
- RunModelSettings: temporary custom deserializer accepts the legacy
  flat-array fallbacks shape inside stored run.created events, keying
  the chain under the requested model name when one is set. Remove once
  pre-0.311 run logs are out of the support window.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 13:24:08 -04:00
Bryan Helmkamp
84c1545812
docs: state the from-route semantics of agent.failover events
Copilot review flagged that a failover event's from route can be a
candidate that failed during activation and never served traffic. That
is intentional — events chain (one event's to is the next one's from)
so the stream records every candidate tried, with the error explaining
why each was abandoned. Document it at the emit site.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 13:00:17 -04:00
Bryan Helmkamp
e6eb36f852
refactor: simplify model-keyed fallback internals
Consolidation pass over the fallback feature, no intended behavior
changes beyond noted validation and event-shape cleanups:

- Unify the two parallel notice types: FallbackPlanNotice is gone;
  ModelFallbackNotice now owns the runtime NoNearbyReasoningLevel case
  and the shared ChainEmpty wording. Notices emit through a new
  Emitter::notice_scoped with their own level, and each distinct notice
  is emitted once per run instead of on every LLM call.
- Move canonical_model_id onto Catalog so chain keys are written and
  read through one function; reject provider-qualified fallback keys,
  which could never match at dispatch and were silently dead config.
- Type FallbackTarget as ProviderId/ModelId, removing repeated
  ProviderId::new re-wrapping at every use site.
- Derive FallbackPlan's current route from a position index instead of
  storing current/requested_controls copies; advance() no longer has
  unreachable None branches.
- Bundle the agent invocation's live state (session, bridge, lease,
  forwarder, accounting) into LiveAgentInvocation; failover_agent_session
  drops from 21 parameters to 7 and the six copies of the
  abort/discard/classify teardown collapse into two methods.
- Share one route_request builder between one_shot and its failover
  loop; complete_one_shot_request takes the request by value instead of
  deep-cloning the message payload per call.
- Event::Failover carries FailoverProps directly; the props' original
  route and attempt fields are now required, and reasoning efforts are
  typed ReasoningEffort instead of strings.
- Reuse RunModelSettings/RunModelControls in fabro-api via
  with_replacement, add the missing controls property to the OpenAPI
  schema, regenerate the TS client, and add the type-identity/JSON
  parity test.
- Smaller cleanups: ReasoningEffort::closest_supported uses enum
  discriminants; ModelFallbackPolicy gains len(); resolve_model_fallbacks
  takes a provider slice; duplicate-target filtering lives only in the
  resolver.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 12:51:36 -04:00