fix(agent): auto-approve scoped investigation edits
Generic Container CI/CD / test-build-publish (push) Successful in 1m19s
Agent CI/CD / build-test-publish-and-deploy (push) Successful in 1m19s

This commit is contained in:
2026-11-08 02:02:58 +08:00
parent a7ddff7b64
commit e476569ebc
5 changed files with 19 additions and 15 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
// Called only for native "asked" events. Explicit denials and host isolation
// still run before this point; the selected round mode answers pending requests.
export function canAutomaticallyApprove(mode: string, action: string, backgroundSandboxShell = false) {
return mode === "always" || (backgroundSandboxShell && action === "shell");
export function canAutomaticallyApprove(mode: string, action: string, backgroundSandboxPermissions = false) {
return mode === "always" || (backgroundSandboxPermissions && (action === "shell" || action === "edit"));
}
+6 -6
View File
@@ -84,7 +84,7 @@ type StreamPromptOptions = {
message: string;
model?: SupportedModel;
approvalMode?: ApprovalMode;
backgroundSandboxShell?: boolean;
backgroundSandboxPermissions?: boolean;
traceId?: string;
projectId?: string;
signal?: AbortSignal;
@@ -149,7 +149,7 @@ export const streamPromptResponse = async ({
message,
model,
approvalMode = "request",
backgroundSandboxShell = false,
backgroundSandboxPermissions = false,
traceId,
projectId,
signal,
@@ -483,7 +483,7 @@ export const streamPromptResponse = async ({
patterns: event.properties.patterns,
elapsedMs: Math.max(0, Date.now() - requestStartedAt),
});
const autoApprove = canAutomaticallyApprove(approvalMode, event.properties.permission, backgroundSandboxShell);
const autoApprove = canAutomaticallyApprove(approvalMode, event.properties.permission, backgroundSandboxPermissions);
emitProgress({
id: `permission-${event.properties.id}`,
phase: "permission",
@@ -493,7 +493,7 @@ export const streamPromptResponse = async ({
autoApprove
? approvalMode === "always"
? "当前模式为本轮自动批准,已允许本次请求,不保存后续轮次授权。"
: "后台任务的沙箱 Shell 已自动批准;沙箱与明确拒绝规则仍生效。"
: "后台任务的会话内 Shell / 文件修改已自动批准;目录边界与明确拒绝规则仍生效。"
: buildPermissionDetail(event),
});
if (autoApprove) {
@@ -533,7 +533,7 @@ export const streamPromptResponse = async ({
resources: event.properties.resources,
elapsedMs: Math.max(0, Date.now() - requestStartedAt),
});
const autoApprove = canAutomaticallyApprove(approvalMode, event.properties.action, backgroundSandboxShell);
const autoApprove = canAutomaticallyApprove(approvalMode, event.properties.action, backgroundSandboxPermissions);
emitProgress({
id: `permission-${event.properties.id}`,
phase: "permission",
@@ -543,7 +543,7 @@ export const streamPromptResponse = async ({
autoApprove
? approvalMode === "always"
? "当前模式为本轮自动批准,已允许本次请求,不保存后续轮次授权。"
: "后台任务的沙箱 Shell 已自动批准;沙箱与明确拒绝规则仍生效。"
: "后台任务的会话内 Shell / 文件修改已自动批准;目录边界与明确拒绝规则仍生效。"
: buildPermissionV2Detail(event),
});
if (autoApprove) {
+1 -1
View File
@@ -997,7 +997,7 @@ export const registerChatStreamRoute = (
message: preparedMessage,
model: parsed.data.model,
approvalMode: parsed.data.approval_mode,
backgroundSandboxShell: sessionPurpose === "task_execution",
backgroundSandboxPermissions: sessionPurpose === "task_execution",
traceId: requestContext.traceId,
projectId: requestContext.projectId,
signal: abortController.signal,