Commit Graph

6507 Commits

Author SHA1 Message Date
YeonGyu-Kim 1fa97c6efe docs(publish): require discord announcement 2026-05-13 17:39:40 +09:00
github-actions[bot] f44d94413c release: v4.1.1 2026-05-13 08:15:11 +00:00
YeonGyu-Kim 3b4d2431ee fix(hooks): guard stale idle prompts 2026-05-13 17:02:17 +09:00
YeonGyu-Kim a337635e3b fix(background-agent): defer active parent wakes 2026-05-13 17:02:17 +09:00
github-actions[bot] 0b99168b7b @EmiyaKiritsugu3 has signed the CLA in code-yeongyu/oh-my-openagent#3990 2026-05-13 07:31:21 +00:00
YeonGyu-Kim 39fb0143da Merge pull request #3986 from code-yeongyu/fix/continuation-message-dispatch
fix(continuation): mark resumed prompts synthetic
2026-05-13 13:46:23 +09:00
YeonGyu-Kim 36f51ddb16 fix(continuation): mark fallback resumes synthetic 2026-05-13 13:36:25 +09:00
YeonGyu-Kim 1189b96d42 fix(continuation): mark atlas resumes synthetic 2026-05-13 13:25:01 +09:00
YeonGyu-Kim e49ba94728 chore(deps): refresh platform lock entries 2026-05-13 13:15:14 +09:00
YeonGyu-Kim 38b1433ff5 fix(continuation): mark resumes synthetic 2026-05-13 13:09:26 +09:00
YeonGyu-Kim 3f92264311 fix(interactive-bash): prohibit tmux kill-server 2026-05-13 13:07:13 +09:00
YeonGyu-Kim 286f5ccfdf when publish always discord 2026-05-13 11:44:47 +09:00
github-actions[bot] 9edaa6e90b release: v4.1.0 2026-05-13 02:32:42 +00:00
YeonGyu-Kim 21460713e3 .opencode to .agents 2026-05-13 11:08:08 +09:00
YeonGyu-Kim a0b46309b4 remove hyperplan for .opencode (not as a feature) 2026-05-13 10:59:15 +09:00
Jacob Schechter 711b75345b fix(delegate-task): honor user fallback_models when category primary is unreachable
resolveModelForDelegateTask returned input.userModel immediately without
availability checking when it was set, silently ignoring the user's
configured fallback_models. Effect: a team-mode category member
(e.g. hyperplan's 'artistry' category) configured with

  { model: "opencode/gemini-3.1-pro", fallback_models: [...] }

spawned with the unreachable primary even though a listed fallback was
reachable, leading to a dropped/broken team member instead of graceful
degradation.

Now, when the provider-models cache is warm AND userFallbackModels is
non-empty, the function verifies userModel is reachable via
fuzzyMatchModel. If not, it iterates userFallbackModels and promotes the
first reachable entry. Cold-cache (first-run) behavior is preserved -
the userModel is returned as-is when availability data is unavailable,
matching the existing 'trust the user' contract covered by the
pre-cache test fixtures.

Adds three regression tests covering: (1) unreachable primary + reachable
fallback -> fallback promoted, (2) reachable primary + reachable fallback
-> primary kept (fast path), (3) unreachable primary + unreachable
fallback -> legacy trust-user behavior preserved.
2026-05-12 19:07:54 -05:00
Ivan Smetanin 83c3379b5a Merge branch 'dev' into fix/surface-subagent-quota-error 2026-05-12 22:17:38 +01:00
tw-yshuang 12f5233877 merge(dev): resolve latest manager and runtime-fallback conflicts
Sync the PR branch with the newest dev branch and resolve the new import-level conflicts in background-agent manager and runtime-fallback tests. Preserve both the delegated bootstrap coverage from this branch and the newer upstream test utilities and runtime wiring changes, then re-verify the affected delegated fallback suites and typecheck.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 22:49:57 +08:00
MoerAI 5cd95cf57e fix(background-agent): fall back to partInfo.input when state.input is unavailable for circuit breaker (fixes #3962)
The circuit breaker in manager.ts uses recordToolCall to detect when a subagent gets stuck repeating identical tool_use blocks. It passed partInfo.state?.input as the tool-input signature. When a model (Kimi K2.6 in the reporter's case) emits duplicate tool_use parts faster than the tool actually starts running, state.input is still null, so loop-detector falls back to the bare 'tool::__unknown-input__' signature. As soon as one part has state.input populated (next event), the signature flips to 'tool::{actual-args}' and the consecutive counter resets to 1, repeatedly. The breaker never reaches its 20-call threshold.

Add a top-level input?: Record<string, unknown> field to the local MessagePartInfo interface and prefer state.input when present, falling back to the part's own input when state is still pre-running. The OpenCode part payload carries the tool input as soon as the tool_use block is generated, so this fallback restores signature stability across the model's repeated emissions.

Verification: added 2 regression tests in manager-circuit-breaker.test.ts. Test 1 (reproduce) emits 20 part.updated events with only top-level input and asserts the task is cancelled by the breaker — fails before the fix, passes after. Test 2 confirms that when state.input IS present, it still wins over the top-level input (precedence preserved). All 10 manager-circuit-breaker tests pass, all 20 loop-detector tests pass, typecheck clean.
2026-05-12 19:02:20 +09:00
MoerAI c4e88d63ea fix(agents): add run_in_background to category task() examples in prompts (fixes #3960)
The task() tool schema declares run_in_background as a REQUIRED parameter, but three prompt-template files contained category-based task() examples that omitted it. When agents copied these patterns into actual tool calls, the runtime validator threw 'run_in_background parameter is REQUIRED', breaking delegation.

Add run_in_background=false to the four offending category-based examples: 2 in src/agents/dynamic-agent-category-skills-guide.ts (Delegation Pattern + Category Domain Matching CORRECT/WRONG pair), 1 in src/agents/hephaestus/gpt-5-3-codex.ts (frontend example), and 1 in src/agents/sisyphus/gemini.ts (Example 4 DELEGATE). Subagent-type explore/librarian examples already correctly use run_in_background=true. atlas/shared-prompt.ts examples were already correct.

Verification: bun test src/agents/ — 373 pass, 0 fail. bun run typecheck — clean. Grep confirms no remaining category task() examples lack the parameter.
2026-05-12 18:56:24 +09:00
YeonGyu-Kim 75825eb9a6 fix(todo-description-override): add OpenCode schema contract for string priorities 2026-05-12 18:18:52 +09:00
YeonGyu-Kim c740ed8aca fix(delegate-task): route sync prompts by directory 2026-05-12 18:14:17 +09:00
YeonGyu-Kim 6035a551ad fix(background-agent): route session prompts by directory 2026-05-12 18:13:39 +09:00
YeonGyu-Kim 7d09d2c83c Merge pull request #3967 from code-yeongyu/refactor/typescript-no-excuse-slops
Remove unsafe TypeScript test assertions
2026-05-12 17:27:38 +09:00
YeonGyu-Kim 730d72c9af test: require explicit unsafe test value type
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 16:30:00 +09:00
YeonGyu-Kim d5fbada13d test: make unsafe test coercion explicit
Move test coercion out of a hidden global and require each test to import the helper so review tools and runtime scripts can see the unsafe boundary.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:51:31 +09:00
YeonGyu-Kim ce5da13fc5 test: add bun types to test setup
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:48:46 +09:00
YeonGyu-Kim 2fc1786077 test(hashline): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:48:46 +09:00
YeonGyu-Kim fb135d047c test(tools): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:48:46 +09:00
YeonGyu-Kim 8b093a1115 test(shared): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim f05aeaa63a test(plugin): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim 0787867384 test(ralph-loop): remove unsafe fixture assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim 23211159c9 test(hooks): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim 11b3638493 test(features): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim 7365163885 test(cli): remove unsafe test assertions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim 9c6090a208 test: add typed test coercion helper
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-12 15:41:17 +09:00
YeonGyu-Kim 4150092e9a test: run suite through isolated mock runner 2026-05-12 15:30:45 +09:00
YeonGyu-Kim cde14b5e37 fix(call-omo-agent): restrict callable agents 2026-05-12 15:28:57 +09:00
YeonGyu-Kim 9ffef79dbb fix(ralph-loop): ignore synthetic idle replays 2026-05-12 15:28:46 +09:00
YeonGyu-Kim 07797e1975 fix(background-agent): preserve direct all-complete replies 2026-05-12 15:28:35 +09:00
github-actions[bot] 2d20037d35 @jas32096 has signed the CLA in code-yeongyu/oh-my-openagent#3966 2026-05-12 04:48:25 +00:00
YeonGyu-Kim d82f6a6024 fix(background-agent): refresh stale todo state 2026-05-12 13:28:40 +09:00
YeonGyu-Kim ec3a7bb1ea Merge pull request #3965 from code-yeongyu/fix/ralph-loop-prompt-result
fix(ralph-loop): return prompt dispatch failures
2026-05-12 13:24:33 +09:00
YeonGyu-Kim 2c0f8e4645 fix(ralph-loop): return prompt dispatch failures 2026-05-12 13:14:07 +09:00
YeonGyu-Kim 2d656bd6bf Merge pull request #3964 from code-yeongyu/fix/electron-bun-runtime-shims
fix(electron): eliminate raw Bun.* runtime calls so plugin loads on OpenCode Desktop
2026-05-12 13:00:49 +09:00
YeonGyu-Kim 8e07ef642e fix(mcp-oauth): use fixed localhost base for callback URL parsing
Cubic AI reviewer flagged the use of the untrusted Host header as the
URL base in startCallbackServer. The server only binds to 127.0.0.1,
so hardcoding "http://127.0.0.1" as the URL base is robust against
malformed or manipulated Host values and matches upstream behavior
prior to the node:http refactor.
2026-05-12 12:54:24 +09:00
YeonGyu-Kim 100819f0bc ci: build plugin before running tests
The dist-bundle regression tests in
src/shared/dist-bundle-bun-globals.test.ts are guarded by
`test.skipIf(!existsSync("dist/index.js"))` and dist/ is
gitignored, so they silently skipped in CI which ran tests before
the build step. Adding the build step earlier ensures the
regression guard runs and a future raw `Bun.*` leak in the bundle
fails CI.
2026-05-12 12:46:50 +09:00
YeonGyu-Kim db3256baf6 test: harden dist-bundle regression guard + Node smoke test
Existing test only checked `globalThis.Bun` top-level destructures
and `__require` calls. Add two new test cases:

1. Raw Bun runtime API scanner: scans dist/index.js for any
   `Bun.<anyMethod>(` or `Bun.<anyMethod>.` call outside shim-safe
   patterns (runtime.Bun, globalThis.Bun, typeof Bun, and the
   "Bun is not defined" error-message string). Uses a negative
   lookbehind so shim indirection (`runtime.Bun.foo`) passes.

2. Node smoke test: imports dist/index.js under
   `node --input-type=module` and asserts stderr contains no
   `ReferenceError` and no `Bun is not defined`. The existing
   case 3 only checked exit code, which masked lazy-evaluation
   crashes that fire after import. Reading exports forces lazy
   module-level evaluation paths to run.
2026-05-12 12:46:50 +09:00
YeonGyu-Kim 11529394aa refactor(cli): use Response(stream).text() instead of Bun.readableStreamToText
bun-install.ts streamToText() was reachable from the plugin bundle via
the cli/config-manager barrel re-export. Replace with the WHATWG
standard `new Response(stream).text()` pattern which works
identically in Bun and Node and avoids the last raw Bun.* runtime
call in dist/index.js.
2026-05-12 12:46:50 +09:00
YeonGyu-Kim 22c7e4eb8e refactor(mcp-oauth): replace Bun.serve with node:http in callback-server
The OAuth callback server was using Bun.serve, which would crash if
mcp-oauth code paths ever entered the plugin bundle. Switch to
node:http.createServer with the same WHATWG behavior:

- Binds to 127.0.0.1, preserves 200/400/404 status codes
- Translates fetch(Request)→Response to (req, res) callback style
- Clears OAuth timeout on success/error/missing-param paths
- Replaces server.stop(true) with server.close() for shutdown

Functional behavior and response bodies unchanged.
2026-05-12 12:46:50 +09:00