Commit Graph

705 Commits

Author SHA1 Message Date
Jeremy Gollehon 8e2410f1a0 refactor(background-agent): rename registerExternalTask to trackTask
Update BackgroundManager to rename the method for tracking external tasks, improving clarity and consistency in task management. Adjust related tests to reflect the new method name.
2026-01-15 10:53:08 -08:00
Jeremy Gollehon b5bd837025 fix(background-agent): improve parent session ID handling in task management
Enhance the BackgroundManager to properly clean up pending tasks when the parent session ID changes. This prevents stale entries in the pending notifications and ensures that the cleanup process is only executed when necessary, improving overall task management reliability.
2026-01-15 00:16:35 -08:00
Jeremy Gollehon 7168c2d904 fix(background-agent): prevent stale entries in pending notifications
Update BackgroundManager to track batched notifications only for running tasks. Implement cleanup for completed or cancelled tasks to avoid stale entries in pending notifications. Enhance logging to include task status for better debugging.
2026-01-14 23:51:19 -08:00
Jeremy Gollehon 7050d447cd feat(background-agent): implement process cleanup for BackgroundManager
Add functionality to manage process cleanup by registering and unregistering signal listeners. This ensures that BackgroundManager instances properly shut down and remove their listeners on process exit. Introduce tests to verify listener removal after shutdown.
2026-01-14 23:11:38 -08:00
Jeremy Gollehon 4ac0fa7bb0 fix(background-agent): preserve external concurrency keys
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-14 22:40:16 -08:00
Jeremy Gollehon c1246f61d1 feat(background-agent): add concurrency group field
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-14 22:40:14 -08:00
Jeremy Gollehon 03871262b2 feat(concurrency): prevent background task races and leaks
Ensure queue waiters settle once, centralize completion with status guards, and release slots before async work so shutdown and cancellations don’t leak concurrency. Internal hardening only.
2026-01-14 21:35:01 -08:00
justsisyphus 4c22d6de76 fix(todo-continuation): preserve model when injecting continuation prompt 2026-01-15 14:30:48 +09:00
justsisyphus 1dd369fda5 perf(comment-checker): lazy init for CLI path resolution
Remove COMMENT_CHECKER_CLI_PATH constant that was blocking on module import.
Replace with getCommentCheckerPathSync() lazy function call.

- Defer file system sync calls (existsSync, require.resolve) to first use
- Add cli.test.ts with 4 BDD tests for lazy behavior verification
2026-01-15 14:23:15 +09:00
Kenny 84e97ba900 Merge pull request #801 from stranger2904/fix/session-cursor-output
fix: add session cursor for tool output
2026-01-14 21:25:40 -05:00
Kenny ef65f405e8 fix: clean up session cursor state on session deletion
Add resetMessageCursor call in session.deleted handler to prevent
unbounded memory growth from orphaned cursor entries.
2026-01-14 21:17:41 -05:00
Kenny 3de559ff87 refactor: rename getNewMessages to consumeNewMessages
Rename to signal mutation behavior - the function advances the cursor
as a side effect, so 'consume' better reflects that calling it twice
with the same input yields different results.
2026-01-14 21:06:26 -05:00
Aleksey Bragin acb16bcb27 fix: reset cursor when history changes 2026-01-14 19:58:56 -05:00
Aleksey Bragin 9995b680f7 fix: add session cursor for tool output 2026-01-14 19:43:46 -05:00
Jason Kölker 70bca4a7a6 fix(cli): add copilot install flag
Installer validation already requires --copilot, but the CLI
command did not expose the option, so non-TUI runs could not
supply the flag. Add the option and update help examples.
2026-01-15 00:01:59 +00:00
aw338WoWmUI 8395a6eaac fix: address PR review feedback
- Prioritize 'latest', 'beta', 'next' tags in getPluginNameWithVersion()
  to ensure deterministic results when version matches multiple tags
- Add 5s timeout to fetchNpmDistTags() to prevent blocking on slow networks
- Remove unused 'join' import from node:path
- Merge upstream/dev and resolve conflicts in config-manager.test.ts
2026-01-15 06:12:04 +08:00
Kenny abd1ec1092 Merge pull request #790 from stranger2904/feat/http-mcp-transport
feat(skill-mcp): add HTTP transport support for remote MCP servers
2026-01-14 15:35:38 -05:00
stranger2904 951df07c0f fix: correct test syntax for headers verification
Fix syntax error where expect().rejects.toThrow() was not properly closed
before the headers assertion.
2026-01-14 15:10:45 -05:00
Kenny 4c49299a93 Merge pull request #736 from Gladdonilli/fix/background-agent-edge-cases
fix(background-agent): address edge cases in task lifecycle
2026-01-14 15:05:09 -05:00
Kenny 00508e9959 Merge pull request #770 from KNN-07/fix/agent-model-inheritance
feat(sisyphus-task): inherit parent model for categories and show fal…
2026-01-14 15:01:18 -05:00
stranger2904 c9ef648c60 test: mock StreamableHTTPClientTransport for faster, deterministic tests
Add mocks for HTTP transport to avoid real network calls during tests.
This addresses reviewer feedback about test reliability:
- Tests are now faster (no network latency)
- Tests are deterministic across environments
- Test intent is clearer (unit testing error handling logic)

