Compare commits

...

27 Commits

Author SHA1 Message Date
Peter Steinberger
38c3a8dd48 docs: refresh config baseline 2026-05-17 04:10:19 +01:00
Peter Steinberger
9c32122e43 docs: refresh release generated docs 2026-05-17 04:08:54 +01:00
Peter Steinberger
9909859c7b docs: refresh plugin sdk api baseline 2026-05-17 04:05:37 +01:00
Peter Steinberger
227613e83b fix(release): stabilize plugin prerelease checks 2026-05-17 04:03:18 +01:00
Peter Steinberger
455e5bb99b test(parallels): expect disabled thinking in smoke scripts 2026-05-17 04:03:18 +01:00
Peter Steinberger
c6cf438e16 fix(plugins): reuse current metadata snapshot in runtime context 2026-05-17 04:03:18 +01:00
Peter Steinberger
a53e4fe73d fix(ui): refresh chat raw copy baseline 2026-05-17 04:03:18 +01:00
Peter Steinberger
cf10f1ec64 chore(release): prepare 2026.5.16 beta 4 2026-05-17 04:03:18 +01:00
Peter Steinberger
1c97d5bfd3 docs: add beta announce skill 2026-05-17 04:02:38 +01:00
Peter Steinberger
0e119a5e91 test(parallels): use supported thinking level in smoke turns 2026-05-17 04:02:38 +01:00
Peter Steinberger
3ae34bbe2b test(parallels): avoid Windows background log write races 2026-05-17 04:02:38 +01:00
Peter Steinberger
495479cf86 test(slack): remove duplicate unfurl expectation 2026-05-17 04:02:38 +01:00
Peter Steinberger
a3fd5acec2 chore(release): prepare 2026.5.16 beta 3 2026-05-17 04:02:38 +01:00
Peter Steinberger
ebb866a95e test: repair release rebase expectations 2026-05-17 04:02:38 +01:00
Peter Steinberger
380f66f816 test(azure-speech): isolate speech env 2026-05-17 04:02:38 +01:00
Peter Steinberger
82ef1a18c1 test(extensions): align prerelease mocks 2026-05-17 04:02:38 +01:00
Peter Steinberger
20bb9a2c76 fix(cron): narrow scheduled payload assertions 2026-05-17 04:02:38 +01:00
Peter Steinberger
e1028cceb3 fix(cron): reject empty scheduled payloads 2026-05-17 04:02:38 +01:00
Peter Steinberger
08676812ba chore(release): prepare 2026.5.16 beta 2 2026-05-17 04:02:37 +01:00
Peter Steinberger
b159b29a01 test(config): use synthetic external channel schema fixture 2026-05-17 04:01:54 +01:00
Peter Steinberger
f8e1f6723a fix(release): preserve external channel validation metadata 2026-05-17 04:01:54 +01:00
Peter Steinberger
a394dc4d75 test(codex): avoid runtime normalization in option forwarding check 2026-05-17 04:01:54 +01:00
Peter Steinberger
23e94713fc test(codex): make tool-search filter check deterministic 2026-05-17 04:01:54 +01:00
Peter Steinberger
117dbc3168 test(release): stabilize beta validation gates 2026-05-17 04:01:54 +01:00
Peter Steinberger
7020daa85a fix(codex): filter tool search controls from app-server tools 2026-05-17 04:01:54 +01:00
Peter Steinberger
04ee0d7d82 fix(release): repair beta validation regressions 2026-05-17 04:01:54 +01:00
Peter Steinberger
9a03da0633 ci: harden release validation flow 2026-05-17 04:01:54 +01:00
196 changed files with 1151 additions and 523 deletions

View File

@@ -0,0 +1,47 @@
---
name: beta-announce
description: "Draft and copy OpenClaw beta Discord announcements from changelog highlights, test focus, and beta update commands."
---
# Beta Announce
Use for OpenClaw beta Discord announcements, prerelease test calls, changelog-to-Discord summaries, and clipboard-ready beta update instructions.
## Ground Truth
- Read the exact beta version from `package.json` or the release tag. Include the full prerelease suffix, for example `2026.5.16-beta.3`.
- Read the full relevant `CHANGELOG.md` range. If the user says "since .12", treat it as the same year/month stable release anchor, for example `v2026.5.12`.
- Verify beta install/update commands from repo docs or `../openclaw.ai` source when available.
- Do not invent shipped features. If tag/npm/release state is uncertain, say beta wording and avoid stable claims.
## Discord Shape
- First line: `OpenClaw VERSION 🦞 is ready for testing. ...`
- Use Markdown section labels:
- `Highlights:`
- `Beta test focus:`
- `How to install or update the beta:`
- `If you hit a regression, please include:`
- Blank line between sections is fine.
- Bullets are fine. One bullet per physical line.
- Do not hard-wrap normal sentences or bullets. Never split one sentence onto a new physical line just because it is long.
- Keep it beta-focused. Do not include stable install/update links or stable-channel guidance unless explicitly asked.
## Content Priorities
- Lead with user-visible wins: new providers/auth, CLI workflows, onboarding/localization, channel behavior, Codex/runtime reliability, Control UI/WebChat improvements, install/update/doctor reliability, provider/media hardening.
- Test focus should name concrete surfaces to exercise, not just feature categories.
- Keep maintainer/CI/release validation details out unless they directly affect what beta users should test.
- Tone: concise, direct, a little dry; not corporate.
## Beta Commands
- Existing installs: `openclaw update --channel beta`
- New beta install or recovery on macOS/Linux: `curl -fsSL https://openclaw.ai/install.sh | bash -s -- --beta`
- Windows beta: `powershell -c "& ([scriptblock]::Create((irm https://openclaw.ai/install.ps1))) -Tag beta"`
## Clipboard
- When the user asks to copy, use `pbcopy`.
- Verify with `pbpaste` enough to catch version, lobster emoji, section breaks, and line wrapping.
- If the user corrects formatting, preserve the latest formatting preference in the copied version.

View File

