π¨ Studio¶
Offline cockpit: kanban, live feed, markdown memory, settings. No CDN at runtime β React/Babel are vendored. Cafe WiβFi can implode; Studio will not. βοΈ
βοΈ Airplane mode
Cafe WiβFi can implode. Studio will not. Bring snacks either way.
Layout πΊοΈ¶
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Brand Β· Query Β· Run/Stop Β· Model β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Pipeline: init β skills β β¦ β execute β learn β
ββββββββββββ¬βββββββββββββββββββββββββββββ¬βββββββββββββββββββ€
β Nav β Kanban / Live / Pipeline β Docs / Settings β
β Agents β Task inspector β CONTEXT/MEMORY β
β Skills β Phase Β· slots editor β β
ββββββββββββ΄βββββββββββββββββββββββββββββ΄βββββββββββββββββββ
| Zone | Job |
|---|---|
| π― Query bar | Start / stop |
| π Pipeline strip | Dynamic phases from .slmcode/pipeline.yaml |
| π§© Pipeline tab | Bind agents per phase, insert slots, loop roles |
| π‘ Live | @agent, scope, patches, slots, output |
| π Kanban | Drag, promote, edit mid-run (any agent role) |
| πΎ Docs | Live markdown memory |
| βοΈ Settings | Provider, knobs, safety |
Mid-run editing βοΈ¶
While agents run you can drag cards, promote columns, edit CONTEXT/MEMORY, and add notes. The loop reloads board.json each wave. Chaos, but structured chaos.
Human-in-the-loop modals β¶
Studio blocks the relevant step with a modal (pipeline header shows Awaiting you):
| Modal | When | Options | Timeout default |
|---|---|---|---|
| Clarify | vague PRD interview | pick options | 2m β recommended |
| Plan approve | before execute | approve / replan | 2m β approve |
| Escalate | task hits max review retries | re-scope / retry / mark done / abort | 30s β @escalate SLM decides |
| Continue | QA/retries exhausted | continue / stop / flag | 2m β stop |
| Shell | shell_permission=ask | approve / deny | 2m |
Config (Settings β Planning / scope, or YAML):
escalate_ask: ask # ask | auto | off
escalate_ask_timeout: 30s # then @escalate (or escalate_timeout_agent) decides
escalate_timeout_agent: "" # empty = @escalate β @reviewer β @coordinator
continue_ask: ask
TUI: /escalate re_scope|retry|mark_done|abort while the banner shows escalate pending. On timeout the dedicated @escalate arbitrator picks retry / re-scope / abort / mark_done.
API: GET /api/escalate/pending Β· POST /api/escalate/answer {"action":"retry"}.
Live events (SSE) π‘¶
Same stream as slmcode run -v:
| Field | Example |
|---|---|
agent | @worker |
kind | agent_start / coord / learn / output |
task_id | T1 |
scope | focus files |
output | truncated specialist text |
HTTP API π¶
| Method | Path |
|---|---|
GET | /api/health |
GET/PUT | /api/config |
GET/PUT | /api/pipeline Β· POST /api/pipeline/reset |
GET/PUT | /api/docs, /api/docs/{name} |
GET/POST/PATCH/DELETE | board / tasks |
GET/POST/PUT/DELETE | /api/agents (custom + overrides) |
GET | /api/skills /api/models |
POST | /api/runs /api/runs/stop |
GET | /api/runs/latest /api/events |
GET/POST | /api/escalate/pending Β· /api/escalate/answer |
GET/POST | /api/continue/pending Β· /api/continue/answer |
GET | / SPA |
β Full pipeline schema: Pipeline
curl -s http://127.0.0.1:7420/api/health | jq .
curl -s -X POST http://127.0.0.1:7420/api/runs \
-H 'Content-Type: application/json' \
-d '{"query":"Add a doc comment to Hello()"}'
Pair with the TUI π₯¶
β π₯οΈ TUI Β· π§ͺ Recipes
βοΈ Made with β₯ by UnicoLab