Skip to content

feat: interactive web dashboard with codex support#677

Merged
laynepenney merged 7 commits intosprint-18from
feat/dashboard-interactive
Apr 13, 2026
Merged

feat: interactive web dashboard with codex support#677
laynepenney merged 7 commits intosprint-18from
feat/dashboard-interactive

Conversation

@laynepenney
Copy link
Copy Markdown
Collaborator

Summary

  • Web dashboard: codex double-Enter support, expandable/fullscreen/pop-out output panels with input bars, scroll preservation
  • Channel: silent reaping of ephemeral s_* identities to eliminate left message spam
  • Tmux dashboard (spawn.rs): /send, /focus, /zoom commands with codex awareness

Premium boundary

Premium boundary: core OSS (dashboard UI, channel infrastructure, tmux orchestration)

Test plan

  • Verified dashboard imports and codex agent detection
  • Tested pop-out window with input via live dashboard
  • Tested double-Enter delivery to Atlas via web input
  • Cargo build clean for spawn.rs changes

@github-actions
Copy link
Copy Markdown
Contributor

Thank you for your contribution! Before we can merge this PR, we need you to sign our Contributor License Agreement.

To sign, please comment on this PR with the following exact text:

I have read the CLA Document and I hereby sign the CLA

You can also re-trigger the CLA check by commenting recheck.


I have read the CLA Document and I hereby sign the CLA


You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

…images

The blog index was missing 11 posts (Sprint 5-11 recaps, building-collaboration,
building-my-own-memory, design-session-that-saved-us, what-is-memory, why-synapt)
because those posts existed only as HTML with no .md frontmatter stubs for the
build script. Added .md stubs so build_blog_index.py generates a complete index.

Also restores Sprint 15 hero images to the correct versions from 34f34b2, which
were overwritten by a bad merge resolution in 5a73f49.
STYLE_SUFFIX in hero.py and DEFAULT_STYLE in generate_hero.py now
inject "wireframe holographic owl as focal subject" into every prompt
so agents can't accidentally generate human-only or abstract heroes.
Humans may still appear alongside owls when context calls for it.

Regenerated 8 off-theme hero images: building-collaboration,
multi-agent-synergy, when-claude-and-codex-debug-together,
agent-madness (round 1), anatomy-of-a-miss, mission-control,
recall-field-guide, sprint-12-recap.
Several code paths in channel.py, registry.py, and sharding.py opened
SQLite connections without PRAGMA busy_timeout, causing instant failure
on write contention when multiple MCP servers share the same database.
Set busy_timeout=5000 on all 8 missing connection sites to match the
existing timeout in _open_db().
…rvation, and fullscreen/popout

Web dashboard (app.py + template.html):
- Detect codex agents from agents.toml; send double-Enter for codex input protocol
- Output panel: expand (50vh), fullscreen (100vh overlay), and pop-out (new window)
- Both fullscreen and pop-out include input bars for sending messages
- Scroll preservation: track user scroll position, only auto-scroll when at bottom
- "New output below" indicator when scrolled up with new content arriving
- Escape key exits fullscreen; close button deselects agent

Channel (channel.py):
- Silent reaping for ephemeral s_* identities; no more "left" message spam
- Ephemeral presences fully deleted on reap instead of set to offline

Tmux dashboard (spawn.rs):
- /send, /focus, /back, /zoom, /help commands in input pane
- Codex double-enter detection from agents.toml at dashboard creation
- Replaced clear with ANSI escape to preserve scrollback
…endpoint

- Add /api/agent/{name}/key endpoint with safety-allowlisted tmux keys
- Add key palette UI (Enter, Esc, y/n, arrows, Tab, ^C, ^D, q) with
  event delegation
- Empty-field heuristic: arrow keys and Enter forward to tmux when input
  is empty; normal text editing when input has content
- Inline ANSI-to-HTML parser (SGR standard, 256-color, RGB) replacing
  broken ansi_up v6 CDN dependency
- Cursor position overlay via tmux display-message (cursor_x, cursor_y)
- Visual feedback: 150ms delayed refresh after key sends
- /api/agent/{name}/snapshot now accepts ansi=true for ANSI escape codes
  and cursor position data
- Fix pop-out window to use ANSI rendering (was plain textContent)
- Add /terminal/{name} endpoint and WebSocket bridge for xterm.js
  terminal pop-out (experimental)
- Allow bare Enter in /api/agent/{name}/input for confirming selections
- Skip codex double-Enter on bare Enter sends
Reaper no longer writes leave messages to channel JSONL; presence
table already tracks offline status. Agents whose display_name
matches their griptree name are treated as ephemeral. Dashboard
renderer returns empty string for join/leave events.
@laynepenney laynepenney force-pushed the feat/dashboard-interactive branch from b2c6ac1 to 1fa63f7 Compare April 13, 2026 20:06
@laynepenney laynepenney merged commit e60c5e2 into sprint-18 Apr 13, 2026
@laynepenney laynepenney deleted the feat/dashboard-interactive branch April 13, 2026 20:06
@github-actions github-actions bot locked and limited conversation to collaborators Apr 13, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant