* [AI] fix(agents): enable bundled static catalog fallback for cron Attempt 2 (#95500)
Plugin-provided models (e.g. opencode-go/deepseek-v4-flash) are registered
in the bundled static catalog but are not discoverable via agent model
discovery alone. The embedded runner's Attempt 2 (after ensureOpenClawModelsJson)
now passes allowBundledStaticCatalogFallback to resolveModelAsync so these
models are resolved through the static catalog fallback path.
Co-Authored-By: iCodeMate <noreply@anthropic.com>
* fix(agents): trim production comment to durable contract per ClawSweeper P3
* fix(agents): enforce plugin policy for static catalog fallback
Signed-off-by: sallyom <somalley@redhat.com>
---------
Signed-off-by: sallyom <somalley@redhat.com>
Co-authored-by: iCodeMate <noreply@anthropic.com>
Co-authored-by: sallyom <somalley@redhat.com>
* fix(session-memory): only skip delivery-mirror duplicates, preserve unique DM rows
- Skip delivery-mirror rows only when their text duplicates the preceding
assistant text (fixes#92563)
- Delivery-mirror rows with unique visible content (e.g., message-tool
replies) are preserved
- Gateway-injected standalone assistant replies are preserved
- Combined with upstream sanitizeSessionMemoryTranscriptText
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(session-memory): reset assistant-text tracking across user turns
lastAssistantText persisted across user messages, causing delivery-mirror
rows that echoed a previous turn's assistant text to be incorrectly
filtered. Reset lastAssistantText to undefined when a visible user
message is emitted, so cross-turn delivery-mirror duplicates are
preserved while same-turn duplicates are still skipped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(session-memory): reset mirror dedupe on command turns
Signed-off-by: sallyom <somalley@redhat.com>
---------
Signed-off-by: sallyom <somalley@redhat.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: sallyom <somalley@redhat.com>
* fix(os): use sw_vers for macOS version on Darwin instead of os.release()
* fix: cache sw_vers, keep resolveOsSummary().release as raw kernel version
Addresses ClawSweeper P1 findings on #95225:
1. Cache sw_vers output for process lifetime: resolveDarwinProductVersion()
is called on the agent prompt hot path (3 callers via resolveOsProductLabel).
Without caching, every prompt build spawns a synchronous subprocess.
Added module-level cache + _resetCachedDarwinProductVersion() for tests.
2. Keep resolveOsSummary().release as os.release(): changing release from
raw kernel to product version breaks status JSON and trajectory metadata
consumers that expect the Darwin kernel release. The darwin product
version is now used only in the label field.
* fix(os): preserve runtime OS labels off Darwin
A non-zero internal tool exit (Codex marks any non-zero exit as failed,
e.g. a no-match shell search) was promoted to a primary red "Tool error"
banner in Control UI even when the turn produced a clean assistant reply.
Compute a per-tool-group turnSucceeded signal at the chat projection
boundary and de-promote such non-terminal failures to a collapsed tool
summary; detail stays available on expand. Genuinely terminal tool
failures still surface.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Regression coverage for #59416: when live /models metadata wins over the
static xhigh allowlist, non-Claude mini-family ids (e.g. gpt-5.4-mini)
must gain xhigh from their resolved compat, while ids whose live effort
list lacks xhigh (e.g. gpt-5-mini) must not over-grant it.
The live-first model catalog union and models-defaults removal are
already in origin/main (75405f64d0, 46c42d4a0d, d2279591bf); this PR now
contributes only the still-missing regression tests on top of that base.
Co-authored-by: saju01 <saju@coderedcorp.com>