Maintainer here. streamlit-coco 0.1.6 is out — here's what's new since 0.1.5.
**`copilot_rail()`.** Most agent demos eat the page. This one is a right column: connection popover, jobs queued by your own screens, and two transcript pills beside the connection (**Last messages**, **First 200 characters**) that fragment-rerun the rail only — your page stays put. While CoCo works, a compact **Working · thinking…** badge sits on that same row instead of a tall status card. **Cancel job** sits on the title row next to **Close** and hides the moment the turn ends.
```python
import streamlit_coco as st_coco
session = st_coco.get_or_create_session(opts, key="copilot")
st_coco.copilot_rail(
session,
job=st.session_state.get("job"), # {"prompt": ..., "label": ..., "status": "queued"}
on_job_sent=lambda job: st.session_state.update(job=job),
on_job_finished=lambda job: st.session_state.pop("job", None),
show_copy=False,
)
```
Your screens never open an agent — they set that job dict, the rail sends it once the session is ready. `max_messages=` / `preview_chars=` are also plain arguments on `panel()` if you only want the transcript behaviour.
**Companion example:** `make tableau-semantic` loads two MIT-licensed Tableau Server workbooks that implement the same row-level-security rule two different ways, surfaces the drift, and has CoCo write one Snowflake semantic view + one row access policy and generate a Streamlit consumer of it. **Preview** shares the Copilot slot — the split is just `streamlit_extras.resizable_columns`. Screens 1–6 run against the fixtures with no Snowflake account.
There's also a training pack under `doc/training/` if you're onboarding someone else onto this.
`pip install "streamlit-coco[sdk]==0.1.6"`
Alpha, Apache-2.0 — feedback on the `copilot_rail()` API especially welcome while it's still cheap to change.
https://github.com/DevoteamSP/streamlit-coco