perf(whatsapp): narrow runtime setter entry#85589
Conversation
|
Codex review: needs maintainer review before merge. Latest ClawSweeper review: 2026-05-23 03:04 UTC / May 22, 2026, 11:04 PM ET. Workflow note: Future ClawSweeper reviews update this same comment in place. How this review workflow works
Summary Reproducibility: not applicable. this is a performance cleanup PR, not a bug report with a failing user flow. The PR body gives a profile-derived estimate, and I verified the current source path the patch narrows. PR rating Rank-up moves:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. Real behavior proof Risk before merge
Maintainer options:
Next step before merge Security Review detailsBest possible solution: Land the narrow setter-entry split if maintainers accept the profile-derived justification, with a follow-up profile or guardrail test only if they want stronger regression proof before merge. Do we have a high-confidence way to reproduce the issue? Not applicable: this is a performance cleanup PR, not a bug report with a failing user flow. The PR body gives a profile-derived estimate, and I verified the current source path the patch narrows. Is this the best way to solve the issue? Yes: using a setter-only top-level entry is the same maintainable pattern already used by Slack, Discord, Telegram, and Matrix, and it preserves Label changes:
Label justifications:
Acceptance criteria:
What I checked:
Likely related people:
Codex review notes: model gpt-5.5, reasoning high; reviewed against 304ff68c7975. |
|
ClawSweeper PR egg ✨ Hatched: 💎 rare Gilded Patch Peep Hatch commandComment Hatchability rules:
Rarity: 💎 rare. What is this egg doing here?
|
…9bef (#232) * perf(whatsapp): narrow runtime setter entry (openclaw#85589) * fix openclaw#84857: skip CLI runtime harness preflight during compaction (openclaw#85862) Summary: - The PR skips agent-harness compaction preflight for provider-owned or configured CLI runtime sessions, adds claude-cli regression coverage, includes a changelog entry, and applies small test/type cleanups. - Reproducibility: yes. at source level. Current main still routes provider-owned `claude-cli` runtime compaction preflight through harness selection, where `claude-cli` is not a registered embedded harness. Automerge notes: - PR branch already contained follow-up commit before automerge: fix openclaw#84857: skip CLI runtime harness preflight during compaction - PR branch already contained follow-up commit before automerge: fix(clawsweeper): address review for automerge-openclaw-openclaw-8487… Validation: - ClawSweeper review passed for head 1dd8a88. - Required merge gates passed before the squash merge. Prepared head SHA: 1dd8a88 Review: openclaw#85862 (comment) Co-authored-by: 张贵萍0668001030 <zhang.guiping@xydigit.com> Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com> Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com> Approved-by: takhoffman Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com> # Conflicts: # CHANGELOG.md # extensions/meeting-notes/index.test.ts # extensions/meeting-notes/src/tool.ts # src/agents/harness/selection.test.ts # src/agents/harness/selection.ts # src/gateway/server-startup-post-attach.test.ts * fix(sandbox): mount workspace skills read-only * fix(sandbox): block bridge writes to workspace skills # Conflicts: # src/agents/sandbox/fs-paths.ts * fix(sandbox): block remote bridge writes to skills * fix(sandbox): filter remote skill mounts by existing roots * fix: harden sandbox skill mounts (openclaw#85591) # Conflicts: # src/agents/sandbox/workspace-skills-bridge-readonly.test.ts * fix: guard remote sandbox skill roots (openclaw#85591) * fix: close remote sandbox skill symlink aliases (openclaw#85591) * fix: preserve sandbox skill overlay precedence (openclaw#85591) # Conflicts: # src/agents/sandbox/browser.create.test.ts # src/agents/sandbox/docker.config-hash-recreate.test.ts * fix(backup): dereference archive hardlinks # Conflicts: # src/commands/backup-verify.test.ts # src/infra/backup-create.test.ts # src/infra/backup-create.ts * fix(backup): reject missing hardlink targets * fix(whatsapp): serialize Error in auto-reply delivery log (openclaw#85777) The auto-reply "delivery failed" log path passes a raw Error under the `err` field. tslog's default JSON serialization renders bare Error instances as `{}` because Error own data properties are non-enumerable. Every delivery failure in production therefore logs `err: {}`, forcing operators to guess the underlying Baileys error from timestamp alone. Convert Error to `{ type, message, stack }` plus own-enumerable properties at the log site, so Boom-style subclass diagnostics (output.statusCode, data) and custom OutboundDeliveryError fields (stage, results) survive. Non-Error rejection values pass through unchanged. Tests cover Error, Error subclass (Boom-style), string rejection, and object rejection paths. AI-assisted: Claude Code (Opus 4.7) authored, codex review locally addressed. # Conflicts: # extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.test.ts # extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts * chore: add model-runtime-aliases.ts from upstream (needed by selection.ts) * chore: add model-runtime-policy.ts from upstream (needed by model-runtime-aliases.ts) * fix: correct backup-create.ts writeTarArchiveWithRetry structure (cherry-pick conflict resolution artifact) * fix: add missing upstream types and helpers for build compatibility - Add AgentRuntimePolicyConfig to types.agents-shared.ts - Add agentRuntime field to AgentModelEntryConfig, ModelDefinitionConfig, ModelProviderConfig - Add models field to AgentConfig - Add relativePathEscapesContainerRoot to sandbox/path-utils.ts - Add backup-volatile-filter.ts from upstream (isVolatileBackupPath) - Add writeTarArchiveWithRetry, buildExtensionsNodeModulesFilter to backup-create.ts - Fix resolveConfiguredAgentHarnessPolicy -> resolveAgentHarnessPolicy in selection.ts * fix: revert upstream-only harness restructuring and apply minimal c8b75a7 patch The previous cherry-pick of c8b75a7 (and fa39bef duplicate) introduced upstream-only files (v2.ts, policy.ts, result-classification.ts, etc.) that depend on types not present in gemmaclaw, and corrupted several test files. This commit reverts all wrongly-introduced upstream-only files to their gemmaclaw branch-point state and applies only the actual c8b75a7 change: - Add isCliRuntimeProvider/isCliRuntimeAliasForProvider guards to maybeCompactAgentHarnessSession to skip compaction preflight for CLI runtimes - Add minimal gemmaclaw-compatible tests for the new skip behavior - Remove dead code introduced by the rollback (staging-based archive helpers, unused imports, unreachable functions) - Delete upstream-only meeting-notes extension files not in gemmaclaw - Restore all test files to their gemmaclaw-compatible versions * fix(backup): skip unreadable files in tar filter (EACCES from Docker root-owned files) Docker git clones create root-owned .promisor files that are unreadable on the host. Add accessSync R_OK check in tarFilter to skip such files gracefully. Also fix sandbox tests to use real temp directories instead of hardcoded /tmp/workspace paths for more robust test isolation. * fix(whatsapp): wire onError into dispatcherOptions for delivery failure logging The cherry-pick of f0ec730 added logWhatsAppReplyDeliveryError and normalizeErrForLog but missed wiring onError in dispatcherOptions because the upstream base already had the onError call site (added in a prior upstream commit not in our range). Add the missing onError handler so delivery failures are logged with serialized Error objects. * fix(whatsapp): restore helper types and functions stripped by revert commit Commit 0696195 was overly aggressive: it reverted upstream-only harness files but also stripped ReplyDeliveryInfo, normalizeErrForLog, and logWhatsAppReplyDeliveryError that were legitimately added by our WhatsApp cherry-pick (2688cf4). Restore them so onError can call logWhatsAppReplyDeliveryError correctly. * fix: add whatsapp runtime-setter-api.js to bundled sidecar paths baseline extensions/whatsapp/runtime-setter-api.ts was added by cherry-pick but the generated baseline JSON was not updated. Run runtime-sidecars:gen to add dist/extensions/whatsapp/runtime-setter-api.js. --------- Co-authored-by: Dallin Romney <dallinromney@gmail.com> Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com> Co-authored-by: 张贵萍0668001030 <zhang.guiping@xydigit.com> Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com> Co-authored-by: Jason O'Neal <jason.allen.oneal@gmail.com> Co-authored-by: Peter Steinberger <steipete@gmail.com> Co-authored-by: Youssef Hemimy <53057646+itsuzef@users.noreply.github.com>
Summary
runtime-setter-api.tsentry that exports onlysetWhatsAppRuntimeruntime-api.tsbarrelEstimated Load-Time Impact
From the post-#84649 cold-start CPU profile:
extensions/whatsapp/runtime-api.tsimport accounted for about 1.97s inclusive, or 11.3% of post-profile non-idle CPUruntime-api.tspath was 63.3% of the measured WhatsApp-attributed startup workThis is an estimate from CPU-profile inclusive stack attribution, not a new before/after benchmark. A follow-up cold-start profile should verify the realized wall-clock change.
Verification
node scripts/run-vitest.mjs extensions/whatsapp/index.test.tspnpm buildgit diff --checkNotes
This follows the same runtime setter split already present in:
extensions/slack/runtime-setter-api.tsextensions/discord/runtime-setter-api.tsextensions/telegram/runtime-setter-api.tsextensions/matrix/runtime-setter-api.tsThe broad WhatsApp
runtime-api.tsremains intact for compatibility/runtime callers; bundled registration only needs the setter.Autoreview was attempted with
.agents/skills/autoreview/scripts/autoreview --mode local --no-web-search, but the helper's Codex runner failed before review because the local Codex config containsapproval_policy = prompt, which that runner does not accept.