Skip to content

feat(chat): plain-language chat surface for non-technical teammates (v0.189.0)#319

Merged
vikasprogrammer merged 1 commit into
mainfrom
feat/native-chat-ui
Jul 14, 2026
Merged

feat(chat): plain-language chat surface for non-technical teammates (v0.189.0)#319
vikasprogrammer merged 1 commit into
mainfrom
feat/native-chat-ui

Conversation

@vikasprogrammer

Copy link
Copy Markdown
Owner

What

A Chat page (nav next to Agents) that renders a claude-code session as a messaging app instead of a terminal — aimed at non-technical teammates (support/sales/marketing):

  • Message bubbles — user turns and the agent's replies (markdown), no monospace grid.
  • Friendly activity cards — tool calls become plain language: "Sent a Slack message" ✓, "Read a file", "Searched the web" — with a ✓/✗ status dot. Terminal detail stays hidden.
  • Inline approvals & questions — a pending gate approval renders as an Approve / Decline card right in the thread; an agent question gets an inline reply box. This is the governance surface, in language a non-engineer can act on.
  • Start & reply — pick an agent, type a first message; follow-ups continue the same conversation.

How (why it's low-risk)

No new way of running Claude, no stream-json rewiring, no governance/DB changes. It reuses what already works:

  • View: Claude Code already writes a structured JSONL transcript per session, and agent-os already pins --session-id. GET /api/sessions/:id/conversation locates that file by name and src/edge/conversation.ts parses it into friendly turns. Read-only.
  • Reply / start: POST /api/sessions/:id/reply and POST /api/chat/start reuse the exact resident-deliver / transcript-resume path Slack thread-continuity uses (deliverToResident / reviveResident) and createSession(..., resident=true) (spawnChatAgent). The PreToolUse gate hook + approvals still mediate every effect.
  • Tradeoff vs. token-streaming: message-level polling (2s), matching the rest of the console. Cleaner for the target audience; no terminal jitter.

The ttyd terminal is untouched — Chat and Terminal are two windows onto the same governed run.

Verified

  • npm run build (server) + cd web && npm run build
  • npm run test:governance → 68/68 ✓
  • Parser unit-tested against a real transcript (clean bubbles + activity cards, tool results merged into ✓/✗).
  • In-process test of the route glue (sessionClaudeId + canViewSession + readConversation) → PASS.

Not yet exercised on a live box (needs tmux + claude): the actual spawn/reply round-trip and a real gate approval through the buttons. The underlying deliver/revive path is the same one Slack chat runs in production, so confidence is high — worth a live smoke test before relying on it.

🤖 Generated with Claude Code

…v0.189.0)

A new Chat page renders a claude-code session as a messaging app instead of a
terminal — message bubbles, friendly activity cards, and inline approve/decline
buttons — so support/sales/marketing can drive and oversee agents without the TUI.

Reads the session's claude transcript (GET /api/sessions/:id/conversation, parsed
by src/edge/conversation.ts) and drives the human's turns via POST .../reply and
POST /api/chat/start, reusing the exact resident-deliver / transcript-resume path
Slack thread-continuity already uses (deliverToResident/reviveResident). No gate,
approvals, or DB changes — every effect still passes the mediated gateway.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vikasprogrammer vikasprogrammer merged commit 0736b13 into main Jul 14, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant