Commit Graph

5884 Commits

Author SHA1 Message Date
YeonGyu-Kim 35cab4db10 test(ralph-loop): cover ownership race, verification commit failure, session.create throw
Three additional invariant tests addressing the gaps surfaced by Cubic and the post-implementation review:

- idle path must not dispatch when state ownership changes during the idleSettleMs window
- verification-failure path must treat incrementIteration failure as a loud failure, not a success
- reset strategy must surface session.create rejections as session_creation_rejected even when the SDK throws instead of returning an error envelope
2026-05-11 13:02:07 +09:00
YeonGyu-Kim caaae19155 fix(ralph-loop): commit iteration only after verification continuation dispatches
Split the verification-failure restart into clearVerificationState (clears\nthe verification flags so we cleanly transition back to the main loop)\nfollowed by injectContinuationPrompt, with incrementIteration only on\nsuccessful injection. On rejection: clear the loop state and emit a loud\nwarning toast. Mirrors the dispatch-before-commit contract enforced for\nthe idle and session.error paths.
2026-05-11 12:46:35 +09:00
YeonGyu-Kim 09c45c3acb fix(ralph-loop): commit iteration only after continuation is dispatched
Reorder the session.idle and session.error retry paths so the durable\niteration counter and the progress toast advance only when continueIteration\nreturns dispatched. On dispatch_rejected or session_creation_rejected,\nclear the loop state and emit a loud failure toast instead of silently\nlogging while the loop appears to make progress.\n\nAdds an explicit settle-window state check so a session.deleted firing\nduring the idleSettleMs sleep no longer feeds dispatch against a cleared\nloop. Keeps idleSettleMs intact for the original idle-settle race.
2026-05-11 12:46:07 +09:00
YeonGyu-Kim d4cdeaccbe fix(ralph-loop): return typed ContinuationResult from continueIteration
Replace silent returns in continueIteration with a discriminated union\n(dispatched | session_creation_rejected | dispatch_rejected). Wraps\ninjectContinuationPrompt in try/catch so reset-strategy createIterationSession\nreturning null and promptAsync rejections both surface as typed failures\nthe caller can react to.
2026-05-11 12:45:59 +09:00
YeonGyu-Kim f0857a88fb test(ralph-loop): add dispatch-failure invariant tests
Lock the contract that durable iteration state and visible UI must only\nadvance when the continuation dispatch is semantically accepted. Adds 4\npermanent invariant tests covering the idle, session.error retry, and\nverification-failure orchestration paths, plus the reset-strategy\nsilent-null path.
2026-05-11 12:45:51 +09:00
acamq b213d0dab1 Merge pull request #3929 from wenghuayang96/fix/runtime-fallback-volcano-quota
fix(runtime-fallback): match Volcano Engine quota exceeded errors
2026-05-10 20:27:17 -06:00
acamq 38c50d6a39 Merge pull request #3827 from ShishaBoyTJ/fix/tmux-subagent-single-dispatch
fix: support cmux tmux compatibility
2026-05-10 19:41:10 -06:00
acamq 0d19c31274 fix: add cmux __tmux-compat prefix to interactive_bash tool
Extract isCmuxCompatEnvironment to shared module and fix
interactive_bash to resolve cmux executables with the __tmux-compat
prefix, matching all other tmux command paths in the codebase.
2026-05-10 19:29:42 -06:00
github-actions[bot] 9314dca06a @acamq has signed the CLA in code-yeongyu/oh-my-openagent#3644 2026-05-11 01:07:10 +00:00
YeonGyu-Kim 69aedf3bc4 Merge pull request #3915 from code-yeongyu/fix/installer-checking-opencode-hang
fix(installer): timeout opencode --version probe to avoid Desktop binary hang
2026-05-11 09:31:01 +09:00
YeonGyu-Kim f983b6b19e fix(installer): avoid empty-version success on delayed stdout 2026-05-11 09:30:33 +09:00
YeonGyu-Kim 5d1c8718d7 fix(installer): bound outputPromise wait after kill to prevent indirect hang
After SIGTERM/SIGKILL escalation, the stdout stream may not close immediately on all platforms. The unconditional await on outputPromise could then hang indefinitely, defeating the bounded process lifetime guarantee. Race outputPromise against a short follow-up timeout to ensure getOpenCodeVersion always returns within a bounded time.

