-
Notifications
You must be signed in to change notification settings - Fork 1.1k
fix(config): allow Sisyphus-Junior agent customization via oh-my-opencode.json #648
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(config): allow Sisyphus-Junior agent customization via oh-my-opencode.json #648
Conversation
…code.json Allow users to configure Sisyphus-Junior agent via agents["Sisyphus-Junior"] in oh-my-opencode.json, removing hardcoded defaults while preserving safety constraints. Closes code-yeongyu#623 Changes: - Add "Sisyphus-Junior" to AgentOverridesSchema and OverridableAgentNameSchema - Create createSisyphusJuniorAgentWithOverrides() helper with guardrails - Update config-handler to use override helper instead of hardcoded values - Fix README category wording (runtime presets, not separate agents) Honored override fields: - model, temperature, top_p, tools, permission, description, color, prompt_append Safety guardrails enforced post-merge: - mode forced to "subagent" (cannot change) - prompt is append-only (base discipline text preserved) - blocked tools (task, sisyphus_task, call_omo_agent) always denied - disable: true ignores override block, uses defaults Category interaction: - sisyphus_task(category=...) runs use the base Sisyphus-Junior agent config - Category model/temperature overrides take precedence at request time - To change model for a category, set categories.<cat>.model (not agent override) - Categories are runtime presets applied to Sisyphus-Junior, not separate agents Tests: 15 new tests in sisyphus-junior.test.ts, 3 new schema tests Co-Authored-By: Sisyphus <[email protected]>
|
All contributors have signed the CLA. Thank you! ✅ |
|
Came here to make this change and found you already did it. Thanks @imarshallwidjaja. Make sure to sign the contributor license. |
|
I have read the CLA Document and I hereby sign the CLA |
|
For fun I did a check to see if all agents are now configurable. After PR #648 merges, here's the complete picture:
Minor Note: BuiltinAgentNameSchema (for disabled_agents)
But these are controlled by other mechanisms:
So there's no gap - users can configure and disable all agents through the appropriate config options. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1 issue found across 8 files
Confidence score: 4/5
- Missing
baseEndIndexvalidation insrc/agents/sisyphus-junior.test.tsmeans a prompt change could let the ordering test pass even when the reference text isn’t found, so regressions might slip through. - Risk is limited to test coverage—runtime behavior remains unaffected—but it’s worth tightening before relying on the test for future prompt edits.
- Pay close attention to
src/agents/sisyphus-junior.test.ts- ensureindexOffailures are explicitly handled.
Prompt for AI agents (all issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="src/agents/sisyphus-junior.test.ts">
<violation number="1" location="src/agents/sisyphus-junior.test.ts:224">
P2: Missing validation that `baseEndIndex` is not -1. If "Dense > verbose." text changes in the base prompt, `indexOf` returns -1 and the ordering assertion becomes meaningless (any position > -1 passes).</violation>
</file>
Since this is your first cubic review, here's how it works:
- cubic automatically reviews your code and comments on bugs and improvements
- Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
- Ask questions if you need clarification on any suggestion
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
|
I ran some manual tests asking for orchestrator to task all subagents and all categories and all categories still work as intended and can still be configured all individually or in tandem with junior being configured. (Junior tasked without a category also works with config now) I'm afk rn will check the recommendation from the review bot when I'm back. 👍 |
Add validation that baseEndIndex is not -1 before using it for ordering assertion. Previously, if "Dense > verbose." text changed in the base prompt, indexOf would return -1 and any positive appendIndex would pass. Co-Authored-By: Sisyphus <[email protected]>
…ing and sync mode ## Summary This commit represents the culmination of extensive debugging and refinement of the background agent and sisyphus_task systems, building upon changes from PRs code-yeongyu#592, code-yeongyu#610, code-yeongyu#628, code-yeongyu#638, code-yeongyu#648, code-yeongyu#649, code-yeongyu#652, and code-yeongyu#653. ## Investigation Journey ### Initial Problem Background tasks were getting stuck indefinitely. User config model overrides were being ignored for certain agent types. ### Root Cause Analysis 1. Discovered validateSessionHasOutput and checkSessionTodos guards were blocking completion even when tasks had finished 2. Found that sync mode (run_in_background=false) was NOT passing categoryModel to session.prompt(), while async mode was 3. Traced config loading path and found JSONC files weren't being detected 4. Analyzed kdcokenny/opencode-background-agents for reference implementation ### Trial and Error Log **Attempt 1: Add model to resume() in manager.ts** - Hypothesis: Resume needs to pass stored model - Result: REVERTED - PR code-yeongyu#638 intentionally removed this; agent config handles it **Attempt 2: Add userAgents lookup for subagent_type** - Hypothesis: Need to look up agent model from user config - Result: REVERTED - Agent model already applied at creation in config-handler.ts **Attempt 3: Add categoryModel to sync mode prompt** - Hypothesis: Sync mode missing model that async mode passes - Result: SUCCESS - This was the actual bug **Attempt 4: Add debug logging throughout pipeline** - Purpose: Trace model flow through config -> agent -> prompt - Files: 6 files with appendFileSync to omo-debug.log - Result: Confirmed fixes working, then REMOVED all debug logging **Attempt 5: Investigate clickable sessions** - Hypothesis: parentID should make child sessions clickable in UI - Result: parentID IS passed correctly, but sessions don't appear clickable - Analysis: kdcokenny uses same approach; may be OpenCode core limitation - Status: UNRESOLVED - Needs further investigation or OpenCode core change ## Background Agent Completion Detection (PR code-yeongyu#638) Simplified the completion detection logic that was causing tasks to get stuck: - Removed overly complex validateSessionHasOutput and checkSessionTodos guards - Tasks now complete after MIN_IDLE_TIME_MS (5s) elapsed on session.idle event - Added 15-minute global timeout (MAX_RUN_TIME_MS) to prevent runaway tasks - Pattern follows kdcokenny/opencode-background-agents reference implementation ## Model Override Architecture (PRs code-yeongyu#610, code-yeongyu#628, code-yeongyu#638) Established clear separation between category-based and agent-based model handling: | Path | Model Source | |-------------------|-------------------------------------------| | category=X | Explicit from category config (passed) | | subagent_type=X | Agent's configured model (at creation) | | resume | Agent's configured model (not passed) | Key insight from PR code-yeongyu#638: Don't pass model in prompt body for resume/subagent - let OpenCode use the agent's configured model set at creation time in config-handler.ts. ## Sync Mode Category Model Fix (NEW) Fixed critical bug where sync mode (run_in_background=false) with categories was NOT passing the categoryModel to session.prompt(): // BEFORE: Model not passed in sync mode body: { agent: agentToUse, system: systemContent, ... } // AFTER: Model passed when available body: { agent: agentToUse, ...(categoryModel ? { model: categoryModel } : {}), ... } This ensures category model overrides work consistently in both sync and async modes. ## JSONC Config File Support Extended config file detection to support both .json and .jsonc extensions: - getUserConfigDir() now checks for oh-my-opencode.jsonc first - Both cross-platform (~/.config) and Windows (%APPDATA%) paths support JSONC - Enables comments in config files for better documentation ## Test Improvements - Increased sync resume test timeout from 5s to 10s - Test was flaky because timeout = MIN_STABILITY_TIME_MS (race condition) - Added clarifying comments about timing requirements ## Code Cleanup - Removed unused 'os' imports from plugin-config.ts and config-handler.ts - Removed ALL debug logging (hardcoded paths, appendFileSync calls) - Added PR code-yeongyu#638 reference comments for future maintainers ## Verified Test Results (8/8 category + subagent tests pass) | Test | Type | Mode | Result | |-------------------|-------------|-------|--------| | quick | category | async | ✅ | | ultrabrain | category | async | ✅ | | most-capable | category | async | ✅ | | quick | category | sync | ✅ | | librarian | subagent | async | ✅ | | Metis | subagent | async | ✅ | | oracle | subagent | sync | ✅ | | quick + git-master| category | async | ✅ | ## Known Issues & Future Work ### 1. Explore Agent Hangs on Non-Exploration Tasks The explore agent hung when given a simple math query (5+5). This is NOT a regression - explore is a specialized codebase search agent (contextual grep) designed for queries like 'Where is X implemented?' not general Q&A. When given non-exploration tasks, it attempts to search for non-existent patterns and may hang indefinitely due to no max_steps limit. **Recommendation**: Add max_steps: 10 to explore agent config in future PR. ### 2. Clickable Child Sessions Not Working Sessions created via sisyphus_task pass parentID correctly, but don't appear as clickable child sessions in OpenCode's sidebar UI. Investigation showed: - parentID IS being passed to session.create() - kdcokenny/opencode-background-agents uses identical approach - Sessions exist and complete, just not rendered as clickable in UI **Recommendation**: May require OpenCode core change or UI setting discovery. ### 3. Prometheus Agent Correctly Blocked Prometheus (Planner) is a primary agent and correctly rejected when called via sisyphus_task with subagent_type. This is expected behavior - primary agents should only be invoked directly, not via task delegation. ## Files Changed - src/features/background-agent/manager.ts - PR code-yeongyu#638 reference comment - src/tools/sisyphus-task/tools.ts - Sync mode categoryModel fix - src/tools/sisyphus-task/tools.test.ts - Test timeout increase - src/shared/config-path.ts - JSONC extension support - src/plugin-config.ts - Cleanup unused import - src/plugin-handlers/config-handler.ts - Cleanup unused import
jkoelker
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
…code.json (#648) * fix(config): allow Sisyphus-Junior agent customization via oh-my-opencode.json Allow users to configure Sisyphus-Junior agent via agents["Sisyphus-Junior"] in oh-my-opencode.json, removing hardcoded defaults while preserving safety constraints. Closes #623 Changes: - Add "Sisyphus-Junior" to AgentOverridesSchema and OverridableAgentNameSchema - Create createSisyphusJuniorAgentWithOverrides() helper with guardrails - Update config-handler to use override helper instead of hardcoded values - Fix README category wording (runtime presets, not separate agents) Honored override fields: - model, temperature, top_p, tools, permission, description, color, prompt_append Safety guardrails enforced post-merge: - mode forced to "subagent" (cannot change) - prompt is append-only (base discipline text preserved) - blocked tools (task, sisyphus_task, call_omo_agent) always denied - disable: true ignores override block, uses defaults Category interaction: - sisyphus_task(category=...) runs use the base Sisyphus-Junior agent config - Category model/temperature overrides take precedence at request time - To change model for a category, set categories.<cat>.model (not agent override) - Categories are runtime presets applied to Sisyphus-Junior, not separate agents Tests: 15 new tests in sisyphus-junior.test.ts, 3 new schema tests Co-Authored-By: Sisyphus <[email protected]> * test(sisyphus-junior): add guard assertion for prompt anchor text Add validation that baseEndIndex is not -1 before using it for ordering assertion. Previously, if "Dense > verbose." text changed in the base prompt, indexOf would return -1 and any positive appendIndex would pass. Co-Authored-By: Sisyphus <[email protected]> --------- Co-authored-by: Sisyphus <[email protected]>

Allow users to configure Sisyphus-Junior agent via agents["Sisyphus-Junior"] in oh-my-opencode.json, removing hardcoded defaults while preserving safety constraints.
Closes #623
Summary
agents["Sisyphus-Junior"]configuration in oh-my-opencode.jsonChanges
"Sisyphus-Junior"toAgentOverridesSchemaandOverridableAgentNameSchemain schema.tscreateSisyphusJuniorAgentWithOverrides()helper with safety guardrailsSISYPHUS_JUNIOR_DEFAULTSfor consistent default valuessupportsNewPermissionSystemfrom permission-compat.tsSisyphus-Junior-{category}agents)Honored override fields:
model,temperature,top_p,tools,permission,description,color,prompt_appendSafety guardrails enforced post-merge:
modeforced to"subagent"(cannot change)promptis append-only (base discipline text preserved)task,sisyphus_task,call_omo_agent) always denieddisable: trueignores override block, uses defaultsCategory interaction:
sisyphus_task(category=...)runs use the base Sisyphus-Junior agent configcategories.<cat>.model(not agent override)Testing
bun run typecheck bun test bun run buildRelated Issues
Closes #623
Summary by cubic
Enable Sisyphus-Junior customization via agents["Sisyphus-Junior"] in oh-my-opencode.json, removing hardcoded defaults while keeping strict safety rules. Closes #623.
Written for commit 9029c14. Summary will update on new commits.