Commit Graph

3605 Commits

Author SHA1 Message Date
YeonGyu-Kim fd69f6ed0e fix(plugin): normalize injected server base URL
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 13:37:54 +09:00
Hakancan a2687a8d02 fix(sdk): use dynamic port instead of hardcoded 4096 (fixes #2311)
- TmuxSessionManager resolves server URL with priority:
  ctx.serverUrl.origin > getServerBaseUrl(client) > OPENCODE_PORT env > localhost:4096
- Inject resolved baseUrl into SDK client (root + session subclient) at
  startup so all session tools use the dynamic port
- Extract shared getInternalClient utility to sdk-internal-client.ts;
  prefer candidate with getConfig/setConfig for correct v1/v2 detection
- Support v1 (client._client) and v2 (client.client) SDK structures
  across opencode-server-auth.ts and opencode-http-api.ts
- Use createMockContext factory for serverUrl overrides in tests
2026-03-12 13:37:54 +09:00
acamq 91b7cedb04 Merge pull request #2446 from win0na/fix/momus-key-trigger-specificity
fix(momus): make keyTrigger specify file-path-only invocation requirement
2026-03-11 20:34:08 -06:00
acamq 0e9073d7d5 Merge pull request #2419 from guazi04/fix/serverurl-throw-getter
fix(tmux): handle serverUrl throw getter from upstream opencode refactor
2026-03-11 20:32:38 -06:00
YeonGyu-Kim b5fb4bb695 Merge pull request #2488 from code-yeongyu/fix/issue-2295-fallback-provider-preserve
fix: preserve session provider context in fallback chain
2026-03-12 11:24:43 +09:00
YeonGyu-Kim e7d658c3a1 Merge pull request #2487 from code-yeongyu/fix/issue-2431-lsp-path-resolution
fix: unify LSP server PATH resolution between detection and spawn
2026-03-12 11:24:41 +09:00
YeonGyu-Kim 5f77f8d0d8 Merge pull request #2484 from code-yeongyu/fix/issue-2393-cubic-error-name
fix: add FreeUsageLimitError to RETRYABLE_ERROR_NAMES set
2026-03-12 11:24:37 +09:00
YeonGyu-Kim 3d91e77689 Merge pull request #2458 from code-yeongyu/fix/memory-leaks
fix: resolve 12 memory leaks (3 critical + 9 high)
2026-03-12 11:21:13 +09:00
YeonGyu-Kim beabca5655 fix: address Cubic findings for provider preserve fallback
- Reorder resolveFallbackProviderID: providerHint now checked before global connected-provider cache
- Revert require('bun:test') hack to standard ESM import in fallback-chain-from-models.test.ts

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:05:31 +09:00
YeonGyu-Kim 0c3102e2c6 fix: address Cubic findings for FreeUsageLimitError classification
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:05:26 +09:00
YeonGyu-Kim 23edacceb8 fix: address Cubic finding for LSP server npm bin path
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:04:43 +09:00
YeonGyu-Kim d4aaf97be5 test(agent-variant): restore hephaestus openai case
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:04:43 +09:00
YeonGyu-Kim 265ef058c9 fix(background-agent): clear pending parent on silent cancel
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:04:35 +09:00
YeonGyu-Kim 9f71a2c829 fix(skill-mcp-manager): guard stale client cleanup
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:04:28 +09:00
YeonGyu-Kim 14aaf4e12a fix(call-omo-agent): track reused sync sessions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 11:04:20 +09:00
github-actions[bot] 1da47731e8 @ChicK00o has signed the CLA in code-yeongyu/oh-my-openagent#2499 2026-03-12 01:26:01 +00:00
github-actions[bot] 33ff5b5609 @djdembeck has signed the CLA in code-yeongyu/oh-my-openagent#2497 2026-03-12 00:48:45 +00:00
acamq bf4c59cef7 Merge pull request #2493 from acamq/fix/fallback-test-regression
fix(test): update agent-variant test model to gpt-5.4
2026-03-11 15:47:23 -06:00
acamq 3c101e1f1d fix(test): update agent-variant test model to gpt-5.4 2026-03-11 15:43:03 -06:00
acamq a32b363644 Merge pull request #2492 from acamq/fix/prometheus-test-regressions
test: update ultrabrain model expectations to gpt-5.4
2026-03-11 15:25:13 -06:00
acamq 054e523acb test: update ultrabrain model expectations to gpt-5.4
The DEFAULT_CATEGORIES ultrabrain model was updated from openai/gpt-5.3-codex
to openai/gpt-5.4 in a previous commit, but test expectations were not updated.

Updated test expectations in:
- src/plugin-handlers/config-handler.test.ts (lines 560, 620)
- src/agents/utils.test.ts (lines 1119, 1232, 1234, 1301, 1303, 1316, 1318)
2026-03-11 15:18:29 -06:00
acamq 4062e7049e Merge pull request #2473 from code-yeongyu/fix/sync-package-json-to-opencode-intent
fix(auto-update): sync cache package.json to opencode.json intent
2026-03-11 14:51:49 -06:00
acamq e7888222f8 fix(auto-update): pipe bun install output and restore other-deps preservation test
background-update-check.ts was using runBunInstall() which defaults to outputMode:"inherit", leaking bun install stdout/stderr into the background session. Reverted to runBunInstallWithDetails({ outputMode: "pipe" }) and explicitly logs result.error on failure.

Restores the accidentally deleted test case asserting that sibling dependencies (e.g. other:"1.0.0") are preserved in package.json after a plugin version sync.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 13:28:12 -06:00
acamq af64f1dcd6 fix(auto-update): expand semver regex to support hyphenated prerelease tags
The previous pattern `(-[\w.]+)?` used `\w` which excludes hyphens, causing versions like `1.2.3-alpha-1` and `1.2.3-rc-test` to be misclassified as unpinned tags. Updated both plugin-entry.ts and sync-package-json.ts (which share the definition) to the spec-compliant pattern that allows dot-separated identifiers using [0-9A-Za-z-] and optional build metadata.

Also adds String() coercion before .trim() in sync-package-json.ts to guard against a TypeError if the parsed JSON value for currentVersion is non-string at runtime.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 13:28:04 -06:00
YeonGyu-Kim eb97c02065 test: update gpt-5.4 fallback expectations
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 02:24:47 +09:00
YeonGyu-Kim c87a616409 fix(background-agent): delay session error task cleanup
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 02:24:42 +09:00
YeonGyu-Kim b3bc441a66 fix(tmux-subagent): cap stale close retries
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 02:24:35 +09:00
YeonGyu-Kim 22a9a1ca0a fix(skill-mcp-manager): drop superseded stale clients
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 02:24:29 +09:00
YeonGyu-Kim 425c9278c4 fix(call-omo-agent): preserve reused session tracking
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 02:24:22 +09:00
YeonGyu-Kim 273838b9c3 fix: remove contaminated await change from FreeUsageLimitError PR
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 01:51:25 +09:00
YeonGyu-Kim 364b77e368 fix: preserve session provider context in fallback chain (#2295) 2026-03-12 01:49:16 +09:00
YeonGyu-Kim 4a1b96744b Merge pull request #2485 from code-yeongyu/fix/issue-2316-tool-after-error-boundary
fix: add error boundary around extract/discard hooks in tool-execute-after
2026-03-12 01:46:51 +09:00
YeonGyu-Kim a8e0cecd09 fix: unify LSP server PATH resolution between detection and spawn (#2431) 2026-03-12 01:44:06 +09:00
YeonGyu-Kim bec09d2190 fix: add error boundary around extract/discard hooks in tool-execute-after (#2316) 2026-03-12 01:41:07 +09:00
YeonGyu-Kim c1a6513505 test(skill-mcp-manager): cover pending cleanup registration retention
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 01:40:34 +09:00
YeonGyu-Kim f9759b9f80 test(skill-mcp-manager): cover disposed guard after disconnectAll
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-12 01:40:34 +09:00
YeonGyu-Kim b5739bcd81 fix: add FreeUsageLimitError to RETRYABLE_ERROR_NAMES set (#2393) 2026-03-12 01:40:24 +09:00
YeonGyu-Kim 6fa0943776 fix: add disposed guard to MCP manager and guard unregister on pending connections 2026-03-12 01:37:03 +09:00
YeonGyu-Kim 0ebe1d5b1b fix: address review-work round 6 findings (dispose isolation, event dispatch, disconnectedSessions ref-counting) 2026-03-12 01:37:03 +09:00
YeonGyu-Kim 0b3fed312b fix(background-agent): handle async shutdown in process-cleanup signal handlers 2026-03-12 01:37:03 +09:00
YeonGyu-Kim a02dd8abaf fix: address review-work round 3 findings (async shutdown, signal generation, stale test name) 2026-03-12 01:37:03 +09:00
YeonGyu-Kim fe5c610e0e fix: address review-work round 2 findings
- MCP teardown race: add shutdownGeneration counter to prevent
  in-flight connections from resurrecting after disconnectAll
- MCP multi-key disconnect race: replace disconnectedSessions Set
  with generation-based Map to track per-session disconnect events
- MCP clients: check shutdownGeneration in stdio/http client
  creators before inserting into state.clients
- BackgroundManager: call clearTaskHistoryWhenParentTasksGone after
  timer-based task removal in scheduleTaskRemoval and notifyParentSession
- BackgroundManager: clean completedTaskSummaries when parent has
  no remaining tasks
- Plugin dispose: remove duplicate tmuxSessionManager.cleanup call
  since BackgroundManager.shutdown already handles it via onShutdown
2026-03-12 01:37:03 +09:00
YeonGyu-Kim e1d864eb83 fix: address 5 edge cases from review-work findings
- C3: include command args in auto-slash-command dedup key
- H2: track completed task summaries for ALL COMPLETE message
- H9: increment tmux close retry count on re-mark
- H8: detect stale MCP connections after disconnect+reconnect race
- H8: guard disconnectedSessions growth for non-MCP sessions
- C1: await tmux cleanup in plugin dispose lifecycle
2026-03-12 01:37:03 +09:00
YeonGyu-Kim 1ede1f4e12 test(background-agent): update completion timer test for per-task cleanup
Test expected timers only after allComplete, but H2 fix intentionally
decoupled per-task cleanup from sibling completion state. Updated
assertion to expect timer after individual task notification.
2026-03-12 01:37:03 +09:00
YeonGyu-Kim 66365b344c fix(plugin): add dispose lifecycle for full teardown on reload
Plugin created managers, hooks, intervals, and process listeners on
every load but had no teardown mechanism. On plugin reload, old
instances remained alive causing cumulative memory leaks.

- Add createPluginDispose() orchestrating shutdown sequence:
  backgroundManager.shutdown() → skillMcpManager.disconnectAll() →
  disposeHooks()
- Add disposeHooks() aggregator with safe optional chaining
- Wire dispose into index.ts to clean previous instance on reload
- Make dispose idempotent (safe to call multiple times)

Tests: 4 pass, 8 expects
2026-03-12 01:37:03 +09:00
YeonGyu-Kim 30323d025c fix(background-agent): fix 3 memory leaks in task lifecycle management
H3: cancelTask(skipNotification=true) now schedules task removal.
Previously the early return path skipped cleanup, leaking task objects
in this.tasks Map permanently. Extracted scheduleTaskRemoval() helper
called from both skipNotification and normal paths.

H2: Per-task completion cleanup timer decoupled from allComplete check.
Previously cleanup timer only ran when ALL sibling tasks completed. Now
each finished task gets its own removal timer regardless of siblings.

H1+C2: TaskHistory.clearAll() added and wired into shutdown(). Added
clearSession() calls on session error/deletion and prune cycles.
taskHistory was the only data structure missed by shutdown().

Tests: 10 pass (3 cancel + 3 completion + 4 history)
2026-03-12 01:37:03 +09:00
YeonGyu-Kim 1333fd82cd fix(skill-mcp-manager): remove process listeners on disconnect and guard connection races
H7: Process 'exit'/'SIGINT' listeners registered per-session were
never removed when all sessions disconnected, accumulating handlers.
- Add unregisterProcessCleanup() called in disconnectAll()

H8: Race condition where disconnectSession() during pending connection
left orphan clients in state.clients.
- Add disconnectedSessions Set to track mid-flight disconnects
- Check disconnect marker after connection resolves, close if stale
- Clear marker on reconnection for same session

Tests: 6 pass (3 disconnect + 3 race)
2026-03-12 01:37:03 +09:00
YeonGyu-Kim 4f127ed104 fix(tmux-subagent): retry pending pane closes to prevent zombie panes
When queryWindowState returned null during session deletion, the
session mapping was deleted but the real tmux pane stayed alive,
creating zombie panes.

- Add closePending/closeRetryCount fields to TrackedSession
- Mark sessions closePending instead of deleting on close failure
- Add retryPendingCloses() called from onSessionCreated and cleanup
- Force-remove mappings after 3 failed retry attempts
- Extract TrackedSessionState helper for field initialization

Tests: 3 pass, 9 expects
2026-03-12 01:37:02 +09:00
YeonGyu-Kim 2d17a2b8d1 fix(todo-continuation-enforcer): expose prune interval for cleanup
Prune interval created inside hook was not exposed for disposal,
preventing cleanup on plugin unload.

- Add dispose() method that clears the prune interval
- Export dispose in hook return type

Tests: 2 pass, 6 expects
2026-03-12 01:37:02 +09:00
YeonGyu-Kim 1e29bf8b50 fix(runtime-fallback): clear monitoring interval on dispose
setInterval for model availability monitoring was never cleared,
keeping the hook alive indefinitely with no dispose mechanism.

- Add dispose() method to RuntimeFallbackHook that clears interval
- Track intervalId in hook state for cleanup
- Export dispose in hook return type

Tests: 3 pass, 10 expects
2026-03-12 01:37:02 +09:00