facett-claude/.nornir/assets/claude-pane.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 300" font-family="sans-serif" font-size="13">
<rect width="760" height="300" fill="#0f1720"/>
<text x="20" y="30" fill="#e6edf3" font-size="16" font-weight="bold">facett-claude — conversation pane (Elm) + injected transport</text>
<!-- pane box -->
<rect x="20" y="60" width="300" height="210" rx="8" fill="#15202b" stroke="#2d3f50"/>
<text x="36" y="84" fill="#9fd3f5" font-weight="bold">ClaudePane (facett Elm → Facet → Panel)</text>
<rect x="36" y="98" width="268" height="26" rx="4" fill="#1b2b3a" stroke="#33506b"/>
<text x="46" y="115" fill="#c6d3df">turns[] · prompt · model · sending · error</text>
<rect x="36" y="132" width="268" height="24" rx="4" fill="#1b2b3a" stroke="#33506b"/>
<text x="46" y="148" fill="#c6d3df">update_json(msg) · state_json() out</text>
<text x="36" y="182" fill="#7fd08c">▶ view: turns + prompt input + Send</text>
<text x="36" y="206" fill="#9aa7b3" font-size="11">prompt_changed → send → (host) → received_ok</text>
<text x="36" y="226" fill="#9aa7b3" font-size="11">robot drives this IN CODE — no pixels, no AI</text>
<!-- effect arrow -->
<line x1="320" y1="150" x2="430" y2="150" stroke="#6fd3f5" stroke-width="2" marker-end="url(#a)"/>
<text x="330" y="142" fill="#6fd3f5" font-size="11">Effect::Send{model,messages}</text>
<!-- host transport -->
<rect x="430" y="90" width="300" height="120" rx="8" fill="#15202b" stroke="#2d3f50"/>
<text x="446" y="114" fill="#f0c674" font-weight="bold">host: ClaudeTransport (injected)</text>
<text x="446" y="138" fill="#c6d3df">nornir viz::claude::HttpTransport</text>
<text x="446" y="158" fill="#9aa7b3" font-size="11">POST api.anthropic.com/v1/messages</text>
<text x="446" y="176" fill="#9aa7b3" font-size="11">model claude-opus-4-8 · $ANTHROPIC_API_KEY</text>
<text x="446" y="196" fill="#7fd08c" font-size="11">default: EchoBackend — offline, no secrets</text>
<!-- return arrow -->
<line x1="430" y1="185" x2="320" y2="185" stroke="#7fd08c" stroke-width="2" marker-end="url(#a)"/>
<text x="330" y="200" fill="#7fd08c" font-size="11">Msg::ReceivedOk / ReceivedErr</text>
<text x="20" y="292" fill="#586570" font-size="11">no nornir/reqwest dep — pure leaf; the pane emits data, the host runs the HTTP. One pane, mounted by nornir · dwarves · holger.</text>
<defs><marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="4" orient="auto"><path d="M0,0 L8,4 L0,8 Z" fill="#8fb0c8"/></marker></defs>
</svg>