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:
@@ -163,6 +163,29 @@ func PreviewFrame(kind string, w, h int) string {
|
||||
m.grantScopeIndex = 1
|
||||
m.overlay = OverlayGrantScope
|
||||
|
||||
case "actions":
|
||||
m.connected = true
|
||||
m.currentModel = "llama-cpp:default"
|
||||
m.sessions = sampleSessions()
|
||||
m.selectedID = "04a546aa"
|
||||
m.sessionEntered = true
|
||||
m.routerConnected = true
|
||||
m.routerMessages["04a546aa"] = []RouterEntry{
|
||||
{Role: "user", Content: "run the healthcheck and write the script"},
|
||||
{Role: "router", Content: "I'll create the script, then run it."},
|
||||
{Role: "action", Icon: "⏵", Content: "file_write"},
|
||||
{Role: "action", Icon: "✎", Content: "wrote healthcheck.sh (+4 −0)"},
|
||||
{Role: "action", Icon: "⌘", Content: "approved file_write"},
|
||||
{Role: "action", Icon: "⏵", Content: "shell"},
|
||||
{Role: "action", Icon: "✓", Content: "shell · exit 0"},
|
||||
{Role: "action", Icon: "⊞", Content: "granted file_write · global"},
|
||||
{Role: "router", Content: "Done — script written and the healthcheck passes."},
|
||||
}
|
||||
if s := m.session("04a546aa"); s != nil {
|
||||
s.CurrentStage = "execute_script"
|
||||
s.LastEventAt = nowMillis() - 3000
|
||||
}
|
||||
|
||||
case "grants":
|
||||
m.connected = true
|
||||
m.currentModel = "llama-cpp:default"
|
||||
|
||||
Reference in New Issue
Block a user