@@ -191,7 +191,7 @@ jobs:
id: packed_tarball
env:
OPENCLAW_PREPACK_PREPARED: "1"
RELEASE_TAG: ${{ inputs.tag }}
RELEASE_REF: ${{ inputs.tag }}
RELEASE_NPM_DIST_TAG: ${{ inputs.npm_dist_tag }}
DEPENDENCY_EVIDENCE_DIR: ${{ steps.dependency_evidence.outputs.dir }}
run: |
@@ -259,6 +259,11 @@ jobs:
fi
RELEASE_SHA="$(git rev-parse HEAD)"
PACKAGE_VERSION="$(node -p "require('./package.json').version")"
if [[ "${RELEASE_REF}" =~ ^[0-9a-fA-F]{40}$ ]]; then
RELEASE_TAG="v${PACKAGE_VERSION}"
else
RELEASE_TAG="${RELEASE_REF}"
fi
TARBALL_NAME="$(basename "$PACK_PATH")"
TARBALL_SHA256="$(sha256sum "$PACK_PATH" | awk '{print $1}')"
ARTIFACT_DIR="$RUNNER_TEMP/openclaw-npm-preflight"
@@ -290,6 +295,7 @@ jobs:
);
NODE
echo "dir=$ARTIFACT_DIR" >> "$GITHUB_OUTPUT"
echo "release_tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT"
- name: Verify prepared npm tarball install
env:
@@ -312,6 +318,14 @@ jobs:
path: ${{ steps.dependency_evidence.outputs.dir }}
if-no-files-found: error
- name: Upload dependency release evidence tag alias
if: ${{ steps.packed_tarball.outputs.release_tag != inputs.tag }}
uses: actions/upload-artifact@v7
with:
name: openclaw-release-dependency-evidence-${{ steps.packed_tarball.outputs.release_tag }}
path: ${{ steps.dependency_evidence.outputs.dir }}
if-no-files-found: error
- name: Upload prepared npm publish bundle
uses: actions/upload-artifact@v7
with:
@@ -319,6 +333,14 @@ jobs:
path: ${{ steps.packed_tarball.outputs.dir }}
if-no-files-found: error
- name: Upload prepared npm publish bundle tag alias
if: ${{ steps.packed_tarball.outputs.release_tag != inputs.tag }}
uses: actions/upload-artifact@v7
with:
name: openclaw-npm-preflight-${{ steps.packed_tarball.outputs.release_tag }}
path: ${{ steps.packed_tarball.outputs.dir }}
if-no-files-found: error
validate_publish_request:
if: ${{ !inputs.preflight_only }}
runs-on: ubuntu-latest
@@ -427,13 +449,45 @@ jobs:
printf '%s' "$RUN_JSON" | node -e 'const fs = require("node:fs"); const run = JSON.parse(fs.readFileSync(0, "utf8")); const checks = [["workflowName", "Full Release Validation"], ["headBranch", process.env.EXPECTED_WORKFLOW_BRANCH], ["event", "workflow_dispatch"], ["status", "completed"], ["conclusion", "success"]]; for (const [key, expected] of checks) { if (run[key] !== expected) { console.error(`Referenced full release validation run ${process.env.FULL_RELEASE_VALIDATION_RUN_ID} must have ${key}=${expected}, got ${run[key] ?? "<missing>"}.`); process.exit(1); } } console.log(`Using full release validation run ${process.env.FULL_RELEASE_VALIDATION_RUN_ID}: ${run.url}`);'
- name: Download prepared npm tarball
uses: actions/download-artifact@v8
with:
name: openclaw-npm-preflight-${{ inputs.tag }}
path: preflight-tarball
repository: ${{ github.repository }}
run-id: ${{ inputs.preflight_run_id }}
github-token: ${{ github.token }}
env:
GH_TOKEN: ${{ github.token }}
PREFLIGHT_RUN_ID: ${{ inputs.preflight_run_id }}
RELEASE_TAG: ${{ inputs.tag }}
run: |
set -euo pipefail
download_preflight_artifact() {
local preferred_name fallback_name
preferred_name="openclaw-npm-preflight-${RELEASE_TAG}"
rm -rf preflight-tarball
mkdir -p preflight-tarball
if gh run download "${PREFLIGHT_RUN_ID}" \
--repo "${GITHUB_REPOSITORY}" \
--name "${preferred_name}" \
--dir preflight-tarball; then
echo "Downloaded ${preferred_name}."
return 0
fi
echo "::warning::${preferred_name} not found; checking run artifacts for a single compatible preflight artifact."
mapfile -t matches < <(gh api -X GET "repos/${GITHUB_REPOSITORY}/actions/runs/${PREFLIGHT_RUN_ID}/artifacts" \
--jq '.artifacts[] | select(.expired != true) | .name' |
grep '^openclaw-npm-preflight-' || true)
if [[ "${#matches[@]}" != "1" ]]; then
echo "Expected ${preferred_name}, or exactly one openclaw-npm-preflight-* fallback artifact in run ${PREFLIGHT_RUN_ID}." >&2
printf 'Available preflight candidates:\n' >&2
printf -- '- %s\n' "${matches[@]:-<none>}" >&2
exit 1
fi
fallback_name="${matches[0]}"
gh run download "${PREFLIGHT_RUN_ID}" \
--repo "${GITHUB_REPOSITORY}" \
--name "${fallback_name}" \
--dir preflight-tarball
echo "Downloaded fallback preflight artifact ${fallback_name}."
}
download_preflight_artifact
- name: Download full release validation manifest
uses: actions/download-artifact@v8

View File

