---
title: "Agent sessions, run relationships, and sandbox visibility"
date: "2026-05-16"
---

<Warning>
**Failure diagnostics now use the richer `{ reason, detail }` shape.** API clients reading terminal run failures should regenerate and read structured fields instead of parsing display strings.

To migrate:
1. Regenerate clients from the current OpenAPI schema.
2. Read public summaries from `failure.reason`.
3. Read source chains, categories, signatures, and redacted command output from `failure.detail`.
</Warning>

## Server-backed agent sessions

Fabro now has durable server-backed agent sessions with persistent session records, turns, transcripts, event replay, and SSE turn streaming. The first slice is local to the same-machine server target, but it gives API clients and the CLI a durable session surface instead of treating every agent interaction as a one-off process.

```bash
fabro session -p "Inspect this checkout and summarize the failing tests"
```

Sessions store messages and turn events under Fabro storage, reject conflicting active turns, validate local working directories, and support interrupt requests through the server.

## Run relationships and pull request links

Runs can now be connected with orchestration-only parent links without merging them into fork or rewind lineage. You can create child runs, filter by parent, link or unlink parent runs, and keep historical parent references even if a parent run is deleted.

```bash
fabro run hello --parent 01KRTKP5DJJ4EV6T7QSB081Z1N
fabro parent link child-run parent-run
fabro pr link run-id https://github.com/fabro-sh/fabro/pull/123
```

Pull request associations are event-sourced too. Existing runs can link, replace, view, and unlink GitHub PR URLs while Fabro-created PR flows continue to work as before.

## Chats in the web app

The web app now includes `/chats/new` and `/chats/:id` routes for the emerging agent chat surface. The implementation ports the validated prototype into the real app shell, using assistant-ui rendering, scripted streaming replies, markdown, tool-call rendering, and a StrictMode-safe first-message handoff.

This is the first web-facing layer over the new session primitives. It keeps the existing `/start` entry point for now while giving the product a dedicated conversation surface.

## More

<Accordion title="API">
- Added session create/list/read/update/delete, turn submission, event replay, interrupt, and session-scoped tool endpoints
- Added parent run fields and `PUT`/`DELETE /api/v1/runs/{id}/parent`
- Added pull request link and unlink endpoints for existing runs
- Added `GET /api/v1/health` alongside the root `/health` probe
- Sandbox details now expose provider dashboard links and network egress/ingress policy
</Accordion>

<Accordion title="CLI">
- Added `fabro session -p <prompt>` for server-backed local agent sessions
- Added `fabro parent link` and `fabro parent unlink`
- Added `--parent` to `fabro run`, `fabro create`, and `fabro ps`
- Added `fabro pr link`, `fabro pr unlink`, and updated `fabro pr view` for stored PR associations
</Accordion>

<Accordion title="Workflows">
- Template diagnostics now preserve source files, line/column spans, node IDs, and attribute context through CLI and server validation
- `fabro validate` now treats undefined variables inside `@file` prompts as warnings in structural mode, matching inline prompt behavior
- Custom provider and model `agent_profile` overrides now control profile-specific behavior for project memory, sessions, and runtime agent routing
</Accordion>

<Accordion title="Improvements">
- Added opt-in Ollama and LiteLLM catalog providers
- Sandbox tabs now show provider links and network policy where Fabro can assert them
- Generated API client output is marked as generated for GitHub language and code-quality tooling
</Accordion>

<Accordion title="Fixes">
- Fixed custom provider IDs in `fabro exec` and provider-filtered model listing
- Fixed Daytona clone setup by moving Daytona repository roots under `/home/daytona/repos`
- Fixed template validation so imported prompt files with undefined inputs produce warnings instead of hard errors
</Accordion>