Refs #3766
2026-05-11 09:24:42 +09:00
YeonGyu-Kim 4b281f949e Merge pull request #3914 from code-yeongyu/fix/max-output-tokens
fix: prevent non-positive maxOutputTokens from leaking to SDK
2026-05-11 09:22:39 +09:00
YeonGyu-Kim 1dc2664e51 Merge pull request #3912 from code-yeongyu/fix/sync-poller-abort-handling
fix(delegate-task): handle abort race in sync session polling
2026-05-11 09:22:35 +09:00
YeonGyu-Kim 50dffc9952 Merge pull request #3911 from code-yeongyu/fix/todo-diag-blocked-alert
fix(plugin): allow real session.idle after synthetic idle within dedup window
2026-05-11 09:22:31 +09:00
YeonGyu-Kim 0b6d28a6a4 Merge pull request #3913 from code-yeongyu/fix/bg-task-registry-aborted
fix(background-agent): retain completed tasks via archive fallback after cleanup
2026-05-11 09:21:18 +09:00
YeonGyu-Kim 8b1696f5e5 fix(delegate-task): prevent stale-text abort recovery 2026-05-11 09:20:14 +09:00
YeonGyu-Kim 8e47d3a166 fix(delegate-task): require anchored text for abort recovery 2026-05-11 09:10:47 +09:00
YeonGyu-Kim f6a6bb32a1 Merge pull request #3910 from code-yeongyu/fix/config-migration-repeated-bak
fix(config): use r+ mode for fsync on Windows to prevent migration retry loop
2026-05-11 09:05:12 +09:00
YeonGyu-Kim e018739d2c fix(delegate-task): recover aborted-operation messages in sync flows 2026-05-11 09:01:17 +09:00
YeonGyu-Kim 64f9a70712 fix(config): use r+ when fsyncing migrated temp file
Apply the Windows-safe open mode in migrateLegacyPluginEntry and add a regression test to assert the temp fd is opened with r+ before fsync.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 08:54:46 +09:00
YeonGyu-Kim eb6605a87f fix(background-agent): preserve non-sensitive timing in archived tasks
Carry queuedAt and startedAt in sanitized archive snapshots so post-cleanup task output duration remains accurate without retaining prompt content.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 08:53:44 +09:00
YeonGyu-Kim 468bf25dcb fix(delegate-task): gate continuation recovery to canonical abort errors 2026-05-11 08:53:21 +09:00
YeonGyu-Kim 84073897c6 test(installer): stabilize timeout signal escalation assertion 2026-05-11 08:50:59 +09:00
YeonGyu-Kim 2f8ce576dc fix(chat-params): use conservative token fallback for invalid limits
Avoid inflating non-positive maxOutputTokens values to model capability maxima by always falling back to a safe fixed budget.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 08:47:49 +09:00
YeonGyu-Kim a4ce0b63b6 fix(background-agent): redact archived prompts and cap fallback archive
Store only sanitized completed-task snapshots in archive to avoid retaining sensitive prompts after cleanup.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 08:47:39 +09:00
YeonGyu-Kim 65913023c5 fix(delegate-task): narrow abort recovery to canonical abort errors 2026-05-11 08:46:14 +09:00
YeonGyu-Kim 2168040ac6 fix(plugin): scope synthetic-idle dedup bypass to matching marker
Only clear recentAnyIdles when the stored marker matches the synthetic idle timestamp for the same session, preventing accidental clobbering of newer idle markers. Add a regression test to verify other sessions keep their dedup state during this bypass path.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 08:45:34 +09:00
YeonGyu-Kim 7464d7e005 fix(installer): timeout opencode --version probe to avoid Desktop binary hang
When the binary resolved as 'opencode' on PATH is the OpenCode Desktop GUI (not the CLI), it does not respond to --version with prompt exit. proc.exited then waits forever, freezing the installer at 'Checking OpenCode installation'.

Fix: race proc.exited against OPENCODE_VERSION_CHECK_TIMEOUT_MS=1500. On timeout, proc.kill() and treat the binary as failed so the next candidate is tried. Success requires both timedExitCode === 0 and proc.exitCode === 0.

Fixes #3766
2026-05-11 08:45:21 +09:00
acamq 851ebfb476 Merge pull request #3932 from code-yeongyu/revert-3622-fix/truncate-tool-error-output
Revert "fix(tool-execute-after): cap excessively long tool output to prevent TUI flooding (fixes #3586)"
2026-05-10 17:39:41 -06:00
acamq 299275094f Revert "fix(tool-execute-after): cap excessively long tool output to prevent TUI flooding (fixes #3586)" 2026-05-10 17:33:36 -06:00
github-actions[bot] 124bbb14c6 @masterkain has signed the CLA in code-yeongyu/oh-my-openagent#3930 2026-05-10 19:58:57 +00:00
wenghuayang863 f3f72fc96f fix(runtime-fallback): also classify Volcano Engine errors as quota_exceeded
- Add /exceeded.*quota/i and /usage\s*quota/i to classifyErrorType quota block
- Align /usage.?quota/i -> /usage\s*quota/i in RETRYABLE_ERROR_PATTERNS for consistency
- Strengthen auto-retry-signal test assertion
- Add classifyErrorType assertion to Volcano Engine regression test

