fabro/docs/public
Bryan Helmkamp 86b1fbef7f
feat(api): bind sessions to runs (#336)
## Summary

Ask Fabro sessions are now run-bound instead of standalone. Sessions are
created under their owning run, then accessed by flat session ID routes,
with durable state projected from the run event stream rather than a
separate session store.

## Changes

- Move session creation/listing to `POST/GET /api/v1/runs/{id}/sessions`
while keeping flat session reads, turns, interrupts, and event streams
under `/api/v1/sessions/{id}/...`.
- Add typed `run.session.*` events, ULID-backed session/turn IDs,
read-only default permissions, and a rebuildable SlateDB `session_id ->
run_id` index.
- Remove the old file-backed session store and wire the server, runtime,
Rust client, generated API crates, and TypeScript client around run
event projections.
- Replace the old top-level CLI session command with `fabro run ask` for
chatting with a run.
- Regenerate the TypeScript API client; this also catches up existing
generated models for Pair/run event detail schemas already present in
the OpenAPI spec.

## Validation

- `cargo build -p fabro-api -p fabro-client -p fabro-server -p
fabro-cli`
- `cargo nextest run -p fabro-server --features test-support -E
'test(run_bound_session_is_created_as_run_event_and_resolves_by_flat_id)
| test(sessions_are_listed_only_under_their_owning_run)'`
- `cargo nextest run -p fabro-store
projection_rebuilds_runtime_context_from_run_events`
- `cargo +nightly-2026-04-14 clippy -p fabro-api -p fabro-client -p
fabro-store -p fabro-server -p fabro-cli --all-targets -- -D warnings`
- `cargo +nightly-2026-04-14 fmt --check --all`
- `cd lib/packages/fabro-api-client && bun run typecheck && cd
../../../apps/fabro-web && bun run typecheck`
- `git diff --check`

---

[![Compound
Engineering](https://img.shields.io/badge/Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)
Generated with GPT-5 via [Codex](https://openai.com/codex)
2026-05-21 10:53:41 -04:00
..
administration refactor(auth): split credential sources and vault schemas (#306) 2026-05-18 11:07:42 -04:00
agents docs: sync public docs to recent changes 2026-05-18 14:42:54 -04:00
api-reference feat(api): bind sessions to runs (#336) 2026-05-21 10:53:41 -04:00
changelog docs(changelog): refresh recent product changes 2026-05-18 14:42:54 -04:00
core-concepts feat(workflow): enforce strict api/acp backends (#307) 2026-05-18 13:20:56 -04:00
examples fix(workflows): pin clippy and fmt to nightly-2026-04-14 2026-05-03 17:32:46 -04:00
execution docs: sync public docs to recent changes 2026-05-18 14:42:54 -04:00
getting-started refactor(workflow): remove retro stage (#230) 2026-05-09 10:18:20 -04:00
human-tools feat(workflows): add interview workflow 2026-05-08 07:44:33 -07:00
images Add system resources settings page (#328) 2026-05-20 17:22:53 -04:00
integrations feat(sandbox): label Daytona sandboxes as managed (#326) 2026-05-20 17:22:12 -04:00
languages refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
logo refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
reference feat(api): bind sessions to runs (#336) 2026-05-21 10:53:41 -04:00
tutorials refactor: remove compatibility shims (#281) 2026-05-16 15:29:25 -04:00
workflows docs: sync public docs to recent changes 2026-05-18 14:42:54 -04:00
.mintignore refactor(docs): move .mintignore into docs/public and update skill paths 2026-04-27 07:29:59 -07:00
docs.json docs(changelog): refresh recent product changes 2026-05-18 14:42:54 -04:00
dot-highlight.js refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
favicon.svg refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00