Keep reset/deleted session archives searchable while preserving visibility filtering, and keep internal cron-run archives opaque when live ownership metadata is gone.\n\nRefs #56131.\nThanks @buyitsydney.
Summary:
- The PR adds a scoped standalone memory-slot plugin load for doctor/status memory resolution, updates memory-runtime regression tests, and adds a changelog fix entry.
- Reproducibility: yes. source-reproducible: current main's doctor/status path reads getMemoryRuntime after on ... registers that runtime only during plugin activation. I did not run a live macOS LaunchAgent reproduction.
Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(cli): load memory plugin for doctor/status when registry is cold
Validation:
- ClawSweeper review passed for head a6a1967316.
- Required merge gates passed before the squash merge.
Prepared head SHA: a6a1967316
Review: https://github.com/openclaw/openclaw/pull/76393#issuecomment-4365255585
Co-authored-by: Neerav Makwana <261249544+neeravmakwana@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Externalize @larksuiteoapi/node-sdk from the bundled Feishu ESM runtime so packaged startup loads the SDK as a plugin-local runtime dependency instead of inlining the SDK's ESM __dirname path.
Adds changelog credit and a tsdown-config regression assertion.
Fixes#76291.
Fixes#76494.
Co-authored-by: Chris Zhang <4436110+zqchris@users.noreply.github.com>
Summary:
- The PR adds an internal Tree-sitter-backed shell command explainer under `src/infra`, parser runtime/tests, dependency/build-policy updates, an index export, and a changelog entry.
- Reproducibility: not applicable. this is a feature PR rather than a bug report. For the prior PR blocker, source inspection shows byte-to-string span conversion and focused Unicode span coverage on the exact head.
Automerge notes:
- Ran the ClawSweeper repair loop before final review.
- Included post-review commit in the final squash: Repair shell command explainer automerge blockers
- Included post-review commit in the final squash: fix(clawsweeper): address review for automerge-openclaw-openclaw-7500…
Validation:
- ClawSweeper review passed for head 47577579e9.
- Required merge gates passed before the squash merge.
Prepared head SHA: 47577579e9
Review: https://github.com/openclaw/openclaw/pull/75004#issuecomment-4351322592
Co-authored-by: Jesse Merhi <jessejmerhi@gmail.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
* fix(openai-codex): honor providerConfig.baseUrl in dynamic-model synthesis fallback
The synthesis fallback in resolveCodexForwardCompatModel hardcoded
OPENAI_CODEX_BASE_URL when the model registry had no template row to
clone, which meant openai-codex providers configured with a custom
baseUrl (e.g. a local proxy that forwards Codex traffic) silently
fell back to api.openai.com / chatgpt.com - bypassing the proxy and
typically failing the auth contract.
Synthesis now reads ctx.providerConfig.baseUrl when present, with the
existing OPENAI_CODEX_BASE_URL constant as the fallback. No effect on
template-clone or registry-find paths, which already inherit the
configured baseUrl through the cloned template.
* docs(changelog): add Unreleased Fixes entry for #76428 codex synthesis baseUrl honor
* fix(gateway): read-only fast path for models.list catalog loading
The gateway model catalog refresh calls loadModelCatalog without
readOnly, triggering ensureOpenClawModelsJson (60-70s), full PI SDK
registry instantiation, auth storage discovery, and live provider
plugin augmentation on every Control UI list/refresh. None of this
is needed for a read-only UI listing.
Three changes:
1. Gateway catalog refresh now passes readOnly: true to loadModelCatalog.
2. In readOnly mode, skip augmentModelCatalogWithProviderPlugins — live
provider discovery is explicit admin/background work, not a UI list
operation.
3. Add a persisted models.json fast path: when readOnly is true, first
try reading the existing models.json directly and converting
providers.<provider>.models[] to catalog rows. Falls back to the
full PI registry path if the file is missing or unreadable.
Observed improvement on a production install:
loadGatewayModelCatalog: 967 entries / 4651ms → 89 entries / 8ms
Live models.list during startup: ~18s → ~2s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(gateway): preserve full model catalog view
* fix(agents): preserve read-only catalog defaults
* fix(agents): preserve provider catalog defaults
---------
Co-authored-by: Marvinthebored <peter@lindsey.jp>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Resolve bare official external plugin IDs through the official catalog before generic npm fallback, preserving explicit npm semantics and catalog integrity through the hook-pack fallback.\n\nFixes #76373.\n\nThanks @bek91 and @vincentkoc.
sessions.list calls buildGatewaySessionRow for every visible session,
running transcript usage fallback, display model inference, cost/context
recomputation, thinking level enumeration, agent runtime metadata, and
plugin extension projection per row. On installs with 30-50+ sessions
this blocks the event loop for 20-80+ seconds, starving Discord
heartbeats and Control UI RPCs.
Add skipTranscriptUsageFallback and lightweightListRow flags to
buildGatewaySessionRow. In lightweight mode, skip transcript usage
fallback, display model inference, cost/context recomputation, thinking
level options, agent runtime metadata, and plugin extension projection.
Use persisted entry fields directly for cost, tokens, and model identity.
listSessionsFromStoreAsync now passes both flags for bulk list rows.
Detail endpoints and single-row loads are unaffected.
Observed improvement on a production install (33 sessions):
sessions.list row construction dropped from ~82s to ~6s.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 803879ec54)
Large transcript JSONL records (multi-MB tool results, file content)
block the event loop via JSON.parse before truncation logic can skip
them. Add a 256 KiB line-size guard to parseTailTranscriptRecord and
extractUsageSnapshotFromTranscriptLine, and replace the full transcript
index scan in readSessionTitleFieldsFromTranscriptAsync with the
existing bounded sync reader.
Observed improvement on a production install (33 sessions):
chat.history dropped from 13-16s to ~1.2s, event loop utilization
from 0.999 to normal, steady-state CPU from ~100% to 0.2-0.3%.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>