feat: surface structured permission details in approval UI

Wire the sidecar's new permissionDetail payload through the frontend:
- Add PermissionDetail interface to sidecar contract
- Add permissionDetail field to PendingApprovalRecord and thread
  through normalization and AryxAppService mapping
- Create PermissionDetailView component with kind-specific rendering:
  shell (command block + warning), write (filename + diff), read (path),
  mcp (server badge + args), url (prominent URL), memory (subject/fact),
  custom-tool (description + args), hook (message + args)
- ApprovalBanner shows structured detail when available, falls back to
  generic text for backward compatibility
- QueuedApprovalsList shows brief kind-specific summaries

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
David Kaya
2026-03-26 16:59:15 +01:00
co-authored by Copilot
parent 13c543e2fd
commit 4c01d8b1a7
5 changed files with 334 additions and 4 deletions
+25
View File
@@ -181,6 +181,30 @@ export interface AgentActivityEvent {
toolName?: string;
}
export interface PermissionDetail {
kind: string;
intention?: string;
command?: string;
warning?: string;
possiblePaths?: string[];
possibleUrls?: string[];
hasWriteFileRedirection?: boolean;
fileName?: string;
diff?: string;
newFileContents?: string;
path?: string;
serverName?: string;
toolTitle?: string;
args?: Record<string, unknown>;
readOnly?: boolean;
url?: string;
subject?: string;
fact?: string;
citations?: string;
toolDescription?: string;
hookMessage?: string;
}
export interface ApprovalRequestedEvent {
type: 'approval-requested';
requestId: string;
@@ -193,6 +217,7 @@ export interface ApprovalRequestedEvent {
permissionKind?: string;
title: string;
detail?: string;
permissionDetail?: PermissionDetail;
}
export interface CommandErrorEvent {