Ensures Volcano Engine errors are both retryable AND logged as
errorType: quota_exceeded.
2026-05-11 01:03:02 +08:00
github-actions[bot] 45f583aab6 @wenghuayang96 has signed the CLA in code-yeongyu/oh-my-openagent#3929 2026-05-10 17:03:01 +00:00
github-actions[bot] 39a7e0199e @MisileLab has signed the CLA in code-yeongyu/oh-my-openagent#3928 2026-05-10 16:57:10 +00:00
wenghuayang863 1c7881ec09 fix(runtime-fallback): match Volcano Engine 'exceeded the usage quota' errors
Volcano Engine sends quota exceeded errors with the words in reverse
order: 'You have exceeded the 5-hour usage quota'. The existing
patterns required 'quota' to precede 'exceeded', so they never matched.

- Add /exceeded.*quota/i and /usage.?quota/i to RETRYABLE_ERROR_PATTERNS
- Add exceeded.*quota and usage\s*quota to AUTO_RETRY_PATTERNS
- Add regression tests for both detection paths

Fixes: runtime-fallback not triggering on Volcano Engine quota errors
2026-05-11 00:43:58 +08:00
acamq cb3aba96d0 Merge pull request #3927 from acamq/feat/support-dsv4-thinking
fix(model-settings): support DeepSeek reasoning effort
2026-05-10 10:25:55 -06:00
acamq a81a7e7621 Merge pull request #3926 from acamq/fix/opencode-go-installer
fix(installer): add opencode-go fallback entries for deep and artistry categories
2026-05-10 10:22:29 -06:00
acamq 5259bdfd20 fix(model-settings): apply reasoning aliases with capabilities 2026-05-10 10:19:34 -06:00
acamq fd670a8169 fix(model-settings): enable DeepSeek reasoning effort 2026-05-10 10:12:22 -06:00
acamq cfab5caea3 fix(installer): add opencode-go fallback entries for deep and artistry categories
The deep and artistry category fallback chains had no opencode-go provider
entries, causing them to fall through to the ultimate fallback
(opencode/gpt-5-nano) which is not available to opencode-go users.

Add opencode-go entries:
- deep: deepseek-v4-pro -> kimi-k2.6 -> glm-5.1
- artistry: kimi-k2.6 -> glm-5.1

Fixes #3924
2026-05-10 10:11:59 -06:00
acamq c5e89f1eea fix(model-settings): support family reasoning aliases 2026-05-10 10:11:55 -06:00
YeonGyu-Kim 50d0d16854 Merge pull request #3909 from code-yeongyu/fix/doctor-version-parsing
fix(doctor): extract semver from `opencode --version` stdout
2026-05-10 16:15:56 +09:00
YeonGyu-Kim 6520c70590 Merge pull request #3917 from code-yeongyu/fix/anthropic-prefill-recovery
fix(plugin): guard assistant prefill message tails
2026-05-10 16:00:47 +09:00
YeonGyu-Kim 432728b2ea Merge pull request #3916 from code-yeongyu/fix/delegate-inactivity-timeout
fix(delegate-task): clarify sync inactivity timeout
2026-05-10 16:00:26 +09:00
YeonGyu-Kim 41629b5262 fix(plugin): guard assistant prefill message tails 2026-05-10 15:54:29 +09:00
YeonGyu-Kim eef62cc4f2 fix(delegate-task): clarify sync inactivity timeout 2026-05-10 15:54:29 +09:00
YeonGyu-Kim 98da8b675b fix(installer): apply extractSemverFromOutput to opencode-binary version probe
The same output.trim() bug fixed in PR #3909 for doctor exists in the
installer's opencode-binary.ts. Without this fix, `bunx oh-my-opencode
install` would store polluted Electron stdout (e.g., `00:24:25.202 >
app starting { version: '1.14.33', packaged: true }`) as the OpenCode
version in config, breaking downstream version-dependent logic.

- Extract extractSemverFromOutput to src/shared/extract-semver.ts
  (precedent: spawn-with-windows-hide is in shared because used by
  both doctor and installer)
- src/cli/doctor/checks/system-binary.ts now imports from shared and
  re-exports for backward compat
- src/cli/config-manager/opencode-binary.ts uses the shared helper
  with `?? output.trim()` fallback to preserve legacy behavior on
  non-semver-shaped successful outputs (e.g., custom builds)
- Add 4 installer regression tests covering: clean semver, polluted
  Electron stdout (regression for #3765 installer caller), fallback
  for non-semver, null when no binary on PATH

Refs #3765
2026-05-10 15:32:36 +09:00
YeonGyu-Kim 6fd1ec3ea8 test(background-agent): align cancel cleanup assertions with archive fallback 2026-05-10 15:05:31 +09:00
YeonGyu-Kim 279f0d150f fix(chat-params): guard non-positive max output tokens 2026-05-10 15:03:01 +09:00