Commit Graph

1070 Commits

Author SHA1 Message Date
YeonGyu-Kim fe326ca79b fix: clear stale recovery retry state 2026-04-03 17:50:24 +09:00
YeonGyu-Kim 9fa1ea38e8 test: isolate recovery hook mocks from full suite 2026-04-03 17:50:24 +09:00
YeonGyu-Kim f84d311c64 Revert "Merge pull request #3048 from code-yeongyu/fix/p0-2-https-enforcement-gaps"
This reverts commit ede561cb74, reversing
changes made to 2d13e125bb.
2026-04-03 17:10:23 +09:00
YeonGyu-Kim 3eb1430a43 Fix HTTP hook HTTPS enforcement gaps
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-03 17:07:17 +09:00
YeonGyu-Kim 1b5114b256 Merge pull request #3017 from code-yeongyu/fix/issue-3014-tool-pair-validation
fix(hook): add tool_use/tool_result pair validator
2026-04-02 15:10:38 +09:00
YeonGyu-Kim 5a2814980e fix(security): enforce HTTPS for HTTP hook URLs
Add TLS requirement for HTTP hook destinations:
- Warn when plain http:// URLs are used
- Reject remote http:// in production mode
- Allow http://localhost and http://127.0.0.1 for dev

Prevents secret exfiltration over unencrypted channels.
2026-04-02 15:01:15 +09:00
YeonGyu-Kim 2440ed9a6f fix(hook): add tool_use/tool_result pair validator to prevent API errors
Adds a defensive tool-pair-validator hook that runs as the final step in
the messages transform pipeline. When compaction or context-window recovery
removes user messages containing tool_result blocks without removing the
preceding assistant message with tool_use blocks, this validator detects
the mismatch and either:

1. Injects missing tool_result parts into the next user message, or
2. Creates a synthetic user message with placeholder tool_results

This prevents Anthropic API errors like 'tool_use ids found without
tool_result blocks immediately after'.

