Commit graph

379 commits

Author SHA1 Message Date
Bryan Helmkamp
be084c1944
refactor(dev): decouple CLI reference generation
Expose the CLI reference renderer through a hidden fabro subcommand so fabro-dev can refresh docs without linking fabro-cli. Gate the fabro-dev binary behind the dev feature and update the cargo dev alias to opt into it explicitly.
2026-05-06 12:31:02 -04:00
fabro-releases[bot]
408b5ab79d Bump version to 0.225.0-nightly.0 2026-05-06 10:02:14 +00:00
fabro-releases[bot]
a2fbac1d60 Bump version to 0.224.0-nightly.0 2026-05-05 09:52:01 +00:00
Bryan Helmkamp
88216313bf
perf(sandbox): skip throwaway reqwest::Client in Daytona probe
Two follow-ups that were still costing ~1s per credential probe:

- Bumped the daytona-sdk-rust pin to fa4870f, which deletes a dead
  underscore-prefixed _http_client field on Client. The field was
  unused but new_with_config built a fresh reqwest::Client for it on
  every call, paying the macOS proxy-discovery tax even with our
  injection seam in place.

- build_api_keys_configuration was using Configuration::new() and then
  overwriting cfg.client with our injected client. The Default impl
  generated by openapi-generator builds a reqwest::Client::new() for
  the client field eagerly, which we then threw away — another
  ~470ms hit per probe. Construct the Configuration as a struct
  literal so the injected client is the only one we ever build.

Drops the three credential-probe tests from ~700ms to ~10ms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 12:48:44 -04:00
Bryan Helmkamp
17f1d1dfeb
perf(sandbox): inject http client into Daytona credential probe
Routes the two reqwest clients in the Daytona credential probe through
fabro_http (system-proxy) in production and fabro_test::test_http_client
(no_proxy) in tests, by threading an http_client parameter through
check_daytona_api_key_with and build_api_keys_configuration. Bumps the
daytona-sdk-rust pin to 314ffd9, which exposes DaytonaConfig::http_client
and ships on reqwest 0.13.

Drops the three credential-probe unit tests from >1s SLOW to ~0.5s by
skipping macOS proxy discovery on the localhost httpmock requests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 12:39:46 -04:00
fabro-releases[bot]
9b0e700a8d Bump version to 0.223.0-nightly.0
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
2026-05-04 03:13:54 +00:00
Bryan Helmkamp
2d7c79de1e
feat(server): validate Daytona API key scopes
Probe the Daytona API at install, `fabro secret set DAYTONA_API_KEY`,
and `fabro doctor` time to confirm the configured key carries the
snapshot/sandbox scopes Fabro needs. Operators now see a precise scope
error against the control plane instead of a generic sandbox-create
failure at first run.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 17:09:01 -04:00
fabro-releases[bot]
5de3dc89d6 Bump version to 0.221.0-nightly.1
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
2026-05-02 16:45:20 +00:00
Bryan Helmkamp
b499a17796
fix(error): preserve remaining error context
Carry structured error sources through workflow, server, tracker, and CLI paths instead of flattening them into strings before the render boundary.
2026-05-02 10:51:15 -04:00
fabro-releases[bot]
349200f056 Bump version to 0.221.0-nightly.0 2026-05-02 09:39:00 +00:00
Bryan Helmkamp
3f9a861f87
fix(error): preserve source chains across workspace
Keep typed transport and provider errors intact through API, GitHub, OAuth, install, diagnostics, and artifact paths. Add regression coverage for cloned shared errors and communication error chains.
2026-05-01 17:30:20 -04:00
fabro-releases[bot]
376a421645 Bump version to 0.220.0-nightly.2 2026-05-01 18:31:35 +00:00
fabro-releases[bot]
de58474e30 Bump version to 0.220.0-nightly.1 2026-05-01 17:14:41 +00:00
Bryan Helmkamp
84ab48d534
Merge origin/main into git2-metadata-writer branch
Origin advanced 11 commits in parallel, including refactors that
restructured the now-deleted sandbox_metadata fast-import writer
(structured ExecFailure for push errors, redacted_output_tail helper,
RunDump moved to fabro-dump crate, RunDump::from_projection now returns
Result, MetadataSnapshotFailureKind::Write, MetadataSnapshotFailed event
gains exec_output_tail, RunStoreBackend gains read_run_log).

Resolution: take ours for the four metadata-writer files (sandbox_metadata
deleted, lifecycle/git.rs, pipeline/finalize.rs, sandbox_git.rs) since the
git2 writer supersedes that module. Fold origin's API changes into the
ours-side: switch to fabro_dump::RunDump, handle from_projection's Result,
populate exec_output_tail: None in MetadataSnapshotFailed (git2 push
failures have no exec stdout/stderr), implement read_run_log on test
mocks. Drop unused from_raw_entries from fabro-dump.

