- OutputSink: collects output, optionally streams to attached WS
- Runtime no longer requires WebSocket — works headless for MCP
- WS connects/disconnects via attach_ws()/detach_ws(), runtime persists
- /api/send/check + /api/send (async) + /api/result (poll with progress)
- Graph switch destroys old runtime, next request creates new one
- Director v2 model: claude-opus-4 (was claude-sonnet-4, reserved)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
RED->GREEN->REFACTOR cycle:
- UI node has state store (key-value), action bindings (op/var), and
local action handlers (inc/dec/set/toggle — no LLM round-trip)
- Thinker self-model: knows its environment, that ACTIONS create real
buttons, that UI handles state locally. Emits var/op payload for
stateful actions.
- Thinker's context includes UI state so it can report current values
- /api/clear resets UI state, bindings, and controls
- Test runner: action_match for fuzzy action names, persistent actions
across steps, _stream_text restored
- Counter test: 16/16 passed (create, read, inc, inc, dec, verify)
- Pub test: 20/20 passed (conversation, language switch, tool use, mood)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Thinker emits ACTIONS: JSON line with follow-up buttons
- UI node is now pure code (no LLM call) — renders actions as buttons,
extracts tables from pipe-separated tool output, labels for single values
- Controls only in workspace panel, not duplicated in chat
- Process cards only in awareness panel, failed auto-remove after 30s
- Auth expiry detection: 403/1006 shows login button, stops reconnect loop
- Sensor timezone fix: zoneinfo.ZoneInfo("Europe/Berlin") for proper DST
- Cache-Control: no-cache on index.html
- Markdown rendering in chat messages
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6-node pipeline: Input -> Thinker -> Output (voice) + UI (screen) in parallel
- Output: text only (markdown, emoji). Never emits HTML or controls.
- UI: dedicated node for labels, buttons, tables. Tracks workspace state.
Replaces entire workspace on each update. Runs parallel with Output.
- Input: strict one-sentence perception. No more hallucinating responses.
- Thinker: controls removed from prompt, focuses on reasoning + tools.
- Frontend: markdown rendered in chat (bold, italic, code blocks, lists).
Label control type added. UI node meter in top bar.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Python code blocks containing SQL keywords (SELECT, CREATE) were
incorrectly re-wrapped in the SQL template. Now only blocks explicitly
tagged as sql/sqlite get wrapped.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Thinker tool results stream directly to user, skipping Output node (halves latency)
- ProcessManager process_start/process_done events render as live cards in chat
- UI controls sent before response text, not after
- Button clicks route to handle_action(), skip Input, go straight to Thinker
- Fix Thinker model: gemini-2.5-flash-preview -> gemini-2.5-flash (old ID expired)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>