> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fabro.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Run events, raw logs, and refreshable GitHub tokens

<Warning>
  **Static `ghs_*` tokens are rejected.** GitHub installation access tokens expire quickly and should not be stored as static `GITHUB_TOKEN` values.

  To migrate:

  1. Replace static `ghs_*` tokens with a personal access token, or configure GitHub App mode.
  2. In GitHub App mode, request scoped run tokens with `[run.integrations.github.permissions]`.
</Warning>

## Separate run events and raw logs

`fabro events` now focuses on structured workflow events, while `fabro logs` prints the raw worker tracing output for a run. Use events when you want the run timeline, assistant messages, tool activity, or follow-mode output; use logs when you need low-level worker diagnostics.

```bash theme={"languages":{"custom":["/languages/dot.json","/languages/fabro.json"]}}
fabro events <run> --pretty --follow
fabro logs <run> --tail 200
```

The split makes the CLI match the product model more closely: events are the durable run history, and logs are the debugging stream.

## Better foreground server logs

`fabro server start --foreground` now writes server logs to stdout by default, and interactive terminals get a compact colored one-line format with date-bearing timestamps. Piped stdout and file logs keep the plain tracing format, so scripts and saved logs do not need to change.

## Refreshable GitHub tokens during workflows

Long-running workflows that used GitHub App installation tokens could outlive the first token minted for the run. Fabro now keeps GitHub credentials as a refreshable token source and resolves `GITHUB_TOKEN` lazily before command and API agent stages, so GitHub operations can continue after token rollover.

Tokens refresh when they are close to expiry. If a refresh fails while the cached token is still valid, Fabro keeps using the cached token and logs a warning; expired tokens now fail explicitly instead of surfacing later as confusing GitHub authentication errors.

## More

<Accordion title="CLI">
  * Added `fabro events` for structured run event history with `--follow`, `--pretty`, `--since`, and `--tail`
  * `fabro logs` now prints raw worker tracing output with `--tail`
  * Foreground logs now show the run ID on run-scoped log lines
  * Failed API commands now preserve server response details instead of collapsing to a status-only error
  * CLI help output now wraps angle-bracket placeholders in backticks
</Accordion>

<Accordion title="Workflows">
  * Command stages and API agent stages resolve `GITHUB_TOKEN` from a refreshable source before use
  * GitHub App installation tokens refresh when they are within 15 minutes of expiry
  * CLI agent stages now surface their launch-time token refresh limitation
</Accordion>

<Accordion title="Improvements">
  * Interactive foreground server logs now use a compact colored TTY format
  * Worker processes preserve the terminal color environment passed by the foreground server
  * `--watch-web` now ignores non-source watcher events and responds faster during local development
  * Agent file reads now parallelize `read_many_files` work
</Accordion>

<Accordion title="Fixes">
  * Fixed long-running GitHub App workflows losing GitHub access after the initial installation token expired
  * Fixed static configuration accepting short-lived `ghs_*` installation tokens
  * Fixed foreground server logs defaulting away from stdout
  * Fixed repeated `cargo dev` rebuilds during generated CLI reference refreshes
</Accordion>
