dashboard: inline approval card — Approve/Deny with Y/N kbd, redacted preview, 5-min auto-deny, audit event #966
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Depends on
Reference
charles/claude-hooks#966
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
User story
As an operator I want destructive tool calls (force-push, file delete, shell with
rm/--force, secret access) to render an inline Approve/Deny card in the timeline that captures my decision in the audit log, so destructive ops never run silently and an idle session auto-denies after 5 min instead of sitting forever.Acceptance criteria
Server
ApprovalGatemiddleware in the agent runner: a tool policy can mark a call as requiring approval; the runner pauses the call, emits atool_callevent withstate: "approval-requested", and waits on aPOST /agents/approvals/:call_id { decision }endpoint or 5-minute timeout (configurable).output-deniedwithreason: "auto-denied (timeout)".systemevent with operator id (from session cookie), decision, timestamp, redacted args.Frontend
<ApprovalCard>renders inline at the matching event. Approve / Deny buttons via existing<Button>primitive (tone="success"/tone="error"). KeyboardY/Nwhile focused.Tooling
approval-requiredtools per agent type. Default seeds:Bashmatchingrm -r|--force-with-lease|git push --force|gpg|cat .env,Delete,mcp__forgejo__delete_*,Writeto.env*/secrets.*.Tests
output-availablelands.Out of scope
Dependencies
<ToolCard>ticket — approval card composes into it.approval-requestedstate.References
🤖 Auto-assigned to code-lead (heuristic: area:dashboard + body 2414 bytes (> 2 KB) — code-lead (heavy)). Reply
/unassignto reroute.