Merge agent and mode into one (#1689)

The concept of mode has been deprecated, there is now only the agent field in the config.

An agent can be cycled through as your primary agent with <tab> or you can spawn a subagent by @ mentioning it. if you include a description of when to use it, the primary agent will try to automatically use it

Full docs here: https://opencode.ai/docs/agents/
This commit is contained in:
Dax
2025-08-07 16:32:12 -04:00
committed by GitHub
parent 12f1ad521f
commit c34aec060f
42 changed files with 1755 additions and 930 deletions

View File

@@ -10,13 +10,16 @@ export namespace Agent {
export const Info = z
.object({
name: z.string(),
description: z.string().optional(),
mode: z.union([z.literal("subagent"), z.literal("primary"), z.literal("all")]),
topP: z.number().optional(),
temperature: z.number().optional(),
model: z
.object({
modelID: z.string(),
providerID: z.string(),
})
.optional(),
description: z.string(),
prompt: z.string().optional(),
tools: z.record(z.boolean()),
})
@@ -24,6 +27,7 @@ export namespace Agent {
ref: "Agent",
})
export type Info = z.infer<typeof Info>
const state = App.state("agent", async () => {
const cfg = await Config.get()
const result: Record<string, Info> = {
@@ -35,6 +39,21 @@ export namespace Agent {
todoread: false,
todowrite: false,
},
mode: "subagent",
},
build: {
name: "build",
tools: {},
mode: "primary",
},
plan: {
name: "plan",
tools: {
write: false,
edit: false,
patch: false,
},
mode: "primary",
},
}
for (const [key, value] of Object.entries(cfg.agent ?? {})) {
@@ -46,14 +65,10 @@ export namespace Agent {
if (!item)
item = result[key] = {
name: key,
description: "",
tools: {
todowrite: false,
todoread: false,
},
mode: "all",
tools: {},
}
const model = value.model ?? cfg.model
if (model) item.model = Provider.parseModel(model)
if (value.model) item.model = Provider.parseModel(value.model)
if (value.prompt) item.prompt = value.prompt
if (value.tools)
item.tools = {
@@ -61,6 +76,9 @@ export namespace Agent {
...value.tools,
}
if (value.description) item.description = value.description
if (value.temperature != undefined) item.temperature = value.temperature
if (value.top_p != undefined) item.topP = value.top_p
if (value.mode) item.mode = value.mode
}
return result
})