Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
229 commits
Select commit Hold shift + click to select a range
c1bb07b
fix(slack): route system events to bound agent sessions (#34045)
vincentkoc Mar 4, 2026
88ee571
Delete changelog/fragments directory
vincentkoc Mar 4, 2026
dc8253a
fix(memory): serialize local embedding initialization to avoid duplic…
SubtleSpark Mar 4, 2026
3fa43ec
fix(model): propagate custom provider headers to model objects (#27490)
Sid-Qin Mar 4, 2026
4fb4049
fix(daemon): handle systemctl is-enabled exit 4 (not-found) on Ubuntu…
Yuandiaodiaodiao Mar 4, 2026
c8ebd48
fix(node-host): sync rawCommand with hardened argv after executable p…
Sid-Qin Mar 4, 2026
76bfd9b
Agents: add generic poll-vote action support
gumadeiras Mar 4, 2026
7597fc5
fix(ollama): pass provider headers to Ollama stream function (#24285)
Feb 23, 2026
7531a3e
test(ollama): add default header precedence coverage
shakkernerd Mar 4, 2026
e6f0203
chore(changelog): add PR entry openclaw#24337 thanks @echoVic
shakkernerd Mar 4, 2026
efdf2ca
Outbound: allow text-only plugin adapters
liuxiaopai-ai Mar 3, 2026
bb07b2b
Outbound: avoid empty multi-media fallback sends
liuxiaopai-ai Mar 3, 2026
a970cae
chore(changelog): align outbound adapter entry openclaw#32788 thanks …
shakkernerd Mar 4, 2026
698c200
fix(outbound): fail media-only text-only adapter fallback
shakkernerd Mar 4, 2026
2123265
chore(changelog): clarify outbound media-only fallback openclaw#32788…
shakkernerd Mar 4, 2026
4cc293d
fix(review): enforce behavioral sweep validation
shakkernerd Mar 4, 2026
2b98cb6
Fix gateway restart false timeouts on Debian/systemd (#34874)
vincentkoc Mar 4, 2026
df0f2e3
Compaction/Safeguard: require structured summary headings (#25555)
rodrigouroz Mar 4, 2026
53b2479
Fix Linux daemon install checks when systemd user bus env is missing …
vincentkoc Mar 4, 2026
4242c51
agents: preserve totalTokens on request failure instead of using cont…
RealKai42 Mar 4, 2026
96021a2
fix: align AGENTS.md template section names with post-compaction extr…
echoVic Mar 4, 2026
8c5692a
Changelog: add daemon systemd user-bus fallback entry (#34884)
vincentkoc Mar 4, 2026
9c68470
Changelog: add gateway restart health entry (#34874)
vincentkoc Mar 4, 2026
b3fb881
fix: finalize spanish locale support
dvrshil Mar 4, 2026
ed05810
fix: add spanish locale support (#35038) (thanks @DaoPromociones)
dvrshil Mar 4, 2026
809f951
fix(deps): patch hono transitive audit vulnerabilities
shakkernerd Mar 4, 2026
da0e245
fix(security): avoid prototype-chain account path checks (#34982)
HOYALIM Mar 5, 2026
4d06c90
fix(deps): bump tar to 7.5.10
shakkernerd Mar 5, 2026
4989485
docs(changelog): document dependency security fixes
shakkernerd Mar 5, 2026
432e022
fix: restore auto-reply system events timeline (#34794) (thanks @anis…
anisoptera Mar 5, 2026
63ce7c7
fix(feishu): comprehensive reply mechanism — outbound replyToId forwa…
guoqunabc Mar 5, 2026
68e68bf
fix(feishu): use msg_type media for mp4 video (fixes #33674) (#33720)
polooooo Mar 5, 2026
8b8167d
fix(agents): bypass pendingDescendantRuns guard for cron announce del…
Sid-Qin Mar 5, 2026
3bf6ed1
Feishu: harden streaming merge semantics and final reply dedupe (#33245)
rexl2018 Mar 5, 2026
1059b40
fix: cron backup should preserve pre-edit snapshot (#35195) (#35234)
0xsline Mar 5, 2026
79d00ae
fix(cron): stabilize restart catch-up replay semantics (#35351)
Takhoffman Mar 5, 2026
28dc2e8
cron: narrow startup replay backoff guard (#35391)
Takhoffman Mar 5, 2026
cc5dad8
cron: unify stale-run recovery and preserve manual-run every anchors …
Takhoffman Mar 5, 2026
4bd3469
refactor(telegram): remove unused webhook callback helper (#27816)
huntharo Mar 5, 2026
5d5fa0d
fix(pr): make review claim step required
shakkernerd Mar 5, 2026
48decef
fix(skills): deduplicate slash commands by skillName across all inter…
Feb 26, 2026
fb4f52b
style: fix formatting in skill-commands.test.ts and provider.ts
Feb 26, 2026
b5a94d2
style(skills): align formatting cleanup for dedupe changes
shakkernerd Mar 5, 2026
1805735
chore(changelog): add dedupe note openclaw#27521 thanks @shivama205
shakkernerd Mar 5, 2026
987e473
fix(agents): detect Venice provider proxying xAI/Grok models for sche…
Sid-Qin Mar 5, 2026
ce0c131
fix(agents): decode HTML entities in xAI/Grok tool call arguments (#3…
Sid-Qin Mar 5, 2026
d9b69a6
fix(agents): guard promoteThinkingTagsToBlocks against malformed cont…
Sid-Qin Mar 5, 2026
8891e1e
fix(web-ui): render Accounts schema node properly (#35380)
stakeswky Mar 5, 2026
463fd47
fix(agents): guard context pruning against malformed thinking blocks …
Sid-Qin Mar 5, 2026
c4dab17
fix(gateway): prevent internal route leakage in chat.send
alexyyyander Mar 5, 2026
3a6b412
fix(gateway): pass actual version to Control UI client instead of dev…
Sid-Qin Mar 5, 2026
60849f3
chore(pr): enforce changelog placement and reduce merge sync churn
shakkernerd Mar 5, 2026
2c8ee59
TTS: add baseUrl support to OpenAI TTS config (#34321)
RealKai42 Mar 5, 2026
6a705a3
ACP: add persistent Discord channel and Telegram topic bindings (#34873)
dutifulbob Mar 5, 2026
c522154
docs(telegram): recommend allowlist for single-user DM policy (#34841)
echoVic Mar 5, 2026
06ff25c
fix(feishu): check response.ok before calling response.json() in stre…
Sid-Qin Mar 5, 2026
e5b6a4e
Mattermost: honor onmessage mention override and add gating diagnosti…
turian Mar 5, 2026
4dc0c66
fix(subagents): strip leaked [[reply_to]] tags from completion announ…
vincentkoc Mar 5, 2026
544abc9
fix(cron): restore direct fallback after announce failure in best-eff…
Takhoffman Mar 5, 2026
9741e91
test(cron): add cross-channel announce fallback regression coverage (…
Takhoffman Mar 5, 2026
136ca87
feat(mattermost): add interactive buttons support (#19957)
tonydehnke Mar 5, 2026
8d48235
fix(browser): remove deprecated --disable-blink-features=AutomationCo…
Sid-Qin Mar 5, 2026
ba223c7
fix(feishu): add HTTP timeout to prevent per-chat queue deadlocks (#3…
ayanesakura Mar 5, 2026
b9f3f8d
fix(feishu): use probed botName for mention checks (#36391)
liuxiaopai-ai Mar 5, 2026
627b37e
Feishu: honor bot mentions by ID despite aliases (Fixes #36317) (#36333)
NaturalTensor Mar 5, 2026
89b303c
Mattermost: switch plugin-sdk imports to scoped subpaths (openclaw#36…
Takhoffman Mar 5, 2026
2972d6f
fix(feishu): accept groupPolicy "allowall" as alias for "open" (#36358)
Sid-Qin Mar 5, 2026
995ae73
synthesis: fix Feishu group mention slash parsing
Sid-Qin Mar 5, 2026
174eeea
Feishu: normalize group slash command probing
liuxiaopai-ai Mar 5, 2026
09c68f8
add prependSystemContext and appendSystemContext to before_prompt_bui…
maweibin Mar 5, 2026
bc66a8f
fix(feishu): avoid media regressions from global HTTP timeout (#36500)
Takhoffman Mar 5, 2026
72cf925
Gateway: add SecretRef support for gateway.auth.token with auth-mode …
joshavant Mar 5, 2026
60a6d11
fix(embedded): classify model_context_window_exceeded as context over…
RealKai42 Mar 5, 2026
6c03761
fix(agents): skip compaction API call when session has no real messag…
Sid-Qin Mar 5, 2026
edc386e
fix(ui): catch marked.js parse errors to prevent Control UI crash (#3…
BinHPdev Mar 5, 2026
709dc67
fix(session): archive old transcript on daily/scheduled reset to prev…
byungsker Mar 5, 2026
591264e
fix(agents): set preserveSignatures to isAnthropic in resolveTranscri…
Sid-Qin Mar 5, 2026
8ac7ce7
fix: avoid false global rate-limit classification from generic cooldo…
stakeswky Mar 5, 2026
f014e25
refactor(agents): share failover HTTP status classification (#36615)
altaywtf Mar 5, 2026
029c473
fix(failover): narrow service-unavailable to require overload indicat…
jnMetaCode Mar 5, 2026
036c329
Compaction/Safeguard: add summary quality audit retries (#25556)
rodrigouroz Mar 5, 2026
6859619
test(agents): add provider-backed failover regressions (#36735)
altaywtf Mar 5, 2026
837b7b4
Docs: add Slack typing reaction fallback
vincentkoc Mar 5, 2026
1d3962a
Docs: update gateway config reference for Slack and TTS
vincentkoc Mar 5, 2026
6b2c115
Docs: clarify OpenAI-compatible TTS endpoints
vincentkoc Mar 5, 2026
2b45eb0
Docs: document Control UI locale support
vincentkoc Mar 5, 2026
98aecab
Docs: cover heartbeat, cron, and plugin route updates
vincentkoc Mar 5, 2026
999b7e4
fix(ui): bump dompurify to 3.3.2 (#36781)
vincentkoc Mar 5, 2026
0c08e3f
UI: hoist lifecycle connect test mocks (#36788)
vincentkoc Mar 5, 2026
49acb07
fix(agents): classify insufficient_quota 400s as billing (#36783)
altaywtf Mar 5, 2026
aad372e
feat: append UTC time alongside local time in shared Current time lin…
jriff Mar 5, 2026
60d3363
fix(auth): grant senderIsOwner for internal channels with operator.ad…
Sid-Qin Mar 5, 2026
a0b731e
fix(config): prevent RangeError in merged schema cache key generation
powermaster888 Mar 5, 2026
7830366
fix(slack): propagate mediaLocalRoots through Slack send path
2233admin Mar 5, 2026
b9a20dc
fix(slack): preserve dedupe while recovering dropped app_mention (#34…
littleben Mar 5, 2026
97ea9df
README: add algal to contributors list (#2046)
joshavant Mar 5, 2026
063e493
fix: decouple Discord inbound worker timeout from listener timeout (#…
dutifulbob Mar 5, 2026
688b72e
plugins: enforce prompt hook policy with runtime validation (#36567)
gumadeiras Mar 5, 2026
f771ba8
fix(memory): avoid destructive qmd collection rebinds
vignesh07 Mar 6, 2026
6dfd39c
Harden Telegram poll gating and schema consistency (#36547)
gumadeiras Mar 6, 2026
06a229f
fix(browser): close tracked tabs on session cleanup (#36666)
vignesh07 Mar 6, 2026
1a67cf5
Diffs: restore system prompt guidance (#36904)
gumadeiras Mar 6, 2026
c260e20
fix(routing): avoid full binding rescans in resolveAgentRoute (#36915)
vignesh07 Mar 6, 2026
d86a12e
fix(gateway): honor insecure ws override for remote hostnames
vignesh07 Mar 6, 2026
3cd4978
fix(llm-task): load runEmbeddedPiAgent from dist/extensionAPI in inst…
vignesh07 Mar 6, 2026
92b4892
fix(auth): harden openai-codex oauth login path
vignesh07 Mar 6, 2026
d58dafa
feat(telegram/acp): Topic Binding, Pin Binding Message, Fix Spawn Par…
huntharo Mar 6, 2026
d326861
fix(gateway): preserve streamed prefixes across tool boundaries
vignesh07 Mar 6, 2026
cec5535
fix(tui): prevent stale model indicator after /model
vignesh07 Mar 6, 2026
fb289b7
Memory: handle SecretRef keys in doctor embeddings (#36835)
joshavant Mar 6, 2026
8088218
fix(openai-codex): request required oauth api scopes (#24720)
vignesh07 Mar 6, 2026
94fdee2
fix(memory-flush): ban timestamped variant files in default flush pro…
zerone0x Mar 6, 2026
6084c26
fix(tui): render final event error when assistant output is empty (#1…
vignesh07 Mar 6, 2026
7a22b3f
feat(agents): flush reply pipeline before compaction wait (#35489)
Sid-Qin Mar 6, 2026
1ab9393
fix(secrets): harden api key normalization for ByteString headers
vignesh07 Mar 6, 2026
b39ca7e
fix(slack): remove double mrkdwn conversion in native streaming path
littleben Mar 6, 2026
909f26a
fix(kimi-coding): normalize anthropic tool payload format
vignesh07 Mar 6, 2026
1efa7a8
fix(slack): thread channel ID through inbound context for reactions (…
dunamismax Mar 6, 2026
604f22c
fix(heartbeat): pin HEARTBEAT.md reads to workspace path
vignesh07 Mar 6, 2026
2f86ae7
fix(subagents): recover announce cleanup after kill/complete race
vignesh07 Mar 6, 2026
71ec421
feat(hooks): emit compaction lifecycle hooks (#16788)
vincentkoc Mar 6, 2026
fa3fafd
fix(auth): harden openai-codex oauth refresh fallback
vignesh07 Mar 6, 2026
81b93b9
fix(subagents): announce delivery with descendant gating, frozen resu…
tyler6204 Mar 6, 2026
4daaea1
fix(agents): avoid synthetic tool-result writes on idle-timeout cleanup
vignesh07 Mar 6, 2026
05fb16d
fix(agent): harden undici stream timeouts for long openai-completions…
vignesh07 Mar 6, 2026
ce71fac
fix(slack): record app_mention retry key before dedupe check (#37033)
Takhoffman Mar 6, 2026
d45353f
fix(agents): honor explicit rate-limit cooldown probes in fallback runs
vignesh07 Mar 6, 2026
36afd1b
fix(agents): allow configured ollama endpoints without dummy api keys
vignesh07 Mar 6, 2026
87e38da
fix(memory): recover qmd updates from duplicate document constraints
vignesh07 Mar 6, 2026
e5481ac
Doctor: warn on implicit heartbeat directPolicy (#36789)
vincentkoc Mar 6, 2026
d4021f4
Plugins: clarify registerHttpHandler migration errors (#36794)
vincentkoc Mar 6, 2026
16f9f4d
fix(memory): repair qmd collection name conflicts during ensure
vignesh07 Mar 6, 2026
91aed29
fix(memory): handle qmd search results without docid
vignesh07 Mar 6, 2026
428d176
Plugins: avoid false integrity drift prompts on unpinned updates (#37…
vincentkoc Mar 6, 2026
9881a74
Changelog: add #37179 release note
vincentkoc Mar 6, 2026
8f69e07
Delete changelog/fragments directory
vincentkoc Mar 6, 2026
10fe82f
Update CHANGELOG.md
vincentkoc Mar 6, 2026
4d9134f
fix(whatsapp): remove implicit [openclaw] self-chat prefix
vignesh07 Mar 6, 2026
8c85ad5
fix: remove config.schema from agent gateway tool (#7382)
kakuteki Mar 6, 2026
5d4b040
feat(openai): add gpt-5.4 support for API and Codex OAuth (#36590)
dorukardahan Mar 6, 2026
8d4a2f2
fix(tui): preserve credential-like tokens in render sanitization
vignesh07 Mar 6, 2026
0e42450
CLI: make read-only SecretRef status flows degrade safely (#37023)
joshavant Mar 6, 2026
ca80914
chore(changelog): update for #37023
joshavant Mar 6, 2026
2671f04
fix(agents): disable usage streaming chunks on non-native openai-comp…
vignesh07 Mar 6, 2026
36e2e04
feat(nano-banana-pro): add --aspect-ratio flag to generate_image.py (…
BrennerSpear Mar 6, 2026
9c86a9f
fix(gateway): support image_url in OpenAI chat completions (#34068)
vincentkoc Mar 6, 2026
e11a077
fix(agents): avoid xAI web_search tool-name collisions
vignesh07 Mar 6, 2026
8c2633a
fix: clear Telegram DM draft after materialize (#36746) (thanks @joel…
obviyus Mar 6, 2026
6c39616
Fix Control UI duplicate iMessage replies for internal webchat turns …
vincentkoc Mar 6, 2026
0e2bc58
fix: enforce 600 perms for cron store and run logs (#36078)
aerelune Mar 6, 2026
726ef48
fix(tui): accept canonical session-key aliases in chat event routing
vignesh07 Mar 6, 2026
9dab154
Gateway: normalize OpenAI stream chunk text
vincentkoc Mar 6, 2026
a939a15
Gateway: coerce chat deliverable route boolean
vincentkoc Mar 6, 2026
dfe23b9
fix(web_search): align brave language codes with API
vignesh07 Mar 6, 2026
777af47
Respect source channel for agent event surfacing (#36030)
Octane0411 Mar 6, 2026
5fdcef7
fix(session): prefer webchat routes for direct ui turns (#37135)
frankekn Mar 6, 2026
ff33460
Gateway: discriminate input sources
vincentkoc Mar 6, 2026
a622aee
Cron: migrate legacy provider delivery hints
vincentkoc Mar 6, 2026
44ec3e4
Cron: stabilize runs-one-shot migration tests
vincentkoc Mar 6, 2026
30c0f7e
fix(memory): retry mcporter after Windows EINVAL spawn
vignesh07 Mar 6, 2026
c5828cb
fix(onboarding): guard daemon status probe on headless linux
vignesh07 Mar 6, 2026
ff97195
Gateway: add path-scoped config schema lookup (#37266)
gumadeiras Mar 6, 2026
5b03ce7
docs(changelog): add pr entry
gumadeiras Mar 6, 2026
ee6f7b1
fix(ci): restore protocol and schema checks (#37470)
altaywtf Mar 6, 2026
a65d70f
Fix failover for zhipuai 1310 Weekly/Monthly Limit Exhausted (#33813)
zhouhe-xydt Mar 6, 2026
a4a490b
fix(openai-codex-oauth): stop mutating authorize url scopes
vignesh07 Mar 6, 2026
cbb96d9
Update CHANGELOG.md
vignesh07 Mar 6, 2026
bdd3685
fix(auth): remove bogus codex oauth responses probe
obviyus Mar 6, 2026
f051c14
docs(changelog): fold codex oauth fix notes
obviyus Mar 6, 2026
ae56597
docs(changelog): add codex oauth pr reference (#37558)
obviyus Mar 6, 2026
01b2017
fix(failover): classify HTTP 402 as rate_limit when payload indicates…
xinhuagu Mar 6, 2026
4a80d48
fix(mattermost): allow reachable interaction callback URLs (#37543)
mukhtharcm Mar 6, 2026
fa6c0e1
Gateway: allow slash-delimited schema lookup paths
gumadeiras Mar 6, 2026
fee91fe
feature(context): extend plugin system to support custom context mana…
jalehman Mar 6, 2026
9fed9f1
fix(session): tighten direct-session webchat routing matching (#37867)
vincentkoc Mar 6, 2026
e88f660
docs(tools): document slash-delimited config schema lookup paths
vincentkoc Mar 6, 2026
f788ba1
docs(protocol): document slash-delimited schema lookup plugin ids
vincentkoc Mar 6, 2026
eb2eeba
docs(plugins): document context engine slots and registration
vincentkoc Mar 6, 2026
7cc3376
docs(plugins): add context-engine manifest kind example
vincentkoc Mar 6, 2026
5470337
docs(config): list the context engine plugin slot
vincentkoc Mar 6, 2026
151f260
docs: context engine
vincentkoc Mar 6, 2026
86a89d9
fix(nano-banana-pro): remove space after MEDIA: token in generate_ima…
QuantDeveloperUSA Mar 6, 2026
a820c63
CI: drop unused install-smoke bootstrap
vincentkoc Mar 6, 2026
37a3fb0
nano-banana-pro: respect explicit --resolution when editing images (#…
shuofengzhang Mar 6, 2026
05c2cbf
Skills/nano-banana-pro: clarify MEDIA token comment (#38063)
vincentkoc Mar 6, 2026
9917a3f
CI: run changed-scope on main pushes
vincentkoc Mar 6, 2026
9c1786b
Telegram/Discord: honor outbound mediaMaxMb uploads (#38065)
vincentkoc Mar 6, 2026
7c45d91
Docs: align BlueBubbles media cap wording
vincentkoc Mar 6, 2026
20038fb
openai-image-gen: validate --background and --style options (#36762)
shuofengzhang Mar 6, 2026
222d635
WhatsApp: honor outbound mediaMaxMb (#38097)
vincentkoc Mar 6, 2026
a274ef9
Mattermost: harden interaction callback binding (#38057)
vincentkoc Mar 6, 2026
f392b81
Infra: require explicit opt-in for prerelease npm installs (#38117)
vincentkoc Mar 6, 2026
81f22ae
openai-image-gen: validate and normalize --output-format (#36648)
shuofengzhang Mar 6, 2026
9aceb51
Gateway: normalize HEIC input_image sources (#38122)
vincentkoc Mar 6, 2026
6a9deb2
CI: cover skill and extension tests
vincentkoc Mar 6, 2026
d000316
fix: Windows: openclaw plugins install fails with spawn EINVAL
Mar 6, 2026
e6bf69b
fix: Telegram API requests fail with Network request failed after
Mar 6, 2026
59895f9
fix: narrow Telegram failed-after retry match
obviyus Mar 6, 2026
f9d86b9
chore: prep #38056 for landing (thanks @0xlin2023)
obviyus Mar 6, 2026
9521e61
Gateway: follow up HEIC input image handling (#38146)
vincentkoc Mar 6, 2026
b127333
fix(feishu): restore explicit media request timeouts
obviyus Mar 6, 2026
4ed5feb
chore(extensions): sync plugin versions
obviyus Mar 6, 2026
d070c44
fix(gateway): keep probe routes reachable with root-mounted control u…
vincentkoc Mar 6, 2026
57f19f0
container builds: opt-in extension deps via OPENCLAW_EXTENSIONS build…
sallyom Mar 6, 2026
e3390bf
CI: add Barnacle r: too-many-prs guard
vincentkoc Mar 6, 2026
b782538
fix: tune stale workflow limits
thewilloftheshadow Mar 6, 2026
3e967cb
fix: add stale workflow fallback run
thewilloftheshadow Mar 6, 2026
8f834ff
chore: update X handle
thewilloftheshadow Mar 6, 2026
9a1a63a
chore: disable contributor labels
thewilloftheshadow Mar 6, 2026
3d7bc59
feat(onboarding): add web search to onboarding flow (#34009)
kesku Mar 6, 2026
067ec4f
CI: shallow scope checkouts
vincentkoc Mar 6, 2026
afdbc47
Install Smoke: shallow docs-scope checkout
vincentkoc Mar 6, 2026
60d20f9
Install Smoke: allow reusing prebuilt test images
vincentkoc Mar 6, 2026
5e05a9c
Install Smoke: cache docker smoke builds
vincentkoc Mar 6, 2026
38f46e8
chore: code/dead tests cleanup (#38286)
vincentkoc Mar 6, 2026
084dfd2
Media: reject spoofed input_image MIME payloads (#38289)
vincentkoc Mar 6, 2026
ec3df0d
CI: scope secret scans to changed files
vincentkoc Mar 6, 2026
b529b7c
Docs: update secret scan reproduction steps
vincentkoc Mar 6, 2026
6611298
CI: keep full secret scans on main
vincentkoc Mar 6, 2026
042b2c8
Docs: clarify main secret scan behavior
vincentkoc Mar 6, 2026
e9919ea
CI: add base-commit fetch helper
vincentkoc Mar 6, 2026
9c464c2
CI: fetch base history on demand
vincentkoc Mar 6, 2026
82eebc9
Install Smoke: fetch docs base on demand
vincentkoc Mar 6, 2026
9c55299
CI: skip detect-secrets on main temporarily
vincentkoc Mar 6, 2026
768736d
Tooling: add Knip workspace config
vincentkoc Mar 6, 2026
b70d3c4
Tooling: wire deadcode scripts to Knip
vincentkoc Mar 6, 2026
b17baca
CI: enable report-only Knip deadcode job
vincentkoc Mar 6, 2026
ab5fcfc
feat(gateway): add channel-backed readiness probes (#38285)
vincentkoc Mar 6, 2026
180a4e7
Fix: support provider:model syntax in subagent model resolution
Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
47 changes: 47 additions & 0 deletions .github/actions/ensure-base-commit/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Ensure base commit
description: Ensure a shallow checkout has enough history to diff against a base SHA.
inputs:
base-sha:
description: Base commit SHA to diff against.
required: true
fetch-ref:
description: Branch or ref to deepen/fetch from origin when base-sha is missing.
required: true
runs:
using: composite
steps:
- name: Ensure base commit is available
shell: bash
env:
BASE_SHA: ${{ inputs.base-sha }}
FETCH_REF: ${{ inputs.fetch-ref }}
run: |
set -euo pipefail
if [ -z "$BASE_SHA" ] || [[ "$BASE_SHA" =~ ^0+$ ]]; then
echo "No concrete base SHA available; skipping targeted fetch."
exit 0
fi
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
echo "Base commit already present: $BASE_SHA"
exit 0
fi
for deepen_by in 25 100 300; do
echo "Base commit missing; deepening $FETCH_REF by $deepen_by."
git fetch --no-tags --deepen="$deepen_by" origin "$FETCH_REF" || true
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
echo "Resolved base commit after deepening: $BASE_SHA"
exit 0
fi
done
echo "Base commit still missing; fetching full history for $FETCH_REF."
git fetch --no-tags origin "$FETCH_REF" || true
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
echo "Resolved base commit after full ref fetch: $BASE_SHA"
exit 0
fi
echo "Base commit still unavailable after fetch attempts: $BASE_SHA"
2 changes: 1 addition & 1 deletion .github/actions/setup-node-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ runs:
if: inputs.install-bun == 'true'
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.9+cf6cdbbba"
bun-version: "1.3.9"

- name: Runtime versions
shell: bash
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/auto-response.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ jobs:
github-token: ${{ steps.app-token.outputs.token || steps.app-token-fallback.outputs.token }}
script: |
// Labels prefixed with "r:" are auto-response triggers.
const activePrLimit = 10;
const rules = [
{
label: "r: skill",
Expand All @@ -48,6 +49,13 @@ jobs:
message:
"Please use [our support server](https://discord.gg/clawd) and ask in #help or #users-helping-users to resolve this, or follow the stuck FAQ at https://docs.openclaw.ai/help/faq#im-stuck-whats-the-fastest-way-to-get-unstuck.",
},
{
label: "r: too-many-prs",
close: true,
message:
`Closing this PR because the author has more than ${activePrLimit} active PRs in this repo. ` +
"Please reduce the active PR queue and reopen or resubmit once it is back under the limit. You can close your own PRs to get back under the limit.",
},
{
label: "r: testflight",
close: true,
Expand Down
94 changes: 67 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,47 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-depth: 1
fetch-tags: false
submodules: false

- name: Ensure docs-scope base commit
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event_name == 'push' && github.ref_name || github.event.pull_request.base.ref }}

- name: Detect docs-only changes
id: check
uses: ./.github/actions/detect-docs-changes

# Detect which heavy areas are touched so PRs can skip unrelated expensive jobs.
# Push to main keeps broad coverage.
# Push to main keeps broad coverage, but this job still needs to run so
# downstream jobs that list it in `needs` are not skipped.
changed-scope:
needs: [docs-scope]
if: github.event_name == 'pull_request' && needs.docs-scope.outputs.docs_only != 'true'
if: needs.docs-scope.outputs.docs_only != 'true'
runs-on: blacksmith-16vcpu-ubuntu-2404
outputs:
run_node: ${{ steps.scope.outputs.run_node }}
run_macos: ${{ steps.scope.outputs.run_macos }}
run_android: ${{ steps.scope.outputs.run_android }}
run_skills_python: ${{ steps.scope.outputs.run_skills_python }}
run_windows: ${{ steps.scope.outputs.run_windows }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-depth: 1
fetch-tags: false
submodules: false

- name: Ensure changed-scope base commit
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event_name == 'push' && github.ref_name || github.event.pull_request.base.ref }}

- name: Detect changed scopes
id: scope
shell: bash
Expand All @@ -71,6 +87,13 @@ jobs:
with:
submodules: false

- name: Ensure secrets base commit (PR fast path)
if: github.event_name == 'pull_request'
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event.pull_request.base.ref }}

- name: Setup Node environment
uses: ./.github/actions/setup-node-env
with:
Expand Down Expand Up @@ -124,6 +147,9 @@ jobs:
- runtime: node
task: test
command: pnpm canvas:a2ui:bundle && pnpm test
- runtime: node
task: extensions
command: pnpm test:extensions
- runtime: node
task: protocol
command: pnpm protocol:check
Expand Down Expand Up @@ -187,25 +213,13 @@ jobs:
- name: Enforce safe external URL opening policy
run: pnpm lint:ui:no-raw-window-open

# Report-only dead-code scans. Runs after scope detection and stores machine-readable
# results as artifacts for later triage before we enable hard gates.
# Temporarily disabled in CI while we process initial findings.
# Report-only dead-code scan. Runs after scope detection and stores the Knip
# report as an artifact so we can triage findings before enabling hard gates.
deadcode:
name: dead-code report
needs: [docs-scope, changed-scope]
# if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true')
if: false
if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true')
runs-on: blacksmith-16vcpu-ubuntu-2404
strategy:
fail-fast: false
matrix:
include:
- tool: knip
command: pnpm deadcode:report:ci:knip
- tool: ts-prune
command: pnpm deadcode:report:ci:ts-prune
- tool: ts-unused-exports
command: pnpm deadcode:report:ci:ts-unused
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -218,13 +232,13 @@ jobs:
install-bun: "false"
use-sticky-disk: "true"

- name: Run ${{ matrix.tool }} dead-code scan
run: ${{ matrix.command }}
- name: Run Knip dead-code scan
run: pnpm deadcode:report:ci:knip

- name: Upload dead-code results
uses: actions/upload-artifact@v4
with:
name: dead-code-${{ matrix.tool }}-${{ github.run_id }}
name: dead-code-knip-${{ github.run_id }}
path: .artifacts/deadcode

# Validate docs (format, lint, broken links) only when docs files changed.
Expand All @@ -249,7 +263,7 @@ jobs:

skills-python:
needs: [docs-scope, changed-scope]
if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true')
if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true' || needs.changed-scope.outputs.run_skills_python == 'true')
runs-on: blacksmith-16vcpu-ubuntu-2404
steps:
- name: Checkout
Expand Down Expand Up @@ -296,13 +310,39 @@ jobs:
- name: Install pre-commit
run: |
python -m pip install --upgrade pip
python -m pip install pre-commit detect-secrets==1.5.0
python -m pip install pre-commit

- name: Detect secrets
run: |
if ! detect-secrets scan --baseline .secrets.baseline; then
echo "::error::Secret scanning failed. See docs/gateway/security.md#secret-scanning-detect-secrets"
exit 1
set -euo pipefail

if [ "${{ github.ref }}" = "refs/heads/main" ]; then
echo "Skipping detect-secrets on main until the allowlist cleanup lands."
exit 0
fi

if [ "${{ github.event_name }}" = "push" ]; then
echo "Running full detect-secrets scan on push."
pre-commit run --all-files detect-secrets
exit 0
fi

BASE="${{ github.event.pull_request.base.sha }}"
changed_files=()
if git rev-parse --verify "$BASE^{commit}" >/dev/null 2>&1; then
while IFS= read -r path; do
[ -n "$path" ] || continue
[ -f "$path" ] || continue
changed_files+=("$path")
done < <(git diff --name-only --diff-filter=ACMR "$BASE" HEAD)
fi

if [ "${#changed_files[@]}" -gt 0 ]; then
echo "Running detect-secrets on ${#changed_files[@]} changed file(s)."
pre-commit run detect-secrets --files "${changed_files[@]}"
else
echo "Falling back to full detect-secrets scan."
pre-commit run --all-files detect-secrets
fi

- name: Detect committed private keys
Expand Down
88 changes: 69 additions & 19 deletions .github/workflows/install-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,14 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-depth: 1
fetch-tags: false

- name: Ensure docs-scope base commit
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event_name == 'push' && github.ref_name || github.event.pull_request.base.ref }}

- name: Detect docs-only changes
id: check
Expand All @@ -33,36 +40,79 @@ jobs:
- name: Checkout CLI
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22.x
check-latest: true

- name: Setup pnpm + cache store
uses: ./.github/actions/setup-pnpm-store-cache
with:
pnpm-version: "10.23.0"
cache-key-suffix: "node22"
use-sticky-disk: "true"

- name: Install pnpm deps (minimal)
run: pnpm install --ignore-scripts --frozen-lockfile

- name: Set up Docker Builder
uses: useblacksmith/setup-docker-builder@v1

- name: Build root Dockerfile smoke image
uses: useblacksmith/build-push-action@v2
with:
context: .
file: ./Dockerfile
tags: openclaw-dockerfile-smoke:local
load: true
push: false
provenance: false
cache-from: type=gha,scope=install-smoke-root-dockerfile
cache-to: type=gha,mode=max,scope=install-smoke-root-dockerfile

- name: Run root Dockerfile CLI smoke
run: |
docker build -t openclaw-dockerfile-smoke:local -f Dockerfile .
docker run --rm --entrypoint sh openclaw-dockerfile-smoke:local -lc 'which openclaw && openclaw --version'
# This smoke only validates that the build-arg path preinstalls selected
# extension deps without breaking image build or basic CLI startup. It
# does not exercise runtime loading/registration of diagnostics-otel.
- name: Build extension Dockerfile smoke image
uses: useblacksmith/build-push-action@v2
with:
context: .
file: ./Dockerfile
build-args: |
OPENCLAW_EXTENSIONS=diagnostics-otel
tags: openclaw-ext-smoke:local
load: true
push: false
provenance: false
cache-from: type=gha,scope=install-smoke-root-dockerfile-ext
cache-to: type=gha,mode=max,scope=install-smoke-root-dockerfile-ext

- name: Smoke test Dockerfile with extension build arg
run: |
docker run --rm --entrypoint sh openclaw-ext-smoke:local -lc 'which openclaw && openclaw --version'
- name: Build installer smoke image
uses: useblacksmith/build-push-action@v2
with:
context: ./scripts/docker
file: ./scripts/docker/install-sh-smoke/Dockerfile
tags: openclaw-install-smoke:local
load: true
push: false
provenance: false
cache-from: type=gha,scope=install-smoke-installer-root
cache-to: type=gha,mode=max,scope=install-smoke-installer-root

- name: Build installer non-root image
if: github.event_name != 'pull_request'
uses: useblacksmith/build-push-action@v2
with:
context: ./scripts/docker
file: ./scripts/docker/install-sh-nonroot/Dockerfile
tags: openclaw-install-nonroot:local
load: true
push: false
provenance: false
cache-from: type=gha,scope=install-smoke-installer-nonroot
cache-to: type=gha,mode=max,scope=install-smoke-installer-nonroot

- name: Run installer docker tests
env:
CLAWDBOT_INSTALL_URL: https://openclaw.ai/install.sh
CLAWDBOT_INSTALL_CLI_URL: https://openclaw.ai/install-cli.sh
CLAWDBOT_NO_ONBOARD: "1"
CLAWDBOT_INSTALL_SMOKE_SKIP_CLI: "1"
CLAWDBOT_INSTALL_SMOKE_SKIP_IMAGE_BUILD: "1"
CLAWDBOT_INSTALL_NONROOT_SKIP_IMAGE_BUILD: ${{ github.event_name == 'pull_request' && '0' || '1' }}
CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT: ${{ github.event_name == 'pull_request' && '1' || '0' }}
CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS: "1"
run: pnpm test:install:smoke
run: bash scripts/test-install-sh-docker.sh
Loading