summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSpoon <[email protected]>2025-12-03 18:19:43 +0100
committerGitHub <[email protected]>2025-12-03 11:19:43 -0600
commit0bccd1d5788d607f761cabf4d2d1a58980c60fe4 (patch)
tree454ec8724c7de18c12ec1cbccc9dbb42fe7d5a3e
parent91db82c138cc7ab1e046d078e44e6336669da3a6 (diff)
downloadopencode-0bccd1d5788d607f761cabf4d2d1a58980c60fe4.tar.gz
opencode-0bccd1d5788d607f761cabf4d2d1a58980c60fe4.zip
feat: experimental.primary_tools, allow user to set the tools that should only be available to primary agents (#4913)
Co-authored-by: GitHub Action <[email protected]>
-rw-r--r--packages/opencode/src/config/config.ts4
-rw-r--r--packages/opencode/src/tool/task.ts4
-rw-r--r--packages/sdk/js/src/gen/types.gen.ts4
3 files changed, 12 insertions, 0 deletions
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 3ed487653..9cae9370d 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -668,6 +668,10 @@ export namespace Config {
chatMaxRetries: z.number().optional().describe("Number of retries for chat completions on failure"),
disable_paste_summary: z.boolean().optional(),
batch_tool: z.boolean().optional().describe("Enable the batch tool"),
+ primary_tools: z
+ .array(z.string())
+ .optional()
+ .describe("Tools that should only be available to primary agents."),
})
.optional(),
})
diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts
index 3bb7fb2bf..35b963124 100644
--- a/packages/opencode/src/tool/task.ts
+++ b/packages/opencode/src/tool/task.ts
@@ -9,6 +9,7 @@ import { Agent } from "../agent/agent"
import { SessionPrompt } from "../session/prompt"
import { iife } from "@/util/iife"
import { defer } from "@/util/defer"
+import { Config } from "../config/config"
export const TaskTool = Tool.define("task", async () => {
const agents = await Agent.list().then((x) => x.filter((a) => a.mode !== "primary"))
@@ -77,6 +78,8 @@ export const TaskTool = Tool.define("task", async () => {
ctx.abort.addEventListener("abort", cancel)
using _ = defer(() => ctx.abort.removeEventListener("abort", cancel))
const promptParts = await SessionPrompt.resolvePromptParts(params.prompt)
+
+ const config = await Config.get()
const result = await SessionPrompt.prompt({
messageID,
sessionID: session.id,
@@ -89,6 +92,7 @@ export const TaskTool = Tool.define("task", async () => {
todowrite: false,
todoread: false,
task: false,
+ ...Object.fromEntries((config.experimental?.primary_tools ?? []).map((t) => [t, false])),
...agent.tools,
},
parts: promptParts,
diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts
index f8e1d34fb..d26c6ec2c 100644
--- a/packages/sdk/js/src/gen/types.gen.ts
+++ b/packages/sdk/js/src/gen/types.gen.ts
@@ -1249,6 +1249,10 @@ export type Config = {
* Enable the batch tool
*/
batch_tool?: boolean
+ /**
+ * Tools that should only be available to primary agents.
+ */
+ primary_tools?: Array<string>
}
}