mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-14 18:19:02 +08:00
Compare commits
42 Commits
codex/secu
...
v2026.6.5-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ff0b21e950 | ||
|
|
b85a13d97d | ||
|
|
965230a417 | ||
|
|
537301c978 | ||
|
|
2e85b58581 | ||
|
|
eeb9b60d0c | ||
|
|
8689417638 | ||
|
|
fb7d2fe128 | ||
|
|
9691ddcab1 | ||
|
|
597bd1684c | ||
|
|
cda413b97a | ||
|
|
e81b643699 | ||
|
|
332df4c4db | ||
|
|
7c5f00d5d3 | ||
|
|
02f3890a1a | ||
|
|
40fa8ed829 | ||
|
|
976e4bfa25 | ||
|
|
678c9cecf8 | ||
|
|
b628d3d534 | ||
|
|
1e28f4845a | ||
|
|
57f5bf25b8 | ||
|
|
c98f49b474 | ||
|
|
0990d98ede | ||
|
|
b15bc581cb | ||
|
|
08048d5f23 | ||
|
|
ad169bbecd | ||
|
|
eea34ca044 | ||
|
|
bd81d3e712 | ||
|
|
579c2b7d34 | ||
|
|
56b63f6ec8 | ||
|
|
07fa4c7095 | ||
|
|
676f41beae | ||
|
|
32f35c58cf | ||
|
|
c62a997446 | ||
|
|
82748a4c97 | ||
|
|
5123af94bd | ||
|
|
2d08823e24 | ||
|
|
8ce8095cd1 | ||
|
|
76b4ef2170 | ||
|
|
53e3bbd7b6 | ||
|
|
2254e4d085 | ||
|
|
b813153e3f |
57
.github/workflows/docker-release.yml
vendored
57
.github/workflows/docker-release.yml
vendored
@@ -88,6 +88,25 @@ jobs:
|
||||
ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/{0}', inputs.tag) || github.ref }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Pre-pull BuildKit image
|
||||
shell: bash
|
||||
env:
|
||||
BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1
|
||||
run: |
|
||||
set -euo pipefail
|
||||
for attempt in 1 2 3 4; do
|
||||
if docker pull "${BUILDKIT_IMAGE}"; then
|
||||
exit 0
|
||||
fi
|
||||
if [[ "${attempt}" == "4" ]]; then
|
||||
echo "::error::Failed to pull ${BUILDKIT_IMAGE} after ${attempt} attempts"
|
||||
exit 1
|
||||
fi
|
||||
sleep_seconds=$((attempt * 10))
|
||||
echo "BuildKit image pull failed; retrying in ${sleep_seconds}s (${attempt}/4)."
|
||||
sleep "${sleep_seconds}"
|
||||
done
|
||||
|
||||
- name: Set up Docker Builder
|
||||
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
|
||||
|
||||
@@ -279,6 +298,25 @@ jobs:
|
||||
ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/{0}', inputs.tag) || github.ref }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Pre-pull BuildKit image
|
||||
shell: bash
|
||||
env:
|
||||
BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1
|
||||
run: |
|
||||
set -euo pipefail
|
||||
for attempt in 1 2 3 4; do
|
||||
if docker pull "${BUILDKIT_IMAGE}"; then
|
||||
exit 0
|
||||
fi
|
||||
if [[ "${attempt}" == "4" ]]; then
|
||||
echo "::error::Failed to pull ${BUILDKIT_IMAGE} after ${attempt} attempts"
|
||||
exit 1
|
||||
fi
|
||||
sleep_seconds=$((attempt * 10))
|
||||
echo "BuildKit image pull failed; retrying in ${sleep_seconds}s (${attempt}/4)."
|
||||
sleep "${sleep_seconds}"
|
||||
done
|
||||
|
||||
- name: Set up Docker Builder
|
||||
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
|
||||
|
||||
@@ -561,6 +599,25 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Pre-pull BuildKit image
|
||||
shell: bash
|
||||
env:
|
||||
BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1
|
||||
run: |
|
||||
set -euo pipefail
|
||||
for attempt in 1 2 3 4; do
|
||||
if docker pull "${BUILDKIT_IMAGE}"; then
|
||||
exit 0
|
||||
fi
|
||||
if [[ "${attempt}" == "4" ]]; then
|
||||
echo "::error::Failed to pull ${BUILDKIT_IMAGE} after ${attempt} attempts"
|
||||
exit 1
|
||||
fi
|
||||
sleep_seconds=$((attempt * 10))
|
||||
echo "BuildKit image pull failed; retrying in ${sleep_seconds}s (${attempt}/4)."
|
||||
sleep "${sleep_seconds}"
|
||||
done
|
||||
|
||||
- name: Set up Docker Builder
|
||||
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
|
||||
|
||||
|
||||
1
.github/workflows/install-smoke.yml
vendored
1
.github/workflows/install-smoke.yml
vendored
@@ -296,6 +296,7 @@ jobs:
|
||||
|
||||
- name: Run QR package install smoke
|
||||
env:
|
||||
OPENCLAW_DOCKER_E2E_CPUS: "4"
|
||||
OPENCLAW_QR_SMOKE_FORCE_INSTALL: "1"
|
||||
run: bash scripts/e2e/qr-import-docker.sh
|
||||
|
||||
|
||||
@@ -1503,31 +1503,66 @@ jobs:
|
||||
|
||||
- name: Build and push bare Docker E2E image
|
||||
if: steps.plan.outputs.needs_bare_image == '1' && steps.image_exists.outputs.bare_exists != '1'
|
||||
uses: useblacksmith/build-push-action@fb9e3e6a9299c78462bfadd0d93352c316adc9b8 # v2
|
||||
with:
|
||||
context: .
|
||||
file: ./scripts/e2e/Dockerfile
|
||||
target: bare
|
||||
platforms: linux/amd64
|
||||
tags: ${{ steps.image.outputs.bare_image }}
|
||||
sbom: true
|
||||
provenance: mode=max
|
||||
push: true
|
||||
shell: bash
|
||||
env:
|
||||
IMAGE_REF: ${{ steps.image.outputs.bare_image }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
build_cmd=(
|
||||
docker buildx build
|
||||
--file ./scripts/e2e/Dockerfile
|
||||
--target bare
|
||||
--platform linux/amd64
|
||||
--tag "$IMAGE_REF"
|
||||
--sbom=true
|
||||
--provenance=mode=max
|
||||
--push
|
||||
.
|
||||
)
|
||||
for attempt in 1 2 3 4; do
|
||||
if "${build_cmd[@]}"; then
|
||||
exit 0
|
||||
fi
|
||||
if [[ "$attempt" == "4" ]]; then
|
||||
echo "::error::Failed to build Docker E2E bare image after ${attempt} attempts"
|
||||
exit 1
|
||||
fi
|
||||
sleep_seconds=$((attempt * 20))
|
||||
echo "Docker E2E bare image build failed; retrying in ${sleep_seconds}s (${attempt}/4)."
|
||||
sleep "$sleep_seconds"
|
||||
done
|
||||
|
||||
- name: Build and push functional Docker E2E image
|
||||
if: steps.plan.outputs.needs_functional_image == '1' && steps.image_exists.outputs.functional_exists != '1'
|
||||
uses: useblacksmith/build-push-action@fb9e3e6a9299c78462bfadd0d93352c316adc9b8 # v2
|
||||
with:
|
||||
context: .
|
||||
file: ./scripts/e2e/Dockerfile
|
||||
target: functional
|
||||
build-contexts: |
|
||||
openclaw_package=.artifacts/docker-e2e-package
|
||||
platforms: linux/amd64
|
||||
tags: ${{ steps.image.outputs.functional_image }}
|
||||
sbom: true
|
||||
provenance: mode=max
|
||||
push: true
|
||||
shell: bash
|
||||
env:
|
||||
IMAGE_REF: ${{ steps.image.outputs.functional_image }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
build_cmd=(
|
||||
docker buildx build
|
||||
--file ./scripts/e2e/Dockerfile
|
||||
--target functional
|
||||
--build-context openclaw_package=.artifacts/docker-e2e-package
|
||||
--platform linux/amd64
|
||||
--tag "$IMAGE_REF"
|
||||
--sbom=true
|
||||
--provenance=mode=max
|
||||
--push
|
||||
.
|
||||
)
|
||||
for attempt in 1 2 3 4; do
|
||||
if "${build_cmd[@]}"; then
|
||||
exit 0
|
||||
fi
|
||||
if [[ "$attempt" == "4" ]]; then
|
||||
echo "::error::Failed to build Docker E2E functional image after ${attempt} attempts"
|
||||
exit 1
|
||||
fi
|
||||
sleep_seconds=$((attempt * 20))
|
||||
echo "Docker E2E functional image build failed; retrying in ${sleep_seconds}s (${attempt}/4)."
|
||||
sleep "$sleep_seconds"
|
||||
done
|
||||
|
||||
prepare_live_test_image:
|
||||
needs: validate_selected_ref
|
||||
|
||||
25
CHANGELOG.md
25
CHANGELOG.md
@@ -13,6 +13,7 @@ Docs: https://docs.openclaw.ai
|
||||
- Google Vertex ADC users get static catalog rows and runtime model resolution again, while single-provider cooldown recovery and memory adapter status checks are more reliable. (#90506, #90609, #90717, #90816) Thanks @849261680.
|
||||
- Matrix can preflight voice notes before mention gating, preserve thread reads/replies through Matrix relations pagination, and carry QA coverage for voice and thread flows. (#78016, #90415)
|
||||
- Auth and plugin install state is more durable: auth profiles now live in SQLite, official npm plugin install records keep their trusted pins, and prerelease fallback integrity checks avoid carrying stale integrity forward. (#89102, #88585)
|
||||
- Agent, tool, and provider loops are stricter around MCP lease timestamps, prompt-cache tool names, local tool catalogs, unreadable dynamic tools, owner-only HTTP tools, and provider catalog metadata, reducing hidden retries and unsafe exposure. (#91124, #91233, #90022, #90261)
|
||||
- macOS node mode no longer silently self-reconnects away from a healthy direct Gateway session, reducing unexpected companion app session churn. (#90668, #90815) Thanks @vrurg.
|
||||
- Upgrade and service paths are safer: cron legacy JSON stores migrate during doctor preflight, service env placeholders no longer mask state-dir secrets, WhatsApp startup waits are bounded, and disabled WhatsApp accounts tear down on config reload. (#90072, #90208, #90277, #90488, #90486, #87951, #87965) Thanks @MonkeyLeeT, @sallyom, @mcaxtr, and @MukundaKatta.
|
||||
|
||||
@@ -22,10 +23,11 @@ Docs: https://docs.openclaw.ai
|
||||
- Matrix/channels: add voice-message preflight and thread-aware read/reply behavior, including Matrix QA scenario wiring and docs for voice-message behavior. (#78016, #90415)
|
||||
- Skills/ClawHub: install ClawHub skills backed by GitHub repositories through the resolved install API, download the pinned GitHub commit, keep install-policy checks, and report install telemetry after success. (#90478) Thanks @Patrick-Erichsen.
|
||||
- Google Chat/channels: add native approval card actions and click handling so Google Chat approvals use platform-native cards instead of generic message flow.
|
||||
- Mobile: Android provider/model screens now surface expiring, unavailable, unresolved, and attention states more clearly, while iOS settings and Talk tabs keep diagnostics, gateway rows, attachment labels, and unavailable Talk controls reachable.
|
||||
- Mobile: Android provider/model screens now surface expiring, unavailable, unresolved, and attention states more clearly, Android adds theme mode selection, and iOS settings and Talk tabs keep diagnostics, gateway rows, attachment labels, fallback copy, and unavailable Talk controls reachable. (#90752, #91201)
|
||||
- Memory: QMD search can use the new rerank toggle, and memory adapter status uses the resolved default model identity when checking plain status. (#61834)
|
||||
- Docs/tooling: add Parallel search docs, refresh weather-skill guidance toward `web_fetch`, clarify legacy `openai-codex` auth, document release/test helper scripts, and tighten changed-test routing docs for CI/debugging work. (#90028, #90250) Thanks @fuller-stack-dev.
|
||||
- Release/process: switch release trains to `YYYY.M.PATCH` monthly patch numbering, keep pre-transition tags compatible, and pin the June 2026 floor at `2026.6.5` after the published beta.
|
||||
- Release metadata: align OpenClaw, publishable plugin manifests, generated shrinkwraps, app version metadata, iOS release notes, Matrix plugin changelog, and generated release baselines with the `2026.6.5` beta train.
|
||||
- Platform maintenance: refresh Android, Swift/macOS, Docker, CodeQL, Buildx, Docker build/push, and Codex Action dependencies for this release train. (#74980, #81757, #86481, #86483, #90601)
|
||||
|
||||
### Fixes
|
||||
@@ -33,18 +35,35 @@ Docs: https://docs.openclaw.ai
|
||||
- Channel content boundaries: QQBot now strips reasoning/thinking tags before sending, preserving final answers while hiding internal model narration from users. (#89913, #90132) Thanks @openperf.
|
||||
- Agents/MCP/providers: coerce non-text/image MCP tool-result blocks before they reach provider converters, preserving valid images and turning richer MCP content into text instead of malformed image blocks. (#90710, #90728) Thanks @RanSHammer and @849261680.
|
||||
- Anthropic/Codex/ACP/agent recovery: defer Anthropic stream start events until `message_start`, strip stale compaction thinking signatures before Anthropic replay, detect unsigned thinking-only stalls, refresh prompt fences after compaction writes, reject empty completion handoffs, preserve parent streaming-off overrides/shared progress commentary, forward heartbeat metadata to context-engine hooks, and cover Codex session/thread migration edge cases. (#90667, #90697, #90163, #90108, #89874, #89505, #90632, #89302, #90729, #90317, #90319) Thanks @openperf, @100yenadmin, and @ooiuuii.
|
||||
- Agents/Codex/tools: MCP lease release no longer refreshes `lastUsedAt`, prompt-cache tool names are guarded, lean local tool catalogs stay compact, unreadable dynamic tools are quarantined, orphan tool errors still surface, native subagent completion results survive app-server monitoring, and background-session name derivation avoids regex backtracking risk. (#91124, #90612, #90022, #91235, #91233)
|
||||
- Provider/model resolution: preserve Google Vertex ADC auth markers in generated catalogs, re-probe a single-provider primary after cooldown, share Codex model visibility, fail closed for unknown model auth, preserve Codex alias availability, keep unresolved profile refs unknown, and avoid resolving auth while listing models. (#90506, #90609, #90717, #90702) Thanks @849261680.
|
||||
- Provider/model resolution: live provider model catalogs keep helper coverage, Ollama catalog metadata is preserved, Google provider prefixes are stripped from Gemini paths, Foundry Responses reasoning replay ids survive, MiniMax M3 thinking stays enabled, Vertex multi-region calls use the right regional host, and OpenRouter streamed generation cost is reconciled. (#91125)
|
||||
- Gateway/macOS/mobile: avoid duplicate Gateway probe warnings by identity, rate-limit node pairing requests while preserving paired-node reconnects, keep macOS node mode on a healthy direct Gateway session, keep iOS diagnostics and gateway rows reachable, and avoid Linux ARM Gradle resource tasks during Android builds. (#85791, #90147, #90668, #90815) Thanks @giodl73-repo and @vrurg.
|
||||
- Gateway/security/config: owner-only HTTP tools are gated, sandbox skills remain readable in writable sandboxes, legacy agent registry and Codex model metadata migrate safely, and stalled MCP response bodies time out instead of tying up Gateway workers. (#90261)
|
||||
- Plugins/Gateway: legacy flat Control UI descriptors from shipped JavaScript plugins now normalize `name` and missing surface fields into session descriptors, restoring Kitchen Sink RPC descriptor proof for package-backed plugin validation.
|
||||
- TUI/chat/Workboard/auto-reply: optimistic user messages stay stable across stale history reloads, runId reassignment, and abort windows instead of disappearing, jumping, or lingering as ghost rows; Workboard stale lifecycle bulk updates no longer overwrite newer status/provenance; message-tool sends now count as delivery. (#86205, #89600, #88592, #90123) Thanks @RomneyDa.
|
||||
- Cron/update/service env: doctor config preflight now migrates legacy cron JSON stores into SQLite before runtime reads, service env planning skips unresolved placeholders that would mask state-dir `.env` values, and session transcript rewrites keep registry markers/discriminants consistent. (#90072, #90208, #90277, #90488) Thanks @MonkeyLeeT and @sallyom.
|
||||
- Cron/update/service env: doctor config preflight now migrates legacy cron JSON stores into SQLite before runtime reads, isolated agent turn payload messages preserve timeout context, service env planning skips unresolved placeholders that would mask state-dir `.env` values, and session transcript rewrites keep registry markers/discriminants consistent. (#90072, #90208, #91230, #90277, #90488) Thanks @MonkeyLeeT and @sallyom.
|
||||
- State/storage: Matrix sync and crypto sidecars, memory-wiki import/source-sync state, sandbox registry state, ACPX process state, device-pair notify state, Zalo hosted media, and plugin SDK dedupe state now use SQLite-owned storage instead of ad hoc runtime files. (#91100, #91108, #91056)
|
||||
- Security/config/tooling: guard MCP HTTP redirects, protect global agent config defaults, and keep release/test/tooling proof failures bounded and explicit. (#89732, #90145)
|
||||
- Channels: WhatsApp restarts when per-account config changes, bounds background startup waits, closes failed sockets, and preserves reconnect behavior; Mattermost slash commands keep their state on `globalThis`; Feishu streaming cards preserve full merged content; voice-call tracks Twilio streams after connect; ClickClack reply tools respect `toolsAllow`. (#87951, #87965, #90486, #68113, #90534, #90181, #90607, #89500) Thanks @MukundaKatta, @mcaxtr, @infoanton, @mushuiyu886, and @sahibzada-allahyar.
|
||||
- Channels: WhatsApp restarts when per-account config changes, bounds background startup waits, closes failed sockets, and preserves reconnect behavior; Mattermost slash commands keep their state on `globalThis`; Feishu streaming cards preserve full merged content; iMessage private-API failures and send timeouts explain themselves while split-send coalescing honors balloon metadata; voice-call tracks Twilio streams after connect; ClickClack reply tools respect `toolsAllow`; Discord runtime adapters stay resolvable; and outbound delivery retries survive budget deferrals. (#87951, #87965, #90486, #68113, #90534, #90181, #90607, #89500, #91041, #90858, #91119, #91241) Thanks @MukundaKatta, @mcaxtr, @infoanton, @mushuiyu886, and @sahibzada-allahyar.
|
||||
- Release/CI/E2E: main CI guard drift, PR merge diff scoping, live Docker credential staging, base-image qualification, installer Docker classification, Playwright dependency install recovery, API-key auth for Codex live Docker lanes, Parallels option terminators, and JSON-mode progress handling are tighter so release proof fails cleaner. (#90532, #90287, #90058) Thanks @RomneyDa, @hxy91819, and @mrunalp.
|
||||
- Release/CI/E2E: installed-package root dist verification now allows the current package's JavaScript file count while keeping dependency, per-file-size, and scan-bound checks active.
|
||||
- Release/CI/E2E: Chutes OAuth model-discovery proof now accepts standard `Headers` requests, and QR package install smoke caps Docker CPU requests to the hosted runner capacity so beta validation fails on real package regressions.
|
||||
- Release/CI/E2E: Matrix and Slack release validation fixtures now seed SQLite-backed session metadata, keeping channel proof aligned with the current session store.
|
||||
- Release/CI/E2E: Matrix exec approval and WhatsApp group activation release fixtures now seed SQLite-backed session metadata, and QA Lab capability-flip proof tolerates restart-aborted waits only after restored image media proof lands.
|
||||
- Release/CI/E2E: Discord native `/think` autocomplete release fixtures now seed SQLite-backed session overrides, keeping provider-specific reasoning choices aligned with the current session store.
|
||||
- Release/CI/E2E: Telegram native approval release fixtures now seed SQLite-backed session origin metadata, keeping plugin approval routing aligned with the current session store.
|
||||
- Release/CI/E2E: Memory Core dreaming release fixtures now seed SQLite-backed session metadata, keeping stale dreaming cleanup and session ingestion proof aligned with the current session store.
|
||||
- Release/CI/E2E: Docker E2E and live Docker harness runs now apply default memory, CPU, and process ceilings while preserving explicit per-lane overrides.
|
||||
- Release/CI/E2E: Docker E2E CPU limits now cap to the runner capacity, keeping package Telegram acceptance on hosted 8-vCPU runners focused on package regressions instead of impossible Docker resource requests.
|
||||
- Release/CI/E2E: task maintenance release checks now reset pinned config and one-time session migration state around isolated temp state dirs, keeping normal CI focused on the active session-store fixture instead of stale process snapshots.
|
||||
- Release/CI/E2E: plugin lifecycle matrix resource sampling now fails phases that exceed RSS, wall-clock, or CPU ceilings instead of only logging the measurements.
|
||||
- Release/CI/E2E: Codex npm plugin live assertions now cap transcript discovery and diagnostic log reads so failure proof stays bounded.
|
||||
- Release/CI/E2E: browser snapshot, release-scenario, release-user-journey, Telegram desktop/RTT/package, web-search, Parallels update, plugin update, doctor switch, and upgrade-survivor diagnostics now stream or bound log/artifact reads so failed proof stays inspectable without unbounded output.
|
||||
- Tests/state isolation: QA Lab valid-tool-call metrics now require runtime tool-call evidence when runtime parity data is available instead of counting tool-backed scenario pass status alone.
|
||||
- Tests/state isolation: QA Lab runtime parity now fails planned-only tool-call rows without matching tool results instead of treating matching mock plans as real tool evidence.
|
||||
- Tests/state isolation: QA Lab runtime parity now treats matching controlled tool errors as equivalent and falls back to transcript tool results when mock debug rows miss async image-generation starts.
|
||||
- Tests/state isolation: QA suites now fail closed on skipped summaries, missing runtime tool proof, planned-only rows, loose release limits, missing live/provider artifacts, failed agent reply markers, and package Telegram summary failures.
|
||||
- Tests/state isolation: provider, media, auth, cron, task, session, sandbox, Gateway, and Codex timeout fixtures now scope more home/state/env data per test, reducing cross-test leakage and making release validation failures less noisy. (#90027, #89974)
|
||||
|
||||
## 2026.6.2
|
||||
|
||||
@@ -65,8 +65,8 @@ android {
|
||||
applicationId = "ai.openclaw.app"
|
||||
minSdk = 31
|
||||
targetSdk = 36
|
||||
versionCode = 2026060201
|
||||
versionName = "2026.6.2"
|
||||
versionCode = 2026060501
|
||||
versionName = "2026.6.5"
|
||||
ndk {
|
||||
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
|
||||
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# OpenClaw iOS Changelog
|
||||
|
||||
## 2026.6.5 - 2026-06-05
|
||||
|
||||
Maintenance update for the current OpenClaw beta release.
|
||||
|
||||
## 2026.6.2 - 2026-06-02
|
||||
|
||||
OpenClaw is now available on iPhone.
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Source of truth: apps/ios/version.json
|
||||
// Generated by scripts/ios-sync-versioning.ts.
|
||||
|
||||
OPENCLAW_IOS_VERSION = 2026.6.2
|
||||
OPENCLAW_MARKETING_VERSION = 2026.6.2
|
||||
OPENCLAW_IOS_VERSION = 2026.6.5
|
||||
OPENCLAW_MARKETING_VERSION = 2026.6.5
|
||||
OPENCLAW_BUILD_VERSION = 1
|
||||
|
||||
#include? "../build/Version.xcconfig"
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
OpenClaw is now available on iPhone.
|
||||
|
||||
Connect to your OpenClaw Gateway to chat with your assistant, use realtime Talk mode, review approvals, share content from iOS, and bring device capabilities like camera, location, screen, and notifications into your private automation workflows.
|
||||
Maintenance update for the current OpenClaw beta release.
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"version": "2026.6.2"
|
||||
"version": "2026.6.5"
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2026.6.2</string>
|
||||
<string>2026.6.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2026060200</string>
|
||||
<string>2026060500</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>OpenClaw</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
a5a97a8b484acd13e68604037c8d8f448699700103c6ea2186f5914ad35a0623 config-baseline.json
|
||||
b0d668dbd794d2f54738152a4bcfd2a306c7954901e78d4dfbde7545a8301ce5 config-baseline.core.json
|
||||
0637c9bdcb9517f56049dd786563366877458d35df575328a6b80a890c8bc915 config-baseline.channel.json
|
||||
37b56008790612b8293930b6a29d74490e98daa90f954fca9d133fcc28645c4c config-baseline.json
|
||||
75b64c2ea081369ba4306493313a8a4cd48b784145f92fed995e6b77a5df350d config-baseline.core.json
|
||||
17d64c9799dfa239a49493413f1100bdd9237e9b67aaeae331a4604dbc227023 config-baseline.channel.json
|
||||
f9d1f50bfa8403891e76cd99dc1357cdece4a71e8ae18a39b190c2a14e6f97b0 config-baseline.plugin.json
|
||||
|
||||
4
extensions/acpx/npm-shrinkwrap.json
generated
4
extensions/acpx/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/acpx",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/acpx",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@agentclientprotocol/claude-agent-acp": "0.39.0",
|
||||
"@zed-industries/codex-acp": "0.15.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/acpx",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw ACP runtime backend with plugin-owned session and transport management.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -26,10 +26,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"staticAssets": [
|
||||
{
|
||||
"source": "./src/runtime-internals/mcp-proxy.mjs",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/admin-http-rpc",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw admin HTTP RPC endpoint",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/alibaba-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Alibaba Model Studio video provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-mantle-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/amazon-bedrock-mantle-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@anthropic-ai/sdk": "0.100.1",
|
||||
"@aws/bedrock-token-generator": "1.1.0"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-mantle-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Amazon Bedrock Mantle provider plugin for OpenAI-compatible model routing.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -24,10 +24,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
4
extensions/amazon-bedrock/npm-shrinkwrap.json
generated
4
extensions/amazon-bedrock/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/amazon-bedrock-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-bedrock": "3.1056.0",
|
||||
"@aws-sdk/client-bedrock-runtime": "3.1056.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Amazon Bedrock provider plugin with model discovery, embeddings, and guardrail support.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -28,10 +28,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
4
extensions/anthropic-vertex/npm-shrinkwrap.json
generated
4
extensions/anthropic-vertex/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/anthropic-vertex-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/anthropic-vertex-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@anthropic-ai/vertex-sdk": "0.16.1"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/anthropic-vertex-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Anthropic Vertex provider plugin for Claude models on Google Vertex AI.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -23,10 +23,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/anthropic-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Anthropic provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/arcee-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Arcee provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/azure-speech",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Azure Speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/bonjour",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Bonjour/mDNS gateway discovery",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
|
||||
4
extensions/brave/npm-shrinkwrap.json
generated
4
extensions/brave/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/brave-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/brave-plugin",
|
||||
"version": "2026.6.2"
|
||||
"version": "2026.6.5-beta.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/brave-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Brave Search provider plugin for web search.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,10 +21,10 @@
|
||||
"allowInvalidConfigRecovery": true
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/browser-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw browser tool plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/byteplus-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw BytePlus provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/canvas-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Canvas plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/cerebras-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Cerebras provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Chutes tests cover implicit provider plugin behavior.
|
||||
import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime";
|
||||
import { resolveOAuthApiKeyMarker } from "openclaw/plugin-sdk/provider-auth";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import plugin from "./index.js";
|
||||
import { CHUTES_BASE_URL } from "./models.js";
|
||||
import { CHUTES_BASE_URL, clearChutesModelCacheForTests } from "./models.js";
|
||||
|
||||
const CHUTES_OAUTH_MARKER = resolveOAuthApiKeyMarker("chutes");
|
||||
|
||||
@@ -35,6 +35,17 @@ async function runChutesCatalogProvider(params: { apiKey: string; discoveryApiKe
|
||||
return result.provider;
|
||||
}
|
||||
|
||||
function readAuthorizationHeader(init?: { headers?: HeadersInit }): string {
|
||||
const headers = init?.headers;
|
||||
if (headers instanceof Headers) {
|
||||
return headers.get("Authorization") ?? "";
|
||||
}
|
||||
if (Array.isArray(headers)) {
|
||||
return headers.find(([key]) => key.toLowerCase() === "authorization")?.[1] ?? "";
|
||||
}
|
||||
return headers?.Authorization ?? headers?.authorization ?? "";
|
||||
}
|
||||
|
||||
async function withRealChutesDiscovery<T>(
|
||||
run: (fetchMock: ReturnType<typeof vi.fn>) => Promise<T>,
|
||||
) {
|
||||
@@ -60,6 +71,10 @@ async function withRealChutesDiscovery<T>(
|
||||
}
|
||||
|
||||
describe("chutes implicit provider auth mode", () => {
|
||||
beforeEach(() => {
|
||||
clearChutesModelCacheForTests();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.restoreAllMocks();
|
||||
});
|
||||
@@ -101,8 +116,8 @@ describe("chutes implicit provider auth mode", () => {
|
||||
|
||||
const chutesCalls = fetchMock.mock.calls.filter(([url]) => String(url).includes("chutes.ai"));
|
||||
expect(chutesCalls.length).toBeGreaterThan(0);
|
||||
const request = chutesCalls[0]?.[1] as { headers?: Record<string, string> } | undefined;
|
||||
expect(request?.headers?.Authorization).toBe("Bearer my-chutes-access-token");
|
||||
const request = chutesCalls[0]?.[1] as { headers?: HeadersInit } | undefined;
|
||||
expect(readAuthorizationHeader(request)).toBe("Bearer my-chutes-access-token");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/chutes-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Chutes.ai provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/clickclack",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw ClickClack channel plugin",
|
||||
"type": "module",
|
||||
@@ -18,7 +18,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/cloudflare-ai-gateway-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Cloudflare AI Gateway provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/codex-supervisor",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Codex app-server fleet supervision plugin.",
|
||||
"type": "module",
|
||||
|
||||
4
extensions/codex/npm-shrinkwrap.json
generated
4
extensions/codex/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/codex",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/codex",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@openai/codex": "0.135.0",
|
||||
"typebox": "1.1.39",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/codex",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Codex app-server harness and model provider plugin with a Codex-managed GPT catalog.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -26,10 +26,10 @@
|
||||
"minHostVersion": ">=2026.5.1-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -380,7 +380,7 @@ describe("CodexNativeSubagentMonitor", () => {
|
||||
const runtime = createRuntime();
|
||||
const monitor = new CodexNativeSubagentMonitor(client, runtime, {
|
||||
codexHome,
|
||||
transcriptPollDelaysMs: [10],
|
||||
transcriptPollDelaysMs: [10, 1],
|
||||
});
|
||||
monitor.registerParent({
|
||||
parentThreadId: "parent-thread",
|
||||
@@ -400,15 +400,20 @@ describe("CodexNativeSubagentMonitor", () => {
|
||||
|
||||
expect(runtime.deliverAgentHarnessTaskCompletion).not.toHaveBeenCalled();
|
||||
|
||||
await vi.advanceTimersByTimeAsync(20);
|
||||
await vi.advanceTimersByTimeAsync(10);
|
||||
expect(runtime.deliverAgentHarnessTaskCompletion).not.toHaveBeenCalled();
|
||||
|
||||
expect(runtime.deliverAgentHarnessTaskCompletion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
childSessionId: "child-thread",
|
||||
status: "succeeded",
|
||||
statusLabel: "completed_without_final_message",
|
||||
result: "Codex native subagent completed without a final assistant message.",
|
||||
}),
|
||||
await vi.advanceTimersByTimeAsync(1);
|
||||
|
||||
await vi.waitFor(() =>
|
||||
expect(runtime.deliverAgentHarnessTaskCompletion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
childSessionId: "child-thread",
|
||||
status: "succeeded",
|
||||
statusLabel: "completed_without_final_message",
|
||||
result: "Codex native subagent completed without a final assistant message.",
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
client.close();
|
||||
|
||||
@@ -606,23 +606,31 @@ export class CodexNativeSubagentMonitor {
|
||||
const delayMs = noFinalCompletionFallbackDelayMs(this.transcriptPollDelaysMs);
|
||||
childState.noFinalCompletionFallbackTimer = setTimeout(() => {
|
||||
childState.noFinalCompletionFallbackTimer = undefined;
|
||||
void this.reconcileChildTranscript(childState.childThreadId)
|
||||
.catch((error: unknown) => {
|
||||
embeddedAgentLog.warn("Failed to reconcile Codex native subagent transcript", {
|
||||
childThreadId: childState.childThreadId,
|
||||
error: formatErrorMessage(error),
|
||||
});
|
||||
return false;
|
||||
})
|
||||
.then((reconciled) => {
|
||||
if (!reconciled && !childState.transcriptTerminal) {
|
||||
void this.processCompletion(state, completion, eventAt);
|
||||
}
|
||||
});
|
||||
void this.deliverNoFinalCompletionFallback(state, childState, completion, eventAt);
|
||||
}, delayMs);
|
||||
unrefTimer(childState.noFinalCompletionFallbackTimer);
|
||||
}
|
||||
|
||||
private async deliverNoFinalCompletionFallback(
|
||||
state: ParentState,
|
||||
childState: ChildState,
|
||||
completion: CodexNativeSubagentCompletion,
|
||||
eventAt: number,
|
||||
): Promise<void> {
|
||||
const reconciled = await this.reconcileChildTranscript(childState.childThreadId).catch(
|
||||
(error: unknown): false => {
|
||||
embeddedAgentLog.warn("Failed to reconcile Codex native subagent transcript", {
|
||||
childThreadId: childState.childThreadId,
|
||||
error: formatErrorMessage(error),
|
||||
});
|
||||
return false;
|
||||
},
|
||||
);
|
||||
if (!reconciled && !childState.transcriptTerminal) {
|
||||
await this.processCompletion(state, completion, eventAt);
|
||||
}
|
||||
}
|
||||
|
||||
private clearTimers(): void {
|
||||
if (this.taskRowReconcileTimer) {
|
||||
clearInterval(this.taskRowReconcileTimer);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/comfy-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw ComfyUI provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/copilot-proxy",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Copilot Proxy provider plugin",
|
||||
"type": "module",
|
||||
|
||||
4
extensions/copilot/npm-shrinkwrap.json
generated
4
extensions/copilot/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/copilot",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/copilot",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@github/copilot-sdk": "1.0.0-beta.9"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/copilot",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw GitHub Copilot agent runtime plugin (registers a `github-copilot` AgentHarness backed by @github/copilot-sdk over JSON-RPC to the GitHub Copilot CLI)",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,10 +25,10 @@
|
||||
"minHostVersion": ">=2026.5.28"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/deepgram-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Deepgram media-understanding provider",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/deepinfra-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw DeepInfra provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/deepseek-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw DeepSeek provider plugin",
|
||||
"type": "module",
|
||||
|
||||
4
extensions/diagnostics-otel/npm-shrinkwrap.json
generated
4
extensions/diagnostics-otel/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-otel",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/diagnostics-otel",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@opentelemetry/api": "1.9.1",
|
||||
"@opentelemetry/api-logs": "0.218.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-otel",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw diagnostics OpenTelemetry exporter for metrics and traces.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -34,10 +34,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-prometheus",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/diagnostics-prometheus",
|
||||
"version": "2026.6.2"
|
||||
"version": "2026.6.5-beta.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-prometheus",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw diagnostics Prometheus exporter for runtime metrics.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,10 +21,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/diffs-language-pack",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/diffs-language-pack",
|
||||
"version": "2026.6.2"
|
||||
"version": "2026.6.5-beta.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diffs-language-pack",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw diffs viewer syntax highlighting language pack",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -22,13 +22,13 @@
|
||||
"minHostVersion": ">=2026.5.27"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"assetScripts": {
|
||||
"build": "node ../../scripts/build-diffs-viewer-runtime.mjs full"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"staticAssets": [
|
||||
{
|
||||
"source": "./assets/viewer-runtime.js",
|
||||
|
||||
4
extensions/diffs/npm-shrinkwrap.json
generated
4
extensions/diffs/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/diffs",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/diffs",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@pierre/diffs": "1.2.4",
|
||||
"@pierre/theme": "1.0.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diffs",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw read-only diff viewer plugin and file renderer for agents.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -29,13 +29,13 @@
|
||||
"minHostVersion": ">=2026.4.30"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"assetScripts": {
|
||||
"build": "node ../../scripts/build-diffs-viewer-runtime.mjs curated"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2",
|
||||
"openclawVersion": "2026.6.5-beta.5",
|
||||
"staticAssets": [
|
||||
{
|
||||
"source": "./assets/viewer-runtime.js",
|
||||
|
||||
6
extensions/discord/npm-shrinkwrap.json
generated
6
extensions/discord/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/discord",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/discord",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@discordjs/voice": "0.19.2",
|
||||
"discord-api-types": "0.38.48",
|
||||
@@ -16,7 +16,7 @@
|
||||
"ws": "8.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/discord",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -20,7 +20,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -67,10 +67,10 @@
|
||||
"allowInvalidConfigRecovery": true
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -7,7 +7,11 @@ import {
|
||||
createEmptyPluginRegistry,
|
||||
setActivePluginRegistry,
|
||||
} from "openclaw/plugin-sdk/plugin-test-runtime";
|
||||
import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/session-store-runtime";
|
||||
import {
|
||||
clearSessionStoreCacheForTest,
|
||||
saveSessionStore,
|
||||
type SessionEntry,
|
||||
} from "openclaw/plugin-sdk/session-store-runtime";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { ChannelType, type AutocompleteInteraction } from "../internal/discord.js";
|
||||
import { createNoopThreadBindingManager } from "./thread-bindings.js";
|
||||
@@ -130,6 +134,25 @@ let findCommandByNativeName: typeof import("openclaw/plugin-sdk/command-auth-nat
|
||||
let resolveCommandArgChoices: typeof import("openclaw/plugin-sdk/command-auth-native").resolveCommandArgChoices;
|
||||
let resolveDiscordNativeChoiceContext: typeof import("./native-command-model-picker-ui.js").resolveDiscordNativeChoiceContext;
|
||||
|
||||
async function saveSessionOverride(params: {
|
||||
providerOverride: string;
|
||||
modelOverride: string;
|
||||
}): Promise<void> {
|
||||
fs.mkdirSync(path.dirname(STORE_PATH), { recursive: true });
|
||||
await saveSessionStore(
|
||||
STORE_PATH,
|
||||
{
|
||||
[SESSION_KEY]: {
|
||||
sessionId: "main",
|
||||
updatedAt: Date.now(),
|
||||
providerOverride: params.providerOverride,
|
||||
modelOverride: params.modelOverride,
|
||||
},
|
||||
} satisfies Record<string, SessionEntry>,
|
||||
{ skipMaintenance: true },
|
||||
);
|
||||
}
|
||||
|
||||
function installProviderThinkingRegistryForTest(): void {
|
||||
const registry = createEmptyPluginRegistry();
|
||||
registry.providers.push({
|
||||
@@ -199,7 +222,7 @@ describe("discord native /think autocomplete", () => {
|
||||
await loadDiscordThinkAutocompleteModulesForTest());
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
beforeEach(async () => {
|
||||
clearSessionStoreCacheForTest();
|
||||
ensureConfiguredBindingRouteReadyMock.mockReset();
|
||||
ensureConfiguredBindingRouteReadyMock.mockResolvedValue({ ok: true });
|
||||
@@ -218,18 +241,10 @@ describe("discord native /think autocomplete", () => {
|
||||
: undefined,
|
||||
);
|
||||
installProviderThinkingRegistryForTest();
|
||||
fs.mkdirSync(path.dirname(STORE_PATH), { recursive: true });
|
||||
fs.writeFileSync(
|
||||
STORE_PATH,
|
||||
JSON.stringify({
|
||||
[SESSION_KEY]: {
|
||||
updatedAt: Date.now(),
|
||||
providerOverride: "openai",
|
||||
modelOverride: "gpt-5.4",
|
||||
},
|
||||
}),
|
||||
"utf8",
|
||||
);
|
||||
await saveSessionOverride({
|
||||
providerOverride: "openai",
|
||||
modelOverride: "gpt-5.4",
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@@ -318,17 +333,10 @@ describe("discord native /think autocomplete", () => {
|
||||
? { levels: [{ id: "off" }, { id: "max" }] }
|
||||
: undefined,
|
||||
);
|
||||
fs.writeFileSync(
|
||||
STORE_PATH,
|
||||
JSON.stringify({
|
||||
[SESSION_KEY]: {
|
||||
updatedAt: Date.now(),
|
||||
providerOverride: "anthropic",
|
||||
modelOverride: "claude-opus-4-7",
|
||||
},
|
||||
}),
|
||||
"utf8",
|
||||
);
|
||||
await saveSessionOverride({
|
||||
providerOverride: "anthropic",
|
||||
modelOverride: "claude-opus-4-7",
|
||||
});
|
||||
const cfg = createConfig();
|
||||
resolveConfiguredBindingRouteMock.mockImplementation(createConfiguredRouteResult);
|
||||
const interaction = {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/document-extract-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw local document extraction plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/duckduckgo-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw DuckDuckGo plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/elevenlabs-speech",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw ElevenLabs speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/exa-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Exa plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/fal-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw fal provider plugin",
|
||||
"type": "module",
|
||||
|
||||
6
extensions/feishu/npm-shrinkwrap.json
generated
6
extensions/feishu/npm-shrinkwrap.json
generated
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"name": "@openclaw/feishu",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/feishu",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@larksuiteoapi/node-sdk": "1.66.0",
|
||||
"typebox": "1.1.39",
|
||||
"zod": "4.4.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/feishu",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Feishu/Lark channel plugin for chats and workplace tools (community maintained by @m1heng).",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -17,7 +17,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -51,10 +51,10 @@
|
||||
"minHostVersion": ">=2026.5.29"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/file-transfer",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw file transfer plugin (file_fetch, dir_list, dir_fetch, file_write)",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/firecrawl-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Firecrawl plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/fireworks-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Fireworks provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/github-copilot-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw GitHub Copilot provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/gmi-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw GMI Cloud provider plugin",
|
||||
"type": "module",
|
||||
|
||||
6
extensions/google-meet/npm-shrinkwrap.json
generated
6
extensions/google-meet/npm-shrinkwrap.json
generated
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"name": "@openclaw/google-meet",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/google-meet",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"commander": "14.0.3",
|
||||
"typebox": "1.1.39"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/google-meet",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -33,10 +33,10 @@
|
||||
"minHostVersion": ">=2026.4.20"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/google-plugin",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Google plugin",
|
||||
"type": "module",
|
||||
|
||||
6
extensions/googlechat/npm-shrinkwrap.json
generated
6
extensions/googlechat/npm-shrinkwrap.json
generated
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"name": "@openclaw/googlechat",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/googlechat",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"gaxios": "7.1.4",
|
||||
"google-auth-library": "10.6.2",
|
||||
"zod": "4.4.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/googlechat",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Google Chat channel plugin for spaces and direct messages.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -17,7 +17,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -75,10 +75,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/gradium-speech",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Gradium speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/groq-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Groq media-understanding provider",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/huggingface-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Hugging Face provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/image-generation-core",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw image generation runtime package",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/imessage",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac",
|
||||
"type": "module",
|
||||
@@ -43,10 +43,10 @@
|
||||
]
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
}
|
||||
},
|
||||
"pluginInspector": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/inworld-speech",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Inworld speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/irc",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw IRC channel plugin",
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/kilocode-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Kilo Gateway provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/kimi-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw Kimi provider plugin",
|
||||
"type": "module",
|
||||
|
||||
6
extensions/line/npm-shrinkwrap.json
generated
6
extensions/line/npm-shrinkwrap.json
generated
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"name": "@openclaw/line",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/line",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@line/bot-sdk": "11.0.1",
|
||||
"zod": "4.4.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/line",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw LINE channel plugin for LINE Bot API chats.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -46,10 +46,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/litellm-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw LiteLLM provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/llm-task",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw JSON-only LLM task plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/lmstudio-provider",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw LM Studio provider plugin",
|
||||
"type": "module",
|
||||
|
||||
4
extensions/lobster/npm-shrinkwrap.json
generated
4
extensions/lobster/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/lobster",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/lobster",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@clawdbot/lobster": "2026.5.22",
|
||||
"typebox": "1.1.39"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/lobster",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "Lobster workflow tool plugin for typed pipelines and resumable approvals.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -24,10 +24,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
# Changelog
|
||||
|
||||
## 2026.6.5
|
||||
|
||||
### Changes
|
||||
- Version alignment with core OpenClaw release numbers.
|
||||
|
||||
## 2026.6.3
|
||||
|
||||
### Changes
|
||||
|
||||
6
extensions/matrix/npm-shrinkwrap.json
generated
6
extensions/matrix/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/matrix",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@openclaw/matrix",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"dependencies": {
|
||||
"@matrix-org/matrix-sdk-crypto-nodejs": "0.6.0",
|
||||
"@matrix-org/matrix-sdk-crypto-wasm": "18.3.0",
|
||||
@@ -18,7 +18,7 @@
|
||||
"zod": "4.4.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/matrix",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Matrix channel plugin for rooms and direct messages.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -22,7 +22,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -88,10 +88,10 @@
|
||||
"allowInvalidConfigRecovery": true
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.6.2"
|
||||
"pluginApi": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.6.2"
|
||||
"openclawVersion": "2026.6.5-beta.5"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -3,6 +3,7 @@ import fs from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
|
||||
import { saveSessionStore } from "openclaw/plugin-sdk/session-store-runtime";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import {
|
||||
getMatrixExecApprovalApprovers,
|
||||
@@ -342,12 +343,12 @@ describe("matrix exec approvals", () => {
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("scopes non-matrix turn sources to the stored matrix account", () => {
|
||||
it("scopes non-matrix turn sources to the stored matrix account", async () => {
|
||||
const tmpDir = createTempDir();
|
||||
const storePath = path.join(tmpDir, "sessions.json");
|
||||
fs.writeFileSync(
|
||||
await saveSessionStore(
|
||||
storePath,
|
||||
JSON.stringify({
|
||||
{
|
||||
"agent:ops-agent:matrix:channel:!room:example.org": {
|
||||
sessionId: "main",
|
||||
updatedAt: 1,
|
||||
@@ -359,8 +360,8 @@ describe("matrix exec approvals", () => {
|
||||
lastTo: "channel:C999",
|
||||
lastAccountId: "work",
|
||||
},
|
||||
}),
|
||||
"utf-8",
|
||||
},
|
||||
{ skipMaintenance: true },
|
||||
);
|
||||
const cfg = buildMultiAccountMatrixConfig({ sessionStorePath: storePath });
|
||||
const request = makeForeignChannelApprovalRequest({
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
testing as sessionBindingTesting,
|
||||
registerSessionBindingAdapter,
|
||||
} from "openclaw/plugin-sdk/session-binding-runtime";
|
||||
import { loadSessionStore, saveSessionStore } from "openclaw/plugin-sdk/session-store-runtime";
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { installMatrixMonitorTestRuntime } from "../../test-runtime.js";
|
||||
import { MATRIX_OPENCLAW_FINALIZED_PREVIEW_KEY } from "../send/types.js";
|
||||
@@ -65,7 +66,7 @@ vi.mock("./replies.js", () => ({
|
||||
deliverMatrixReplies: deliverMatrixRepliesMock,
|
||||
}));
|
||||
|
||||
function writeMatrixSessionMeta(
|
||||
async function writeMatrixSessionMeta(
|
||||
storePath: string,
|
||||
sessionKey: string,
|
||||
origin: {
|
||||
@@ -75,10 +76,11 @@ function writeMatrixSessionMeta(
|
||||
nativeChannelId?: string;
|
||||
nativeDirectUserId?: string;
|
||||
},
|
||||
): void {
|
||||
const store = fs.existsSync(storePath)
|
||||
? (JSON.parse(fs.readFileSync(storePath, "utf8")) as Record<string, Record<string, unknown>>)
|
||||
: {};
|
||||
): Promise<void> {
|
||||
const store = loadSessionStore(storePath, { skipCache: true }) as Record<
|
||||
string,
|
||||
Record<string, unknown>
|
||||
>;
|
||||
const existing = store[sessionKey] ?? {
|
||||
sessionId: `sess-${Object.keys(store).length + 1}`,
|
||||
updatedAt: Date.now(),
|
||||
@@ -98,7 +100,7 @@ function writeMatrixSessionMeta(
|
||||
},
|
||||
};
|
||||
fs.mkdirSync(path.dirname(storePath), { recursive: true });
|
||||
fs.writeFileSync(storePath, JSON.stringify(store, null, 2), "utf8");
|
||||
await saveSessionStore(storePath, store as never, { skipMaintenance: true });
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -1153,7 +1155,7 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
|
||||
try {
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
chatType: "direct",
|
||||
from: "matrix:@user:example.org",
|
||||
to: "room:!other:example.org",
|
||||
@@ -1207,7 +1209,7 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
}));
|
||||
|
||||
try {
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
chatType: "direct",
|
||||
from: "matrix:@user:example.org",
|
||||
to: "room:!other:example.org",
|
||||
@@ -1251,7 +1253,7 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
|
||||
try {
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:matrix:direct:@user:example.org", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:matrix:direct:@user:example.org", {
|
||||
chatType: "direct",
|
||||
from: "matrix:@user:example.org",
|
||||
to: "room:!other:example.org",
|
||||
@@ -1295,7 +1297,7 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
|
||||
try {
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
chatType: "direct",
|
||||
from: "matrix:@user:example.org",
|
||||
to: "room:!other:example.org",
|
||||
@@ -1347,13 +1349,13 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
|
||||
try {
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
chatType: "direct",
|
||||
from: "matrix:@user:example.org",
|
||||
to: "room:!other:example.org",
|
||||
nativeChannelId: "!other:example.org",
|
||||
});
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
chatType: "direct",
|
||||
from: "matrix:@other:example.org",
|
||||
to: "room:@other:example.org",
|
||||
@@ -1389,7 +1391,7 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
|
||||
try {
|
||||
writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
|
||||
chatType: "group",
|
||||
from: "matrix:channel:!group:example.org",
|
||||
to: "room:!group:example.org",
|
||||
@@ -1421,9 +1423,9 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
it("skips the shared-session notice when Matrix DMs are isolated per room", async () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-dm-room-scope-"));
|
||||
const storePath = path.join(tempDir, "sessions.json");
|
||||
fs.writeFileSync(
|
||||
await saveSessionStore(
|
||||
storePath,
|
||||
JSON.stringify({
|
||||
{
|
||||
"agent:ops:main": {
|
||||
sessionId: "sess-main",
|
||||
updatedAt: Date.now(),
|
||||
@@ -1433,8 +1435,8 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
accountId: "ops",
|
||||
},
|
||||
},
|
||||
}),
|
||||
"utf8",
|
||||
} as never,
|
||||
{ skipMaintenance: true },
|
||||
);
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
|
||||
@@ -1468,9 +1470,9 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
it("skips the shared-session notice when a Matrix DM is explicitly bound", async () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-dm-bound-notice-"));
|
||||
const storePath = path.join(tempDir, "sessions.json");
|
||||
fs.writeFileSync(
|
||||
await saveSessionStore(
|
||||
storePath,
|
||||
JSON.stringify({
|
||||
{
|
||||
"agent:bound:session-1": {
|
||||
sessionId: "sess-bound",
|
||||
updatedAt: Date.now(),
|
||||
@@ -1480,8 +1482,8 @@ describe("matrix monitor handler pairing account scope", () => {
|
||||
accountId: "ops",
|
||||
},
|
||||
},
|
||||
}),
|
||||
"utf8",
|
||||
} as never,
|
||||
{ skipMaintenance: true },
|
||||
);
|
||||
const sendNotice = vi.fn(async () => "$notice");
|
||||
const touch = vi.fn();
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import fs from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { saveSessionStore } from "openclaw/plugin-sdk/session-store-runtime";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import type { OpenClawConfig } from "./runtime-api.js";
|
||||
import { resolveMatrixOutboundSessionRoute } from "./session-route.js";
|
||||
@@ -27,21 +28,21 @@ const defaultAccountPerRoomDmMatrixConfig = {
|
||||
},
|
||||
} satisfies MatrixChannelConfig;
|
||||
|
||||
function createTempStore(entries: Record<string, unknown>): string {
|
||||
async function createTempStore(entries: Record<string, unknown>): Promise<string> {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-session-route-"));
|
||||
tempDirs.add(tempDir);
|
||||
const storePath = path.join(tempDir, "sessions.json");
|
||||
fs.writeFileSync(storePath, JSON.stringify(entries), "utf8");
|
||||
await saveSessionStore(storePath, entries as never, { skipMaintenance: true });
|
||||
return storePath;
|
||||
}
|
||||
|
||||
function createMatrixRouteConfig(
|
||||
async function createMatrixRouteConfig(
|
||||
entries: Record<string, unknown>,
|
||||
matrix: MatrixChannelConfig = perRoomDmMatrixConfig,
|
||||
): OpenClawConfig {
|
||||
): Promise<OpenClawConfig> {
|
||||
return {
|
||||
session: {
|
||||
store: createTempStore(entries),
|
||||
store: await createTempStore(entries),
|
||||
},
|
||||
channels: {
|
||||
matrix,
|
||||
@@ -127,14 +128,14 @@ function resolveUserRoute(params: { cfg: OpenClawConfig; accountId?: string; tar
|
||||
});
|
||||
}
|
||||
|
||||
function resolveUserRouteForCurrentSession(params: {
|
||||
async function resolveUserRouteForCurrentSession(params: {
|
||||
storedSession: Record<string, unknown>;
|
||||
accountId?: string;
|
||||
target?: string;
|
||||
matrix?: MatrixChannelConfig;
|
||||
}) {
|
||||
return resolveUserRoute({
|
||||
cfg: createMatrixRouteConfig(
|
||||
cfg: await createMatrixRouteConfig(
|
||||
{
|
||||
[currentDmSessionKey]: params.storedSession,
|
||||
},
|
||||
@@ -188,8 +189,8 @@ afterEach(() => {
|
||||
});
|
||||
|
||||
describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
it("reuses the current DM room session for same-user sends when Matrix DMs are per-room", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("reuses the current DM room session for same-user sends when Matrix DMs are per-room", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession(),
|
||||
accountId: "ops",
|
||||
});
|
||||
@@ -197,8 +198,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectCurrentDmRoomRoute(route);
|
||||
});
|
||||
|
||||
it("falls back to user-scoped routing when the current session is for another DM peer", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("falls back to user-scoped routing when the current session is for another DM peer", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession({ from: "matrix:@bob:example.org" }),
|
||||
accountId: "ops",
|
||||
});
|
||||
@@ -206,8 +207,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectFallbackUserRoute(route);
|
||||
});
|
||||
|
||||
it("falls back to user-scoped routing when the current session belongs to another Matrix account", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("falls back to user-scoped routing when the current session belongs to another Matrix account", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession(),
|
||||
accountId: "support",
|
||||
});
|
||||
@@ -215,8 +216,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectFallbackUserRoute(route);
|
||||
});
|
||||
|
||||
it("reuses the canonical DM room after user-target outbound metadata overwrites latest to fields", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("reuses the canonical DM room after user-target outbound metadata overwrites latest to fields", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession({
|
||||
from: "matrix:@bob:example.org",
|
||||
to: "room:@bob:example.org",
|
||||
@@ -231,8 +232,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectCurrentDmRoomRoute(route);
|
||||
});
|
||||
|
||||
it("does not reuse the canonical DM room for a different Matrix user after latest metadata drift", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("does not reuse the canonical DM room for a different Matrix user after latest metadata drift", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession({
|
||||
from: "matrix:@bob:example.org",
|
||||
to: "room:@bob:example.org",
|
||||
@@ -248,8 +249,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectFallbackUserRoute(route, { userId: "@bob:example.org" });
|
||||
});
|
||||
|
||||
it("does not reuse a room after the session metadata was overwritten by a non-DM Matrix send", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("does not reuse a room after the session metadata was overwritten by a non-DM Matrix send", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredChannelSession(),
|
||||
accountId: "ops",
|
||||
});
|
||||
@@ -257,8 +258,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectFallbackUserRoute(route);
|
||||
});
|
||||
|
||||
it("uses the effective default Matrix account when accountId is omitted", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("uses the effective default Matrix account when accountId is omitted", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession(),
|
||||
matrix: defaultAccountPerRoomDmMatrixConfig,
|
||||
});
|
||||
@@ -266,8 +267,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expectCurrentDmRoomRoute(route);
|
||||
});
|
||||
|
||||
it("reuses the current DM room when stored account metadata is missing", () => {
|
||||
const route = resolveUserRouteForCurrentSession({
|
||||
it("reuses the current DM room when stored account metadata is missing", async () => {
|
||||
const route = await resolveUserRouteForCurrentSession({
|
||||
storedSession: createStoredDirectDmSession({ accountId: null }),
|
||||
matrix: defaultAccountPerRoomDmMatrixConfig,
|
||||
});
|
||||
@@ -291,17 +292,17 @@ describe("resolveMatrixOutboundSessionRoute", () => {
|
||||
expect(channelRoute.threadId).toBe("$RootEvent:Example.Org");
|
||||
});
|
||||
|
||||
it("resolves per-room DM metadata from the base key when currentSessionKey has a thread suffix", () => {
|
||||
it("resolves per-room DM metadata from the base key when currentSessionKey has a thread suffix", async () => {
|
||||
const storedSession = createStoredDirectDmSession();
|
||||
const route = resolveUserRoute({
|
||||
cfg: createMatrixRouteConfig({
|
||||
cfg: await createMatrixRouteConfig({
|
||||
[currentDmSessionKey]: storedSession,
|
||||
}),
|
||||
accountId: "ops",
|
||||
target: "@alice:example.org",
|
||||
});
|
||||
const threadedRoute = resolveMatrixOutboundSessionRoute({
|
||||
cfg: createMatrixRouteConfig({
|
||||
cfg: await createMatrixRouteConfig({
|
||||
[route?.baseSessionKey ?? currentDmSessionKey]: storedSession,
|
||||
}),
|
||||
agentId: "main",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/mattermost",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"description": "OpenClaw Mattermost channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/media-understanding-core",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw media understanding runtime package",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/memory-core",
|
||||
"version": "2026.6.2",
|
||||
"version": "2026.6.5-beta.5",
|
||||
"private": true,
|
||||
"description": "OpenClaw core memory search plugin",
|
||||
"type": "module",
|
||||
@@ -14,7 +14,7 @@
|
||||
"openclaw": "2026.5.28"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.6.2"
|
||||
"openclaw": ">=2026.6.5-beta.5"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user