Commit graph

1929 commits

Author SHA1 Message Date
Bryan Helmkamp
c5f68d4eda
fix(server): skip stale worker cleanup after resume
Guard server worker cleanup against superseded subprocesses so rewind and
resume flows do not append a synthetic failure from an older worker. Update
CLI snapshots for the current interview events and give the shared test
session lock more time to cover daemon startup and shutdown.
2026-04-07 20:11:17 -04:00
Bryan Helmkamp
326e0c27fa
refactor(interview): move run answers onto control channels
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (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
Persist pending interviews in run state, deliver accepted answers to workers
through the server-owned control path, and remove the old scratch-file and
WebInterviewer transports.

This also moves Slack onto the canonical server answer flow, adds richer
question metadata to the API and run events, and covers the subprocess
question lifecycle with end-to-end tests.
2026-04-07 19:23:36 -04:00
Bryan Helmkamp
6839ba9e91
plan 2026-04-07 18:37:59 -04:00
Bryan Helmkamp
bc3f91fb38
refactor(store): unify run dump export sources
Share one store-dump export pipeline across the server-backed CLI path
and the local test helper, and add mixed blob-ref plus artifact coverage
for the exported output.
2026-04-07 18:28:28 -04:00
Bryan Helmkamp
54dbb28289
fix(store): make run export use server-backed blob reads
Route `fabro store dump` through the server client for run state, events,
blob hydration, and artifact downloads instead of reopening storage directly
from the CLI process. This fixes blob-backed checkpoint exports and restores
store-dump coverage under the in-memory test server.
2026-04-07 18:16:29 -04:00
Bryan Helmkamp
668d7857e6
fix(clippy): restore workspace lint cleanups after main merge
Reapply the lint-safe changes that were partially displaced while merging
origin/main, including the billing serialization assertion and the attach
replay/server annotation cleanups. This keeps the merged main branch back to a
clean full-workspace clippy pass before the store-dump debugging continues.
2026-04-07 18:01:53 -04:00
Bryan Helmkamp
b6e5ac4f38
Merge remote-tracking branch 'origin/main' 2026-04-07 17:52:15 -04:00
Bryan Helmkamp
ffe3854c8f
Merge remote-tracking branch 'origin/main'
Resolve the artifact lifecycle merge by keeping object-backed upload and sandbox sync behavior alongside durable blob-ref normalization.
2026-04-07 17:52:07 -04:00
Bryan Helmkamp
6bd58c0180
plan 2026-04-07 17:50:41 -04:00
Bryan Helmkamp
0d48f2c255
fix(artifacts): harden object-backed upload rollout
Tighten the worker upload path so object-backed runs only fail when an
artifact upload is actually attempted without a token, and update CLI
snapshots for the new artifact storage metadata.

Fold in the workspace test and clippy fixes needed to verify the final
artifact upload implementation cleanly across Rust and web targets.
2026-04-07 17:45:49 -04:00
Bryan Helmkamp
cf94f88791
plans 2026-04-07 17:18:42 -04:00
Bryan Helmkamp
73e9509aa8
feat(workflow): persist offloaded context as global blob refs
Store large context payloads in the global CAS and keep durable
checkpoint state as blob://sha256 refs instead of execution-local file
paths. Resolve and materialize blob refs at execution, output, and export
time so resumed and remote runs can read legacy and new artifacts
consistently.
2026-04-07 17:18:28 -04:00
Bryan Helmkamp
5ced931d1a
feat(artifacts): finish object-backed artifact uploads
Add scoped worker upload tokens and HTTP artifact upload clients.

Support manifest-first multipart stage artifact uploads with validation and checksums.

Gate artifact reads by run capability while preserving legacy scratch fallback.
2026-04-07 16:56:37 -04:00
Bryan Helmkamp
9db9143b0d
test(nextest): set leak timeout to 500ms 2026-04-07 16:19:47 -04:00
Bryan Helmkamp
4b8e803aa9
plans 2026-04-07 16:05:21 -04:00
Bryan Helmkamp
518e27260d
plans 2026-04-07 16:05:11 -04:00
Bryan Helmkamp
5899850541
fix(run): terminate active workers on force removal
Active runs deleted through rm --force were removed from server state
without signalling the worker process, which could leave detached
workers orphaned after test cleanup. Terminate the tracked worker
process group before deleting run state and cover it with an
integration regression.
2026-04-07 16:04:26 -04:00
Bryan Helmkamp
6f5da61497
fix(server): update aggregate billing test 2026-04-07 15:35:29 -04:00
Bryan Helmkamp
9ca0113f66
Merge remote-tracking branch 'origin/main'
# Conflicts:
#	apps/fabro-web/app/routes/run-overview.tsx
#	apps/fabro-web/app/routes/workflow-detail.tsx
#	apps/fabro-web/app/routes/workflows.tsx
#	lib/crates/fabro-workflow/src/lifecycle/artifact.rs
#	lib/crates/fabro-workflow/src/pipeline/finalize.rs
2026-04-07 15:24:07 -04:00
Bryan Helmkamp
4f02f5c42f
Merge branch 'codex/fix-attach-terminal-authoritative-stream' 2026-04-07 15:10:06 -04:00
Bryan Helmkamp
df67cfaa36
Merge remote-tracking branch 'origin/main' into codex/fix-attach-terminal-authoritative-stream
# Conflicts:
#	lib/crates/fabro-cli/src/server_client.rs
2026-04-07 15:04:32 -04:00
Bryan Helmkamp
888370cddc
fix(web): use local workflow response types
The workflow routes were importing types that do not exist in the generated
OpenAPI client. Define the workflow endpoint response shapes locally so the
web app typechecks against the actual server responses.
2026-04-07 14:48:19 -04:00
Bryan Helmkamp
ba7dc77be0
refactor(billing): unify the LLM billing domain
Replace the overlapping usage and cost model with canonical billing
primitives centered on ModelRef, ModelHandle, TokenCounts, and
BilledModelUsage. This also renames the public API and web surface from
usage to billing, removes compatibility aliases, and normalizes provider
usage adapters onto the shared billing vocabulary.
2026-04-07 14:33:35 -04:00
Bryan Helmkamp
1953ed1a69
refactor(run): remove worker-side SlateDB access
Move detached workers onto an HTTP-backed runtime store so the server
remains the only SlateDB owner. This replaces the worker's seeded local
RunDatabase with a canonical server-backed handle for state, events, and
blobs, and updates workflow runtime plumbing to use that abstraction.
2026-04-07 14:33:33 -04:00
Bryan Helmkamp
3dcf2ad04b
fix(run): make attach stream terminal-authoritative
Replay persisted run events for attach requests, keep the SSE stream live
only while the run is active, and close on terminal run events instead of
returning 410 for completed runs.

The CLI now treats premature attach EOF as an error, and the affected
integration tests were stabilized around store-backed event ordering and
recovered rewind timelines.
2026-04-07 14:32:23 -04:00
Bryan Helmkamp
6c5ea35fd1
Merge remote-tracking branch 'origin/main' 2026-04-07 13:00:13 -04:00
Bryan Helmkamp
f4488c4d35
feat(run): record run creation provenance
Persist server, client, and subject provenance on run creation so
run state and inspect output can show which Fabro version created a
run, which first-party client submitted it, and how the request was
authenticated.
2026-04-07 12:59:25 -04:00
Bryan Helmkamp
26e21f0a13
fmt 2026-04-07 12:59:16 -04:00
Bryan Helmkamp
6a804e9808
refactor(cli): stream run attach over SSE
Replace the attach polling loop with the existing run attach SSE endpoint.
Seed from stored history once, fetch interview questions only when needed,
and keep completed-run replay behavior intact.
2026-04-07 12:58:37 -04:00
Bryan Helmkamp
80dfbd5309
Merge remote-tracking branch 'origin/main'
# Conflicts:
#	lib/crates/fabro-cli/tests/it/cmd/support.rs
2026-04-07 11:44:13 -04:00
Bryan Helmkamp
a2ab0afc86
perf(nextest): keep shared test server state in memory
Default test daemons now opt into an in-memory object store and test
helpers carry explicit run ids instead of rediscovering runs from
shared state.

This also disables the disk-backed store dump integration tests until
store dump is routed through the server's live store handles.
2026-04-07 11:39:40 -04:00
Bryan Helmkamp
552498cf8a
refactor(store): share run projection with cli
Make fabro-store::RunProjection the single projection type used by the
server, CLI, and CLI test helpers. This removes the duplicated CLI-side
mirrors and adds serde coverage for the store-owned projection.
2026-04-07 11:36:22 -04:00
Bryan Helmkamp
5c5d48c152
refactor(cli): centralize HTTP client builder with User-Agent header
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 10:31:07 -04:00
Bryan Helmkamp
d3de014723
plans 2026-04-07 10:30:40 -04:00
Bryan Helmkamp
7c71afed53
Merge remote-tracking branch 'origin/main' 2026-04-07 10:29:36 -04:00
Bryan Helmkamp
4470eb21ad
fix(run): propagate worker cancellation into command stages
Pass a real cancel signal from __run-worker through the workflow engine
into sandbox command execution so cancelled runs reap gated shell loops
instead of leaking slow.gate waiters.
2026-04-07 10:09:30 -04:00
Bryan Helmkamp
099362cd42
fix(nextest): let shared test server reap run workers
Give the harness longer to stop the shared test server than the server
itself uses to shut down active run workers. This prevents session cleanup
from SIGKILLing the server before it can terminate worker process groups,
which was leaving orphaned `fabro <run> running` subprocesses behind.
2026-04-07 09:52:12 -04:00
Bryan Helmkamp
9d9ebd529f
test(nextest): share one session server by default
Eagerly start one shared test server per nextest session and point default
TestContext commands at that session socket instead of leaking per-test
daemons keyed by FABRO_STORAGE_DIR. Add isolated_server() for tests that
need an explicit separate daemon, and tighten the ps filtering test so it
still proves the contract without timing out under full-suite load.
2026-04-07 09:44:34 -04:00
Bryan Helmkamp
9fe7268026
chore: remove workflows and steer endpoints
Remove GET /workflows, GET /workflows/{name}, GET /workflows/{name}/runs,
and POST /runs/{id}/steer from the OpenAPI spec, server routes, demo
fixtures, pagination tests, docs navigation, and generated TS client.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 08:25:54 -04:00
Bryan Helmkamp
b96c8d22a2
fix(docs): sync Mintlify docs.json with current OpenAPI spec
Remove endpoint references deleted from the spec (context, files,
sessions) and add the new start endpoint so Mintlify can resolve
all page anchors against the OpenAPI file.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 08:08:10 -04:00
Bryan Helmkamp
c9d1b92725
feat(run): harden server-supervised worker lifecycle
Move subprocess workers fully behind the server-owned run store by
switching worker/server coordination to HTTP-backed run events and
control state. Reconcile stale in-flight runs on boot, terminate live
workers during shutdown, and update process titles to reflect server and
worker lifecycle phases.
2026-04-07 07:59:35 -04:00
Bryan Helmkamp
a7bc63a5ae
feat(logging): add daily log rotation and 7-day cleanup
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (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
Logs were growing unbounded — cli.log and server.log used
rolling::never() with no rotation. Switch to daily rotation via
tracing-appender builder API (prefix.YYYY-MM-DD.log) and clean up
files older than 7 days on startup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:08:26 -04:00
Bryan Helmkamp
5b63e25b28
chore: remove unused verification, retros, and sessions endpoints
These endpoints had zero CLI callers and served only the web UI demo.
Verification and retros were `not_implemented` stubs in real mode;
sessions had an in-memory implementation but no CLI usage. Removing
them shrinks the API surface and eliminates ~9,000 lines of dead code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:52:51 -04:00
Bryan Helmkamp
4352508f55
Merge remote-tracking branch 'origin/main' 2026-04-06 16:57:45 -04:00
Bryan Helmkamp
839d0187d1
docs 2026-04-06 16:57:34 -04:00
Bryan Helmkamp
097c86024f
chore: remove skill install command and GET /runs/{id}/verification endpoint
Dead feature cleanup: `skill install` was hidden/experimental and never
graduated; the run verification endpoint was only implemented in demo mode.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:38:03 -04:00
Bryan Helmkamp
6c53fc29b5
fix(logging): use stable server log paths 2026-04-06 16:18:13 -04:00
Bryan Helmkamp
51c57b5d8f
Merge remote-tracking branch 'origin/main' 2026-04-06 16:17:14 -04:00
Bryan Helmkamp
62f6f9b100
feat(system): add server-backed system commands 2026-04-06 16:10:06 -04:00
Bryan Helmkamp
b760d07c8b
test(nextest): add workflow timeout override
Give fabro-workflow tests a package-specific timeout budget so the
parallel git branching integration test does not hit the default
3-second hard kill under full-suite load.
2026-04-06 15:51:42 -04:00