The mock throws immediately with a controlled error message,
allowing tests to validate error handling without network dependencies.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-14 15:01:10 -05:00
Kenny 8a9ebe1012 refactor(sisyphus-task): use dynamic model fallback from OpenCode config
- Remove hardcoded "anthropic/claude-sonnet-4-5" fallback
- Fetch systemDefaultModel from client.config.get() at tool boundary
- Add 'category-default' and 'system-default' fallback types
- Use switch(actualModel) for cleaner type detection
- Add guard clauses and fail-loud validation for invalid models
- Wrap config fetch in try/catch for graceful degradation
- Update toast messages with typed suffixMap
2026-01-14 14:45:01 -05:00
stranger2904 570b51d07b feat(skill-mcp): add HTTP transport support for remote MCP servers
Add support for connecting to remote MCP servers via HTTP in addition to
the existing stdio (local process) connections. This enables skills to
use cloud-hosted MCP servers and aggregated MCP gateways.

## Changes

- Extend SkillMcpManager to detect connection type from config:
  - Explicit `type: "http"` or `type: "sse"` → HTTP connection
  - Explicit `type: "stdio"` → stdio connection
  - Infer from `url` field → HTTP connection
  - Infer from `command` field → stdio connection

- Add StreamableHTTPClientTransport from MCP SDK for HTTP connections
  - Supports custom headers for authentication (e.g., API keys)
  - Proper error handling with helpful hints

- Maintain full backward compatibility with existing stdio configurations

## Usage

```yaml
# HTTP connection (new)
mcp:
  remote-server:
    url: https://mcp.example.com/mcp
    headers:
      Authorization: Bearer ${API_KEY}

# stdio connection (existing, unchanged)
mcp:
  local-server:
    command: npx
    args: [-y, @some/mcp-server]
```

## Tests

Added comprehensive tests for:
- Connection type detection (explicit type vs inferred)
- HTTP URL validation and error messages
- Headers configuration
- Backward compatibility with stdio configs
2026-01-14 11:35:32 -05:00
Kenny a91b05d9c6 Merge pull request #751 from Momentum96/feat/sisyphus-task-retry
feat(hooks): add sisyphus-task-retry hook for auto-correction
2026-01-14 10:57:59 -05:00
Nguyen Khac Trung Kien 4a892a9809 fix(sisyphus-task): correct modelInfo.type detection to compare actual resolved model
The previous detection checked if parentModelString exists, but the
resolution uses a ?? chain where default may win over parent. Now
compares actualModel against each source to correctly identify type.

Fixes: model toast incorrectly showing 'inherited' when default was used
2026-01-14 22:15:05 +07:00
Nguyen Khac Trung Kien 4d4966362f feat(sisyphus-task): inherit parent model for categories and show fallback warning
- Change model priority: user override > parent model > category default
- Add ModelFallbackInfo to track model resolution type
- Show warning toast when category uses inherited or default model
- Add tests for model fallback info in task toast
2026-01-14 22:06:24 +07:00
Kenny 0c21c72e05 Merge pull request #776 from MotorwaySouth9/fix/config-migration-do-not-prune-agent-overrides
fix(migration): normalize Orchestrator-Sisyphus name
2026-01-14 10:02:26 -05:00
Kenny 3801e42ccb fix: restore mock in keyword-detector tests 2026-01-14 09:32:05 -05:00
Kenny 9f040e020f Merge branch 'dev' into fix/ulw-boundary-and-skill-mcp-args 2026-01-14 09:27:59 -05:00
YeonGyu-Kim 47a641c415 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
popododo0720 5c4f4fc655 fix: ulw keyword word boundary and skill_mcp parseArguments object handling
- Add word boundary to ulw/ultrawork regex to prevent false matches on substrings like 'StatefulWidget' (fixes #779)
- Handle object type in parseArguments to prevent [object Object] JSON parse error (fixes #747)
- Add test cases for word boundary behavior
2026-01-14 21:36:32 +09:00
justsisyphus e180d295bb 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 54575ad259 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
Gladdonilli 4d966ec99b refactor(background-agent): extract cleanupPendingByParent helper
Extract duplicated 8-line pendingByParent cleanup pattern into a
reusable helper method. Reduces code duplication across 5 call sites.

Addresses cubic-dev-ai feedback on PR #736.
2026-01-14 17:34:54 +08:00
Gladdonilli 5d99e9ab64 fix: address remaining PR review feedback
- Add pendingByParent cleanup in pruneStaleTasksAndNotifications
- Add double-release guard in launch error handler (L170)
- Add concurrency release in resume error handler (L326)
2026-01-14 17:34:54 +08:00
Gladdonilli 129388387b fix: address PR review feedback
- Add pendingByParent cleanup to ALL completion paths (session.idle, polling, stability)
- Add null guard for task.parentSessionID before Map access
- Add consistency guard in prune function (set concurrencyKey = undefined)
- Remove redundant setTimeout release (already released at completion)
2026-01-14 17:34:54 +08:00
Gladdonilli c196db2a0e fix(background-agent): address 3 edge cases in task lifecycle
- Reset startedAt on resume to prevent immediate false completion
- Release concurrency immediately on completion with double-release guard
- Clean up pendingByParent on session.deleted to prevent stale entries
2026-01-14 17:33:47 +08:00
justsisyphus 6ded689d08 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 45d660176e 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 e203130ed8 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 0631865c16 style(agents): add green color to Orchestrator Sisyphus 2026-01-14 16:20:02 +09:00
MotorwaySouth9 e6a572824c fix(migration): normalize Orchestrator-Sisyphus name 2026-01-14 15:09:22 +08:00
justsisyphus 3d5319a72d 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 325ce1212b 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 66f8946ff1 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 22619d137e 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 9f07aae0a1 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 d7326e1eeb 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 444b7ce991 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 31c5951dfc 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