plugins: preserve qveris runtime surfaces#121
Conversation
* fix(memory): align qmd read paths Co-authored-by: zsx <git@zsxsoft.com> * fix(memory): add qmd exact-path read fast path * fix(memory): tighten qmd read-path guards * changelog: note QMD memory_get canonical-path restriction (openclaw#66026) --------- Co-authored-by: zsx <git@zsxsoft.com> Co-authored-by: Devin Robison <drobison@nvidia.com>
…hexsprite) * fix: forward optional params dropped at the runEmbeddedAttempt call site runEmbeddedPiAgent in pi-embedded-runner/run.ts hand-enumerates ~85 fields when calling runEmbeddedAttempt({...}). Several optional fields on RunEmbeddedPiAgentParams were added to the type and to attempt.ts (the consumer) but were never wired at this specific call site. Because every field is declared as ?: optional on EmbeddedRunAttemptParams, TypeScript does not flag the missing fields and the attempt silently receives undefined for each. Four fields were affected: - toolsAllow (openclaw#58504, openclaw#62569): cron's --tools allow-list. Persisted in jobs.json by the CLI, forwarded by cron/isolated-agent/run-executor.ts to runEmbeddedPiAgent, but dropped here. Result: provider request ships the full tool catalog on every cron run regardless of toolsAllow, defeating the ~95% input-token reduction documented in openclaw#58504 and the --tools restriction documented in docs/automation/cron-jobs.md:85. - disableMessageTool: cron/isolated-agent/run-executor.ts:164 sets it from toolPolicy.disableMessageTool, derived at run.ts:110 as `params.deliveryContract === "cron-owned" ? true : params.deliveryRequested`. Every cron-owned delivery (the default per docs) is supposed to disable the message tool so the runner owns the final delivery path. Without forwarding, the agent can call messaging tools mid-cron and cause duplicate or wrong-channel sends. - requireExplicitMessageTarget: cron/isolated-agent/run-executor.ts:163 sets it from toolPolicy.requireExplicitMessageTarget. Has a fallback at attempt.ts:568-569 to `?? isSubagentSessionKey(params.sessionKey)`, so non-subagent crons silently get false instead of the intended value. - internalEvents: agents/command/attempt-execution.ts:478 passes it via params.opts.internalEvents. Different caller path from cron, but the same drop point. Internal events array silently dropped before reaching the consumer at attempt.ts:1480. The fix is four lines in the runEmbeddedAttempt({...}) call, immediately after the bootstrapContextMode/bootstrapContextRunKind lines added by PR openclaw#62264 (which fixed two more fields with the identical pattern at the same call site). A regression test (run.attempt-param-forwarding.test.ts) covers all six optional fields shown to have been bitten by this class of bug at this seam. The next ?: optional field added to RunEmbeddedPiAgentParams without wiring at the runEmbeddedAttempt call site will fail a test instead of silently shipping broken — addressing the missing-guardrail concern PR openclaw#60776's writeup explicitly noted. Verified locally: 6/6 forwarding tests pass, 258 pi-embedded-runner/run* tests pass, 176 cron/isolated-agent tests pass, oxlint and tsgo deltas versus origin/main are zero. Fixes openclaw#62569 * test: distill param forwarding guardrails * fix: restore embedded-run param forwarding (openclaw#62675) (thanks @hexsprite) --------- Co-authored-by: Ayaan Zaidi <hi@obviy.us>
… (openclaw#64790) Merged via squash. Prepared head SHA: 324202d Co-authored-by: feiskyer <676637+feiskyer@users.noreply.github.com> Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com> Reviewed-by: @vincentkoc
… race (openclaw#64188) (openclaw#66528) Merged via squash. Prepared head SHA: 0c4003a Co-authored-by: feiskyer <676637+feiskyer@users.noreply.github.com> Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com> Reviewed-by: @vincentkoc
…7099) * fix(plugins): localize bundled runtime deps to extensions * fix(plugins): move staged runtime deps out of root * fix(packaging): harden prepack and runtime dep staging * fix(packaging): preserve optional runtime dep staging * Update CHANGELOG.md * fix(packaging): harden runtime staging filesystem writes * fix(docker): ship preinstall warning in bootstrap layers * fix(packaging): exclude staged plugin node_modules from npm pack
…claw#67047) Merged via squash. Prepared head SHA: 5ce11d0 Co-authored-by: Unayung <1853105+Unayung@users.noreply.github.com> Co-authored-by: frankekn <712880+frankekn@users.noreply.github.com> Reviewed-by: @frankekn
…ync-2026-04-15 # Conflicts: # .github/workflows/install-smoke.yml # docs/.generated/config-baseline.json # docs/.generated/config-baseline.jsonl # docs/.generated/plugin-sdk-api-baseline.json # docs/.generated/plugin-sdk-api-baseline.jsonl # docs/channels/feishu.md # docs/ci.md # extensions/acpx/package.json # extensions/amazon-bedrock/package.json # extensions/anthropic-vertex/package.json # extensions/anthropic/package.json # extensions/bluebubbles/package.json # extensions/brave/package.json # extensions/browser/package.json # extensions/browser/src/browser/routes/agent.debug.ts # extensions/browser/src/browser/routes/agent.snapshot.ts # extensions/browser/src/browser/routes/agent.storage.ts # extensions/byteplus/package.json # extensions/chutes/package.json # extensions/cloudflare-ai-gateway/package.json # extensions/copilot-proxy/package.json # extensions/deepgram/package.json # extensions/deepseek/package.json # extensions/diagnostics-otel/package.json # extensions/diffs/package.json # extensions/discord/package.json # extensions/discord/src/monitor/agent-components-helpers.ts # extensions/discord/src/monitor/agent-components.ts # extensions/discord/src/monitor/native-command.ts # extensions/discord/src/monitor/provider.ts # extensions/duckduckgo/package.json # extensions/elevenlabs/package.json # extensions/exa/package.json # extensions/fal/package.json # extensions/feishu/package.json # extensions/firecrawl/package.json # extensions/github-copilot/package.json # extensions/google/package.json # extensions/googlechat/package.json # extensions/groq/package.json # extensions/huggingface/package.json # extensions/image-generation-core/package.json # extensions/imessage/package.json # extensions/irc/package.json # extensions/kilocode/package.json # extensions/kimi-coding/package.json # extensions/line/package.json # extensions/line/src/bot-message-context.ts # extensions/litellm/package.json # extensions/llm-task/package.json # extensions/lobster/package.json # extensions/matrix/CHANGELOG.md # extensions/matrix/package.json # extensions/mattermost/package.json # extensions/media-understanding-core/package.json # extensions/memory-core/package.json # extensions/memory-lancedb/package.json # extensions/microsoft-foundry/package.json # extensions/microsoft/package.json # extensions/minimax/package.json # extensions/mistral/package.json # extensions/modelstudio/package.json # extensions/moonshot/package.json # extensions/msteams/CHANGELOG.md # extensions/msteams/package.json # extensions/nextcloud-talk/package.json # extensions/nostr/CHANGELOG.md # extensions/nostr/package.json # extensions/nvidia/package.json # extensions/ollama/package.json # extensions/open-prose/package.json # extensions/openai/package.json # extensions/opencode-go/package.json # extensions/opencode/package.json # extensions/openrouter/package.json # extensions/openshell/package.json # extensions/perplexity/package.json # extensions/qianfan/package.json # extensions/qqbot/package.json # extensions/searxng/package.json # extensions/sglang/package.json # extensions/signal/package.json # extensions/slack/package.json # extensions/speech-core/package.json # extensions/stepfun/package.json # extensions/synology-chat/package.json # extensions/synthetic/package.json # extensions/tavily/package.json # extensions/telegram/package.json # extensions/telegram/src/bot-handlers.buffers.ts # extensions/telegram/src/bot.ts # extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts # extensions/telegram/src/fetch.network-policy.test.ts # extensions/tlon/package.json # extensions/together/package.json # extensions/twitch/CHANGELOG.md # extensions/twitch/package.json # extensions/venice/package.json # extensions/vercel-ai-gateway/package.json # extensions/vllm/package.json # extensions/voice-call/CHANGELOG.md # extensions/voice-call/package.json # extensions/volcengine/package.json # extensions/whatsapp/package.json # extensions/whatsapp/src/auto-reply.test-harness.ts # extensions/xai/package.json # extensions/xiaomi/package.json # extensions/zai/package.json # extensions/zalo/CHANGELOG.md # extensions/zalo/package.json # extensions/zalo/src/monitor.webhook.ts # extensions/zalouser/CHANGELOG.md # extensions/zalouser/package.json # package.json # pnpm-lock.yaml # scripts/docker/install-sh-e2e/run.sh # scripts/docker/install-sh-smoke/run.sh # scripts/lib/plugin-sdk-entrypoints.json # scripts/test-install-sh-docker.sh # scripts/test-planner/executor.mjs # src/agents/openclaw-tools.ts # src/agents/pi-embedded-runner/compact.ts # src/agents/pi-embedded-runner/run/types.ts # src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping.test.ts # src/agents/skills.loadworkspaceskillentries.test.ts # src/agents/skills.test.ts # src/agents/system-prompt.test.ts # src/agents/system-prompt.ts # src/agents/tools/message-tool.ts # src/agents/tools/session-status-tool.ts # src/agents/tools/web-fetch.test-harness.ts # src/auto-reply/reply/commands-core.ts # src/auto-reply/reply/get-reply-run.ts # src/auto-reply/reply/model-selection.ts # src/cli/gateway-cli/run.ts # src/cli/program/command-registry.ts # src/cli/update-cli.test.ts # src/commands/onboard-search.test.ts # src/config/schema.base.generated.ts # src/config/types.models.ts # src/config/types.tools.ts # src/config/validation.ts # src/config/zod-schema.core.ts # src/cron/isolated-agent/delivery-target.ts # src/cron/service.issue-regressions.test.ts # src/daemon/systemd.ts # src/gateway/server-reload-handlers.ts # src/gateway/server.agent.gateway-server-agent-b.test.ts # src/gateway/server.chat.gateway-server-chat.test.ts # src/gateway/server.impl.ts # src/gateway/server.sessions.gateway-server-sessions-a.test.ts # src/gateway/test-helpers.mocks.ts # src/hooks/hooks-status.ts # src/infra/exec-approvals.ts # src/infra/outbound/message-action-runner.ts # src/infra/update-global.ts # src/infra/update-runner.ts # src/plugin-sdk/anthropic-vertex-auth-presence.ts # src/plugin-sdk/browser-config.ts # src/plugin-sdk/compat.ts # src/plugin-sdk/whatsapp-auth-presence.ts # src/plugins/bundled-provider-auth-env-vars.generated.ts # src/plugins/manifest-registry.ts # src/plugins/runtime/runtime-channel.ts # src/plugins/runtime/types-channel.ts # src/plugins/web-search-providers.test.ts # src/security/audit-channel.ts # src/wizard/setup.ts # test/helpers/plugins/plugin-runtime-mock.ts # ui/src/ui/views/chat.ts
There was a problem hiding this comment.
Code Review
This pull request updates the OpenClaw ecosystem to version 2026.4.14, introducing new agent skills for QA testing and secret scanning, an incident response plan, and stricter contribution limits. Key technical changes include local MLX-based speech synthesis for macOS, remote TTS support for Android, and a new execution approval workflow for iOS and Apple Watch. Feedback for the Android app identifies a logic discrepancy where manual gateway connections fail if the port is left blank, despite UI placeholders suggesting a default of 18789.
| val port = if (portTrimmed.isEmpty()) { | ||
| if (tls) 443 else return null | ||
| } else { | ||
| portTrimmed.toIntOrNull() ?: return null | ||
| } |
There was a problem hiding this comment.
The composeGatewayManualUrl function returns null for non-TLS connections if the port is empty. However, the UI placeholder in ConnectTabScreen and OnboardingFlow suggests a default port of 18789 for non-TLS connections. This discrepancy causes a validation error when a user leaves the port field blank, expecting the default behavior. It should default to 18789 to match the parseGatewayEndpoint logic and UI expectations.
| val port = if (portTrimmed.isEmpty()) { | |
| if (tls) 443 else return null | |
| } else { | |
| portTrimmed.toIntOrNull() ?: return null | |
| } | |
| val port = if (portTrimmed.isEmpty()) { | |
| if (tls) 443 else 18789 | |
| } else { | |
| portTrimmed.toIntOrNull() ?: return null | |
| } |
Summary
qverisplugin and its web search surface to win consistently in the packaged runtime, and local diagnostics should not report false gateway exposure alarms.extensions/qveris/web-search-provider.tspublic surface, taught bundled public-surface resolution to prefer built artifacts, skipped legacy globalqverisshadows in the manifest registry, moveddotenv/file-type/ipaddr.jsloads behind runtime seams, removed the old bundled web-search registry, and updated the affected tests.Change Type
Scope
Linked Issue/PR
Root Cause
qverisinstall path could shadow the bundled plugin during manifest loading.Regression Test Plan
src/plugins/public-surface-runtime.test.ts,src/commands/gateway-status.test.ts,src/cli/update-cli.test.ts,test/scripts/test-install-sh-docker.test.tssrc/plugins/public-surface-runtime.test.tsUser-visible / Behavior Changes
Diagram
Security Impact
Yes, explain risk + mitigation: N/ARepro + Verification
Environment
Steps
env OPENCLAW_LOCAL_CHECK=0 pnpm test src/plugins/public-surface-runtime.test.ts src/commands/gateway-status.test.ts src/cli/update-cli.test.ts test/scripts/test-install-sh-docker.test.ts.pnpm buildand inspect the runtime-postbuild chain.QVerisAI/QVerisBotand opens againstmain.Expected
Actual
pnpm buildreachedruntime-postbuildwithout surfacing a compile error, but the local run did not terminate cleanly in this sandboxed session, so I did not record a green full-build exit.Evidence
Human Verification
origin/QVerisAI/QVerisBot, and PR target set tomain.qverisshadow handling, deterministic doctor bind-host resolution.pnpm buildexit in this sandbox session.Review Conversations
Compatibility / Migration
Risks and Mitigations