The Google Meet OAuth login binds a fixed localhost:8085 callback listener
and let listener failures propagate, so meet auth login aborted entirely when
port 8085 was already in use. The sibling Gemini CLI OAuth path already
recovers by switching to the manual copy/paste flow on EADDRINUSE/listen
errors; bring Google Meet to parity by catching listener errors and reusing
the existing manual-paste handler instead of failing the login.
* fix(cron): keep a due recurring run when an edit re-saves the same schedule
update() advanced state.nextRunAtMs to the next future slot whenever a
patch carried schedule or enabled, even when the schedule was unchanged,
dropping an already-due run and re-phasing every-job anchors to now. Gate
the advance on cronSchedulingInputsEqual so only a genuine schedule or
enabled change recomputes, and inherit the previous every anchor when a
re-save omits it, matching the add/remove maintenance recompute.
* fix(cron): re-anchor every-job to edit time on a genuine interval change
Only inherit the previous cadence anchor for an unchanged-interval every
re-save. A real everyMs change (UI omits anchorMs) now re-anchors to the
edit time, matching the prior update semantics, while idempotent re-saves
still preserve a due slot and phase. Adds a regression test for the
interval-change path.
The error handler in tryHandleRootHelpFastPath only set process.exitCode=1
without calling process.exit(). When dangling async handles exist (timers,
connections, promises), the Node event loop stays open and the CLI hangs
indefinitely instead of returning to the terminal.
In tryHandleRootVersionFastPath, the default onError handler called
process.exit(1) directly, bypassing the injected exit seam that the
success path already uses. Changed to exit(1) (deps.exit ?? process.exit)
so tests and embedded callers can observe and control exit on failure.
Added rejection-path tests for version fast path: injected exit called
on resolveVersion rejection, and caller-supplied onError honored.
Fixes#97793.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
estimateMessageTokenPressure special-cased toolResult, tool, and
assistant roles and otherwise read record.content. bashExecution stores
its payload in command/output and branchSummary/compactionSummary store
theirs in summary, so record.content was undefined and those turns
scored as bare boundary overhead. The provider request expands them via
convertToLlm into full user text, so bash-heavy sessions skipped the
preflight overflow gate and submitted oversized prompts.
Estimate each affected role from the exact text convertToLlm renders:
bashExecutionToText for bash turns (zero for excludeFromContext records,
which convertToLlm drops), and the summary prefix/suffix plus summary
text for the two summary roles.
* [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>