A follow-up will port the structured push-failure pattern to run_metadata
without widening ExecFailure to non-exec ops.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 10:00:27 -04:00
Bryan Helmkamp
2ef87240e7
fix(dump): propagate serde errors from RunDump::from_projection
push_json_entry and push_json_entry_path silently dropped entries via if let Ok(...) on serde_json::to_value, hiding any future Serialize impl failure as missing files. They now return Result, RunDump::from_projection returns Result<Self>, and the three production callers (pipeline/finalize, lifecycle/git init + checkpoint) report failures via emit_metadata_snapshot_failed with MetadataSnapshotFailureKind::Write.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 09:32:48 -04:00
Bryan Helmkamp
78979e5f66
Merge remote-tracking branch 'origin/main' 2026-05-01 08:55:38 -04:00
Bryan Helmkamp
becc2d0254
Merge remote-tracking branch 'origin/main' 2026-05-01 08:49:31 -04:00
fabro-releases[bot]
a319177c97 Bump version to 0.220.0-nightly.0 2026-05-01 09:47:13 +00:00
Bryan Helmkamp
165b38c3ed
refactor(workflow): write metadata snapshots with git2
Replace the sandbox-side fast-import metadata writer with an in-process git2 writer that builds metadata commits locally and pushes them with worker-side GitHub credentials. Keep sandbox git probing separate from metadata runtime state so checkpoint commits and metadata snapshots have independent lifecycles.
2026-05-01 00:22:01 -04:00
Bryan Helmkamp
93908de46c
refactor(retro): share run dump hydration
Move RunDump into fabro-dump so CLI export and retro uploads share the same hydrated run layout. Drop the legacy artifact file-ref parser, add best-effort run.log retrieval for retro, and update retro prompts/docs to use events.jsonl and checkpoints.
2026-04-30 23:31:12 -04:00
Bryan Helmkamp
f5f6c76f16
fix(daytona): preserve streamed command semantics 2026-04-30 22:45:37 -04:00
Bryan Helmkamp
d4be6362cb
feat(daytona): stream session command logs 2026-04-30 22:45:37 -04:00
Bryan Helmkamp
78a2f8638b
refactor(api): reuse billing and model domain types 2026-04-30 06:15:18 -04:00
fabro-releases[bot]
86adabf6b6 Bump version to 0.219.0-nightly.0
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
2026-04-30 01:27:32 +00:00
Bryan Helmkamp
3e97cae0ae
refactor(api): unify secret metadata types 2026-04-29 20:26:13 -04:00
Bryan Helmkamp
25cd80c072
refactor(api): unify leaf API types 2026-04-29 20:21:23 -04:00
Bryan Helmkamp
dede93dceb
Merge remote-tracking branch 'origin/main' 2026-04-29 11:51:47 -04:00
Bryan Helmkamp
85c763d511
fix(cli): persist auth login target
When auth login succeeds and no CLI target is configured, write the resolved server target to settings.toml so later CLI commands can reuse it.
2026-04-29 08:02:50 -04:00
fabro-releases[bot]
46bbac92eb Bump version to 0.218.0-nightly.0 2026-04-29 09:55:40 +00:00
Bryan Helmkamp
8c3d3c340a
Merge remote-tracking branch 'origin/main' 2026-04-28 12:31:09 -07:00
Bryan Helmkamp
642e312cca
refactor: unify duplicate API types via with_replacement
Eliminate four parallel-type duplications between fabro-api generated
DTOs and fabro-types canonical types. The wire shape is owned by
OpenAPI; canonical types are reused via fabro-api/build.rs
with_replacement so the adapter functions and silent unwrap_or_default
defaults disappear.

- SecretType moves to fabro-types (was fabro-vault); deletes
  secret_type_from_api adapter.
- DiffLineStats renamed to DiffStats, moved to fabro-types, switched
  u64 -> i64 to match the OpenAPI integer; deletes line_stats_to_api.
- ManifestPreRunPushOutcome rewritten as a oneOf+discriminator
  PreRunPushOutcome over five variant schemas, deleting both
  pre_run_push_outcome_from_manifest and build_manifest_push_outcome.
- ManifestGit and PreRunGitContext unify as GitContext: dirty:
  DirtyStatus replaces clean: bool (preserving the Unknown state
  previously truncated on the wire), sha becomes Option<String>, and
  origin_url/branch fold into the unified context. RunSpec and
  RunCreatedProps flatten three fields (repo_origin_url, base_branch,
  pre_run_git) into a single git: Option<GitContext>.

Each replacement gets a fabro-api parity test (TypeId equality plus
JSON roundtrip) modeled on run_summary_round_trip.rs. TS client
regenerated.

Greenfield app, no production deployments — wire contract changed
directly without backwards-compat shims.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 12:29:37 -07:00
Bryan Helmkamp
be9d9284be
feat(dev): add bench-tests command for capturing per-test timing CSV
Runs the workspace test suite N times via `cargo nextest run --no-fail-fast`
and appends one row per testcase to a CSV (git_sha, run_index, started_at,
binary, package, classname, test_name, status, duration_ms). Group ≈ package
is derived from the JUnit testsuite name.

The lenient `[profile.bench]` (with junit.path) is synthesized at runtime to
target/bench-tests/nextest-tool.toml and passed via `--tool-config-file`, so
nothing needs to be added to .config/nextest.toml.