Fixes #3014
2026-04-02 13:31:48 +09:00
YeonGyu-Kim 51d9685571 fix(start-work): use Atlas list key in command config 2026-04-01 17:45:16 -07:00
YeonGyu-Kim f4b8e1c365 fix(claude-code-hooks): cache idle hook config and parent lookups
Reduce repeated session.idle work by reusing hook config loads across a short TTL and by retrying parent session lookup instead of permanently caching transient failures.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-01 17:43:00 -07:00
YeonGyu-Kim 724d21b3cc fix(start-work): restore atlas-first slash discovery
Static slash-command discovery runs before agent registration, so /start-work regressed to Sisyphus even though config-time wiring still needed Atlas-aware fallback. Split builtin command resolution so discovery stays Atlas-first while command config remains availability-aware.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-01 17:32:46 -07:00
YeonGyu-Kim ea14a1a346 fix(auto-slash-command): resolve project commands from session dir
Use the plugin session directory instead of process.cwd() when resolving project slash commands. This restores project and opencode-project slashcommand behavior when the runtime cwd differs from the actual session workspace.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-31 22:24:54 -07:00
YeonGyu-Kim 7f846b2da3 fix(start-work): restore atlas handoff
Keep native /start-work resolvable on Sisyphus, but switch the work session back to Atlas when Atlas is registered. Stamp the outgoing agent with Atlas's actual list-display key so config→start-work execution resolves correctly and still falls back to Sisyphus when Atlas is unavailable.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-31 22:24:54 -07:00
YeonGyu-Kim a3f9eb1337 fix(start-work): fall back to sisyphus without atlas
/start-work should leave plan mode even when Atlas is unavailable. This prevents Prometheus from being persisted into boulder state and keeping resumed work sessions in md-only mode.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-31 18:52:09 -07:00
YeonGyu-Kim 256aaba482 fix(anthropic-recovery): improve executor test coverage and assertions
🤖 Generated with assistance of OhMyOpenCode
2026-03-31 18:11:28 -07:00
YeonGyu-Kim 3c77c048dd fix(comment-checker): improve pending calls handling and add tests
🤖 Generated with assistance of OhMyOpenCode
2026-03-31 17:33:38 -07:00
YeonGyu-Kim 439c9a6499 feat(claude-code-hooks): improve session handling and add tests
🤖 Generated with assistance of OhMyOpenCode
2026-03-31 17:33:29 -07:00
YeonGyu-Kim 116b1f9e4e fix(anthropic-recovery): fix retry timer memory leak in context window recovery
🤖 Generated with assistance of OhMyOpenCode
2026-03-31 17:33:24 -07:00
YeonGyu-Kim ce0d3581f0 fix: revert delegate-task to string category schema, fix mock isolation and restore UB7 originals 2026-03-31 17:25:00 -07:00
YeonGyu-Kim 3f457fd8f1 Merge branch 'fix/ub7-regression' into dev 2026-03-31 17:08:45 -07:00
YeonGyu-Kim 11ee88f28f fix: use jsonc-parser for safe JSONC migration and add project-local config detection 2026-03-31 17:06:46 -07:00
YeonGyu-Kim 87445a2ef3 fix: add missing run_in_background to resume snippet and fix background launch detection 2026-03-31 17:02:56 -07:00
YeonGyu-Kim 2d46a71da4 Merge pull request #2929 from quangtran88/fix/rules-injector-respect-claude-code-config
fix(rules-injector): respect claude_code config for user rule loading
2026-03-29 18:54:27 -07:00
YeonGyu-Kim 59f11680a7 Merge pull request #2874 from sanoyphilippe/feat/plugin-tool-session-navigation
feat(atlas): support plugin tools with metadata.sessionId in orchestration hook
2026-03-29 18:45:43 -07:00
YeonGyu-Kim 8b437ee1d9 Merge pull request #2930 from sjawhar/fix/agent-name-duplication
fix: permanently resolve agent name duplication yo-yo bug
2026-03-29 18:42:50 -07:00
YeonGyu-Kim 67253447b7 fix(anthropic-effort): skip effort injection for internal agents (fixes #2940)
Internal agents (title, summary, compaction) no longer receive the
anthropic-beta effort header, preventing 400 errors on Google Vertex
Anthropic provider.

Verified: 12 tests pass, typecheck clean
2026-03-30 10:33:38 +09:00
Sami Jawhar 4314a3e482 fix: permanently resolve agent name duplication yo-yo bug 2026-03-29 15:13:47 +00:00
Tran Quang a1a2bb4b07 fix(rules-injector): respect claude_code config for user rule loading
When claude_code integration is disabled in oh-my-opencode.json, the
rules-injector now skips loading rules from ~/.claude/rules/ to prevent
Claude Code-specific instructions from leaking into non-Claude agents
(e.g., GPT-5.4 Sisyphus), which causes agent hallucination.

Also adds ~/.sisyphus/rules/ and ~/.opencode/rules/ as OpenCode-native
user rule directories that are always searched regardless of config.

Fixes #2920

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 10:13:55 +07:00
YeonGyu-Kim b2497f1327 fix: resolve 3 community-reported bugs (#2915, #2917, #2918)
- background_output: snapshot read cursor before consuming, restore on
  /undo message removal so re-reads return data (fixes #2915)
- MCP loader: preserve oauth field in transformMcpServer, add scope/
  projectPath filtering so local-scoped MCPs only load in matching
  directories (fixes #2917)
- runtime-fallback: add 'reached your usage limit' to retryable error
  patterns so quota exhaustion triggers model fallback (fixes #2918)

Verified: bun test (4606 pass / 0 fail), tsc --noEmit clean
2026-03-29 04:53:43 +09:00
Ravi Tharuma 4e214cba4e fix(recovery): ignore empty summary-only assistant messages 2026-03-28 08:57:36 +01:00
YeonGyu-Kim 4a029258a4 fix: resolve 5 remaining pre-publish blockers (14, 15, 17, 21, 25c)
- completion-promise-detector: restrict to assistant text parts only,
  remove tool_result from completion detection (blocker 14)
- ralph-loop tests: flip tool_result completion expectations to negative
  coverage, add false-positive rejection tests (blocker 15)
- skill tools: merge nativeSkills into initial cachedDescription
  synchronously before any execute() call (blocker 17)
- skill tools test: add assertion for initial description including
  native skills before execute() (blocker 25c)
- docs: sync all 4 fallback-chain docs with model-requirements.ts
  runtime source of truth (blocker 21)

Verified: bun test (4599 pass / 0 fail), tsc --noEmit clean
2026-03-28 15:57:27 +09:00
YeonGyu-Kim d2c576c510 fix: resolve 25 pre-publish blockers
- postinstall.mjs: fix alias package detection
- migrate-legacy-plugin-entry: dedupe + regression tests
- task_system: default consistency across runtime paths
- task() contract: consistent tool behavior
- runtime model selection, tool cap, stale-task cancellation
- recovery sanitization, context-limit gating
- Ralph semantic DONE hardening, Atlas fallback persistence
- native-skill description/content, skill path traversal guard
- publish workflow: platform awaited via reusable workflow job
- release: version edits reapplied before commit/tag
- JSONC plugin migration: top-level plugin key safety
- cold-cache: user fallback models skip disconnected providers
- docs/version/release framing updates

Verified: bun test (4599 pass), tsc --noEmit clean, bun run build clean
2026-03-28 15:24:18 +09:00
YeonGyu-Kim aeec5ef98d Merge pull request #2773 from MoerAI/fix/ralph-loop-fuzzy-completion
fix(ralph-loop): add semantic completion detection as fallback for natural language (fixes #2489)
2026-03-28 01:44:56 +09:00
YeonGyu-Kim 7b2b8be181 Merge pull request #2771 from MoerAI/fix/bash-file-read-guard
fix(hooks): add bash-file-read-guard to warn agents against cat/head/tail (fixes #2096)
2026-03-28 01:44:44 +09:00
YeonGyu-Kim b9ed0ca30b Merge pull request #2877 from WhiteGiverMa/fix/atlas-agent-not-found
fix: use getAgentDisplayName in injectBoulderContinuation
2026-03-28 01:40:38 +09:00
YeonGyu-Kim 49687a654a Merge pull request #2895 from MoerAI/fix/session-recovery-missing-messageid
fix(session-recovery): fallback to fetching messageID from session messages (fixes #2046)
2026-03-28 01:39:44 +09:00
YeonGyu-Kim 9e6f2d9977 Merge pull request #2893 from MoerAI/fix/keyword-detector-silent-skips
fix(keyword-detector): add logging for silent skip paths (fixes #2058)
2026-03-28 01:39:20 +09:00
YeonGyu-Kim 4fa7d48c04 Merge pull request #2890 from MoerAI/fix/start-work-atlas-not-found
fix(start-work): gracefully handle missing Atlas agent (fixes #2132)
2026-03-28 01:38:53 +09:00
YeonGyu-Kim 631092461c Merge pull request #2891 from codivedev/fix/issue-2882
fix: use display name in runtime-fallback retry
2026-03-28 01:38:14 +09:00
YeonGyu-Kim c5068d37d2 fix(#2885): add model_not_supported to RETRYABLE error patterns
model_not_supported errors from providers (e.g. OpenAI returning
{"error": {"code": "model_not_supported"}}) were not recognized as
retryable. Subagents would silently fail with no response, hanging the
parent session.

Fix:
- Add "model_not_supported", "model not supported", "model is not
  supported" to RETRYABLE_MESSAGE_PATTERNS in model-error-classifier.ts
- Add regex patterns to RETRYABLE_ERROR_PATTERNS in
  runtime-fallback/constants.ts to match "model ... is ... not ...
  supported" with flexible spacing
- Add regression test covering all three variations

Now model_not_supported errors trigger the normal fallback chain instead
of silent failure.
2026-03-28 00:42:52 +09:00
YeonGyu-Kim 1434313bd7 Merge pull request #2717 from gtg7784/fix/analyze-mode-load-skills-hint
Verified: tsc clean, 27/27 keyword-detector tests pass. Fix is correct — analyze-mode message was missing delegate_task required params which caused load_skills validation errors.
2026-03-28 00:29:53 +09:00
codivedev b4d4d30fa8 fix: use display name in runtime-fallback retry 2026-03-27 13:39:50 +01:00
MoerAI fee60d2def fix(session-recovery): fallback to fetching messageID from session messages (fixes #2046) 2026-03-27 21:26:09 +09:00
MoerAI f030e0d78d fix(keyword-detector): add logging for silent skip paths (fixes #2058) 2026-03-27 21:24:03 +09:00
MoerAI d09af86ea7 fix(start-work): gracefully handle missing Atlas agent (fixes #2132) 2026-03-27 21:13:44 +09:00
YeonGyu-Kim 3be26cb97f fix(#2732): enhance notification for failed/crashed subagent tasks
- completedTaskSummaries now includes status and error info
- notifyParentSession: noReply=false for failed tasks so parent reacts
- Batch notification distinguishes successful vs failed/cancelled tasks
- notification-template updated to show task errors
- task-poller: session-gone tests (85 new lines)
- CI: add Bun shim to PATH for legacy plugin migration tests
2026-03-27 15:48:07 +09:00
YeonGyu-Kim e22e13cd29 fix(#2732): detect crashed subagent sessions with shorter timeout
When a subagent session disappears from the status registry (process
crashed), the main agent was waiting the full stale timeout before
acting. Fix:

- Add sessionGoneTimeoutMs config option (default 60s, vs 30min normal)
- task-poller: use shorter timeout when session is gone from status
- manager: verify session existence when gone, fail crashed tasks
  immediately with descriptive error
- Add legacy-plugin-toast hook for #2823 migration warnings
- Update schema with new config option
2026-03-27 15:43:01 +09:00
YeonGyu-Kim 6a733c9dde fix(#2823): auto-migrate legacy plugin name and warn users at startup
- logLegacyPluginStartupWarning now emits console.warn (visible to user,
  not just log file) when oh-my-opencode is detected in opencode.json
- Auto-migrates opencode.json plugin entry from oh-my-opencode to
  oh-my-openagent (with backup)
- plugin-config.ts: add console.warn when loading legacy config filename
- test: 10 tests covering migration, console output, edge cases
2026-03-27 15:40:04 +09:00
YeonGyu-Kim 041770ff42 fix(#2736): prevent infinite compaction loop by setting cooldown before try
lastCompactionTime was only set on successful compaction. When compaction
failed (rate limit, timeout, etc.), no cooldown was recorded, causing
immediate retries in an infinite loop.

Fix: set lastCompactionTime before the try block so both success and
failure respect the cooldown window.

- test: add failed-compaction cooldown enforcement test
- test: fix timeout retry test to advance past cooldown
2026-03-27 14:25:38 +09:00
WhiteGiverMa a3b84ec5f9 fix: use getAgentDisplayName in injectBoulderContinuation
The agent parameter was using raw config key "atlas" but the SDK
expects the display name "Atlas (Plan Executor)". This caused
"Agent not found: 'atlas'" errors when auto-compact tried to
continue boulder execution.

Root cause: injectBoulderContinuation passed raw agent key to
session.promptAsync, but SDK's agent matching logic compares
against display names registered in the system.

Fix: Use getAgentDisplayName() to convert the config key to
the expected display name before passing to the SDK.
2026-03-27 13:22:58 +08:00
YeonGyu-Kim 670d8ab175 fix(#2852): forward model overrides from categories/agent config to subagents
- fix(switcher): use lastIndexOf for multi-slash model IDs (e.g. aws/anthropic/claude-sonnet-4)
- fix(model-resolution): same lastIndexOf fix in doctor parseProviderModel
- fix(call-omo-agent): resolve model from agent config and forward to both
  background and sync executors via DelegatedModelConfig
- fix(subagent-resolver): inherit category model/variant when agent uses
  category reference without explicit model override
- test: add model override forwarding tests for call-omo-agent
- test: add multi-slash model ID test for switcher
2026-03-27 13:59:06 +09:00