Merge nucleic/calm-north-ferret-9vca into dev

This commit is contained in:
2026-07-21 18:47:59 -07:00
parent 02d523161a
commit 629f4690fe
2 changed files with 18 additions and 4 deletions
@@ -23,7 +23,10 @@ struct ApprovalCardView: View {
Text("Permission requested").font(.subheadline.weight(.semibold))
}
HStack(spacing: 6) {
Text(approval.toolName).font(.caption.weight(.bold))
// The gate reads as what it grants — "macOS VM", "linux_container" — rather than
// as the `mcp__nucleic__…` wire name, matching the Mac's approval header.
Text(SandboxToolDisplay.gateLabel(for: approval.toolName))
.font(.caption.weight(.bold))
Text(approval.risk.label)
.font(.caption2.weight(.semibold))
.padding(.horizontal, 6).padding(.vertical, 2)
@@ -148,10 +151,13 @@ struct ApprovalCardView: View {
}
private func alwaysLabel(_ scope: AlwaysScope) -> String {
// Named the same way the header names it — the rule still matches on the exact tool name;
// only how it's spelled to the user changes.
let tool = SandboxToolDisplay.gateLabel(for: approval.toolName)
switch scope {
case .session: "This command, this session"
case .toolName: "Any \(approval.toolName), this session"
case .toolNameWithPattern: "\(approval.toolName) matching this pattern"
case .session: return "This command, this session"
case .toolName: return "Any \(tool), this session"
case .toolNameWithPattern: return "\(tool) matching this pattern"
}
}
}
@@ -38,6 +38,14 @@ enum SandboxToolDisplay {
}
}
/// The tool name for an *approval* surface, where identity is what the user is deciding on:
/// the pretty label when we have one, and otherwise the tool name with the `mcp__nucleic__`
/// plumbing prefix dropped. Never nil and never invented — a tool this file doesn't know
/// still reads as its own identifier rather than as something friendlier than it is.
static func gateLabel(for toolName: String) -> String {
label(for: toolName) ?? bareName(toolName)
}
/// SF Symbol for the tool — a screen for computer-use, a box for a container, a power switch
/// for a lifecycle op — so the glyph carries the same distinction the label does.
static func icon(for toolName: String) -> String? {