diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts index ff71b0453..77aea216b 100644 --- a/packages/opencode/src/acp/agent.ts +++ b/packages/opencode/src/acp/agent.ts @@ -475,7 +475,8 @@ export namespace ACP { description: agent.description, })) - const currentModeId = availableModes.find((m) => m.name === "build")?.id ?? availableModes[0].id + const defaultAgentName = await Agent.getDefault() + const currentModeId = availableModes.find((m) => m.name === defaultAgentName)?.id ?? availableModes[0].id const mcpServers: Record = {} for (const server of params.mcpServers) { @@ -577,7 +578,7 @@ export namespace ACP { if (!current) { this.sessionManager.setModel(session.id, model) } - const agent = session.modeId ?? "build" + const agent = session.modeId ?? (await Agent.getDefault()) const parts: Array< { type: "text"; text: string } | { type: "file"; url: string; filename: string; mime: string } diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 740f67b7e..d387d0954 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -183,6 +183,22 @@ export namespace Agent { return state().then((x) => x[agent]) } + export async function getDefault() { + const cfg = await Config.get() + const defaultAgent = cfg.default_agent + + if (defaultAgent) { + const agents = await state() + if (agents[defaultAgent]) { + return defaultAgent + } + } + + // Fallback to build agent if it exists + const agents = await state() + return agents.build ? "build" : Object.keys(agents)[0] + } + export async function list() { return state().then((x) => Object.values(x)) } diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts index b646f0b15..b5e94f6ef 100644 --- a/packages/opencode/src/cli/cmd/run.ts +++ b/packages/opencode/src/cli/cmd/run.ts @@ -224,7 +224,7 @@ export const RunCommand = cmd({ await sdk.session.command({ path: { id: sessionID }, body: { - agent: args.agent || "build", + agent: args.agent || (await Agent.getDefault()), model: args.model, command: args.command, arguments: message, @@ -235,7 +235,7 @@ export const RunCommand = cmd({ await sdk.session.prompt({ path: { id: sessionID }, body: { - agent: args.agent || "build", + agent: args.agent || (await Agent.getDefault()), model: modelParam, parts: [...fileParts, { type: "text", text: message }], }, diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index d9c453038..5b6db1ee3 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -497,6 +497,7 @@ export namespace Config { .catchall(Agent) .optional() .describe("@deprecated Use `agent` field instead."), + default_agent: z.string().optional().describe("Default agent to use when no agent is specified"), agent: z .object({ plan: Agent.optional(), diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index 0bb949ba9..9b1745e92 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -164,7 +164,7 @@ export namespace SessionCompaction { time: { created: Date.now(), }, - agent: "build", + agent: await Agent.getDefault(), model: input.model, }) await Session.updatePart({ @@ -197,7 +197,7 @@ export namespace SessionCompaction { role: "user", model: input.model, sessionID: input.sessionID, - agent: "build", + agent: await Agent.getDefault(), time: { created: Date.now(), }, diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 6b77feb37..e7443853b 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -782,7 +782,8 @@ export namespace SessionPrompt { } async function createUserMessage(input: PromptInput) { - const agent = await Agent.get(input.agent ?? "build") + const agentName = input.agent ?? (await Agent.getDefault()) + const agent = await Agent.get(agentName) const info: MessageV2.Info = { id: input.messageID ?? Identifier.ascending("message"), role: "user", @@ -1289,7 +1290,7 @@ export namespace SessionPrompt { export async function command(input: CommandInput) { log.info("command", input) const command = await Command.get(input.command) - const agentName = command.agent ?? input.agent ?? "build" + const agentName = command.agent ?? input.agent ?? (await Agent.getDefault()) const raw = input.arguments.match(argsRegex) ?? [] const args = raw.map((arg) => arg.replace(quoteTrimRegex, "")) @@ -1428,7 +1429,7 @@ export namespace SessionPrompt { time: { created: Date.now(), }, - agent: input.message.info.role === "user" ? input.message.info.agent : "build", + agent: input.message.info.role === "user" ? input.message.info.agent : await Agent.getDefault(), model: { providerID: input.providerID, modelID: input.modelID,