diff --git a/src/features/builtin-commands/commands.ts b/src/features/builtin-commands/commands.ts index f489c198b..d4e10903b 100644 --- a/src/features/builtin-commands/commands.ts +++ b/src/features/builtin-commands/commands.ts @@ -55,7 +55,7 @@ ${REFACTOR_TEMPLATE} }, "start-work": { description: "(builtin) Start Sisyphus work session from Prometheus plan", - agent: "orchestrator-sisyphus", + agent: "atlas", template: ` ${START_WORK_TEMPLATE} diff --git a/src/hooks/atlas/index.ts b/src/hooks/atlas/index.ts index 859b462e2..e36175d84 100644 --- a/src/hooks/atlas/index.ts +++ b/src/hooks/atlas/index.ts @@ -569,7 +569,7 @@ export function createSisyphusOrchestratorHook( } if (!isCallerOrchestrator(sessionID)) { - log(`[${HOOK_NAME}] Skipped: last agent is not orchestrator-sisyphus`, { sessionID }) + log(`[${HOOK_NAME}] Skipped: last agent is not atlas`, { sessionID }) return } diff --git a/src/hooks/start-work/index.test.ts b/src/hooks/start-work/index.test.ts index 7731649a0..c13b5193f 100644 --- a/src/hooks/start-work/index.test.ts +++ b/src/hooks/start-work/index.test.ts @@ -379,7 +379,7 @@ describe("start-work hook", () => { }) describe("session agent management", () => { - test("should update session agent to orchestrator-sisyphus when start-work command is triggered", async () => { + test("should update session agent to atlas when start-work command is triggered", async () => { // #given const updateSpy = spyOn(sessionState, "updateSessionAgent") @@ -395,7 +395,7 @@ describe("start-work hook", () => { ) // #then - expect(updateSpy).toHaveBeenCalledWith("ses-prometheus-to-sisyphus", "orchestrator-sisyphus") + expect(updateSpy).toHaveBeenCalledWith("ses-prometheus-to-sisyphus", "atlas") updateSpy.mockRestore() }) }) diff --git a/src/hooks/start-work/index.ts b/src/hooks/start-work/index.ts index 704435a5e..4f3d528b2 100644 --- a/src/hooks/start-work/index.ts +++ b/src/hooks/start-work/index.ts @@ -71,7 +71,7 @@ export function createStartWorkHook(ctx: PluginInput) { sessionID: input.sessionID, }) - updateSessionAgent(input.sessionID, "orchestrator-sisyphus") + updateSessionAgent(input.sessionID, "atlas") const existingState = readBoulderState(ctx.directory) const sessionId = input.sessionID diff --git a/src/plugin-handlers/config-handler.ts b/src/plugin-handlers/config-handler.ts index b8c4388ed..948df8c39 100644 --- a/src/plugin-handlers/config-handler.ts +++ b/src/plugin-handlers/config-handler.ts @@ -160,7 +160,7 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { explore?: { tools?: Record }; librarian?: { tools?: Record }; "multimodal-looker"?: { tools?: Record }; - "orchestrator-sisyphus"?: { tools?: Record }; + atlas?: { tools?: Record }; Sisyphus?: { tools?: Record }; }; const configAgent = config.agent as AgentConfig | undefined; @@ -319,8 +319,8 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { const agent = agentResult["multimodal-looker"] as AgentWithPermission; agent.permission = { ...agent.permission, task: "deny", look_at: "deny" }; } - if (agentResult["orchestrator-sisyphus"]) { - const agent = agentResult["orchestrator-sisyphus"] as AgentWithPermission; + if (agentResult["atlas"]) { + const agent = agentResult["atlas"] as AgentWithPermission; agent.permission = { ...agent.permission, task: "deny", call_omo_agent: "deny", delegate_task: "allow" }; } if (agentResult.Sisyphus) { diff --git a/src/tools/delegate-task/tools.test.ts b/src/tools/delegate-task/tools.test.ts index 301ff3a59..25d1d0e88 100644 --- a/src/tools/delegate-task/tools.test.ts +++ b/src/tools/delegate-task/tools.test.ts @@ -894,17 +894,29 @@ describe("sisyphus-task", () => { }) describe("modelInfo detection via resolveCategoryConfig", () => { - test("systemDefaultModel is used when no userModel and no inheritedModel", () => { - // #given - builtin category, no user model, no inherited model + test("catalog model is used for category with catalog entry", () => { + // #given - ultrabrain has catalog entry const categoryName = "ultrabrain" // #when const resolved = resolveCategoryConfig(categoryName, { systemDefaultModel: SYSTEM_DEFAULT_MODEL }) - // #then - actualModel should be systemDefaultModel (categories no longer have model defaults) + // #then - catalog model is used expect(resolved).not.toBeNull() - const actualModel = resolved!.config.model - expect(actualModel).toBe(SYSTEM_DEFAULT_MODEL) + expect(resolved!.config.model).toBe("openai/gpt-5.2-codex") + expect(resolved!.config.variant).toBe("xhigh") + }) + + test("systemDefaultModel is used for category without catalog entry", () => { + // #given - general has no catalog entry + const categoryName = "general" + + // #when + const resolved = resolveCategoryConfig(categoryName, { systemDefaultModel: SYSTEM_DEFAULT_MODEL }) + + // #then - systemDefaultModel is used + expect(resolved).not.toBeNull() + expect(resolved!.config.model).toBe(SYSTEM_DEFAULT_MODEL) }) test("inheritedModel takes precedence over systemDefaultModel for builtin category", () => { diff --git a/src/tools/delegate-task/tools.ts b/src/tools/delegate-task/tools.ts index 28b40b6d1..5f5b075c1 100644 --- a/src/tools/delegate-task/tools.ts +++ b/src/tools/delegate-task/tools.ts @@ -118,22 +118,24 @@ export function resolveCategoryConfig( const { userCategories, inheritedModel, systemDefaultModel } = options const defaultConfig = DEFAULT_CATEGORIES[categoryName] const userConfig = userCategories?.[categoryName] + const catalogEntry = CATEGORY_MODEL_CATALOG[categoryName] const defaultPromptAppend = CATEGORY_PROMPT_APPENDS[categoryName] ?? "" if (!defaultConfig && !userConfig) { return null } - // Model priority: user override > inherited from parent > system default + // Model priority: user override > inherited from parent > catalog default > system default const model = resolveModel({ userModel: userConfig?.model, inheritedModel, - systemDefault: systemDefaultModel, + systemDefault: catalogEntry?.model ?? systemDefaultModel, }) const config: CategoryConfig = { ...defaultConfig, ...userConfig, model, + variant: userConfig?.variant ?? catalogEntry?.variant, } let promptAppend = defaultPromptAppend