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:
@@ -68,11 +68,18 @@ export function deriveModesFromACP(
|
||||
): { modes: ProviderMode[]; currentModeId: string | null } {
|
||||
if (modeState?.availableModes?.length) {
|
||||
return {
|
||||
modes: modeState.availableModes.map((mode) => ({
|
||||
id: mode.id,
|
||||
label: mode.name,
|
||||
description: mode.description ?? undefined,
|
||||
})),
|
||||
// ACP omits the unattended flag; inherit it from the manifest fallback by
|
||||
// id so the unified permission picker can still detect each agent's bypass
|
||||
// mode (e.g. opencode `full-access`) from live-probed modes.
|
||||
modes: modeState.availableModes.map((mode) => {
|
||||
const fb = fallbackModes.find((f) => f.id === mode.id);
|
||||
return {
|
||||
id: mode.id,
|
||||
label: mode.name,
|
||||
description: mode.description ?? undefined,
|
||||
...(fb?.isUnattended ? { isUnattended: true } : {}),
|
||||
};
|
||||
}),
|
||||
currentModeId: modeState.currentModeId ?? null,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user