summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMariano Uvalle <[email protected]>2025-08-13 06:01:17 -0700
committerGitHub <[email protected]>2025-08-13 09:01:17 -0400
commite1f80c006761fd0d0f5eda36ce727970a3d4b272 (patch)
treea3495fcc0857c24720cd07403940af3ac7124f17
parent4ff13d3290b053cd1aadff0690710b0c54b3d13b (diff)
downloadopencode-e1f80c006761fd0d0f5eda36ce727970a3d4b272.tar.gz
opencode-e1f80c006761fd0d0f5eda36ce727970a3d4b272.zip
Merge default agent permissions with global config (#1879)
-rw-r--r--packages/opencode/src/agent/agent.ts59
1 files changed, 36 insertions, 23 deletions
diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts
index aa9eeec8e..7f0831c08 100644
--- a/packages/opencode/src/agent/agent.ts
+++ b/packages/opencode/src/agent/agent.ts
@@ -44,6 +44,8 @@ export namespace Agent {
},
webfetch: "allow",
}
+ const agentPermission = mergeAgentPermissions(defaultPermission, cfg.permission ?? {})
+
const result: Record<string, Info> = {
general: {
name: "general",
@@ -54,20 +56,20 @@ export namespace Agent {
todowrite: false,
},
options: {},
- permission: defaultPermission,
+ permission: agentPermission,
mode: "subagent",
},
build: {
name: "build",
tools: {},
options: {},
- permission: defaultPermission,
+ permission: agentPermission,
mode: "primary",
},
plan: {
name: "plan",
options: {},
- permission: defaultPermission,
+ permission: agentPermission,
tools: {
write: false,
edit: false,
@@ -86,7 +88,7 @@ export namespace Agent {
item = result[key] = {
name: key,
mode: "all",
- permission: defaultPermission,
+ permission: agentPermission,
options: {},
tools: {},
}
@@ -108,25 +110,7 @@ export namespace Agent {
if (mode) item.mode = mode
if (permission ?? cfg.permission) {
- const merged = mergeDeep(cfg.permission ?? {}, permission ?? {})
- if (merged.edit) item.permission.edit = merged.edit
- if (merged.webfetch) item.permission.webfetch = merged.webfetch
- if (merged.bash) {
- if (typeof merged.bash === "string") {
- item.permission.bash = {
- "*": merged.bash,
- }
- }
- // if granular permissions are provided, default to "ask"
- if (typeof merged.bash === "object") {
- item.permission.bash = mergeDeep(
- {
- "*": "ask",
- },
- merged.bash,
- )
- }
- }
+ item.permission = mergeAgentPermissions(cfg.permission ?? {}, permission ?? {})
}
}
return result
@@ -170,3 +154,32 @@ export namespace Agent {
return result.object
}
}
+
+function mergeAgentPermissions(basePermission: any, overridePermission: any): Agent.Info["permission"] {
+ const merged = mergeDeep(basePermission ?? {}, overridePermission ?? {}) as any
+ let mergedBash
+ if (merged.bash) {
+ if (typeof merged.bash === "string") {
+ mergedBash = {
+ "*": merged.bash,
+ }
+ }
+ // if granular permissions are provided, default to "ask"
+ if (typeof merged.bash === "object") {
+ mergedBash = mergeDeep(
+ {
+ "*": "ask",
+ },
+ merged.bash,
+ )
+ }
+ }
+
+ const result: Agent.Info["permission"] = {
+ edit: merged.edit ?? "allow",
+ webfetch: merged.webfetch ?? "allow",
+ bash: mergedBash ?? { "*": "allow" },
+ }
+
+ return result
+}