feat(tui-go): inline action rows in the OUTPUT transcript
Surface side-effecting ("external feedback") events in the conversation
flow, opencode-style, instead of only in the EVENTS side log.
- New RouterEntry role "action" (glyph + text) appended at arrival so it
interleaves with chat turns by order. Rendered dim with an accent gutter
glyph; the EVENTS panel still carries the full stream.
- Surfaced: tool start (⏵), tool done (✓ / ✎ wrote <path> (+a −b) for a
diff), tool failed (✗), rejected (✕ blocked), approval resolved
(⌘ approved / ✕ rejected, noting "· via grant" on a grant auto-approve),
and grant create/revoke (⊞ / ⊟ · scope). ApprovalResolved names no tool
on the wire, so the tool is recovered from the pending queue before the
gate is dropped.
- Toggle: "inline actions" palette command flips actionsHidden (rows are
always recorded, gated at render, so toggling reveals history); persisted
in tui-prefs.json. prefs.go refactored to load/mutate/save so the new
field and statusbarHidden no longer clobber each other.
- demo.go: "actions" preview kind.
go build / vet / test green; rendered the flow via cmd/preview.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -542,6 +542,14 @@ func (m Model) routerRows(w, h int) []string {
|
||||
}
|
||||
case "narration", "stage":
|
||||
rows = append(rows, t.span(e.Content, t.P.Dim))
|
||||
case "action":
|
||||
// Inline "external feedback" row: a side-effecting action (tool call, write/edit,
|
||||
// approval, grant) surfaced in the conversation flow. Muted via actionsHidden.
|
||||
if m.actionsHidden {
|
||||
break
|
||||
}
|
||||
icon := lipgloss.NewStyle().Foreground(t.P.Accent2).Background(t.P.Bg).Render(e.Icon)
|
||||
rows = append(rows, " "+icon+" "+t.span(e.Content, t.P.Dim))
|
||||
}
|
||||
}
|
||||
// With a selection, scroll so the selected message is visible (top-aligned, clamped
|
||||
|
||||
Reference in New Issue
Block a user