chat: replace universal bar chrome with compact bar + talent-view modal (lode 3b)
Delete the 680-line inline/panel JS block in app.html and the
conversation_panel.html template. In their place:
- convey/templates/chat_bar.html: compact always-visible bar with a
single-line sol-message slot, talent icon tray (max 8 + overflow),
and composer row. Subscribes to the new "chat" tract (from 3a).
- convey/templates/app.html: shared talent-view modal (role=dialog,
aria-modal, ESC-closes, focus-return). Static mode fetches
/api/chat/talent-log/<use_id>; running mode also short-polls and
watches the chat tract for terminal events.
- window.openConversation(text?) repurposed: focus bar input,
pre-fill text. Panel semantics gone.
Gating decision: add app_bar: bool = True to the App dataclass so
/app/chat (lode 3c) can opt out. Body .has-app-bar class and the
bar include both gate on app_registry.apps[app].app_bar. Workspace
bottom-space reservation moved under body.has-app-bar .workspace
so a bar-less app reclaims the space.
Deleted DOM/CSS/JS: conversationBackdrop, conversationMessages,
chatBarResponsePanel, chatBarThinking, chatBarResponse, chatBarDismiss,
conversation-separator, app-bar--focused/dismissing/glance, expand
button, panel focus trap, pagehide saves, the two solstone:*State
localStorage keys, and the /api/chat/result recovery path. One-time
localStorage cleanup remains.
Guard extended: tests/test_no_legacy_chat_imports.py now text-scans
.html and .js files (excluding itself and fixtures) for the deleted
DOM literals, so they can't creep back in.
net: -1084 lines old / +735 lines new across 7 files.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>