2068 Commits

Author SHA1 Message Date
YeonGyu-Kim
5c83fee619 feat(ralph-loop): add strategy option for fresh context per iteration
Closes #1901

Add 'default_strategy' config option (default: 'continue') to control whether ralph-loop creates a new session per iteration ('reset') or keeps the same session ('continue'). The 'reset' strategy keeps the model in the smart zone by starting with fresh context for each iteration.

Supports --strategy flag for per-command override.
2026-02-21 05:33:53 +09:00
YeonGyu-Kim
b48804e3cb fix(config-handler): preserve disable_omo_env wiring in agent setup 2026-02-21 05:33:52 +09:00
YeonGyu-Kim
49aa5162bb fix(session-recovery): harden unavailable tool recovery flow 2026-02-21 05:33:52 +09:00
YeonGyu-Kim
414099534e fix(plugin): remove stale hook wiring for missing hooks 2026-02-21 05:33:52 +09:00
YeonGyu-Kim
e6883a45e2 fix(session-recovery): wire unavailable_tool recovery in hook 2026-02-21 05:33:52 +09:00
YeonGyu-Kim
b404bcd42c fix(session-recovery): recover unavailable_tool with synthetic tool_result 2026-02-21 05:33:52 +09:00
YeonGyu-Kim
43b8884db6 fix(session-recovery): detect unavailable_tool errors 2026-02-21 05:33:52 +09:00
YeonGyu-Kim
8f37d7ffe1 fix(doctor): align isPinned logic with auto-updater to treat channel tags as not pinned 2026-02-21 05:31:53 +09:00
YeonGyu-Kim
51654c1c5e
Merge pull request #2004 from code-yeongyu/fix/1804-1962-migration-overwrite
fix(migration): remove non-existent gpt-5.3-codex migration from MODEL_VERSION_MAP
2026-02-21 05:31:00 +09:00
YeonGyu-Kim
64ff0da1a2 test: restore mocked modules in recovery-hook to prevent cross-test leakage 2026-02-21 05:12:07 +09:00
YeonGyu-Kim
145bb65192 test(events): use baseline snapshot pattern for console spy isolation
Replace exact call count assertions with delta-based checks:
- capture errorSpy.mock.calls.length before processing events
- slice to only check calls made during this test's execution
- use try/finally to guarantee mockRestore() even on assertion failure

This prevents test pollution from cross-file spy leakage in CI batch runs.
2026-02-21 05:09:12 +09:00
YeonGyu-Kim
165c8122f6 test(events): use baseline snapshot pattern for console spy isolation
Replace exact call count assertions with delta-based checks:
- capture errorSpy.mock.calls.length before processing events
- slice to only check calls made during this test's execution
- use try/finally to guarantee mockRestore() even on assertion failure

This prevents test pollution from cross-file spy leakage in CI batch runs.
2026-02-21 05:09:10 +09:00
YeonGyu-Kim
4268cada8d test(events): use baseline snapshot pattern for console spy isolation
Replace exact call count assertions with delta-based checks:
- capture errorSpy.mock.calls.length before processing events
- slice to only check calls made during this test's execution
- use try/finally to guarantee mockRestore() even on assertion failure

This prevents test pollution from cross-file spy leakage in CI batch runs.
2026-02-21 05:08:58 +09:00
YeonGyu-Kim
8b11fe5402 test: fix flaky timer isolation and dynamic-import non-determinism
- executor.test.ts: capture globalThis.setTimeout/clearTimeout at module level
- events.test.ts: replace dynamic await import with static top-level import
2026-02-21 04:57:18 +09:00
YeonGyu-Kim
70b814a852 test: fix flaky timer isolation and dynamic-import non-determinism
- executor.test.ts: capture globalThis.setTimeout/clearTimeout at module level
- events.test.ts: replace dynamic await import with static top-level import
2026-02-21 04:57:10 +09:00
YeonGyu-Kim
07c89f0091 docs: restore coding on steroids narrative with future-betting manifesto in all READMEs 2026-02-21 04:54:21 +09:00
YeonGyu-Kim
b1eccf7425 docs: update all 31 AGENTS.md files with current project state 2026-02-21 04:38:18 +09:00
YeonGyu-Kim
8938b6349e fix(rebase): restore missing hook export and fix duplicate function in event handler 2026-02-21 04:19:00 +09:00
YeonGyu-Kim
1db26ed114 fix(rebase): restore missing hook export and fix duplicate function in event handler 2026-02-21 04:18:20 +09:00
YeonGyu-Kim
5ae9de0e8e fix: include line number in hashline computation 2026-02-21 04:14:54 +09:00
YeonGyu-Kim
f260d15632 fix(auto-update): support prerelease versions without numeric suffix in fallback 2026-02-21 04:10:27 +09:00
YeonGyu-Kim
88148fe248 fix(auto-update): treat only explicit semver pins as user-pinned
Fixes #1920