@@ -76,6 +76,7 @@ jobs:
timeout-minutes: 20
outputs:
sha: ${{ steps.manifest.outputs.sha || steps.ref.outputs.sha }}
preflight_artifact_name: ${{ steps.preflight_artifact.outputs.name }}
steps:
- name: Validate inputs
env:
@@ -131,14 +132,43 @@ jobs:
esac
- name: Download OpenClaw npm preflight manifest
id: preflight_artifact
if: ${{ inputs.publish_openclaw_npm }}
uses: actions/download-artifact@v8
with:
name: openclaw-npm-preflight-${{ inputs.tag }}
path: ${{ runner.temp }}/openclaw-npm-preflight-manifest
repository: ${{ github.repository }}
run-id: ${{ inputs.preflight_run_id }}
github-token: ${{ github.token }}
env:
GH_TOKEN: ${{ github.token }}
PREFLIGHT_RUN_ID: ${{ inputs.preflight_run_id }}
RELEASE_TAG: ${{ inputs.tag }}
run: |
set -euo pipefail
preferred_name="openclaw-npm-preflight-${RELEASE_TAG}"
preflight_dir="${RUNNER_TEMP}/openclaw-npm-preflight-manifest"
rm -rf "${preflight_dir}"
mkdir -p "${preflight_dir}"
if gh run download "${PREFLIGHT_RUN_ID}" \
--repo "${GITHUB_REPOSITORY}" \
--name "${preferred_name}" \
--dir "${preflight_dir}"; then
echo "name=${preferred_name}" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "::warning::${preferred_name} not found; checking run artifacts for a single compatible preflight artifact."
mapfile -t matches < <(gh api -X GET "repos/${GITHUB_REPOSITORY}/actions/runs/${PREFLIGHT_RUN_ID}/artifacts" \
--jq '.artifacts[] | select(.expired != true) | .name' |
grep '^openclaw-npm-preflight-' || true)
if [[ "${#matches[@]}" != "1" ]]; then
echo "Expected ${preferred_name}, or exactly one openclaw-npm-preflight-* fallback artifact in run ${PREFLIGHT_RUN_ID}." >&2
printf 'Available preflight candidates:\n' >&2
printf -- '- %s\n' "${matches[@]:-<none>}" >&2
exit 1
fi
fallback_name="${matches[0]}"
gh run download "${PREFLIGHT_RUN_ID}" \
--repo "${GITHUB_REPOSITORY}" \
--name "${fallback_name}" \
--dir "${preflight_dir}"
echo "name=${fallback_name}" >> "$GITHUB_OUTPUT"
- name: Download full release validation manifest
if: ${{ inputs.publish_openclaw_npm }}
@@ -306,6 +336,7 @@ jobs:
PLUGINS: ${{ inputs.plugins }}
PUBLISH_OPENCLAW_NPM: ${{ inputs.publish_openclaw_npm && 'true' || 'false' }}
WAIT_FOR_CLAWHUB: ${{ inputs.wait_for_clawhub && 'true' || 'false' }}
PREFLIGHT_ARTIFACT_NAME: ${{ needs.resolve_release_target.outputs.preflight_artifact_name }}
run: |
set -euo pipefail
@@ -314,7 +345,10 @@ jobs:
shift
local before_json dispatch_output run_id
before_json="$(gh run list --repo "$GITHUB_REPOSITORY" --workflow "$workflow" --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
before_json="$(gh api -X GET "repos/${GITHUB_REPOSITORY}/actions/workflows/${workflow}/runs" \
-F event=workflow_dispatch \
-F per_page=100 \
--jq '[.workflow_runs[].id]')"
dispatch_output="$(gh workflow run --repo "$GITHUB_REPOSITORY" "$workflow" --ref "$CHILD_WORKFLOW_REF" "$@" 2>&1)"
printf '%s\n' "$dispatch_output" >&2
@@ -327,8 +361,10 @@ jobs:
if [[ -z "$run_id" ]]; then
for _ in $(seq 1 60); do
run_id="$(
BEFORE_IDS="$before_json" gh run list --repo "$GITHUB_REPOSITORY" --workflow "$workflow" --event workflow_dispatch --limit 50 --json databaseId,createdAt \
--jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
BEFORE_IDS="$before_json" gh api -X GET "repos/${GITHUB_REPOSITORY}/actions/workflows/${workflow}/runs" \
-F event=workflow_dispatch \
-F per_page=50 \
--jq '.workflow_runs | map({databaseId:.id, createdAt:.created_at}) | map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
)"
if [[ -n "$run_id" ]]; then
break
@@ -349,6 +385,23 @@ jobs:
printf '%s\n' "${run_id}"
}
print_pending_deployments() {
local workflow="$1"
local run_id="$2"
local pending_json
pending_json="$(gh api -X GET "repos/${GITHUB_REPOSITORY}/actions/runs/${run_id}/pending_deployments" 2>/dev/null || true)"
if [[ -z "${pending_json}" ]] || ! printf '%s' "${pending_json}" | jq -e 'length > 0' >/dev/null 2>&1; then
return 0
fi
echo "${workflow} pending environment approval:"
while IFS=$'\t' read -r env_id env_name can_approve; do
echo "- env=${env_name} canApprove=${can_approve}"
echo " approve: gh api -X POST repos/${GITHUB_REPOSITORY}/actions/runs/${run_id}/pending_deployments -F 'environment_ids[]=${env_id}' -f state=approved -f comment='Approve release gate'"
done < <(printf '%s' "${pending_json}" | jq -r '.[] | [.environment.id, .environment.name, .current_user_can_approve] | @tsv')
}
wait_for_run() {
local workflow="$1"
local run_id="$2"
@@ -366,6 +419,7 @@ jobs:
state="${status}:${updated_at}"
if [[ "$state" != "$last_state" ]]; then
echo "${workflow} still ${status} (updated ${updated_at}): ${url}"
print_pending_deployments "${workflow}" "${run_id}"
last_state="$state"
fi
sleep 30
@@ -466,17 +520,18 @@ jobs:
}
upload_dependency_evidence_release_asset() {
local release_version download_dir asset_path asset_name
local release_version download_dir asset_path asset_name artifact_name
release_version="${RELEASE_TAG#v}"
download_dir="${RUNNER_TEMP}/openclaw-release-dependency-evidence-asset"
asset_name="openclaw-${release_version}-dependency-evidence.zip"
asset_path="${RUNNER_TEMP}/${asset_name}"
artifact_name="${PREFLIGHT_ARTIFACT_NAME:-openclaw-npm-preflight-${RELEASE_TAG}}"
rm -rf "${download_dir}" "${asset_path}"
mkdir -p "${download_dir}"
gh run download "${PREFLIGHT_RUN_ID}" \
--repo "${GITHUB_REPOSITORY}" \
--name "openclaw-npm-preflight-${RELEASE_TAG}" \
--name "${artifact_name}" \
--dir "${download_dir}"
if [[ ! -d "${download_dir}/dependency-evidence" ]]; then

View File

@@ -2,16 +2,7 @@
Docs: https://docs.openclaw.ai
## Unreleased
### Fixes
- Agents/subagents: route group/channel subagent completions through message-tool-only handoffs when required and keep active-requester wake failures from dropping completion delivery. Fixes #82803. Thanks @galiniliev, @yozakura-ava, and @moeedahmed.
- Memory-core: scan persisted memory source sessions on startup, comparing on-disk transcripts against the index and marking only missing/newer/resized files dirty for incremental sync. Fixes #82341. (#82341) Thanks @giodl73-repo.
- Telegram: keep the top-level default account in the account list when named accounts or bindings are added alongside top-level credentials, preserving default polling while still letting named-only configs resolve to a single account. Fixes #82794. (#82794) Thanks @giodl73-repo.
- WhatsApp: honor forced document delivery for outbound image, GIF, and video media so `forceDocument`/`asDocument` sends preserve original media bytes instead of using compressed media payloads. (#79272) Thanks @itsuzef.
## 2026.5.17
## 2026.5.16
### Changes
@@ -38,6 +29,10 @@ Docs: https://docs.openclaw.ai
### Fixes
- Agents/subagents: route group/channel subagent completions through message-tool-only handoffs when required and keep active-requester wake failures from dropping completion delivery. Fixes #82803. Thanks @galiniliev, @yozakura-ava, and @moeedahmed.
- Memory-core: scan persisted memory source sessions on startup, comparing on-disk transcripts against the index and marking only missing/newer/resized files dirty for incremental sync. Fixes #82341. (#82341) Thanks @giodl73-repo.
- Telegram: keep the top-level default account in the account list when named accounts or bindings are added alongside top-level credentials, preserving default polling while still letting named-only configs resolve to a single account. Fixes #82794. (#82794) Thanks @giodl73-repo.
- WhatsApp: honor forced document delivery for outbound image, GIF, and video media so `forceDocument`/`asDocument` sends preserve original media bytes instead of using compressed media payloads. (#79272) Thanks @itsuzef.
- Gateway/usage: refresh large session usage summaries in the background and reuse durable transcript metadata so `sessions.usage` no longer blocks Gateway requests on full transcript rescans. Fixes #82773. (#82778) Thanks @hclsys.
- TUI: restore the submitted draft when chat is busy instead of clearing it or queueing another run. Fixes #45326. (#82774) Thanks @hyspacex.
- Browser plugin: redact attach-details from Chrome MCP diagnostics and keep raw Chrome launch error output around long enough to surface in user reports without leaking sensitive paths.
@@ -196,6 +191,7 @@ Docs: https://docs.openclaw.ai
- Config persistence: normalize malformed auth profile credential fields/state, skip JSON-valid garbage transcript checkpoint rows, and let `openclaw doctor --fix` remove unrepairable cron job rows.
- Cron: skip persisted job rows with malformed schedule or payload shapes in memory, leaving the store for `openclaw doctor --fix` instead of hydrating them into runtime state.
- Cron: keep legacy string schedules and blank system-event jobs available for runtime repair/skip handling instead of dropping them as malformed persisted rows.
- Cron: reject empty scheduled main/isolated payloads before persisting jobs, keeping runtime stores compatible with malformed-row hardening.
- Task persistence: drop malformed array/scalar requester-origin JSON from task and task-flow SQLite sidecars instead of restoring it as delivery metadata.
- Agents/timeouts: clarify model idle-timeout errors and docs so provider `timeoutSeconds` is shown as bounded by the whole agent/run timeout ceiling.
- Agents/OpenAI streams: yield cooperatively while processing bursty Completions and Responses chunks, keeping aborts, channel liveness timers, and startup heartbeats responsive under noisy model output. Refs #82462.

View File

@@ -66,7 +66,7 @@ android {
minSdk = 31
targetSdk = 36
versionCode = 2026051700
versionName = "2026.5.17"
versionName = "2026.5.16"
ndk {
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")

View File

@@ -1,6 +1,6 @@
# OpenClaw iOS Changelog
## 2026.5.17 - 2026-05-17
## 2026.5.16 - 2026-05-16
Maintenance update for the current OpenClaw release.

View File

@@ -2,8 +2,8 @@
// Source of truth: apps/ios/version.json
// Generated by scripts/ios-sync-versioning.ts.
OPENCLAW_IOS_VERSION = 2026.5.17
OPENCLAW_MARKETING_VERSION = 2026.5.17
OPENCLAW_IOS_VERSION = 2026.5.16
OPENCLAW_MARKETING_VERSION = 2026.5.16
OPENCLAW_BUILD_VERSION = 1
#include? "../build/Version.xcconfig"

View File

@@ -1,3 +1,3 @@
{
"version": "2026.5.17"
"version": "2026.5.16"
}

View File

@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2026.5.17</string>
<string>2026.5.16</string>
<key>CFBundleVersion</key>
<string>2026051700</string>
<key>CFBundleIconFile</key>

View File

@@ -1,4 +1,4 @@
23eb36c39b4e1b0b711211fd946d23579a3f87cb0aee3c0701e5f9447c3c2527 config-baseline.json
ec106c0eb093aaaa1382733d4a67ac9f3d4b9bbcadda3a3d5a56d70f1aea2a97 config-baseline.core.json
bbc8aeaf5b1a4951617a47ebec41ba63cb6081972a78a4509bace7f1c137d559 config-baseline.json
c8bf5c9d60189f3d9134a3cab00e569eab13061ed835b4d89293d8336f0a5ced config-baseline.core.json
fe4f1cb00d7d1dee9746779ec3cf14236e5f672c91502268a12ad6e467a2c4ad config-baseline.channel.json
e9049ce0154f484f44bb0ac174a44198269256044da5ba62a6e107e78bfd7a70 config-baseline.plugin.json

View File

@@ -1,2 +1,2 @@
2c665b045d30f690c5fd6adb89481a003d5cc55ab4eed1a0456ef47136f6b684 plugin-sdk-api-baseline.json
f4b6c016576cd19409356ef23d18da0e54cb6c5904f864049461ace921e1f72c plugin-sdk-api-baseline.jsonl
0518202ab2339b16d001424a0ec26f33334958d3e1d48f09dc4e270239564c9a plugin-sdk-api-baseline.json
d6435140b43dc1c81fea77e80487f2e4f156d875b1cc3b8e4304400b6ec7af6b plugin-sdk-api-baseline.jsonl

View File

@@ -73,7 +73,7 @@ commands.
| [duckduckgo](/plugins/reference/duckduckgo) | Adds web search provider support. | `@openclaw/duckduckgo-plugin`<br />included in OpenClaw | contracts: webSearchProviders |
| [elevenlabs](/plugins/reference/elevenlabs) | Adds media understanding provider support. Adds realtime transcription provider support. Adds text-to-speech provider support. | `@openclaw/elevenlabs-speech`<br />included in OpenClaw | contracts: mediaUnderstandingProviders, realtimeTranscriptionProviders, speechProviders |
| [exa](/plugins/reference/exa) | Adds web search provider support. | `@openclaw/exa-plugin`<br />included in OpenClaw | contracts: webSearchProviders |
| [fal](/plugins/reference/fal) | Adds fal model provider support to OpenClaw. | `@openclaw/fal-provider`<br />included in OpenClaw | providers: fal; contracts: imageGenerationProviders, videoGenerationProviders |
| [fal](/plugins/reference/fal) | Adds fal model provider support to OpenClaw. | `@openclaw/fal-provider`<br />included in OpenClaw | providers: fal; contracts: imageGenerationProviders, musicGenerationProviders, videoGenerationProviders |
| [file-transfer](/plugins/reference/file-transfer) | Fetch, list, and write files on paired nodes via dedicated node commands. Bypasses bash stdout truncation by using base64 over node.invoke for binaries up to 16 MB. | `@openclaw/file-transfer`<br />included in OpenClaw | contracts: tools |
| [firecrawl](/plugins/reference/firecrawl) | Adds agent-callable tools. Adds web fetch provider support. Adds web search provider support. | `@openclaw/firecrawl-plugin`<br />included in OpenClaw | contracts: tools, webFetchProviders, webSearchProviders |
| [fireworks](/plugins/reference/fireworks) | Adds Fireworks model provider support to OpenClaw. | `@openclaw/fireworks-provider`<br />included in OpenClaw | providers: fireworks |
@@ -107,7 +107,7 @@ commands.
| [openai](/plugins/reference/openai) | Adds OpenAI, OpenAI Codex model provider support to OpenClaw. | `@openclaw/openai-provider`<br />included in OpenClaw | providers: openai, openai-codex; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, speechProviders, videoGenerationProviders |
| [opencode](/plugins/reference/opencode) | Adds OpenCode model provider support to OpenClaw. | `@openclaw/opencode-provider`<br />included in OpenClaw | providers: opencode; contracts: mediaUnderstandingProviders |
| [opencode-go](/plugins/reference/opencode-go) | Adds OpenCode Go model provider support to OpenClaw. | `@openclaw/opencode-go-provider`<br />included in OpenClaw | providers: opencode-go; contracts: mediaUnderstandingProviders |
| [openrouter](/plugins/reference/openrouter) | Adds OpenRouter model provider support to OpenClaw. | `@openclaw/openrouter-provider`<br />included in OpenClaw | providers: openrouter; contracts: imageGenerationProviders, mediaUnderstandingProviders, speechProviders, videoGenerationProviders |
| [openrouter](/plugins/reference/openrouter) | Adds OpenRouter model provider support to OpenClaw. | `@openclaw/openrouter-provider`<br />included in OpenClaw | providers: openrouter; contracts: imageGenerationProviders, mediaUnderstandingProviders, musicGenerationProviders, speechProviders, videoGenerationProviders |
| [perplexity](/plugins/reference/perplexity) | Adds web search provider support. | `@openclaw/perplexity-plugin`<br />included in OpenClaw | contracts: webSearchProviders |
| [qianfan](/plugins/reference/qianfan) | Adds Qianfan model provider support to OpenClaw. | `@openclaw/qianfan-provider`<br />included in OpenClaw | providers: qianfan |
| [qwen](/plugins/reference/qwen) | Adds Qwen, Qwen Cloud, Model Studio, DashScope model provider support to OpenClaw. | `@openclaw/qwen-provider`<br />included in OpenClaw | providers: qwen, qwencloud, modelstudio, dashscope; contracts: mediaUnderstandingProviders, videoGenerationProviders |

View File

@@ -49,7 +49,7 @@ pnpm plugins:inventory:gen
| [duckduckgo](/plugins/reference/duckduckgo) | Adds web search provider support. | `@openclaw/duckduckgo-plugin`<br />included in OpenClaw | contracts: webSearchProviders |
| [elevenlabs](/plugins/reference/elevenlabs) | Adds media understanding provider support. Adds realtime transcription provider support. Adds text-to-speech provider support. | `@openclaw/elevenlabs-speech`<br />included in OpenClaw | contracts: mediaUnderstandingProviders, realtimeTranscriptionProviders, speechProviders |
| [exa](/plugins/reference/exa) | Adds web search provider support. | `@openclaw/exa-plugin`<br />included in OpenClaw | contracts: webSearchProviders |
| [fal](/plugins/reference/fal) | Adds fal model provider support to OpenClaw. | `@openclaw/fal-provider`<br />included in OpenClaw | providers: fal; contracts: imageGenerationProviders, videoGenerationProviders |
| [fal](/plugins/reference/fal) | Adds fal model provider support to OpenClaw. | `@openclaw/fal-provider`<br />included in OpenClaw | providers: fal; contracts: imageGenerationProviders, musicGenerationProviders, videoGenerationProviders |
| [feishu](/plugins/reference/feishu) | Adds the Feishu channel surface for sending and receiving OpenClaw messages. | `@openclaw/feishu`<br />npm; ClawHub | channels: feishu; contracts: tools; skills |
| [file-transfer](/plugins/reference/file-transfer) | Fetch, list, and write files on paired nodes via dedicated node commands. Bypasses bash stdout truncation by using base64 over node.invoke for binaries up to 16 MB. | `@openclaw/file-transfer`<br />included in OpenClaw | contracts: tools |
| [firecrawl](/plugins/reference/firecrawl) | Adds agent-callable tools. Adds web fetch provider support. Adds web search provider support. | `@openclaw/firecrawl-plugin`<br />included in OpenClaw | contracts: tools, webFetchProviders, webSearchProviders |
@@ -93,7 +93,7 @@ pnpm plugins:inventory:gen
| [openai](/plugins/reference/openai) | Adds OpenAI, OpenAI Codex model provider support to OpenClaw. | `@openclaw/openai-provider`<br />included in OpenClaw | providers: openai, openai-codex; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, speechProviders, videoGenerationProviders |
| [opencode](/plugins/reference/opencode) | Adds OpenCode model provider support to OpenClaw. | `@openclaw/opencode-provider`<br />included in OpenClaw | providers: opencode; contracts: mediaUnderstandingProviders |
| [opencode-go](/plugins/reference/opencode-go) | Adds OpenCode Go model provider support to OpenClaw. | `@openclaw/opencode-go-provider`<br />included in OpenClaw | providers: opencode-go; contracts: mediaUnderstandingProviders |
| [openrouter](/plugins/reference/openrouter) | Adds OpenRouter model provider support to OpenClaw. | `@openclaw/openrouter-provider`<br />included in OpenClaw | providers: openrouter; contracts: imageGenerationProviders, mediaUnderstandingProviders, speechProviders, videoGenerationProviders |
| [openrouter](/plugins/reference/openrouter) | Adds OpenRouter model provider support to OpenClaw. | `@openclaw/openrouter-provider`<br />included in OpenClaw | providers: openrouter; contracts: imageGenerationProviders, mediaUnderstandingProviders, musicGenerationProviders, speechProviders, videoGenerationProviders |
| [openshell](/plugins/reference/openshell) | Sandbox backend powered by OpenShell with mirrored local workspaces and SSH-based command execution. | `@openclaw/openshell-sandbox`<br />npm; ClawHub | plugin |
| [perplexity](/plugins/reference/perplexity) | Adds web search provider support. | `@openclaw/perplexity-plugin`<br />included in OpenClaw | contracts: webSearchProviders |
| [qa-channel](/plugins/reference/qa-channel) | Adds the QA Channel surface for sending and receiving OpenClaw messages. | `@openclaw/qa-channel`<br />source checkout only | channels: qa-channel |

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/acpx",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw ACP runtime backend",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17",
"openclawVersion": "2026.5.16-beta.4",
"staticAssets": [
{
"source": "./src/runtime-internals/mcp-proxy.mjs",

View File

@@ -11,6 +11,14 @@ function expectedSourceMcpServerArgs(entrypoint: string): string[] {
return ["--import", TSX_IMPORT, path.resolve(entrypoint)];
}
function expectedMcpServerArgs(sourceEntrypoint: string, distEntrypoint: string): string[] {
const distPath = path.resolve(distEntrypoint);
if (fs.existsSync(distPath)) {
return [distPath];
}
return expectedSourceMcpServerArgs(sourceEntrypoint);
}
describe("embedded acpx plugin config", () => {
it("resolves workspace stateDir and cwd by default", () => {
const workspaceDir = path.resolve("/tmp/openclaw-acpx");
@@ -164,7 +172,10 @@ describe("embedded acpx plugin config", () => {
const server = resolved.mcpServers["openclaw-plugin-tools"];
expect(server).toEqual({
command: process.execPath,
args: expectedSourceMcpServerArgs("src/mcp/plugin-tools-serve.ts"),
args: expectedMcpServerArgs(
"src/mcp/plugin-tools-serve.ts",
"dist/mcp/plugin-tools-serve.js",
),
});
});
@@ -179,7 +190,10 @@ describe("embedded acpx plugin config", () => {
const server = resolved.mcpServers["openclaw-tools"];
expect(server).toEqual({
command: process.execPath,
args: expectedSourceMcpServerArgs("src/mcp/openclaw-tools-serve.ts"),
args: expectedMcpServerArgs(
"src/mcp/openclaw-tools-serve.ts",
"dist/mcp/openclaw-tools-serve.js",
),
});
});

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/admin-http-rpc",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw admin HTTP RPC endpoint",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/alibaba-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Alibaba Model Studio video provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Amazon Bedrock Mantle (OpenAI-compatible) provider plugin",
"repository": {
"type": "git",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17",
"openclawVersion": "2026.5.16-beta.4",
"bundledDist": false
},
"release": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Amazon Bedrock provider plugin",
"repository": {
"type": "git",
@@ -27,10 +27,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17",
"openclawVersion": "2026.5.16-beta.4",
"bundledDist": false
},
"release": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Anthropic Vertex provider plugin",
"repository": {
"type": "git",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17",
"openclawVersion": "2026.5.16-beta.4",
"bundledDist": false
},
"release": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Anthropic provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/arcee-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Arcee provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/azure-speech",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Azure Speech plugin",
"type": "module",

View File

@@ -44,14 +44,18 @@ describe("buildAzureSpeechProvider", () => {
vi.resetModules();
});
it("reports configured only when key plus region or endpoint is available", () => {
const provider = buildAzureSpeechProvider();
function clearAzureSpeechEnv() {
delete process.env.AZURE_SPEECH_KEY;
delete process.env.AZURE_SPEECH_API_KEY;
delete process.env.SPEECH_KEY;
delete process.env.AZURE_SPEECH_REGION;
delete process.env.SPEECH_REGION;
delete process.env.AZURE_SPEECH_ENDPOINT;
}
it("reports configured only when key plus region or endpoint is available", () => {
const provider = buildAzureSpeechProvider();
clearAzureSpeechEnv();
expect(provider.isConfigured({ providerConfig: {}, timeoutMs: 30_000 })).toBe(false);
expect(provider.isConfigured({ providerConfig: { apiKey: "key" }, timeoutMs: 30_000 })).toBe(
@@ -70,6 +74,7 @@ describe("buildAzureSpeechProvider", () => {
});
it("normalizes provider-owned config under canonical and alias keys", () => {
clearAzureSpeechEnv();
const provider = buildAzureSpeechProvider();
const canonical = provider.resolveConfig?.({
cfg: {} as never,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/bonjour",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Bonjour/mDNS gateway discovery",
"type": "module",
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/brave-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Brave plugin",
"repository": {
"type": "git",
@@ -21,10 +21,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/browser-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw browser tool plugin",
"type": "module",

View File

@@ -356,7 +356,7 @@ describe("basic browser routes", () => {
expect(isTransportAvailable).toHaveBeenCalledTimes(1);
expect(isTransportAvailable).toHaveBeenCalledWith(5_000);
const [timeoutMs, reachabilityOptions] = readFirstReachabilityCall(isReachable);
expect(timeoutMs).toBeGreaterThan(0);
expect(timeoutMs).toBeGreaterThanOrEqual(6_900);
expect(timeoutMs).toBeLessThanOrEqual(7_000);
expect(reachabilityOptions?.ephemeral).toBe(true);
expect(reachabilityOptions?.signal).toBeInstanceOf(AbortSignal);

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/byteplus-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw BytePlus provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/canvas-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Canvas plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/cerebras-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Cerebras provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/chutes-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Chutes.ai provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/clickclack",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw ClickClack channel plugin",
"type": "module",
@@ -18,7 +18,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/cloudflare-ai-gateway-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Cloudflare AI Gateway provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/codex",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Codex harness and model provider plugin",
"repository": {
"type": "git",
@@ -27,10 +27,10 @@
"minHostVersion": ">=2026.5.1-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -30,7 +30,10 @@ import * as authBridge from "./auth-bridge.js";
import { resolveCodexAppServerEnvApiKeyCacheKey } from "./auth-bridge.js";
import type { CodexAppServerClientFactory } from "./client-factory.js";
import { readCodexPluginConfig, resolveCodexAppServerRuntimeOptions } from "./config.js";
import { CODEX_OPENCLAW_DYNAMIC_TOOL_NAMESPACE } from "./dynamic-tools.js";
import {
CODEX_OPENCLAW_DYNAMIC_TOOL_NAMESPACE,
createCodexDynamicToolBridge,
} from "./dynamic-tools.js";
import * as elicitationBridge from "./elicitation-bridge.js";
import {
buildCodexPluginAppCacheKey,
@@ -811,7 +814,30 @@ describe("runCodexAppServerAttempt", () => {
expect((await readCodexAppServerBinding(sessionFile))?.mcpServersFingerprint).toBeUndefined();
});
it("passes auth profiles into Codex dynamic tool construction", async () => {
it("does not expose OpenClaw Tool Search controls through Codex dynamic tools", () => {
const tools = __testing.filterCodexDynamicTools(
[
createRuntimeDynamicTool("message"),
createRuntimeDynamicTool("tool_search_code"),
createRuntimeDynamicTool("tool_search"),
createRuntimeDynamicTool("tool_describe"),
createRuntimeDynamicTool("tool_call"),
],
{},
);
const bridge = createCodexDynamicToolBridge({
tools,
signal: new AbortController().signal,
loading: "searchable",
});
const dynamicToolNames = bridge.specs.map((tool) => tool.name);
expect(dynamicToolNames).toContain("message");
for (const toolName of ["tool_search_code", "tool_search", "tool_describe", "tool_call"]) {
expect(dynamicToolNames).not.toContain(toolName);
}
});
it("passes auth profiles into Codex dynamic tool construction", () => {
const sessionFile = path.join(tempDir, "session.jsonl");
const workspaceDir = path.join(tempDir, "workspace");
const params = createParams(sessionFile, workspaceDir);
@@ -828,13 +854,8 @@ describe("runCodexAppServerAttempt", () => {
params.disableTools = false;
params.authProfileStore = authProfileStore;
params.runtimePlan = createCodexRuntimePlanFixture();
const factoryOptions: unknown[] = [];
__testing.setOpenClawCodingToolsFactoryForTests((options) => {
factoryOptions.push(options);
return [];
});
await __testing.buildDynamicTools({
const toolOptions = __testing.buildOpenClawCodingToolsOptions({
params,
resolvedWorkspace: workspaceDir,
effectiveWorkspace: workspaceDir,
@@ -846,10 +867,7 @@ describe("runCodexAppServerAttempt", () => {
onYieldDetected: () => undefined,
});
expect(factoryOptions).toHaveLength(1);
expect((factoryOptions[0] as { authProfileStore?: unknown }).authProfileStore).toBe(
authProfileStore,
);
expect(toolOptions.authProfileStore).toBe(authProfileStore);
});
it("keeps canonical OpenAI Codex runs on OpenAI dynamic tool policy", async () => {

View File

@@ -2699,18 +2699,15 @@ function resolveOpenClawCodingToolsSessionKeys(
};
}
async function buildDynamicTools(input: DynamicToolBuildParams) {
function buildOpenClawCodingToolsOptions(
input: DynamicToolBuildParams,
): OpenClawCodingToolsOptions {
const { params } = input;
if (params.disableTools || !supportsModelTools(params.model)) {
return [];
}
const modelHasVision = params.model.input?.includes("image") ?? false;
const agentDir = params.agentDir ?? resolveAgentDir(params.config ?? {}, input.sessionAgentId);
const createOpenClawCodingTools =
openClawCodingToolsFactoryForTests ??
(await import("openclaw/plugin-sdk/agent-harness")).createOpenClawCodingTools;
const sessionKeys = resolveOpenClawCodingToolsSessionKeys(params, input.sandboxSessionKey);
const allTools = createOpenClawCodingTools({
return {
agentId: input.sessionAgentId,
...buildEmbeddedAttemptToolRunContext(params),
exec: {
@@ -2777,10 +2774,22 @@ async function buildDynamicTools(input: DynamicToolBuildParams) {
});
input.runAbortController.abort("sessions_yield");
},
});
};
}
async function buildDynamicTools(input: DynamicToolBuildParams) {
const { params } = input;
if (params.disableTools || !supportsModelTools(params.model)) {
return [];
}
const createOpenClawCodingTools =
openClawCodingToolsFactoryForTests ??
(await import("openclaw/plugin-sdk/agent-harness")).createOpenClawCodingTools;
const toolOptions = buildOpenClawCodingToolsOptions(input);
const allTools = createOpenClawCodingTools(toolOptions);
const codexFilteredTools = filterCodexDynamicTools(allTools, input.pluginConfig);
const visionFilteredTools = filterToolsForVisionInputs(codexFilteredTools, {
modelHasVision,
modelHasVision: toolOptions.modelHasVision ?? false,
hasInboundImages: (params.images?.length ?? 0) > 0,
});
const toolsAllow = includeForcedMessageToolAllow(params.toolsAllow, params);
@@ -3877,6 +3886,7 @@ export const __testing = {
createCodexSteeringQueue,
buildCodexNativeHookRelayId,
filterCodexDynamicTools,
buildOpenClawCodingToolsOptions,
buildDynamicTools,
filterCodexDynamicToolsForAllowlist,
filterToolsForVisionInputs,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/comfy-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw ComfyUI provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/copilot-proxy",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Copilot Proxy provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepgram-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Deepgram media-understanding provider",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepinfra-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw DeepInfra provider plugin",
"type": "module",

View File

@@ -7,18 +7,18 @@ const {
readProviderBinaryResponseMock,
resolveProviderHttpRequestConfigMock,
} = vi.hoisted(() => ({
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
postJsonRequestMock: vi.fn(),
readProviderBinaryResponseMock: vi.fn(async (response: Response) => {
return new Uint8Array(await response.arrayBuffer());
}),
resolveProviderHttpRequestConfigMock: vi.fn((params: Record<string, unknown>) => ({
baseUrl: params.baseUrl ?? params.defaultBaseUrl ?? "https://api.deepinfra.com/v1/openai",
allowPrivateNetwork: false,
headers: new Headers(params.defaultHeaders as HeadersInit | undefined),
dispatcherPolicy: undefined,
})),
}));
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
postJsonRequestMock: vi.fn(),
readProviderBinaryResponseMock: vi.fn(async (response: Response) => {
return new Uint8Array(await response.arrayBuffer());
}),
resolveProviderHttpRequestConfigMock: vi.fn((params: Record<string, unknown>) => ({
baseUrl: params.baseUrl ?? params.defaultBaseUrl ?? "https://api.deepinfra.com/v1/openai",
allowPrivateNetwork: false,
headers: new Headers(params.defaultHeaders as HeadersInit | undefined),
dispatcherPolicy: undefined,
})),
}));
vi.mock("openclaw/plugin-sdk/provider-http", () => ({
assertOkOrThrowHttpError: assertOkOrThrowHttpErrorMock,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepseek-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw DeepSeek provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diagnostics-otel",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw diagnostics OpenTelemetry exporter",
"repository": {
"type": "git",
@@ -34,10 +34,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diagnostics-prometheus",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw diagnostics Prometheus exporter",
"repository": {
"type": "git",
@@ -21,10 +21,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diffs",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw diff viewer plugin",
"repository": {
"type": "git",
@@ -31,10 +31,10 @@
"minHostVersion": ">=2026.4.30"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17",
"openclawVersion": "2026.5.16-beta.4",
"staticAssets": [
{
"source": "./assets/viewer-runtime.js",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/discord",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Discord channel plugin",
"repository": {
"type": "git",
@@ -21,7 +21,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -65,10 +65,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -2,33 +2,39 @@ import { Readable } from "node:stream";
import { describe, expect, it } from "vitest";
import { decodeOpusStream, resolveOpusDecoderPreference } from "./audio.js";
function withoutOpusPreference<T>(run: () => T): T {
const previousPreference = process.env.OPENCLAW_DISCORD_OPUS_DECODER;
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
try {
return run();
} finally {
if (previousPreference === undefined) {
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
} else {
process.env.OPENCLAW_DISCORD_OPUS_DECODER = previousPreference;
}
}
}
describe("discord voice opus decoder selection", () => {
it("defaults to the pure-JS opusscript decoder", async () => {
const verbose: string[] = [];
const warnings: string[] = [];
const previousPreference = process.env.OPENCLAW_DISCORD_OPUS_DECODER;
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
try {
const decoded = await decodeOpusStream(Readable.from([]), {
const decoded = await withoutOpusPreference(async () => {
return await decodeOpusStream(Readable.from([]), {
onVerbose: (message) => verbose.push(message),
onWarn: (message) => warnings.push(message),
});
});
expect(decoded.length).toBe(0);
expect(verbose).toContain("opus decoder: opusscript");
expect(warnings).toEqual([]);
} finally {
if (previousPreference === undefined) {
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
} else {
process.env.OPENCLAW_DISCORD_OPUS_DECODER = previousPreference;
}
}
expect(decoded.length).toBe(0);
expect(verbose).toContain("opus decoder: opusscript");
expect(warnings).toEqual([]);
});
it("requires an explicit preference for native opus", () => {
expect(resolveOpusDecoderPreference()).toBe("opusscript");
expect(withoutOpusPreference(() => resolveOpusDecoderPreference())).toBe("opusscript");
expect(resolveOpusDecoderPreference("opusscript")).toBe("opusscript");
expect(resolveOpusDecoderPreference("native")).toBe("native");
expect(resolveOpusDecoderPreference("@discordjs/opus")).toBe("native");

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/document-extract-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw local document extraction plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/duckduckgo-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw DuckDuckGo plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/elevenlabs-speech",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw ElevenLabs speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/exa-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Exa plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/fal-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw fal provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/feishu",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
"repository": {
"type": "git",
@@ -17,7 +17,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -48,10 +48,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/file-transfer",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw file transfer plugin (file_fetch, dir_list, dir_fetch, file_write)",
"type": "module",
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/firecrawl-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Firecrawl plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/fireworks-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Fireworks provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/github-copilot-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw GitHub Copilot provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-meet",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Google Meet participant plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -33,10 +33,10 @@
"minHostVersion": ">=2026.4.20"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-plugin",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Google plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/googlechat",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Google Chat channel plugin",
"repository": {
"type": "git",
@@ -17,7 +17,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -75,10 +75,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/gradium-speech",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Gradium speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/groq-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Groq media-understanding provider",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/huggingface-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Hugging Face provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/image-generation-core",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw image generation runtime package",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/imessage",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac",
"type": "module",
@@ -40,10 +40,10 @@
]
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
}
},
"pluginInspector": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/inworld-speech",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Inworld speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/irc",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw IRC channel plugin",
"type": "module",
"devDependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/kilocode-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Kilo Gateway provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/kimi-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Kimi provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/line",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw LINE channel plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -46,10 +46,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/litellm-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw LiteLLM provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/llm-task",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw JSON-only LLM task plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/lmstudio-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw LM Studio provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/lobster",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
"repository": {
"type": "git",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
# Changelog
## 2026.5.17
## 2026.5.16
### Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/matrix",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Matrix channel plugin",
"repository": {
"type": "git",
@@ -22,7 +22,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -87,10 +87,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/mattermost",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Mattermost channel plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/media-understanding-core",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw media understanding runtime package",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-core",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw core memory search plugin",
"type": "module",
@@ -14,7 +14,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-lancedb",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-wiki",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw persistent wiki plugin",
"type": "module",
@@ -14,7 +14,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-foundry",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Microsoft Foundry provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-speech",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Microsoft speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/migrate-claude",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "Claude to OpenClaw migration provider",
"type": "module",
@@ -9,7 +9,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/migrate-hermes",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "Hermes to OpenClaw migration provider",
"type": "module",
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/minimax-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw MiniMax provider and OAuth plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/mistral-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Mistral provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/moonshot-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Moonshot provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/msteams",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Microsoft Teams channel plugin",
"repository": {
"type": "git",
@@ -22,7 +22,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -58,10 +58,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/nextcloud-talk",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Nextcloud Talk channel plugin",
"repository": {
"type": "git",
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -44,10 +44,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/nostr",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"description": "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -54,10 +54,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.17"
"pluginApi": ">=2026.5.16-beta.4"
},
"build": {
"openclawVersion": "2026.5.17"
"openclawVersion": "2026.5.16-beta.4"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/nvidia-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw NVIDIA provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/oc-path",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw oc:// workspace path plugin",
"type": "module",
@@ -15,7 +15,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.17"
"openclaw": ">=2026.5.16-beta.4"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/ollama-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw Ollama provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/open-prose",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenProse VM skill pack plugin (slash command + telemetry).",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/openai-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw OpenAI provider plugins",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/opencode-go-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw OpenCode Go provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/opencode-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw OpenCode Zen provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/openrouter-provider",
"version": "2026.5.17",
"version": "2026.5.16-beta.4",
"private": true,
"description": "OpenClaw OpenRouter provider plugin",
"type": "module",

Some files were not shown because too many files have changed in this diff Show More