Changed PACKAGE_NAME from 'oh-my-openagent' to 'oh-my-opencode' in
auto-update-checker/constants.ts to match package.json. This fixes
getCachedVersion() returning null, causing 'unknown' in version toast.
TDD: red-green confirmed. 39 tests pass, tsc clean.
Closes#3129
/start-work is the "execute this plan with atlas" command.
Previously, if the user's current session agent was sisyphus (or any
non-prometheus/non-atlas agent), the hook would keep that agent instead
of switching to atlas. This caused sisyphus to execute the plan.
Fix: unconditionally select atlas (when registered) or sisyphus (fallback).
The current session agent is irrelevant to /start-work's intent.
Adds regression test: running /start-work from a sisyphus session must
always hand off to atlas when atlas is available.
- provider.test.ts: reset discovery cache before/after refresh tests to prevent
cross-test contamination via module-level discoveryCache singleton
- completion-promise-session-negative.test.ts: update negative test case to use
non-oracle agent (hephaestus) since oracle tool_result VERIFIED detection was
intentionally added in 56f2a9df
Bug fixes:
1. OAuth token refresh (#3149): buildHttpRequestInit() now attempts silent refresh
via refresh_token before triggering full browser re-auth. Added refresh() method
to McpOAuthProvider. Includes test isolation fix for discovery mock.
2. Quota error STOP (#3126): Added STOP_MESSAGE_PATTERNS in model-error-classifier
that take precedence over RETRYABLE_MESSAGE_PATTERNS. Message-only quota errors
now non-retryable. Runtime-fallback: quota_exceeded with 'retrying in' signal
still triggers fallback (provider-managed auto-retry). Restored removed patterns.
3. Compaction loop (#3127): MAX_RECOVERY_ATTEMPTS=3 cap + additional suppression
guard from opencode session in degradation monitor.
Also: refactored extractAutoRetrySignal to auto-retry-signal.ts, new regression
tests for quota classifier and compaction degradation monitor.
Add MAX_RECOVERY_ATTEMPTS (3) guard to post-compaction degradation recovery.
On models like Kimi/Minimax that repeatedly generate no-text responses,
the recovery loop would trigger indefinitely as each compaction reset the
recovery counter via onSessionCompacted.
The recovery count now persists across compaction cycles per session and
is only reset on session deletion (clear()), not on every compaction.
The test overrides globalThis.setTimeout which conflicts with other atlas
tests when batched by bun test. Adding mock.module forces run-ci-tests.ts
to run this file in its own isolated process.
Also added setSessionAgent for descendant session to fix null agent lookup
in non-SQLite CI environments.
The todo-continuation-enforcer was passing raw agent names (which could be
display names like 'Sisyphus (Ultraworker)') to promptAsync. These names
contain spaces/parentheses that violate HTTP header specs, causing the
x-opencode-agent-name header validation to fail with 'unknown error' toast.
Added normalizeAgentForPromptKey() that converts display names to config keys
(e.g., 'Sisyphus (Ultraworker)' -> 'sisyphus') before API calls.
TDD: Added regression test that verifies config key is sent to promptAsync.
- Add lineage-aware continuation injection logic
- Support for tracking multiple session types (direct vs appended)
- Update tests for new lineage continuation scenarios
- Add session origin validation in continuation flow
🤖 Generated with assistance of OhMyOpenCode
- Update recent-model-resolver for session origin awareness
- Update resolve-active-boulder-session with lineage support
- Add comprehensive test coverage for boulder session resolution
- Add fallback tests for recent model resolver
- Update index tests for new lineage tracking
🤖 Generated with assistance of OhMyOpenCode
- Update background-launch-session-tracking to track session origins
- Add tests for lineage-aware retry scheduling
- Update tool-execute-after to support new tracking
- Add comprehensive tests for background launch continuation
🤖 Generated with assistance of OhMyOpenCode
- Sort messages by creation timestamp for accurate last agent detection
- Add fallback to filename sorting for deterministic ordering
- Add JSON backend test coverage
- Update SQLite backend tests for timestamp-aware sorting
🤖 Generated with assistance of OhMyOpenCode
Update continuation injector to work with new lineage detection.
Refine idle event handling for proper subagent session tracking
and agent mismatch detection.
🤖 Generated with assistance of OhMyOpenCode
Add flag to track when continuation is being injected to prevent
race conditions in boulder session management.
🤖 Generated with assistance of OhMyOpenCode
- Remove kimi from auto-detected unstable agents in category-resolver (only gemini/minimax remain)
- Add resolveCallID() to safely resolve callID/callId/call_id variants from tool context
- Use resolveCallID across all 5 delegate task execution paths (sync, background, unstable, continuations)
- Update writing category test to verify kimi runs sync when kimi provider is available
- Add atlas metadata preservation tests confirming tool-execute-after does not clobber metadata
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add zauc-mocks-bg, zauc-mocks-cache, zauc-mocks-hook,
zauc-mocks-ws, and zauc-sync-mocks directories
- Renamed from _auc-mocks-* to zauc-mocks-* for better organization
🤖 GENERATED WITH ASSISTANCE OF OhMyOpenCode
- Delete background-update-check, cache, hook, workspace-resolution,
and sync-package-json isolated test directories
- These have been renamed/reorganized to zauc-mocks-* pattern
🤖 GENERATED WITH ASSISTANCE OF OhMyOpenCode
- Moved hook.test.ts, background-update-check.test.ts, workspace-resolution.test.ts, and cache.test.ts to separate sibling directories (_auc-mocks-hook, _auc-mocks-bg, _auc-mocks-ws, _auc-mocks-cache)
- Separated sync-package-json.test.ts to _auc-sync-mocks
- Fixed all relative import paths to account for new directory structure
- Bun runs same-directory test files in parallel; mock.module() calls contaminate each other. Only reliable isolation is separate directory = separate CI batch
- CI plan now creates individual isolated target for each mocking test file, preventing cross-file pollution
- Moved hook-integration tests → src/hooks/_auc-mocks-hook/
- Moved workspace-resolution tests → src/hooks/_auc-mocks-workspace/
- Moved background-update-check tests → src/hooks/_auc-mocks-bgupdate/
- Moved cache tests → src/hooks/_auc-mocks-cache/
- Moved sync-package-json tests → src/hooks/_auc-sync-mocks/
- Removed hook.test.ts, workspace-resolution.test.ts, background-update-check.test.ts from auto-update-checker
- Removed cache.test.ts from auto-update-checker
- Each test file with mock.module() now in its own isolated CI batch
- Bun's prefix glob matching was picking up _auc-mocks-* when running auto-update-checker
- Solution: Separate into dedicated directories prevents cross-contamination
CI Results: 3151 pass, 0 fail ✓
sync-package-json.test.ts mocks node:fs which leaks into plugin-entry.test.ts
running in the same CI batch. Move to checker/sync/ subdirectory for isolation.
hook.test.ts mocks ./checker at module load time, which contaminates
checker.test.ts and invalidate-package.test.ts running in parallel in
the same CI batch. Move to hook-integration/ subdirectory for CI batch
isolation.
mock.module('./executor') leaks across all files in the same batch because
Bun runs test files in a directory in parallel. The afterAll restore trick
doesn't work when other files load the module concurrently at startup.
Moving the leak test to its own subdirectory (leak/) ensures CI's batch
runner isolates it in a separate bun test invocation, preventing executor
mock contamination in executor-resolution.test.ts and index.test.ts.