Installer-written exact versions (e.g., oh-my-opencode@3.5.2) were incorrectly treated as user-pinned, blocking auto-updates for all installer users.

Fix isPinned to only block auto-update when pinnedVersion is an explicit semver string (user's intent). Channel tags (latest, beta, next) and bare package name all allow auto-update.

Fix installer fallback to return bare PACKAGE_NAME for stable versions and PACKAGE_NAME@{channel} for prerelease versions, preserving channel tracking.
2026-02-21 04:09:50 +09:00
YeonGyu-Kim
67c2cfddf4 fix(migration): remove non-existent gpt-5.3-codex from MODEL_VERSION_MAP
Fixes #1804, fixes #1962

The migration entry 'gpt-5.2-codex → gpt-5.3-codex' caused the plugin to silently overwrite user configs on every startup with a model that doesn't exist in the OpenAI API. Users explicitly setting gpt-5.2-codex (the correct current model) were forced to revert their config manually every session.
2026-02-21 04:08:44 +09:00
YeonGyu-Kim
67f4c7039c test: update model-fallback and chat-headers test expectations
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 03:33:42 +09:00
YeonGyu-Kim
63ccf2abe0 fix(category-resolver): add kimi to unstable agent detection, check category config model
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 03:33:37 +09:00
YeonGyu-Kim
9f09f77588 feat(hooks): export json-error-recovery hook
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 03:33:30 +09:00
YeonGyu-Kim
6153a43c39 fix(hashline-read-enhancer): support plain read output without content tags
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 03:33:26 +09:00
YeonGyu-Kim
fb4530cafe fix(provider-matching): normalize provider names to lowercase for connectivity checks
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 03:33:20 +09:00
YeonGyu-Kim
b9442f51da fix(event): remove duplicate dispatchToHooks from merge artifact
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 03:33:15 +09:00
JiHongKim98
02017a1b70 fix(tools): address PR review feedback from cubic
- Use tool.schema.enum() for output_mode instead of generic string()
- Remove unsafe type assertion for output_mode
- Fix files_with_matches mode returning empty results by adding
  filesOnly flag to parseOutput for --files-with-matches rg output
2026-02-21 03:17:48 +09:00
YeonGyu-Kim
97a48995b2 test(cli): align librarian fallback expectations with actual resolution 2026-02-21 03:10:29 +09:00
YeonGyu-Kim
9059a4fdbc fix(model-requirements): remove custom quotio provider, restore standard providers 2026-02-21 03:03:57 +09:00
JiHongKim98
dafdca217b fix(tools): throttle ripgrep CPU usage with thread limits and concurrency control
- Add --threads=4 flag to all rg invocations (grep and glob)
- Add global semaphore limiting concurrent rg processes to 2
- Reduce grep timeout from 300s to 60s (matches tool description)
- Reduce max output from 10MB to 256KB (prevents excessive memory usage)
- Add output_mode parameter (content/files_with_matches/count)
- Add head_limit parameter for incremental result fetching

Closes #2008

Ref: #674, #1722
2026-02-21 03:02:01 +09:00
YeonGyu-Kim
481106a12e Merge branch 'pr-1959' into dev
# Conflicts:
#	src/hooks/index.ts
#	src/plugin/event.ts
#	src/tools/delegate-task/sync-task.ts
2026-02-21 02:49:39 +09:00
YeonGyu-Kim
f0ff232b43 fix(model-fallback): add gpt-5-nano to multimodal-looker chain, remove librarian hardcoding
- BUG-7: Add gpt-5-nano as final fallback in multimodal-looker model requirements
- BUG-14: Remove hardcoded LIBRARIAN_MODEL, let librarian resolve through normal fallback chain
- Update snapshots and tests to reflect new fallback behavior
2026-02-21 02:47:19 +09:00
YeonGyu-Kim
13196aedb7 fix: resolve post-rebase runtime fallback merge leftovers 2026-02-21 02:45:48 +09:00
YeonGyu-Kim
148687c7fe fix: remove unused spawnFailed variable (dead code) 2026-02-21 02:43:24 +09:00
YeonGyu-Kim
52f62c3fda fix(tmux-deferred): add TTL/max-size guards, null-state exit, and spawn atomicity
- BUG-3: Add DEFERRED_SESSION_TTL_MS (5min) and MAX_DEFERRED_QUEUE_SIZE (20) to prevent unbounded growth
- BUG-15: Track consecutive null window states, stop polling after 3 nulls to prevent immortal loop
- BUG-6: Track close+spawn failure and re-queue deferred session for retry
2026-02-21 02:43:24 +09:00
YeonGyu-Kim
945c7e658a fix(skill/command): add user_message param to skill tool, fix command priority order
- BUG-20: Add optional user_message parameter to skill tool for command arguments
- BUG-19: Reorder command discovery: user > project > opencode-project > opencode-global > builtin
- Update AGENTS.md to reflect slashcommand removal and skill tool changes
2026-02-21 02:42:51 +09:00
IYODA Atsushi
a8e3e1ea01 fix(test): correct browserProvider assertion to match actual behavior
When browserProvider is not set, agent-browser skill should NOT resolve.
Test assertions were inverted — expected 'Skills not found' but asserted the opposite.
2026-02-21 02:42:20 +09:00
IYODA Atsushi
fcaaa11a06 fix(runtime-fallback): detect type:error message parts for fallback progression 2026-02-21 02:42:20 +09:00
IYODA Atsushi
f82e65fdd1 docs(runtime-fallback): clarify timeout_seconds=0 disables auto-retry detection 2026-02-21 02:42:20 +09:00
YeonGyu-Kim
695b8a16b8 fix(ultrawork-db): wrap microtask/setTimeout callbacks in try/catch/finally
Unhandled SQLite exceptions (SQLITE_BUSY, database locked, etc.) in queueMicrotask/setTimeout callbacks could crash the entire process. Added try/catch/finally to ensure db.close() is always called and errors are logged instead of crashing.
2026-02-21 02:42:16 +09:00
Youngbin Kim
b6456faea8 refactor(runtime-fallback): decompose index.ts into focused modules
Split 1021-line index.ts into 10 focused modules per project conventions.

New structure:

- error-classifier.ts: error analysis with dynamic status code extraction

- agent-resolver.ts: agent detection utilities

- fallback-state.ts: state management and cooldown logic

- fallback-models.ts: model resolution from config

- auto-retry.ts: retry helpers with mutual recursion support

- event-handler.ts: session lifecycle events

- message-update-handler.ts: message.updated event handling

- chat-message-handler.ts: chat message interception

- hook.ts: main factory with proper cleanup

- types.ts: updated with HookDeps interface

- index.ts: 2-line barrel re-export

Embedded fixes:

- Fix setInterval leak with .unref()

- Replace require() with ESM import

- Add log warning on invalid model format

- Update sessionLastAccess on normal traffic

- Make extractStatusCode dynamic from config

- Remove unused SessionErrorInfo type

All 61 tests pass without modification.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-21 02:42:12 +09:00
YeonGyu-Kim
cd5e071eda fix(chat-headers): cache internal marker lookups to prevent N+1 API calls
- BUG-4: Add in-memory cache for hasInternalMarker() results with 1000-entry limit
- Eliminates redundant session.message API calls for copilot marker detection
2026-02-21 02:41:46 +09:00
Youngbin Kim
c54da1e670 docs(config): correct retry_on_errors default in schema comment
Update schema comment to match actual code default [400, 429, 503, 529].

Previously the comment omitted 400 which is included in the code default.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-21 02:41:43 +09:00
YeonGyu-Kim
07fa0560c2 fix(hashline-edit): restore leading indentation for first line in replace_lines
- BUG-21: Apply restoreLeadingIndent to first entry of replace_lines, matching set_line behavior
- Update test to verify indentation preservation
2026-02-21 02:41:21 +09:00
Youngbin Kim
1835458054 fix(test): revert atlas test to use uiSelectedModel
Revert test name and assertion to original behavior per PR review feedback.

The test now correctly expects Atlas to respect uiSelectedModel instead of using its own fallback chain.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-21 02:40:47 +09:00
Youngbin Kim
349e820473 fix(config): allow timeout_seconds to be 0 to disable fallback
Previously, the Zod schema rejected timeout_seconds: 0 due to .min(1).
Now it accepts 0-integer values to allow disabling timeout-based fallback.

- Changed z.number().min(1) to z.number().min(0)
- Updated comment to clarify 0 disables timeout checks
- All tests pass (44 runtime-fallback + 46 schema tests)
- Build successful
2026-02-21 02:40:47 +09:00
Youngbin Kim
68f5d982fc feat(runtime-fallback): add timeout toggle for quota retry detection
Make provider auto-retry signal detection respect timeout_seconds setting:
- When timeout_seconds=0, disable quota-based fallback escalation
- Only treat auto-retry signals as errors when timeout is enabled
- Add test to verify behavior when timeout_seconds is disabled
- Update documentation to explain timeout_seconds=0 behavior

This allows users to disable timeout-based fallbacks while keeping
error-based fallback functionality intact.
2026-02-21 02:40:47 +09:00