feat(coder): unified Plan/Ask/Bypass permission picker
Replace the raw per-agent mode dropdown in the BooCoder composer with a curated three-option permission ladder mapped generically onto each provider's native modes: `plan` id -> Plan, default -> Ask, isUnattended -> Bypass (claude bypassPermissions, qwen yolo, opencode full-access). modeId stays the single wire field; the active unified mode is derived from it (no contracts change). Native BooCode gains its own mode set: Ask stages to the pending-changes queue (today's behavior), Bypass auto-applies the queue to disk after the turn (interactive messages path + task dispatcher path), Plan falls back to Ask. The shared apps/server inference engine is left untouched. Also preserve isUnattended on live-probed ACP modes so opencode's bypass mode stays detectable from the wire. Coder 373 tests green; coder + web typecheck clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,18 @@ const QWEN_PTY_MODES: ProviderMode[] = [
|
||||
{ id: 'yolo', label: 'YOLO', description: 'Auto-approve all tools', isUnattended: true },
|
||||
];
|
||||
|
||||
// Native BooCode (llama-swap) has no agent-native mode vocabulary, so we define
|
||||
// one that matches the unified permission ladder. `bypass` is the only mode that
|
||||
// changes behavior (auto-apply staged edits after the turn — dispatcher.ts);
|
||||
// `plan` falls back to `ask` semantics for native (writes still stage to the
|
||||
// pending-changes queue). External agents map the same three unified modes onto
|
||||
// THEIR native ids via the `plan`-id / default / `isUnattended` shape.
|
||||
const BOOCODE_MODES: ProviderMode[] = [
|
||||
{ id: 'plan', label: 'Plan', description: 'Read-only analysis (native BooCode falls back to Ask)' },
|
||||
{ id: 'ask', label: 'Ask Permission', description: 'Stage edits to the pending-changes queue for review' },
|
||||
{ id: 'bypass', label: 'Bypass', description: 'Auto-apply edits to disk after the turn', isUnattended: true },
|
||||
];
|
||||
|
||||
const CLAUDE_THINKING = [
|
||||
{ id: 'low', label: 'Low' },
|
||||
{ id: 'medium', label: 'Medium' },
|
||||
@@ -41,6 +53,10 @@ const CLAUDE_THINKING = [
|
||||
];
|
||||
|
||||
export const PROVIDER_MANIFEST: Record<string, ProviderManifestEntry> = {
|
||||
boocode: {
|
||||
defaultModeId: 'ask',
|
||||
modes: BOOCODE_MODES,
|
||||
},
|
||||
claude: {
|
||||
defaultModeId: 'default',
|
||||
modes: CLAUDE_MODES,
|
||||
|
||||
Reference in New Issue
Block a user