Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1889 commits
Select commit Hold shift + click to select a range
5df9aac
fix(podman): default run-openclaw-podman bind to loopback (land #2749…
steipete Feb 26, 2026
125dc32
refactor(feishu): unify account-aware tool routing and message body
steipete Feb 26, 2026
ecb2053
chore(pr): guard against dropped changelog refs
steipete Feb 26, 2026
46eba86
fix: harden workspace boundary path resolution
steipete Feb 26, 2026
69590de
fix: suppress SUBAGENT_SPAWN_ACCEPTED_NOTE for cron isolated sessions
Lukavyi Feb 26, 2026
452a8c9
fix: use canonical cron session detection for spawn note
obviyus Feb 26, 2026
f692288
feat(cron): add --session-key option to cron add/edit CLI commands
Matt-Hulme Feb 26, 2026
8b5ebff
fix(cron): prevent isolated hook session-key double-prefixing (land #…
steipete Feb 26, 2026
4fd29a3
fix: block broken-symlink sandbox path escapes
steipete Feb 26, 2026
2ca2d5a
docs: add changelog note for sandbox alias fix
steipete Feb 26, 2026
e3385a6
fix(security): harden root file guards and host writes
steipete Feb 26, 2026
4b71de3
fix(core): unify session-key normalization and plugin boundary checks
steipete Feb 26, 2026
1aef45b
fix: harden boundary-path canonical alias handling
steipete Feb 26, 2026
c397a02
fix(queue): harden drain/abort/timeout race handling
steipete Feb 26, 2026
f53e4e9
chore: Fix broken build protocol:check
huntharo Feb 26, 2026
b402770
refactor(reply): split abort cutoff and timeout policy modules
steipete Feb 26, 2026
7b5153f
refactor: dedupe boundary-path canonical checks
steipete Feb 26, 2026
cf31197
fix(plugins): fallback bundled channel specs when npm install returns…
vincentkoc Feb 26, 2026
7d8aeaa
fix(gateway): pin paired reconnect metadata for node policy
steipete Feb 26, 2026
473a274
fix(auto-reply): gate inline directives on resolved auth (#27248)
steipete Feb 26, 2026
490cb51
fix(apps): sign gateway device auth with v3 payload
steipete Feb 26, 2026
185c393
fix(ios): remove talk voice directive hint
ngutman Feb 26, 2026
85b075d
fix: record ios talk voice directive hint removal (#27543) (thanks @n…
ngutman Feb 26, 2026
7e7ca43
fix(auth-profiles): accept mode/apiKey aliases to prevent silent cred…
byungsker Feb 25, 2026
00e8e88
docs(changelog): note auth-profile alias normalization (#26950) (than…
steipete Feb 26, 2026
4b259ab
fix(models): normalize trailing @profile parsing across resolver paths
steipete Feb 26, 2026
79176cc
fix(typing): force cleanup when dispatch idle is never received
Sid-Qin Feb 26, 2026
1ba525f
fix(telegram): degrade command sync on BOT_COMMANDS_TOO_MUCH
Sid-Qin Feb 26, 2026
a481ed0
fix(config): warn and ignore unknown plugin entry keys
Sid-Qin Feb 26, 2026
71e45ce
fix(sessions): add fix-missing cleanup path for orphaned store entries
Sid-Qin Feb 26, 2026
0ab5f4c
fix: enable store=true for Azure OpenAI Responses API
Feb 26, 2026
9c14299
fix: preserve operator scopes for shared auth connections
Feb 26, 2026
eb9a968
fix(slack): suppress NO_REPLY before Slack API call
Sid-Qin Feb 26, 2026
96aad96
fix: land NO_REPLY announce suppression and auth scope assertions
steipete Feb 26, 2026
8315c58
refactor(auth-profiles): unify coercion and add rejected-entry diagno…
steipete Feb 26, 2026
081b1aa
refactor(gateway): unify v3 auth payload builders and vectors
steipete Feb 26, 2026
4c75eca
fix(browser): land PR #23962 extension relay CORS fix
steipete Feb 26, 2026
77a3930
fix(gateway): allow cron commands to use gateway.remote.token (#27286)
zhangzhefang-github Feb 26, 2026
42cf32c
fix(browser): land PR #26015 query-token auth for /json relay routes
steipete Feb 26, 2026
ce833cd
fix(browser): land PR #24142 flush relay pending timers on stop
steipete Feb 26, 2026
65d5a91
fix(browser): land PR #22571 with safe extension handshake handling
steipete Feb 26, 2026
5416cab
fix(browser): land PR #21277 dedupe concurrent relay init
steipete Feb 26, 2026
840b768
Telegram: improve webhook config guidance and startup fallback
huntharo Feb 26, 2026
2962106
fix(telegram): Log bound port if ephemeral (0) is configured
huntharo Feb 26, 2026
dbfdf60
fix(telegram): Allow ephemeral webhookPort
huntharo Feb 26, 2026
22b0f36
fix: add changelog entry for telegram webhook updates (#25732) (thank…
obviyus Feb 26, 2026
62a248e
core(protocol): pnpm protocol:check
huntharo Feb 26, 2026
79659b2
fix(browser): land PR #11880 decodeURIComponent guardrails
steipete Feb 26, 2026
6daf40d
Gemini OAuth: resolve npm global shim install layouts (#27585)
vincentkoc Feb 26, 2026
c3a4251
Config: add secret ref schema and redaction foundations
joshavant Feb 21, 2026
d00ed73
Config: enforce source-specific SecretRef id validation
joshavant Feb 22, 2026
2f3b919
Config: remove unused extension path helper
joshavant Feb 24, 2026
b50c4c2
Gateway: add eager secrets runtime snapshot activation
joshavant Feb 21, 2026
b1533bc
Gateway: avoid double secrets activation at startup
joshavant Feb 21, 2026
e4915cb
Secrets: preserve runtime snapshot source refs on write
joshavant Feb 22, 2026
e45729a
Secrets runtime: include sourceConfig in prepared snapshot type
joshavant Feb 22, 2026
eb855f7
Gateway: emit one-shot operator events for secrets degraded/recovered
joshavant Feb 22, 2026
1560f02
Gateway: mark restart callback promise as intentionally detached
joshavant Feb 22, 2026
3dbb6be
Gateway tests: handle async restart callback path
joshavant Feb 22, 2026
8e33ebe
Secrets: make runtime activation auth loads read-only
joshavant Feb 24, 2026
45ec5aa
Secrets: keep read-only runtime sync in-memory
joshavant Feb 24, 2026
4c5a2c3
Agents: inject pi auth storage from runtime profiles
joshavant Feb 21, 2026
e1301c3
Auth profiles: never persist plaintext when refs are present
joshavant Feb 22, 2026
cec4042
Auth labels: handle token refs and share Pi credential conversion
joshavant Feb 22, 2026
5ae367a
Tests: stub discoverAuthStorage in model catalog mocks
joshavant Feb 24, 2026
6a251d8
Auth profiles: resolve keyRef/tokenRef outside gateway
joshavant Feb 24, 2026
301fe18
Agents: inject pi auth storage from runtime profiles
joshavant Feb 21, 2026
fe56700
Gateway: add manual secrets reload command
joshavant Feb 21, 2026
2e53033
Gateway: serialize secrets activation across reload paths
joshavant Feb 22, 2026
f6a854b
Secrets: add migrate rollback and skill ref support
joshavant Feb 21, 2026
a74067d
Secrets migrate: share helpers and narrow env scrub scope
joshavant Feb 22, 2026
8e439e2
Secrets migrate: ensure unique backup ids per write
joshavant Feb 22, 2026
4807e40
Agents: restore auth.json static scrub during pi auth discovery
joshavant Feb 22, 2026
3633342
Secrets migrate: split plan/apply/backup modules
joshavant Feb 24, 2026
7e1557b
Onboard: persist env-backed API keys as secret refs
joshavant Feb 21, 2026
5859008
Onboard auth: use shared secret-ref helpers
joshavant Feb 22, 2026
56f73ae
Auth choice tests: assert env-backed keyRef persistence
joshavant Feb 22, 2026
103d02f
Auth choice tests: expect env-backed key refs
joshavant Feb 24, 2026
04aa856
Onboard: require explicit mode for env secret refs
joshavant Feb 24, 2026
b50d2ce
Tests: align auth-choice helper expectations with secret mode
joshavant Feb 24, 2026
09c7cb5
Tests: update onboard credential expectations for explicit ref mode
joshavant Feb 24, 2026
68b9d89
Onboard: store OpenAI auth in profiles instead of .env
joshavant Feb 21, 2026
fce4d76
Tests: narrow OpenAI default model assertion typing
joshavant Feb 24, 2026
e8d1725
Onboard auth: remove leftover merge marker
joshavant Feb 24, 2026
2ef109f
Onboard OpenAI: explicit secret-input-mode behavior
joshavant Feb 24, 2026
59e5f12
Onboard: move volcengine/byteplus auth from .env to profiles
joshavant Feb 21, 2026
13b4993
Onboard non-interactive: avoid rewriting profile-backed keys
joshavant Feb 22, 2026
4d94b05
Secrets: keep read-only runtime sync in-memory
joshavant Feb 24, 2026
cb11987
Onboard: require explicit mode for env secret refs
joshavant Feb 24, 2026
c0a3801
Docs: document secrets refs runtime and migration
joshavant Feb 24, 2026
9203d58
Docs: add secrets and CLI secrets reference pages
joshavant Feb 24, 2026
c5b89fb
Docs: address review feedback on secrets docs
joshavant Feb 24, 2026
0e69660
feat(secrets): finalize external secrets runtime and migration hardening
joshavant Feb 25, 2026
e8637c7
fix(secrets): harden sops migration sops rule matching
joshavant Feb 25, 2026
5e3a86f
feat(secrets): expand onboarding secret-ref flows and custom-provider…
joshavant Feb 25, 2026
bb60cab
test: sops invocation assertion
joshavant Feb 25, 2026
4e7a833
feat(security): add provider-based external secrets management
joshavant Feb 25, 2026
bde9cbb
docs(secrets): align provider model and add exec resolver coverage
joshavant Feb 25, 2026
b84d779
test(secrets): skip strict file-permission resolver tests on windows
joshavant Feb 26, 2026
060ede8
test(secrets): skip windows ACL-sensitive file-provider runtime tests
joshavant Feb 26, 2026
67e9554
test(session): normalize parent fork parentSession path assertion
joshavant Feb 26, 2026
86622eb
fix(secrets): enforce file provider read timeouts
joshavant Feb 26, 2026
8944b75
fix(secrets): align ref contracts and non-interactive ref persistence
joshavant Feb 26, 2026
f413e31
feat(secrets): replace migrate flow with audit/configure/apply
joshavant Feb 26, 2026
ba2eb58
fix(secrets): make apply idempotent and keep audit read-only
joshavant Feb 26, 2026
06290b4
feat(secrets): finalize mode rename and validated exec docs
joshavant Feb 26, 2026
f46b9c9
feat(secrets): allow opt-in symlink exec command paths
joshavant Feb 26, 2026
ea1ccf4
docs(secrets): add direct 1password exec example
joshavant Feb 26, 2026
d879c7c
fix(secrets): harden apply and audit plan handling
joshavant Feb 26, 2026
7671c1d
test(secrets): cover skill migration and symlinked exec command flow
joshavant Feb 26, 2026
14897e8
docs(secrets): clarify partial migration guidance
joshavant Feb 26, 2026
485cd0c
fix(test): skip exec-backed audit batching assertion on windows
joshavant Feb 26, 2026
820d614
fix(secrets): harden plan target paths and ref-only auth profiles
steipete Feb 26, 2026
4380d74
docs(secrets): add dedicated apply plan contract page
steipete Feb 26, 2026
47fc6a0
fix: stabilize secrets land + docs note (#26155) (thanks @joshavant)
steipete Feb 26, 2026
cc1eaf1
docs(gateway): clarify remote token local fallback semantics
steipete Feb 26, 2026
0f9c602
docs(changelog): highlight external secrets management (#26155)
steipete Feb 26, 2026
45b5c23
docs(changelog): reorder unreleased changes by user interest
steipete Feb 26, 2026
aa17bdb
docs(changelog): reorder all unreleased entries by user impact
steipete Feb 26, 2026
fae8de9
fix(browser): land PR #27617 relay reconnect resilience
steipete Feb 26, 2026
d8477cb
fix(ci): sync protocol models and acpx version
steipete Feb 26, 2026
5c02554
fix: tolerate missing pi-coding-agent backend export
steipete Feb 26, 2026
792ce7b
fix: detect OpenClaw-managed launchd/systemd services in process respawn
taw0002 Feb 26, 2026
63c6080
fix: clean stale gateway PIDs before triggerOpenClawRestart calls lau…
Sid-Qin Feb 26, 2026
03d7641
feat(agents): default codex transport to websocket-first
steipete Feb 26, 2026
ed9cd84
chore(deps): refresh grammy and @types/node
steipete Feb 26, 2026
16ccd5a
fix(gateway): add ThrottleInterval to launchd plist to prevent restar…
Feb 26, 2026
7f863e2
docs(changelog): unify gateway restart-loop fixes
steipete Feb 26, 2026
051fdcc
fix(security): centralize dm/group allowlist auth composition
steipete Feb 26, 2026
f877e7e
fix(telegram): split stop-created preview finalization path
steipete Feb 26, 2026
9a4b226
fix(security): bind node system.run approvals to env
steipete Feb 26, 2026
c81e986
fix(pi): stop history image reinjection token blowup
steipete Feb 26, 2026
4da6a7f
refactor(restart): extract stale pid cleanup and supervisor markers
steipete Feb 26, 2026
7d93970
fix(bluebubbles): allow configured host for attachment SSRF guard
steipete Feb 26, 2026
09f4abd
fix(msteams): Send invokeResponse immediately to prevent Teams timeou…
Feb 26, 2026
ecbb3bc
fix(msteams): Fix test timing for async file upload handling
Feb 26, 2026
773ab31
fix(msteams): Fix code formatting
Feb 26, 2026
2e97d0d
fix: finalize teams file-consent timeout landing (#27641) (thanks @sc…
steipete Feb 26, 2026
57334cd
refactor: unify channel/plugin ssrf fetch policy and auth fallback
steipete Feb 26, 2026
75ed72e
refactor(pi): extract history image prune helpers
steipete Feb 26, 2026
b678308
docs: add unreleased security note for msteams ssrf hardening
steipete Feb 26, 2026
1708b11
refactor(pi): simplify image reference detection
steipete Feb 26, 2026
60bb475
fix: set authHeader: true by default for MiniMax API provider (#27622)
riccoyuanft Feb 26, 2026
551647a
feat(android): add device invoke protocol commands
obviyus Feb 26, 2026
67f6a13
feat(android): add device status and info handler
obviyus Feb 26, 2026
d768c1f
feat(android): wire device commands into runtime
obviyus Feb 26, 2026
d14e734
refactor(android): remove dead thermal sdk branch
obviyus Feb 26, 2026
cf327f6
fix(android): require validated network for device status
obviyus Feb 26, 2026
baf1c8e
docs: add changelog for android device node commands (#27664) (thanks…
obviyus Feb 26, 2026
4894d90
refactor(exec-approvals): unify system.run binding and generate host …
steipete Feb 26, 2026
37a138c
fix: harden typing lifecycle and cross-channel suppression
steipete Feb 26, 2026
258d615
fix: harden plugin route auth path canonicalization
steipete Feb 26, 2026
8a51891
test(exec-approvals): cover v1 binding precedence and mismatch mapping
steipete Feb 26, 2026
b044c14
Mattermost: avoid raw fetch in monitor media download
shakkernerd Feb 26, 2026
15e3e63
protocol: regenerate Swift models for exec env field
shakkernerd Feb 26, 2026
08e3357
refactor: share gateway security path canonicalization
steipete Feb 26, 2026
6fd9ec9
fix(gateway): preserve turn-origin messageChannel in agent runs
steipete Feb 26, 2026
273973d
refactor: unify typing dispatch lifecycle and policy boundaries
steipete Feb 26, 2026
0ec7711
fix(agents): harden compaction and reset safety
steipete Feb 26, 2026
53e3047
test(agents): add compaction and workspace reset regressions
steipete Feb 26, 2026
cd80c7e
refactor: unify dm policy store reads and reason codes
steipete Feb 26, 2026
c5facb8
fix(discord): avoid invalid /acp native option payload
steipete Feb 26, 2026
9f154ef
docs(acp): expand /acp operator playbook
steipete Feb 26, 2026
edf7ad9
add me to Maintainers list
joshavant Feb 26, 2026
9597cf1
docs(security): scope obfuscation parity reports as hardening
steipete Feb 26, 2026
f4391c1
docs(security): clarify Teams fileConsent uploadUrl report scope
steipete Feb 26, 2026
1048109
refactor(security): enforce v1 node exec approval binding
steipete Feb 26, 2026
c596658
feat(auto-reply): make agent time-aware with message timestamps
liuy Feb 15, 2026
fe842b5
test(auto-reply): cover inbound timestamp guard
shakkernerd Feb 26, 2026
d0d83a2
docs(changelog): add PR #17017 entry
shakkernerd Feb 26, 2026
64de4b6
fix: enforce explicit group auth boundaries across channels
steipete Feb 26, 2026
262bca9
fix: restore dm command and self-chat auth behavior
steipete Feb 26, 2026
d6eefe2
style: format auth boundary updates
steipete Feb 26, 2026
90d426f
fix(cli): gateway status probe with TLS when bind=lan
liuy Feb 23, 2026
b788616
fix(cli): add TLS daemon-status probe regression coverage
shakkernerd Feb 26, 2026
bed6933
fix(cli): scope daemon status TLS fingerprint to local probes
shakkernerd Feb 26, 2026
47f52cd
test(cli): tighten daemon status TLS mock typings
shakkernerd Feb 26, 2026
1087033
fix(cli): list all supported auth modes in gateway run --auth help
s1korrrr Feb 26, 2026
a909019
fix: align gateway run auth modes (#27469) (thanks @s1korrrr)
steipete Feb 26, 2026
a81cf35
Add contributor Jonathan Taylor to CONTRIBUTING.md
visionik Feb 26, 2026
3f20c43
fix: add nimrod gutman maintainer profile (#27840) (thanks @ngutman)
ngutman Feb 26, 2026
dc6e4a5
fix: harden dm command authorization in open mode
steipete Feb 26, 2026
f7041fb
fix(windows): normalize namespaced path containment checks
shakkernerd Feb 26, 2026
d92fc85
refactor(cli): dedupe gateway run mode parsing
steipete Feb 26, 2026
861b90f
fix(config): add openai-codex-responses to ModelApiSchema
AytuncYildizli Feb 26, 2026
ac03803
fix: align codex model api schema/type coverage (#27501) (thanks @Ayt…
steipete Feb 26, 2026
344f54b
refactor(config): dedupe model api definitions
steipete Feb 26, 2026
03159f3
CI: add maintainer ping auto-response
thewilloftheshadow Feb 26, 2026
d6cbaea
fix(tui): preserve streamed text during tool call transitions
Feb 26, 2026
b01273c
fix: narrow finalize boundary-drop guard (#27711) (thanks @scz2011)
steipete Feb 26, 2026
675764e
refactor(tui): simplify stream boundary-drop modes
steipete Feb 26, 2026
311f57a
Changelog: add entries for PR #12849 and #27585 (#27887)
vincentkoc Feb 26, 2026
20730af
fix(browser): stop wrapping application errors with Can't reach message
TarasShyn Feb 25, 2026
a4408a9
fix: pass sessionKey to deliverOutboundPayloads for message:sent hook…
Feb 26, 2026
4cb4053
fix: complete sessionKey forwarding for message:sent hook (#27584) (t…
steipete Feb 26, 2026
01b4f42
fix(matrix): preserve sender labels in Matrix BodyForAgent
steipete Feb 26, 2026
8483e01
refactor(matrix): dedupe sender label resolution for inbound bodies
steipete Feb 26, 2026
a1628d8
refactor: unify outbound session context wiring
steipete Feb 26, 2026
764cd5a
fix(gemini-oauth): align OAuth project discovery metadata and endpoin…
vincentkoc Feb 26, 2026
5a453ea
chore(onboarding): add explicit account-risk warning for Gemini CLI O…
vincentkoc Feb 26, 2026
1aadf26
fix(voice-call): bind webhook dedupe to verified request identity
steipete Feb 26, 2026
38b6cee
feat(config): add embedded pi project settings policy
steipete Feb 26, 2026
611dff9
fix(agents): harden embedded pi project settings loading
steipete Feb 26, 2026
78a7ff2
fix(security): harden node exec approvals against symlink rebind
steipete Feb 26, 2026
6f0b4ca
refactor(voice-call): share header and guarded api helpers
steipete Feb 26, 2026
535ef89
refactor(voice-call): enforce verified webhook key contract
steipete Feb 26, 2026
192df12
test(voice-call): cover verification key and header helpers
steipete Feb 26, 2026
36b6ea1
docs: enforce repo-relative file refs in AGENTS
steipete Feb 26, 2026
a0c5e28
refactor(extensions): use scoped pairing helper
steipete Feb 26, 2026
bce643a
refactor(security): enforce account-scoped pairing APIs
steipete Feb 26, 2026
d82c042
refactor(node-host): split system.run plan and allowlist internals
steipete Feb 26, 2026
d06632b
refactor(gateway): share node command catalog
steipete Feb 26, 2026
4e690e0
refactor(gateway): centralize system.run approval context and errors
steipete Feb 26, 2026
4b4718c
refactor(cli): decompose nodes run approval flow
steipete Feb 26, 2026
47bb568
fix(nodes): resolve default node when multiple canvas-capable nodes a…
Feb 26, 2026
da9f24d
fix: add nodes default-node regression test (#27444) (thanks @carbaj03)
steipete Feb 26, 2026
712e231
fix(agent): forward resolved outbound session context for delivery
steipete Feb 26, 2026
a0b12f2
fix(browser): accept fill fields without explicit type
Feb 26, 2026
2ed9d63
fix: browser fill default type parity (#27662) (thanks @Uface11)
steipete Feb 26, 2026
df65ed7
test(gateway): align outbound session assertion shape
steipete Feb 26, 2026
69b2f8c
docs(changelog): credit reporter for pairing isolation fix
steipete Feb 26, 2026
eaa9e1c
refactor(browser): unify fill field normalization
steipete Feb 26, 2026
7ef6623
fix: forward resolved session key in agent delivery (follow-up #27584…
steipete Feb 26, 2026
a1346a5
refactor(nodes): share default selection and tighten node.list fallback
steipete Feb 26, 2026
c53b11d
test: fix pairing/daemon assertion drift
steipete Feb 26, 2026
da61aa8
test: fix TS2783 in nodes-utils helper
steipete Feb 26, 2026
d33db18
docs: reorder unreleased 2026.2.26 changelog entries
steipete Feb 26, 2026
ca2ae34
fix(cli): accept node24 executable names in argv reparse
steipete Feb 26, 2026
7e0b3f1
fix: preserve assistant usage snapshots during compaction cleanup
steipete Feb 26, 2026
564be6b
refactor(channels): unify dm pairing policy flows
steipete Feb 26, 2026
27f4ab2
fix(models): extend gpt-5.3-codex forward compat to github-copilot
Sid-Qin Feb 26, 2026
0cfd448
fix(delivery-queue): change break to continue to prevent head-of-line…
Jimmy-xuzimo Feb 26, 2026
cceefe8
fix: harden delivery recovery backoff eligibility and tests (#27710) …
steipete Feb 26, 2026
58171c8
docs(security): clarify parity-only command-risk reports
steipete Feb 26, 2026
5dd264d
refactor(daemon): unify runtime binary detection
steipete Feb 26, 2026
10c7ae1
refactor(outbound): split recovery counters and normalize legacy retr…
steipete Feb 26, 2026
cb917b7
chore: silence onboard warning noise
steipete Feb 26, 2026
eb6fa0d
fix(googlechat): keep startAccount pending until abort to prevent res…
junsuwhy Feb 26, 2026
53575f2
fix: add googlechat lifecycle regression test (#27384) (thanks @junsu…
steipete Feb 26, 2026
b1bbf3f
fix: harden temp dir perms for umask 0002 (landed from #27860 by @sta…
steipete Feb 26, 2026
31c0b04
fix(nextcloud-talk): keep startAccount pending until abort (#27897)
steipete Feb 26, 2026
c03adfb
test: align compaction hook usage expectation
steipete Feb 26, 2026
39f7dbf
fix(cli): make gateway --force resilient to lsof EACCES
steipete Feb 26, 2026
e618794
test: align compaction hook usage expectation
steipete Feb 26, 2026
cbed0e0
fix: reject dmPolicy="allowlist" with empty allowFrom across all chan…
widingmarcus-cyber Feb 26, 2026
0fdac31
fix: skip allowFrom validation at account level (inherits from parent)
widingmarcus-cyber Feb 26, 2026
45d8686
fix: enforce dm allowFrom inheritance across account channels (#27936…
steipete Feb 26, 2026
a29b18c
Protocol: regenerate Swift models for systemRunPlanV2
philipp-spiess Feb 26, 2026
90c6744
docs(changelog): reorder docker gateway fix by user impact
steipete Feb 26, 2026
80d44c9
chore(release): cut 2026.2.26-beta.1
steipete Feb 26, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
* text=auto eol=lf
CLAUDE.md -text
src/gateway/server-methods/CLAUDE.md -text
4 changes: 4 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,10 @@
- changed-files:
- any-glob-to-any-file:
- "extensions/device-pair/**"
"extensions: acpx":
- changed-files:
- any-glob-to-any-file:
- "extensions/acpx/**"
"extensions: minimax-portal-auth":
- changed-files:
- any-glob-to-any-file:
Expand Down
127 changes: 125 additions & 2 deletions .github/workflows/auto-response.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ name: Auto response
on:
issues:
types: [opened, edited, labeled]
issue_comment:
types: [created]
pull_request_target:
types: [labeled]

Expand Down Expand Up @@ -42,6 +44,7 @@ jobs:
{
label: "r: testflight",
close: true,
commentTriggers: ["testflight"],
message: "Not available, build from source.",
},
{
Expand All @@ -55,11 +58,76 @@ jobs:
close: true,
lock: true,
lockReason: "off-topic",
commentTriggers: ["moltbook"],
message:
"OpenClaw is not affiliated with Moltbook, and issues related to Moltbook should not be submitted here.",
},
];
const maintainerTeam = "maintainer";
const pingWarningMessage =
"Please don’t spam-ping multiple maintainers at once. Be patient, or join our community Discord for help: https://discord.gg/clawd";
const mentionRegex = /@([A-Za-z0-9-]+)/g;
const maintainerCache = new Map();
const normalizeLogin = (login) => login.toLowerCase();
const isMaintainer = async (login) => {
if (!login) {
return false;
}
const normalized = normalizeLogin(login);
if (maintainerCache.has(normalized)) {
return maintainerCache.get(normalized);
}
let isMember = false;
try {
const membership = await github.rest.teams.getMembershipForUserInOrg({
org: context.repo.owner,
team_slug: maintainerTeam,
username: normalized,
});
isMember = membership?.data?.state === "active";
} catch (error) {
if (error?.status !== 404) {
throw error;
}
}
maintainerCache.set(normalized, isMember);
return isMember;
};
const countMaintainerMentions = async (body, authorLogin) => {
if (!body) {
return 0;
}
const normalizedAuthor = authorLogin ? normalizeLogin(authorLogin) : "";
if (normalizedAuthor && (await isMaintainer(normalizedAuthor))) {
return 0;
}
const haystack = body.toLowerCase();
const teamMention = `@${context.repo.owner.toLowerCase()}/${maintainerTeam}`;
if (haystack.includes(teamMention)) {
return 3;
}
const mentions = new Set();
for (const match of body.matchAll(mentionRegex)) {
mentions.add(normalizeLogin(match[1]));
}
if (normalizedAuthor) {
mentions.delete(normalizedAuthor);
}
let count = 0;
for (const login of mentions) {
if (await isMaintainer(login)) {
count += 1;
}
}
return count;
};
const triggerLabel = "trigger-response";
const target = context.payload.issue ?? context.payload.pull_request;
if (!target) {
Expand All @@ -72,6 +140,63 @@ jobs:
.filter((name) => typeof name === "string"),
);
const issue = context.payload.issue;
const pullRequest = context.payload.pull_request;
const comment = context.payload.comment;
if (comment) {
const authorLogin = comment.user?.login ?? "";
if (comment.user?.type === "Bot" || authorLogin.endsWith("[bot]")) {
return;
}
const commentBody = comment.body ?? "";
const responses = [];
const mentionCount = await countMaintainerMentions(commentBody, authorLogin);
if (mentionCount >= 3) {
responses.push(pingWarningMessage);
}
const commentHaystack = commentBody.toLowerCase();
const commentRule = rules.find((item) =>
(item.commentTriggers ?? []).some((trigger) =>
commentHaystack.includes(trigger),
),
);
if (commentRule) {
responses.push(commentRule.message);
}
if (responses.length > 0) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: target.number,
body: responses.join("\n\n"),
});
}
return;
}
if (issue) {
const action = context.payload.action;
if (action === "opened" || action === "edited") {
const issueText = `${issue.title ?? ""}\n${issue.body ?? ""}`.trim();
const authorLogin = issue.user?.login ?? "";
const mentionCount = await countMaintainerMentions(
issueText,
authorLogin,
);
if (mentionCount >= 3) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: pingWarningMessage,
});
}
}
}
const hasTriggerLabel = labelSet.has(triggerLabel);
if (hasTriggerLabel) {
labelSet.delete(triggerLabel);
Expand All @@ -94,7 +219,6 @@ jobs:
return;
}
const issue = context.payload.issue;
if (issue) {
const title = issue.title ?? "";
const body = issue.body ?? "";
Expand Down Expand Up @@ -136,7 +260,6 @@ jobs:
const noisyPrMessage =
"Closing this PR because it looks dirty (too many unrelated or unexpected changes). This usually happens when a branch picks up unrelated commits or a merge went sideways. Please recreate the PR from a clean branch.";
const pullRequest = context.payload.pull_request;
if (pullRequest) {
if (labelSet.has(dirtyLabel)) {
await github.rest.issues.createComment({
Expand Down
81 changes: 78 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,9 @@ jobs:
- name: Check types and lint and oxfmt
run: pnpm check

- 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.
Expand Down Expand Up @@ -317,6 +320,32 @@ jobs:
- name: Check docs
run: pnpm check:docs

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')
runs-on: blacksmith-16vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: false

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install Python tooling
run: |
python -m pip install --upgrade pip
python -m pip install pytest ruff pyyaml
- name: Lint Python skill scripts
run: python -m ruff check skills

- name: Test skill Python scripts
run: python -m pytest -q skills

secrets:
runs-on: blacksmith-16vcpu-ubuntu-2404
steps:
Expand All @@ -325,15 +354,20 @@ jobs:
with:
submodules: false

- name: Setup Node environment
uses: ./.github/actions/setup-node-env
with:
install-bun: "false"

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install detect-secrets
- name: Install pre-commit
run: |
python -m pip install --upgrade pip
python -m pip install detect-secrets==1.5.0
python -m pip install pre-commit detect-secrets==1.5.0
- name: Detect secrets
run: |
Expand All @@ -342,6 +376,30 @@ jobs:
exit 1
fi
- name: Detect committed private keys
run: pre-commit run --all-files detect-private-key

- name: Audit changed GitHub workflows with zizmor
run: |
set -euo pipefail
if [ "${{ github.event_name }}" = "push" ]; then
BASE="${{ github.event.before }}"
else
BASE="${{ github.event.pull_request.base.sha }}"
fi
mapfile -t workflow_files < <(git diff --name-only "$BASE" HEAD -- '.github/workflows/*.yml' '.github/workflows/*.yaml')
if [ "${#workflow_files[@]}" -eq 0 ]; then
echo "No workflow changes detected; skipping zizmor."
exit 0
fi
pre-commit run zizmor --files "${workflow_files[@]}"
- name: Audit production dependencies
run: pre-commit run --all-files pnpm-audit-prod

checks-windows:
needs: [docs-scope, changed-scope, build-artifacts, check]
if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true')
Expand All @@ -360,12 +418,23 @@ jobs:
include:
- runtime: node
task: lint
shard_index: 0
shard_count: 1
command: pnpm lint
- runtime: node
task: test
shard_index: 1
shard_count: 2
command: pnpm canvas:a2ui:bundle && pnpm test
- runtime: node
task: test
shard_index: 2
shard_count: 2
command: pnpm canvas:a2ui:bundle && pnpm test
- runtime: node
task: protocol
shard_index: 0
shard_count: 1
command: pnpm protocol:check
steps:
- name: Checkout
Expand Down Expand Up @@ -437,6 +506,12 @@ jobs:
pnpm -v
pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true || pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
- name: Configure test shard (Windows)
if: matrix.task == 'test'
run: |
echo "OPENCLAW_TEST_SHARDS=${{ matrix.shard_count }}" >> "$GITHUB_ENV"
echo "OPENCLAW_TEST_SHARD_INDEX=${{ matrix.shard_index }}" >> "$GITHUB_ENV"
- name: Configure vitest JSON reports
if: matrix.task == 'test'
run: echo "OPENCLAW_VITEST_REPORT_DIR=$RUNNER_TEMP/vitest-reports" >> "$GITHUB_ENV"
Expand All @@ -454,7 +529,7 @@ jobs:
if: matrix.task == 'test'
uses: actions/upload-artifact@v4
with:
name: vitest-reports-${{ runner.os }}-${{ matrix.runtime }}
name: vitest-reports-${{ runner.os }}-${{ matrix.runtime }}-shard${{ matrix.shard_index }}of${{ matrix.shard_count }}
path: |
${{ env.OPENCLAW_VITEST_REPORT_DIR }}
${{ runner.temp }}/vitest-slowest.md
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/docker-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,9 @@ jobs:
if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then
version="${GITHUB_REF#refs/tags/v}"
tags+=("${IMAGE}:${version}")
if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?$ ]]; then
tags+=("${IMAGE}:latest")
fi
fi
if [[ ${#tags[@]} -eq 0 ]]; then
echo "::error::No manifest tags resolved for ref ${GITHUB_REF}"
Expand Down
21 changes: 21 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ __pycache__/
ui/src/ui/__screenshots__/
ui/playwright-report/
ui/test-results/
packages/dashboard-next/.next/
packages/dashboard-next/out/

# Mise configuration files
mise.toml
Expand Down Expand Up @@ -96,6 +98,25 @@ package-lock.json
.agents/
.agents
.agent/
skills-lock.json

# Local iOS signing overrides
apps/ios/LocalSigning.xcconfig

# Xcode build directories (xcodebuild output)
apps/ios/build/
apps/shared/OpenClawKit/build/
Swabble/build/

# Generated protocol schema (produced via pnpm protocol:gen)
dist/protocol.schema.json
.ant-colony/

# Eclipse
**/.project
**/.classpath
**/.settings/
**/.gradle/

# Synthing
**/.stfolder/
13 changes: 13 additions & 0 deletions .mailmap
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Canonical contributor identity mappings for cherry-picked commits.
bmendonca3 <208517100+bmendonca3@users.noreply.github.com> <brianmendonca@Brians-MacBook-Air.local>
hcl <7755017+hclsys@users.noreply.github.com> <chenglunhu@gmail.com>
Glucksberg <80581902+Glucksberg@users.noreply.github.com> <markuscontasul@gmail.com>
JackyWay <53031570+JackyWay@users.noreply.github.com> <jackybbc@gmail.com>
Marcus Castro <7562095+mcaxtr@users.noreply.github.com> <mcaxtr@gmail.com>
Marc Gratch <2238658+mgratch@users.noreply.github.com> <me@marcgratch.com>
Peter Machona <7957943+chilu18@users.noreply.github.com> <chilu.machona@icloud.com>
Ben Marvell <92585+easternbloc@users.noreply.github.com> <ben@marvell.consulting>
zerone0x <39543393+zerone0x@users.noreply.github.com> <hi@trine.dev>
Marco Di Dionisio <3519682+marcodd23@users.noreply.github.com> <m.didionisio23@gmail.com>
mujiannan <46643837+mujiannan@users.noreply.github.com> <shennan@mujiannan.com>
Santhanakrishnan <239082898+bitfoundry-ai@users.noreply.github.com> <noreply@anthropic.com>
2 changes: 1 addition & 1 deletion .npmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
allow-build-scripts=@whiskeysockets/baileys,sharp,esbuild,protobufjs,fs-ext,node-pty,@lydell/node-pty,@matrix-org/matrix-sdk-crypto-nodejs
# pnpm build-script allowlist lives in package.json -> pnpm.onlyBuiltDependencies.
Loading