




























@@ -1,4 +1,7 @@
1-import type { CliBackendConfig } from "openclaw/plugin-sdk/cli-backend";
1+import type {
2+CliBackendConfig,
3+CliBackendNormalizeConfigContext,
4+} from "openclaw/plugin-sdk/cli-backend";
25import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
36import { CLAUDE_CLI_BACKEND_ID } from "./cli-constants.js";
47export {
@@ -58,16 +61,40 @@ const CLAUDE_LEGACY_SKIP_PERMISSIONS_ARG = "--dangerously-skip-permissions";
5861const CLAUDE_PERMISSION_MODE_ARG = "--permission-mode";
5962const CLAUDE_SETTING_SOURCES_ARG = "--setting-sources";
6063const CLAUDE_SAFE_SETTING_SOURCES = "user";
64+const CLAUDE_BYPASS_PERMISSION_MODE = "bypassPermissions";
61656266export function isClaudeCliProvider(providerId: string): boolean {
6367return normalizeOptionalLowercaseString(providerId) === CLAUDE_CLI_BACKEND_ID;
6468}
656966-export function normalizeClaudePermissionArgs(args?: string[]): string[] | undefined {
70+function isOpenClawRequestedYolo(context?: CliBackendNormalizeConfigContext): boolean {
71+const agentExec = context?.agentId
72+ ? context.config?.agents?.list?.find((agent) => agent.id === context.agentId)?.tools?.exec
73+ : undefined;
74+const exec = agentExec ?? context?.config?.tools?.exec;
75+const security = exec?.security ?? "full";
76+const ask = exec?.ask ?? "off";
77+return security === "full" && ask === "off";
78+}
79+80+export function resolveClaudePermissionMode(context?: CliBackendNormalizeConfigContext): {
81+mode?: string;
82+overrideExisting: boolean;
83+} {
84+return isOpenClawRequestedYolo(context)
85+ ? { mode: CLAUDE_BYPASS_PERMISSION_MODE, overrideExisting: false }
86+ : { overrideExisting: false };
87+}
88+89+export function normalizeClaudePermissionArgs(
90+args?: string[],
91+options?: { mode?: string; overrideExisting?: boolean },
92+): string[] | undefined {
6793if (!args) {
68-return args;
94+return options?.mode ? [CLAUDE_PERMISSION_MODE_ARG, options.mode] : args;
6995}
7096const normalized: string[] = [];
97+let hasPermissionMode = false;
7198for (let i = 0; i < args.length; i += 1) {
7299const arg = args[i];
73100if (arg === CLAUDE_LEGACY_SKIP_PERMISSIONS_ARG) {
@@ -80,21 +107,30 @@ export function normalizeClaudePermissionArgs(args?: string[]): string[] | undef
80107maybeValue.trim().length > 0 &&
81108!maybeValue.startsWith("-")
82109) {
83-normalized.push(arg);
84-normalized.push(maybeValue);
110+hasPermissionMode = true;
111+if (!options?.overrideExisting) {
112+normalized.push(arg);
113+normalized.push(maybeValue);
114+}
85115i += 1;
86116}
87117continue;
88118}
89119if (arg.startsWith(`${CLAUDE_PERMISSION_MODE_ARG}=`)) {
90120const maybeValue = arg.slice(`${CLAUDE_PERMISSION_MODE_ARG}=`.length).trim();
91121if (maybeValue.length > 0 && !maybeValue.startsWith("-")) {
92-normalized.push(`${CLAUDE_PERMISSION_MODE_ARG}=${maybeValue}`);
122+hasPermissionMode = true;
123+if (!options?.overrideExisting) {
124+normalized.push(`${CLAUDE_PERMISSION_MODE_ARG}=${maybeValue}`);
125+}
93126}
94127continue;
95128}
96129normalized.push(arg);
97130}
131+if (options?.mode && (!hasPermissionMode || options.overrideExisting)) {
132+normalized.push(CLAUDE_PERMISSION_MODE_ARG, options.mode);
133+}
98134return normalized;
99135}
100136@@ -132,13 +168,20 @@ export function normalizeClaudeSettingSourcesArgs(args?: string[]): string[] | u
132168return normalized;
133169}
134170135-export function normalizeClaudeBackendConfig(config: CliBackendConfig): CliBackendConfig {
171+export function normalizeClaudeBackendConfig(
172+config: CliBackendConfig,
173+context?: CliBackendNormalizeConfigContext,
174+): CliBackendConfig {
136175const output = config.output ?? "jsonl";
137176const input = config.input ?? "stdin";
177+const permission = resolveClaudePermissionMode(context);
138178return {
139179 ...config,
140-args: normalizeClaudePermissionArgs(normalizeClaudeSettingSourcesArgs(config.args)),
141-resumeArgs: normalizeClaudePermissionArgs(normalizeClaudeSettingSourcesArgs(config.resumeArgs)),
180+args: normalizeClaudePermissionArgs(normalizeClaudeSettingSourcesArgs(config.args), permission),
181+resumeArgs: normalizeClaudePermissionArgs(
182+normalizeClaudeSettingSourcesArgs(config.resumeArgs),
183+permission,
184+),
142185 output,
143186liveSession:
144187config.liveSession ?? (output === "jsonl" && input === "stdin" ? "claude-stdio" : undefined),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。