Commit Graph

667 Commits

Author SHA1 Message Date
YeonGyu-Kim c39424a76c feat(lsp): add kotlin-ls LSP server support (#782)
Add Kotlin LSP server (kotlin-ls) to the built-in servers catalog,
syncing with OpenCode's server.ts. Includes:
- BUILTIN_SERVERS entry with kotlin-lsp command
- LSP_INSTALL_HINTS entry pointing to GitHub repo
- Extensions: .kt, .kts (already in EXT_TO_LANG)

Co-authored-by: justsisyphus <sisyphus-dev-ai@users.noreply.github.com>
2026-01-14 22:59:18 +09:00
justsisyphus dbcc90a005 feat(installer): add GitHub Copilot fallback for visual/frontend agents
- frontend-ui-ux-engineer, document-writer, multimodal-looker, explore
  now use Copilot models when no native providers available
- Category overrides (visual-engineering, artistry, writing) also use
  Copilot models as fallback
- Priority: native providers (Gemini/Claude) > Copilot > free models
- Login guide moved to bottom with GitHub Copilot auth option added

🤖 Generated with [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) assistance
2026-01-14 19:11:28 +09:00
justsisyphus d86917de04 fix: use dynamic message lookup for model/agent context in prompts
Instead of using stale parentModel/parentAgent from task state, now
dynamically looks up the current message to get fresh model/agent values.
Applied across all prompt injection points:
- background-agent notifyParentSession
- ralph-loop continuation
- sisyphus-orchestrator boulder continuation
- sisyphus-task resume

🤖 Generated with [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) assistance
2026-01-14 18:55:46 +09:00
justsisyphus 85a6f3568b fix(background-agent): omit model field to use session's lastModel
Previously, background task completion notifications passed parentModel when defined, causing OpenCode to use default Sonnet model when parentModel was undefined. Now model field is always omitted, letting OpenCode use the session's existing lastModel (like todo-continuation hook).

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-14 18:02:20 +09:00
justsisyphus 72fa8f2c65 refactor(lsp): consolidate LSP tools - remove lsp_hover, lsp_code_actions, lsp_code_action_resolve - merge lsp_document_symbols + lsp_workspace_symbols into lsp_symbols with scope parameter - update all references in hooks, templates, and documentation 2026-01-14 17:30:04 +09:00
justsisyphus 126274fa2c refactor(cli): remove OpenAI codex auth plugin setup
OpenCode now natively supports OpenAI authentication, so we no longer
need to:
- Add opencode-openai-codex-auth plugin
- Configure CODEX_PROVIDER_CONFIG provider settings

The --chatgpt flag still controls Oracle agent model selection
(GPT-5.2 vs fallback).
2026-01-14 16:20:02 +09:00
justsisyphus abd86dba73 style(agents): add green color to Orchestrator Sisyphus 2026-01-14 16:20:02 +09:00
justsisyphus 3cb7592a8f fix(agents): block call_omo_agent from Prometheus planner (#772)
Prometheus (Planner) agent should not have access to call_omo_agent tool
to prevent direct agent spawning. Uses the same pattern as orchestrator-sisyphus.

Co-authored-by: justsisyphus <justsisyphus@users.noreply.github.com>
2026-01-14 14:27:40 +09:00
justsisyphus baba0db924 fix(config): remove hidden flag from demoted plan agent
Plan agent should remain visible as subagent when Prometheus replaces it.
Previously hidden:true made it completely invisible in the UI.
2026-01-14 13:54:34 +09:00
justsisyphus 8e46b08aea fix(background-agent): preserve parent model in notifyParentSession
Fixes model switching bug where sisyphus_task with category would
change the main session's model after completion.

- Add parentModel to session.prompt body in notifyParentSession
- Add test verifying model is included when parentModel is defined
2026-01-14 13:50:12 +09:00
justsisyphus 1351f52bc3 fix(migration): remove auto model-to-category conversion (#764)
* chore(deps): upgrade @opencode-ai/plugin and sdk to 1.1.19

* docs(prometheus): add Question tool usage reminder

* fix(migration): remove auto model-to-category conversion

- Remove migrateAgentConfigToCategory call from migrateConfigFile
- User's explicit model/category settings are now preserved as-is
- No more unwanted deletion of agent configs (e.g., multimodal-looker)
- Add BUILTIN_AGENT_NAMES constant for future reference
- Update tests to reflect new behavior

* ci(sisyphus): add mandatory 'new branch + PR' todos for implementation tasks

---------

Co-authored-by: justsisyphus <justsisyphus@users.noreply.github.com>
2026-01-14 11:57:08 +09:00
sisyphus-dev-ai 68691e43c8 feat(config): implement Copilot fallback in model assignment logic
Update generateOmoConfig to use GitHub Copilot models as fallback when native providers are unavailable.

- Sisyphus: claude-opus-4-5 > github-copilot/claude-opus-4.5 > glm-4.7-free
- Oracle: gpt-5.2 > github-copilot/gpt-5.2 > claude-opus-4-5 > glm-4.7-free
- Add Copilot detection in detectCurrentConfig from agent models

Addresses #762

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-14 02:25:04 +00:00
sisyphus-dev-ai 2bf8af0a1e feat(installer): add GitHub Copilot support with priority-based fallback
Add GitHub Copilot as a fallback provider option in the installer. Native providers (Claude/ChatGPT/Gemini) have priority over Copilot.

- Add hasCopilot field to InstallConfig and DetectedConfig types
- Add --copilot flag support for both TUI and non-TUI modes
- Add Copilot prompt in interactive installer (after Gemini)
- Update model selection logic to use Copilot fallback when native providers unavailable
- Update configuration summary to display Copilot status

Addresses #762

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-14 02:24:52 +00:00
Kenny b3f2febf59 fix(sisyphus-task): guard client.session.get and update sync mode tests
- Add guard clause to check if client.session.get exists before calling
- Update 4 sync mode tests to properly mock session.get
- Fixes test failures from PR #731 directory inheritance feature
2026-01-13 13:41:41 -05:00
Kenny 7e5bb2e67a Merge pull request #731 from oussamadouhou/fix/background-task-directory-inheritance
fix(background-agent): inherit parent session directory for background tasks
2026-01-13 12:38:38 -05:00
Kenny 6ad1bae849 Merge pull request #750 from code-yeongyu/refactor/remove-builtin-google-auth 2026-01-13 12:04:09 -05:00
Kenny 094142d519 chore: delete Google Antigravity OAuth implementation (~8k lines) 2026-01-13 11:55:03 -05:00
sisyphus-dev-ai 7a82b6cffc fix(todo-continuation): implement hybrid abort detection
- Add event-based abort detection as primary method
- Keep API-based detection as fallback
- Track abort events via session.error with 3s time window
- Clear abort flag on user/assistant activity and tool execution
- Add comprehensive tests for hybrid approach (8 new test cases)
- All 663 tests pass

Fixes #577
2026-01-13 10:48:41 -05:00
Kenny 167ca65190 Merge pull request #749 from Momentum96/fix/categories-deep-merge
Fix categories not being deep merged in mergeConfigs
2026-01-13 09:56:17 -05:00
Kenny 03b56d3f3c Merge pull request #745 from LTS2/test/deep-merge-unit-tests
test(shared): add unit tests for deep-merge utility
2026-01-13 09:50:59 -05:00
GeonWoo Jeon 36828bcad5 Fix categories not being deep merged in mergeConfigs
When merging user and project configs, categories were simply
spread instead of deep merged. This caused user-level category
model settings to be completely overwritten by project-level
configs, even when the project config only specified partial
overrides like temperature.

Add deepMerge for categories field and comprehensive tests.
2026-01-13 23:06:48 +09:00
Kenny e214c1cfd0 refactor: remove built-in Google auth in favor of external plugin
- Delete src/auth/antigravity/ directory (28 files)
- Delete src/google-auth.ts standalone wrapper
- Delete src/cli/commands/auth.ts CLI command
- Remove google_auth config option from schema
- Update CLI to remove auth command registration
- Update config-manager to remove google_auth handling
- Update documentation to reference external opencode-antigravity-auth plugin only
- Regenerate JSON schema

Users should install the opencode-antigravity-auth plugin for Gemini authentication.

BREAKING CHANGE: The google_auth config option is removed. Use the external plugin instead.
2026-01-13 09:03:43 -05:00
ewjin a00f6edda4 test(shared): add unit tests for deep-merge utility
Add comprehensive unit tests for the deep-merge.ts utility functions:

- isPlainObject: 11 test cases covering null, undefined, primitives,
  Array, Date, RegExp, and plain objects
- deepMerge: 15 test cases covering:
  - Basic object merging
  - Deep nested object merging
  - Edge cases (undefined handling)
  - Array replacement behavior
  - Prototype pollution protection (DANGEROUS_KEYS)
  - MAX_DEPTH limit handling
2026-01-13 22:23:11 +09:00
YeonGyu-Kim cb582355ec feat(agents): enable call_omo_agent for Sisyphus-Junior subagents
Allow Sisyphus-Junior (category-based tasks) to spawn explore/librarian
agents via call_omo_agent for research capabilities.

Changes:
- Remove call_omo_agent from BLOCKED_TOOLS in sisyphus-junior.ts
- Update prompt to show ALLOWED status for call_omo_agent
- Remove global call_omo_agent blocking in config-handler.ts
- Keep blocking for orchestrator-sisyphus (use sisyphus_task instead)
- Keep runtime recursion prevention in index.ts for explore/librarian

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-13 21:00:00 +09:00
YeonGyu-Kim 3efbe5824c fix(agents): enable call_omo_agent for background agents while restricting recursive calls
- Enable call_omo_agent tool for skill execution in BackgroundManager
- Enable call_omo_agent tool for agent execution in BackgroundManager
- Enable call_omo_agent tool for sisyphus_task resume operations
- Enable call_omo_agent tool for sisyphus_task category-based delegation
- Restrict recursive task and sisyphus_task calls to prevent loops
- Allows background agents to delegate to other agents cleanly

🤖 Generated with OhMyOpenCode assistance
2026-01-13 21:00:00 +09:00
YeonGyu-Kim 04cff9bda0 Revert "fix(agents): use createAgentToolRestrictions for Sisyphus call_omo_agent deny"
This reverts commit 9011111eb0575fcdc630fd33043e5524640adfe0.
2026-01-13 21:00:00 +09:00
YeonGyu-Kim c984beab17 fix(agents): use createAgentToolRestrictions for Sisyphus call_omo_agent deny
Use version-aware permission system instead of hardcoded tools object.
This ensures call_omo_agent is properly denied on both old (tools) and
new (permission) OpenCode versions.
2026-01-13 21:00:00 +09:00
YeonGyu-Kim 10fe7c6a44 refactor(agents): move question permission from orchestrator to prometheus
Restrict question tool to primary agents only:
- Remove from orchestrator-sisyphus (subagent orchestration)
- Add to prometheus (planner needs to ask clarifying questions)
2026-01-13 21:00:00 +09:00
YeonGyu-Kim 8b2900e635 fix(background-agent): improve task completion detection and concurrency release
- manager.ts: Release concurrency key immediately on task completion, not after retention
- call-omo-agent: Add polling loop for sync agent completion detection
- sisyphus-task: Add abort handling, improve poll logging for debugging
2026-01-13 21:00:00 +09:00
YeonGyu-Kim c8da697a10 docs: update AGENTS.md hierarchy with latest structure and line counts
- Root: Add Prometheus/Metis/Momus agents, MCP architecture, 82 test files
- agents/: Document 7-section delegation and wisdom notepad
- auth/: Multi-account load balancing (10 accounts), endpoint fallback
- features/: Update background-agent 825 lines, builtin-skills 1230 lines
- hooks/: 22+ hooks with event timing details
- tools/: sisyphus-task 583 lines, LSP client 632 lines
- cli/: config-manager 725 lines, 17+ doctor checks
- shared/: Cross-cutting utilities with usage patterns
2026-01-13 21:00:00 +09:00
YeonGyu-Kim 7085bf01df feat(agents): enable question tool permission for Sisyphus agents
Allow Sisyphus and orchestrator-sisyphus agents to use OpenCode's
question tool for interactive user prompts. OpenCode defaults
question permission to "deny" for all agents except build/plan.
2026-01-13 21:00:00 +09:00
Kenny c031563622 Merge pull request #560 from code-yeongyu/fix/install-preserve-config
fix(cli): preserve user config on reinstall
2026-01-13 07:22:51 -05:00
Oussama Douhou 8ce8b4b1db fix(background-agent): inherit parent session directory for background tasks
Background tasks were defaulting to $HOME instead of the parent session's
working directory. This caused background agents to scan the entire home
directory instead of the project directory, leading to:
- High CPU/memory load from scanning unrelated files
- Permission errors on system directories
- Task failures and timeouts

The fix retrieves the parent session's directory before creating a new
background session and passes it via the query.directory parameter.

Files modified:
- manager.ts: Look up parent session directory in launch()
- call-omo-agent/tools.ts: Same fix for sync mode
- look-at/tools.ts: Same fix for look_at tool
- sisyphus-task/tools.ts: Same fix + interface update for directory prop
- index.ts: Pass directory to sisyphusTask factory
2026-01-13 06:27:56 +01:00
Jason Kölker 7f67df9bd0 feat(config): add model variant support
Allow optional model variant config for agents and categories.
Propagate category variants into task model payloads so
category-driven runs inherit provider-specific variants.

Closes: #647
2026-01-13 04:37:51 +00:00
Kenny cacccc7bda fix(test): update sisyphus-orchestrator test to expect preserved subagent response
The implementation preserves original subagent responses for debugging failed tasks.
Updated test assertion from .not.toContain() to .toContain() to match this behavior.
2026-01-12 23:04:34 -05:00
Kenny e8d89c50b7 Merge pull request #709 from Momentum96/fix/skill-lazy-loading
fix(skill-loader): implement eager loading for skills
2026-01-12 22:50:31 -05:00
Kenny 6d264f1d9a refactor(skill-loader): eager loading with atomic file reads
- Extract body during initial parseFrontmatter call
- Rename lazyContent → eagerLoader with rationale comment
- Eliminates redundant file read and race condition
2026-01-12 22:46:28 -05:00
Kenny e62390fe96 Merge pull request #698 from chilipvlmer/fix/preserve-subagent-response
fix(sisyphus-orchestrator): preserve subagent response in output transformation
2026-01-12 22:16:59 -05:00
Kenny f5d1595764 Merge pull request #726 from code-yeongyu/fix/todowrite-agent-friendly-errors
fix(hooks): throw agent-friendly errors when todowrite receives invalid input
2026-01-12 22:11:28 -05:00
Kenny 20f16fc0ef fix: only append ellipsis when string exceeds 100 chars 2026-01-12 22:05:21 -05:00
YeonGyu-Kim b0961ed5cc feat(tools): disable call_omo_agent by default, enable via sisyphus_task 2026-01-13 11:21:01 +09:00
Kenny 9270d712c9 fix(hooks): throw agent-friendly errors when todowrite receives invalid input 2026-01-12 21:19:05 -05:00
Victor Sumner 9b8ed588fa fix(sisyphus-junior): use categoryConfig.model instead of hardcoded sonnet-4.5 (#718) 2026-01-13 09:58:05 +09:00
Nguyen Khac Trung Kien 3dc06225db fix(prometheus): prevent agent fallback to build in background tasks (#695) 2026-01-13 09:39:25 +09:00
Kenny d0a34d68ca fix(glob): default hidden=true and follow=true to align with OpenCode (#720)
- Add follow?: boolean option to GlobOptions interface
- Change buildRgArgs to use !== false pattern for hidden and follow flags
- Change buildFindArgs to use === false pattern, add -L for symlinks
- Change buildPowerShellCommand to use !== false pattern for hidden
- Remove -FollowSymlink from PowerShell (unsupported in PS 5.1)
- Export build functions for testing
- Add comprehensive BDD-style tests (18 tests, 21 assertions)

Note: Symlink following via -FollowSymlink is not supported in Windows
PowerShell 5.1. OpenCode auto-downloads ripgrep which handles symlinks
via --follow flag. PowerShell fallback is a safety net that rarely triggers.

Fixes #631
2026-01-13 09:24:07 +09:00
Ivan Marshall Widjaja d2fe26212a fix(config): allow Sisyphus-Junior agent customization via oh-my-opencode.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 <sisyphus@mengmota.com>

* 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 <sisyphus@mengmota.com>

---------

Co-authored-by: Sisyphus <sisyphus@mengmota.com>
2026-01-12 17:46:47 +09:00
Momentum96 20c6752060 fix(skill-loader): implement eager loading to resolve empty slash commands 2026-01-12 17:27:54 +09:00
Ivan Marshall Widjaja 569d8c7edd fix(sisyphus_task): resolve sync mode JSON parse error (#708) 2026-01-12 17:26:32 +09:00
YeonGyu-Kim 426d00dd5f fix(cli/run): properly serialize error objects to prevent [object Object] output
- Add serializeError utility to handle Error instances, plain objects, and nested message paths
- Fix handleSessionError to use serializeError instead of naive String() conversion
- Fix runner.ts catch block to use serializeError for detailed error messages
- Add session.error case to logEventVerbose for better error visibility
- Add comprehensive tests for serializeError function

Fixes error logging in sisyphus-agent workflow where errors were displayed as '[object Object]'
2026-01-12 14:49:07 +09:00
Ivan Marshall Widjaja d839790576 fix(config): resolve category to model for Prometheus (Planner) agent (#652)
* fix(config): resolve category to model for Prometheus (Planner) agent

When Prometheus (Planner) was configured with only a category (e.g.,
"ultrabrain") and no explicit model, the category was ignored and the
agent fell back to the hardcoded default "anthropic/claude-opus-4-5".
Add resolveModelFromCategoryWithUserOverride() helper that checks user
categories first, then DEFAULT_CATEGORIES, to resolve category names
to their corresponding models. Apply this resolution when building
the Prometheus agent configuration.

Co-Authored-By: Sisyphus <sisyphus@mengmota.com>

* fix(test): use actual implementation instead of local duplicate

Co-Authored-By: Sisyphus <sisyphus@mengmota.com>

* fix(config): apply all category properties, not just model for Prometheus (Planner)

The resolveModelFromCategoryWithUserOverride() helper only extracted
the model field from CategoryConfig, ignoring critical properties like
temperature, top_p, tools, maxTokens, thinking, reasoningEffort, and
textVerbosity. This caused categories like "ultrabrain" (temperature:
0.1) to run with incorrect default temperatures.

Refactor resolveModelFromCategoryWithUserOverride() to
resolveCategoryConfig() that returns the full CategoryConfig. Update
Prometheus (Planner) configuration to apply all category properties
(temperature, top_p, tools, etc.) when a category is specified, matching
the pattern established in Sisyphus-Junior. Explicit overrides still
take precedence during merge.

Co-Authored-By: Sisyphus <sisyphus@mengmota.com>

---------

Co-authored-by: Sisyphus <sisyphus@mengmota.com>
2026-01-12 12:04:55 +09:00