Metadata-Version: 2.4
Name: millrace-web
Version: 0.21.1
Summary: Optional read-only local web dashboard for Millrace workspaces
License-Expression: Apache-2.0
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: millrace-ai>=0.21.1
Requires-Dist: fastapi<1,>=0.115
Requires-Dist: uvicorn<1,>=0.30
Provides-Extra: dev
Requires-Dist: httpx<1,>=0.27; extra == "dev"
Requires-Dist: pytest<9,>=8; extra == "dev"
Requires-Dist: ruff<1,>=0.11; extra == "dev"

# Millrace Web

`millrace-web` is an optional local, read-only dashboard for initialized
Millrace workspaces. It is shipped as a separate package so the base
`millrace-ai` runtime stays lightweight and does not include web dependencies,
web modules, or static assets.

```bash
pip install millrace-web
millrace-web serve --workspace /path/to/workspace
millrace-web serve --workspace /path/a --workspace /path/b
```

The server binds to `127.0.0.1:8765` by default and only serves workspaces
explicitly passed with `--workspace`.

## Views

- `Detail`: the default dense operator view for active runtime state, queues,
  run artifacts, compiled plan identity, usage governance, and Arbiter status.
- `Flow`: a visual runtime-flow view over compiled stage graph topology,
  active runtime state, and recent run-trace outcomes when available.

Both views share the same DTOs and refresh loop. The dashboard does not mount
write or control routes.

The Flow graph DOM stays stable between unchanged poll responses so animated
lane effects continue smoothly while the rest of the read-only state refreshes.

The API also exposes graph/trace-specific read surfaces:

- `/api/workspaces/<workspace_id>/compiled-plan/graphs`
- `/api/workspaces/<workspace_id>/runs/<run_id>/trace`

## Safety Model

The dashboard reads initialized workspace state under `millrace-agents/` and
does not acquire the daemon ownership lock. Future interactivity should be
added through explicit control routes that call Millrace's supported runtime
control surfaces, not by writing runtime files directly.