Intended use: collect samples on the current checkout, switch SHAs, collect
again, then diff/aggregate externally to hunt slowdowns.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 09:18:00 -07:00
fabro-releases[bot]
2880133af2 Bump version to 0.217.0-nightly.0 2026-04-28 10:00:53 +00:00
Bryan Helmkamp
69d4ac5b9b
Merge remote-tracking branch 'origin/main'
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 / Build (push) Waiting to run
TypeScript / Typecheck (push) Waiting to run
TypeScript / Test (push) Waiting to run
2026-04-27 15:27:05 -07:00
Bryan Helmkamp
2460ffc37a
feat(install): add sandbox provider step to web install wizard
Operators choose Docker (default, zero-config) or Daytona (validated
via Daytona SDK) during browser install. Selection is captured in
settings.toml under [run.sandbox] -- explicitly even for Docker, so the
choice is locked in. Daytona keys land in the vault as DAYTONA_API_KEY
(Environment secret). Step always runs after object_store and before
the LLM step.

Server adds POST /install/sandbox/test (validates Daytona key via
client.list) and PUT /install/sandbox; both reuse the install-token
auth and InstallSecret redaction patterns established by object-store.
A resolve_install_sandbox_state helper preserves a saved Daytona key
when the operator revisits the step without re-entering it. The
in-memory api_key is dropped from PendingInstall after finish, matching
the manual_credentials cleanup for S3 access keys.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 14:59:17 -07:00
fabro-releases[bot]
5563369492 Bump version to 0.216.0-nightly.1 2026-04-27 18:50:35 +00:00
Bryan Helmkamp
bac0d4a601
Merge remote-tracking branch 'origin/main' 2026-04-27 10:41:52 -07:00
Bryan Helmkamp
50847ebc6f
fix(sandbox): preserve error chains
Introduce typed sandbox errors and carry source causes through workflow events, persisted failure summaries, and API/CLI string boundaries so Docker client failures keep the actionable underlying cause.
2026-04-27 10:41:39 -07:00
fabro-releases[bot]
b7c3ce89ff Bump version to 0.216.0-nightly.0 2026-04-27 16:23:30 +00:00
Bryan Helmkamp
3a8e1a0517
refactor(sandbox): make Docker clone-based by default
Switch Docker sandboxes from host bind mounts to per-run clone-based containers with structured run metadata, reconnect validation, archive-based file transfer, and Docker resource defaults.

Extend run config/API surfaces so Docker image and clone settings flow through manifests, server preflight, workflow startup, and generated clients.

Update docs and tests for the new default Docker provider path.
2026-04-26 18:21:02 -04:00
Bryan Helmkamp
d07596ca80
feat(server): support stdout log destination
Add configurable server log destinations with an environment override so containers can stream foreground server logs to stdout while local installs keep file logging by default. Validate configured log filters at load time and reject stdout logging for daemon mode.
2026-04-26 14:52:15 -04:00
fabro-releases[bot]
98dd4595ed Bump version to 0.215.0-nightly.0 2026-04-26 09:33:44 +00:00
fabro-releases[bot]
9951f6dcfd Bump version to 0.214.0-nightly.2 2026-04-25 23:25:21 +00:00
Bryan Helmkamp
c28b040c6f
fix(install): reject wildcard public URLs
Normalize bind-address wildcards before presenting install URLs, reject wildcard public origins at CLI and server install boundaries, and surface recovery guidance in the installer and doctor output.
2026-04-25 18:58:00 -04:00
Bryan Helmkamp
3d92a1a46b
Merge pull request #172 from fabro-sh/dependabot-fix/rustls-webpki-0.103.13
chore(deps): bump rustls-webpki to 0.103.13 (GHSA-82j2-j2ch-gfr8)
2026-04-25 10:24:14 -04:00
fabro-releases[bot]
859d7a3aa7 Bump version to 0.214.0-nightly.1 2026-04-25 14:07:53 +00:00
Bryan Helmkamp
fa7a496dcf
chore(deps): bump rustls-webpki to 0.103.13
Patches GHSA-82j2-j2ch-gfr8: a malformed CRL BIT STRING can panic
bit_string_flags() in rustls-webpki via BorrowedCertRevocationList::from_der().
Reachable when applications opt into CRL checking and load CRL bytes from an
attacker-influenced source.

Resolves Dependabot alert #25.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 10:01:40 -04:00
fabro-releases[bot]
7ea8698dbf Bump version to 0.214.0-nightly.0 2026-04-25 09:30:44 +00:00
Bryan Helmkamp
11be286fa1
refactor(dev): simplify generated docs tooling
Share the real CLI parser with reference generation, reuse option metadata flattening, and centralize dev command execution helpers.
2026-04-24 18:41:00 -04:00
Bryan Helmkamp
5e28ec0f82
Merge remote-tracking branch 'origin/main'
# Conflicts:
#	.github/workflows/nightly.yml
#	bin/dev/release.sh
2026-04-24 17:04:55 -04:00