diff --git a/src/agents/sisyphus-junior.ts b/src/agents/sisyphus-junior.ts new file mode 100644 index 00000000..13568225 --- /dev/null +++ b/src/agents/sisyphus-junior.ts @@ -0,0 +1,131 @@ +import type { AgentConfig } from "@opencode-ai/sdk" +import { isGptModel } from "./types" +import type { CategoryConfig } from "../config/schema" +import { + createAgentToolRestrictions, + migrateAgentConfig, +} from "../shared/permission-compat" + +const SISYPHUS_JUNIOR_PROMPT = ` +Sisyphus-Junior - Focused executor from OhMyOpenCode. +Execute tasks directly. NEVER delegate or spawn other agents. + + + +BLOCKED ACTIONS (will fail if attempted): +- task tool: BLOCKED +- sisyphus_task tool: BLOCKED +- sisyphus_task tool: BLOCKED (already blocked above, but explicit) +- call_omo_agent tool: BLOCKED + +You work ALONE. No delegation. No background tasks. Execute directly. + + + +## Notepad Location (for recording learnings) +NOTEPAD PATH: .sisyphus/notepads/{plan-name}/ +- learnings.md: Record patterns, conventions, successful approaches +- issues.md: Record problems, blockers, gotchas encountered +- decisions.md: Record architectural choices and rationales +- problems.md: Record unresolved issues, technical debt + +You SHOULD append findings to notepad files after completing work. + +## Plan Location (READ ONLY) +PLAN PATH: .sisyphus/plans/{plan-name}.md + +⚠️⚠️⚠️ CRITICAL RULE: NEVER MODIFY THE PLAN FILE ⚠️⚠️⚠️ + +The plan file (.sisyphus/plans/*.md) is SACRED and READ-ONLY. +- You may READ the plan to understand tasks +- You may READ checkbox items to know what to do +- You MUST NOT edit, modify, or update the plan file +- You MUST NOT mark checkboxes as complete in the plan +- Only the Orchestrator manages the plan file + +VIOLATION = IMMEDIATE FAILURE. The Orchestrator tracks plan state. + + + +TODO OBSESSION (NON-NEGOTIABLE): +- 2+ steps → todowrite FIRST, atomic breakdown +- Mark in_progress before starting (ONE at a time) +- Mark completed IMMEDIATELY after each step +- NEVER batch completions + +No todos on multi-step work = INCOMPLETE WORK. + + + +Task NOT complete without: +- lsp_diagnostics clean on changed files +- Build passes (if applicable) +- All todos marked completed + + +` + +function buildSisyphusJuniorPrompt(promptAppend?: string): string { + if (!promptAppend) return SISYPHUS_JUNIOR_PROMPT + return SISYPHUS_JUNIOR_PROMPT + "\n\n" + promptAppend +} + +// Core tools that Sisyphus-Junior must NEVER have access to +const BLOCKED_TOOLS = ["task", "sisyphus_task", "call_omo_agent"] + +export function createSisyphusJuniorAgent( + categoryConfig: CategoryConfig, + promptAppend?: string +): AgentConfig { + const prompt = buildSisyphusJuniorPrompt(promptAppend) + const model = categoryConfig.model + + const baseRestrictions = createAgentToolRestrictions(BLOCKED_TOOLS) + const mergedConfig = migrateAgentConfig({ + ...baseRestrictions, + ...(categoryConfig.tools ? { tools: categoryConfig.tools } : {}), + }) + + const base: AgentConfig = { + description: + "Sisyphus-Junior - Focused task executor. Same discipline, no delegation.", + mode: "subagent" as const, + model, + maxTokens: categoryConfig.maxTokens ?? 64000, + prompt, + color: "#20B2AA", + ...mergedConfig, + } + + if (categoryConfig.temperature !== undefined) { + base.temperature = categoryConfig.temperature + } + if (categoryConfig.top_p !== undefined) { + base.top_p = categoryConfig.top_p + } + + if (categoryConfig.thinking) { + return { ...base, thinking: categoryConfig.thinking } as AgentConfig + } + + if (categoryConfig.reasoningEffort) { + return { + ...base, + reasoningEffort: categoryConfig.reasoningEffort, + textVerbosity: categoryConfig.textVerbosity, + } as AgentConfig + } + + if (isGptModel(model)) { + return { ...base, reasoningEffort: "medium" } as AgentConfig + } + + return { + ...base, + thinking: { type: "enabled", budgetTokens: 32000 }, + } as AgentConfig +}