Commit Graph

6111 Commits

Author SHA1 Message Date
YeonGyu-Kim a328343622 Merge pull request #3299 from kilhyeonjun/fix/claude-code-settings-hooks-not-executed
fix: don't early-return on 'allow' in executePreToolUseHooks, accumulate hook outputs
2026-05-15 19:57:37 +09:00
YeonGyu-Kim 0036c203a2 Merge pull request #3934 from Qihao0v0/fix/unifyllm-quota-classifier
fix(runtime-fallback): classify localized balance failures as quota exhaustion
2026-05-15 19:57:34 +09:00
YeonGyu-Kim c6054af9fa Merge pull request #3872 from x-x-gpu/dev
fix: pass resolved model to session.create so sub-agent sessions use the correct model
2026-05-15 19:56:09 +09:00
YeonGyu-Kim 7da44232a1 Merge pull request #4049 from code-yeongyu/supersede/3790-session-firstmessage-no-clear
fix(hooks): do not clear sessionFirstMessageProcessed on session.idle (supersedes #3790)
2026-05-15 19:51:22 +09:00
brooksbUWO 9f6b68118e fix(hooks): do not clear sessionFirstMessageProcessed on session.idle
SessionStart hooks fire on every user prompt instead of only at session
start. The root cause is clearSessionHookState(), called on every
session.idle event, which clears sessionFirstMessageProcessed. This
resets the isFirstMessage guard, making it always return true, so
SessionStart hooks execute on every prompt.

sessionFirstMessageProcessed is session-level state (tracks whether the
first message has been processed) and should only be cleared in
clearAllSessionHookState() on session deletion/disposal, not on idle.

sessionErrorState and sessionInterruptState remain cleared on idle since
they are per-response transient state.
2026-05-15 19:50:14 +09:00
YeonGyu-Kim ac66a43e99 Merge pull request #4046 from code-yeongyu/fix/3494-strip-zwsp-before-promptasync
fix(atlas,todo-continuation): strip ZWSP sort prefix before promptAsync agent (fixes #3494, supersedes #3547)
2026-05-15 19:45:21 +09:00
YeonGyu-Kim 7caf74a9b9 fix(atlas,todo-continuation): strip ZWSP sort prefix before promptAsync agent
Both injectors call resolveRegisteredAgentName, which returns the
registered alias verbatim. OpenCode TUI registers agent names with
leading zero-width characters (U+200B) for sort ordering, so that
alias can be e.g. "\u200B\u200BAtlas - Plan Executor". Passing it
directly to promptAsync produces "Agent not found" because the
OpenCode SDK does an exact match against its canonical display
name registry.

Strip the ZWSP sort prefix on the resolved name before sending it
to promptAsync in:
- src/hooks/atlas/boulder-continuation-injector.ts
- src/hooks/todo-continuation-enforcer/continuation-injection.ts

Add regression tests asserting promptAsync receives the canonical
display name (no \u200B) even when the registered alias carries
a ZWSP sort prefix. Same root cause class as #3494 / #3547. Tests
were RED on dev before the fix and GREEN after.
2026-05-15 19:44:44 +09:00
YeonGyu-Kim 2b43147c41 Merge pull request #4045 from code-yeongyu/supersede/3901-call-omo-agent-display-name
fix(call-omo-agent): translate config-key subagent_type to display name before SDK dispatch (supersedes #3901)
2026-05-15 19:34:21 +09:00
Sami Jawhar 10f721de1f fix(call-omo-agent): translate config-key subagent_type to display name before SDK dispatch 2026-05-15 19:32:34 +09:00
YeonGyu-Kim 437a8edba6 Merge pull request #4007 from PeterPonyu/feat/runtime-fallback-internal-abort
fix(runtime-fallback): preserve attemptCount when our own abort is the cause
2026-05-15 19:26:53 +09:00
YeonGyu-Kim 5e7ee9418a Merge pull request #3982 from jas32096/fix/category-fallback-ignored-when-primary-set
fix(delegate-task): honor user fallback_models when category primary is unreachable
2026-05-15 19:26:37 +09:00
YeonGyu-Kim 83ab000963 Merge pull request #3972 from MoerAI/fix/circuit-breaker-tool-input-fallback
fix(background-agent): fall back to partInfo.input when state.input is unavailable for circuit breaker (fixes #3962)
2026-05-15 19:20:36 +09:00
YeonGyu-Kim e2b8e49e2f Merge pull request #4044 from code-yeongyu/revert/3825-delegated-bootstrap
Revert "Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback"
2026-05-15 19:18:26 +09:00
YeonGyu-Kim 3c7d1299a7 Revert "Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback"
This reverts commit cd33f3a397, reversing
changes made to 521c99cf0b.
2026-05-15 19:13:48 +09:00
YeonGyu-Kim cd33f3a397 Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback
fix(delegate-task): harden child-session first-prompt fallback recovery
2026-05-15 19:06:43 +09:00
YeonGyu-Kim 521c99cf0b Merge pull request #3950 from ismetanin/fix/surface-subagent-quota-error
fix(runtime-fallback): surface quota errors from stuck subagents
2026-05-15 19:05:34 +09:00
YeonGyu-Kim f00a69398d Merge pull request #3947 from MoerAI/fix/process-cleanup-opt-out-env
fix(background-agent): add OMO_DISABLE_PROCESS_CLEANUP env opt-out for global handlers (fixes #3856)
2026-05-15 18:56:38 +09:00
YeonGyu-Kim c3319c753f Merge pull request #3470 from omer-koren/fix/thinking-block-modified-recovery
fix(session-recovery): add thinking_block_modified error detection and recovery
2026-05-15 18:55:42 +09:00
YeonGyu-Kim 984b8c1a3d Merge pull request #4032 from PeterPonyu/fix/3996-tool-pair-validator-background-sessions
fix(tool-pair-validator): skip placeholder repair for subagent sessions
2026-05-15 18:50:44 +09:00
YeonGyu-Kim 15b0a41fe9 Merge pull request #4043 from code-yeongyu/fix/session-recovery-stale-error-dedupe
fix(session-recovery): persist dedupe across stale repeated session.error
2026-05-15 18:44:44 +09:00
YeonGyu-Kim 8e9dea949b fix(session-recovery): persist dedupe across stale repeated session.error
processingErrors was emptied in a finally block, so a second
session.error fired for the same assistant message id after the
first recovery resolved would re-run abort, history fetch, the
recovery toast, and any auto-resume promptAsync (resumeSession),
producing duplicate internal prompt injections during stale event
re-emission or polling-driven retries.

Drop the in-flight delete and keep the dedupe permanent for the
plugin lifetime. A genuinely new failure starts a new assistant
message with a different id, so this never blocks future legitimate
errors. Same-id duplicates collapse into a single recovery attempt.

Add hook.test.ts asserting that two sequential handleSessionRecovery
calls for the same recoverable info trigger session.abort, the
recovery toast, and any internal promptAsync at most once.
2026-05-15 18:43:53 +09:00
YeonGyu-Kim cb87385086 test(ci): isolate runtime and rules dependencies 2026-05-15 18:36:32 +09:00
YeonGyu-Kim a02686e729 test(ci): remove suite-order mock coupling 2026-05-15 18:21:04 +09:00
YeonGyu-Kim f1fb1e08eb fix(ralph-loop): send registered agent display name on continue
Continuation injector previously called normalizeAgentForPromptKey,
which collapsed agent inputs like "Sisyphus - Ultraworker" or
"sisyphus" down to the lowercase config key (e.g. "sisyphus").
OpenCode's promptAsync rejects that with "Agent not found", so the
ralph-loop continue prompt silently failed to dispatch on parent
sessions whose inherited message used a known display name.

Switch to normalizeAgentForPrompt and add a small wrapper that:
- preserves any agent string already in canonical " - " display form
  verbatim (covers ZWSP-prefixed inheritance and user-defined custom
  agents)
- otherwise normalizes config keys / legacy parenthesized names to the
  registered display name OpenCode expects.

Update the existing regression tests so that ZWSP-prefixed and clean
inherited agents both assert the registered display name reaches
promptAsync.
2026-05-15 18:19:58 +09:00
YeonGyu-Kim b3b2da89c9 test(ci): avoid global module mock leaks 2026-05-15 17:54:59 +09:00
YeonGyu-Kim 8dcbccf063 fix(tmux): inject pane action dependencies 2026-05-15 17:54:43 +09:00
YeonGyu-Kim 7a94cc72be fix(background-agent): stabilize parent wakes 2026-05-15 17:54:32 +09:00
YeonGyu-Kim c0544a703a fix(background-agent): defer retry notifications 2026-05-15 17:29:37 +09:00
YeonGyu-Kim 462b55efc7 Merge pull request #4040 from code-yeongyu/cleanup/typescript-ai-slop-20260515
Refactor TypeScript cleanup patterns
2026-05-15 16:42:10 +09:00
YeonGyu-Kim b6a0be562d test: remove decorative dividers
Drop section-divider comments that duplicated test group labels without adding behavior context.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-15 16:31:13 +09:00
YeonGyu-Kim a9886ccbb7 refactor(plugin): remove metadata assertions
Guard optional plugin metadata and pane identifiers before passing them to cleanup and warning paths.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-15 16:31:13 +09:00
YeonGyu-Kim 0a3d1875f7 refactor(tools): narrow optional values
Avoid non-null assertions in tool and doctor code by preserving narrowed locals through each use site.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-15 16:31:13 +09:00
YeonGyu-Kim d92e78c956 refactor(sdk): narrow response fallbacks
Replace unsafe unknown-array assertions with generic fallback types and explicit todo status narrowing.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-15 16:31:13 +09:00
YeonGyu-Kim 4785767a0c refactor(interactive-bash): reuse tmux parser
Route interactive bash tracking through the existing tmux parser so session name narrowing is shared and type-safe.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-15 16:31:13 +09:00
YeonGyu-Kim d8f52aae7f test: run suite without split runner 2026-05-15 16:26:57 +09:00
YeonGyu-Kim 150ccefa05 fix(delegate-task): allow hidden plan task 2026-05-15 16:03:31 +09:00
YeonGyu-Kim c25cb8dcef fix(background-task): clarify task id contracts 2026-05-15 15:41:30 +09:00
YeonGyu-Kim 15e7330ff0 fix(team-mode): gate status injection by keyword 2026-05-15 15:35:35 +09:00
YeonGyu-Kim 1e7a7a22af Merge pull request #4037 from code-yeongyu/fix/internal-initiator-dedupe
fix(background-agent): avoid branched parent wakes
2026-05-15 15:01:59 +09:00
YeonGyu-Kim cd1c1a5921 fix(background-agent): avoid branched parent wakes 2026-05-15 14:39:55 +09:00
YeonGyu-Kim 9f6d0d2281 docs(agents-md): refresh hierarchical knowledge base for v4.1.2
- Bump root AGENTS.md header: 2026-05-14 → 2026-05-15, commit 5ffbe0e2453a740636, release v4.1.1 → v4.1.2
- Update file counts: 2034 (1337+697) → 2041 (1340+701), LOC ~292k → ~294k
- Fix STRUCTURE: openclaw lives at src/openclaw/ (not src/features/); list more accurate feature modules in the parenthetical
- Clarify interactive_bash gate: tmux binary on PATH via isInteractiveBashEnabled() (not 'tmux enabled')
- Fix docs/reference/features.md hook counts: Tool Guard 14→16, Total base 52→54, total with team-mode 59→61
- Bump 'Generated' date on all 43 subdir AGENTS.md files to 2026-05-15
- Preserve promptAsync injection cautions verbatim (per request)
2026-05-15 13:48:11 +09:00
YeonGyu-Kim 3dd8a5cabf chore(rules): forbid flaky tests, time sleeps, and prompt pinning
Adds .sisyphus/rules/test-discipline.md, auto-injected by
rulesInjector hook whenever an agent reads or edits a test file
(**/*.test.ts, __tests__/**, src/testing/**, test-setup.ts,
script/run-ci-tests.ts).

Rules enforced:
- 'bun test' must pass in one process, one run, no isolation flags
- no setTimeout/sleep in test bodies unless time is the SUT
- event tests must subscribe-before-trigger with explicit timeout
- no .only/.skip/process-isolation to mask state leaks
- prompt-builder tests must assert behavior, not text snapshots

Also un-ignores .sisyphus/rules/ so project-scope rules can be
checked in while keeping .sisyphus/{draft,run-continuation,...}
ignored.
2026-05-15 13:46:26 +09:00
YeonGyu-Kim 53a7406362 no prompt async 2026-05-15 13:35:10 +09:00
YeonGyu-Kim ced722e254 Merge pull request #4034 from code-yeongyu/fix/promptasync-duplicate-output
fix(prompt-async): gate duplicate internal prompts
2026-05-15 13:26:06 +09:00
YeonGyu-Kim c2aa180e7e fix(prompt-gate): pin duplicate prompt dispatches
Keep prompt reservations briefly after successful dispatch so rapid idle/message/error transitions cannot inject the same follow-up twice.

Route all production session prompt calls through the shared gate, restore skipped background resume state, release holds after abort/recovery paths, and preserve Ralph/ULW loop state when a dispatch is deferred.

Add regression coverage for session routing, static prompt route auditing, team-mode live messaging, model suggestion retries, call-omo-agent reuse, background parent wakes, runtime fallback, compaction recovery, Atlas, and Ralph/ULW loops.
2026-05-15 13:19:10 +09:00
YeonGyu-Kim 05189700fb fix(prompt-gate): hold reservations after dispatch 2026-05-15 12:55:56 +09:00
YeonGyu-Kim c6e3b7e1f7 docs(agents-md): warn on prompt injection 2026-05-15 12:55:56 +09:00
YeonGyu-Kim edf3e530d4 fix(hooks): gate sync injected prompts 2026-05-15 12:55:56 +09:00
YeonGyu-Kim 0b48f80569 fix(call-omo-agent): gate reused sync prompts 2026-05-15 12:55:56 +09:00
YeonGyu-Kim 439e72839b fix(runtime-fallback): gate retry prompts 2026-05-15 12:55:56 +09:00