Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1931 commits
Select commit Hold shift + click to select a range
85b7bc7
refactor: remove dock shim and move session routing into plugins
steipete Mar 16, 2026
3fe3a53
Plugins: add provider runtime contracts
vincentkoc Mar 16, 2026
a9a9cf4
GitHub Copilot: move runtime tests to provider contracts
vincentkoc Mar 16, 2026
25535b5
Z.ai: move runtime tests to provider contracts
vincentkoc Mar 16, 2026
62de7e0
Anthropic: move runtime tests to provider contracts
vincentkoc Mar 16, 2026
182a00c
Google: move runtime tests to provider contracts
vincentkoc Mar 16, 2026
7dab66c
OpenAI: move runtime tests to provider contracts
vincentkoc Mar 16, 2026
e7eb410
Qwen Portal: move runtime tests to provider contracts
vincentkoc Mar 16, 2026
0ca1b18
fix(core): restore outbound fallbacks and gate checks
steipete Mar 16, 2026
e3ab0e1
style(core): normalize rebase fallout
steipete Mar 16, 2026
36f0f21
fix: accept sandbox plugin id hints
steipete Mar 16, 2026
6644783
Plugins: capture tool registrations in test registry
vincentkoc Mar 16, 2026
947b548
Plugins: cover Firecrawl tool ownership
vincentkoc Mar 16, 2026
95b761a
Firecrawl: drop local registration contract test
vincentkoc Mar 16, 2026
79a67a5
Plugins: add provider catalog contracts
vincentkoc Mar 16, 2026
3c62ab5
Plugins: narrow provider runtime contracts
vincentkoc Mar 16, 2026
99c501a
refactor(plugin-sdk): use scoped core imports for bundled channels
steipete Mar 16, 2026
cec1070
fix: unblock ci gates
steipete Mar 16, 2026
320b4bc
Plugins: add provider wizard contracts
vincentkoc Mar 16, 2026
e90c1d9
fix: unblock docs and registry checks
steipete Mar 16, 2026
7964563
refactor: finish plugin-owned channel runtime seams
steipete Mar 16, 2026
b3025e6
refactor(plugin-sdk): clean shared core imports
steipete Mar 16, 2026
bbf3b4a
Plugins: add provider auth contracts
vincentkoc Mar 16, 2026
209f1a0
Plugins: dedupe routing imports in channel adapters
vincentkoc Mar 16, 2026
a6eda07
Plugins: add provider discovery contracts
vincentkoc Mar 16, 2026
045a879
fix: stop bonjour before re-advertising
steipete Mar 16, 2026
67b886b
Plugins: extend provider discovery contracts
vincentkoc Mar 16, 2026
49251de
docs: codify macOS parallels discord smoke
steipete Mar 16, 2026
74d0c39
refactor: move session lifecycle and outbound fallbacks into plugins
steipete Mar 16, 2026
8fe08df
refactor(plugins): derive compat provider ids from manifests
steipete Mar 16, 2026
4f8c066
Plugins: cover catalog discovery providers
vincentkoc Mar 16, 2026
78f24dc
Tests: type auth contract prompt mocks
vincentkoc Mar 16, 2026
0ed64f1
fix: mount CLI auth dirs in docker live tests
steipete Mar 16, 2026
3a2c24e
refactor: route shared channel sdk imports through plugin seams
steipete Mar 16, 2026
ced20e7
Plugins: add auth choice contracts
vincentkoc Mar 16, 2026
83ddb0f
Plugins: restore routing seams and discovery fixtures
vincentkoc Mar 16, 2026
7c2863d
fix: harden bonjour retry recovery
steipete Mar 16, 2026
7a09255
Runtime: lazy-load channel runtime singletons
vincentkoc Mar 16, 2026
f11589b
refactor: tighten plugin sdk channel seams
steipete Mar 16, 2026
a73d662
refactor: route remaining channel imports through plugin sdk
steipete Mar 16, 2026
7cc5789
refactor(plugins): finish provider auth boundary cleanup
steipete Mar 16, 2026
e575f41
fix(infra): wire gaxios-fetch-compat shim to prevent node-fetch crash…
Mar 16, 2026
1aabce7
fix(infra): also wire gaxios-fetch-compat shim into src/index.ts (gat…
Mar 16, 2026
94a01c9
fix: keep gaxios compat off the package root (#47914) (thanks @pdd-cli)
steipete Mar 16, 2026
7e74ade
refactor: shrink public channel plugin sdk surfaces
steipete Mar 16, 2026
4c8678c
refactor: add private channel sdk bridges
steipete Mar 16, 2026
f49fc63
fix: restore effective setup wizard lazy import
steipete Mar 16, 2026
09e8d1e
docs: add frontmatter to parallels discord skill
steipete Mar 16, 2026
77b1f24
fix: retry runtime postbuild skill copy races
steipete Mar 16, 2026
776e5d8
Gateway: lazily resolve channel runtime
vincentkoc Mar 16, 2026
9ee0fb5
Gateway: cover lazy channel runtime resolution
vincentkoc Mar 16, 2026
ff2e864
Plugins: add Claude marketplace registry installs (#48058)
vincentkoc Mar 16, 2026
30c31d4
UI: keep thinking helpers browser-safe
vincentkoc Mar 16, 2026
c06101b
Infra: restore check after gaxios compat
vincentkoc Mar 16, 2026
c9423dc
Docs: refresh generated config baseline
vincentkoc Mar 16, 2026
43c156e
docs: reorder unreleased changelog entries
steipete Mar 16, 2026
6f5369c
fix: split browser-safe thinking helpers
steipete Mar 16, 2026
2a85fa7
fix(macos): restore debug build helpers (#48046)
ngutman Mar 16, 2026
d896d8e
Docs: add Claude marketplace plugin install guidance
vincentkoc Mar 16, 2026
5cd206f
Channels: expand contract suites
vincentkoc Mar 16, 2026
429144d
Channels: add contract surface coverage
vincentkoc Mar 16, 2026
4aae0d4
Channels: centralize outbound payload contracts
vincentkoc Mar 16, 2026
79a8905
Channels: centralize group policy contracts
vincentkoc Mar 16, 2026
70aa920
Channels: centralize inbound context contracts
vincentkoc Mar 16, 2026
a897096
Tests: add contract runner
vincentkoc Mar 16, 2026
65f05d7
Tests: harden WhatsApp inbound contract cleanup
vincentkoc Mar 16, 2026
d572188
Tests: add extension test runner
vincentkoc Mar 16, 2026
abb21d9
Runtime: lazy-load Discord channel ops
vincentkoc Mar 16, 2026
3832f93
Docs: use placeholders for marketplace plugin examples
vincentkoc Mar 16, 2026
1447e2e
Release: trim generated docs from npm pack
vincentkoc Mar 16, 2026
898d684
Runtime: lazy-load Telegram and Slack channel ops
vincentkoc Mar 16, 2026
d68645d
Tests: detect changed extensions
vincentkoc Mar 16, 2026
2ee20a6
Tests: cover changed extension detection
vincentkoc Mar 16, 2026
303f690
Docs: add extension test workflow
vincentkoc Mar 16, 2026
5336c4e
CI: add changed extension test lane
vincentkoc Mar 16, 2026
e1f759f
BlueBubbles: lazy-load channel runtime paths
vincentkoc Mar 16, 2026
9270094
Plugin SDK: restore scoped imports for bundled channels
gumadeiras Mar 16, 2026
296083a
Plugin SDK: consolidate shared channel exports
gumadeiras Mar 16, 2026
1cf544f
Channels: fix surface contract plugin lookup
gumadeiras Mar 16, 2026
8cd1bdd
Status: stabilize startup memory probes
gumadeiras Mar 16, 2026
6e65066
Media: avoid slow auth misses in auto-detect
gumadeiras Mar 16, 2026
d61c08e
Tests: scope Codex bundle loader fixture
gumadeiras Mar 16, 2026
fdfa98c
Tests: isolate bundle surface fixtures
gumadeiras Mar 16, 2026
6a8f5bc
feat(telegram): add configurable silent error replies (#19776)
auspic7 Mar 16, 2026
fba394c
fix(ui): auto load Usage tab data on navigation
Mar 13, 2026
8b438a3
fix(telegram): keep silent error fallback replies quiet
ImLukeF Mar 16, 2026
ccba943
test(gateway): restore agent request route mock
obviyus Mar 16, 2026
d6aa9b5
Cron: isolate active-model delivery tests
gumadeiras Mar 16, 2026
5e4851a
Tests: align media auth fixture with selection checks
gumadeiras Mar 16, 2026
4c88531
Plugins: preserve lazy runtime provider resolution
gumadeiras Mar 16, 2026
092afc8
Bootstrap: report nested entry import misses
huntharo Mar 16, 2026
55f6d2d
fix(channels): parse bundled targets without plugin registry
obviyus Mar 16, 2026
e78b51b
test(telegram): cover shared parsing without registry
obviyus Mar 16, 2026
9fc6c19
Plugin SDK: split setup and sandbox subpaths
gumadeiras Mar 16, 2026
c08f2aa
Providers: centralize setup defaults and helper boundaries
gumadeiras Mar 16, 2026
b7f99a5
Plugins: decouple bundled web search discovery
gumadeiras Mar 16, 2026
e5282e6
Plugin SDK: update entrypoint metadata
gumadeiras Mar 16, 2026
467dae5
Secrets: honor caller env during runtime validation
gumadeiras Mar 16, 2026
ad18866
Tests: align Docker cache checks with non-root images
gumadeiras Mar 16, 2026
c186176
Plugin SDK: keep root alias reflection lazy
gumadeiras Mar 16, 2026
77566a1
Providers: scope compat resolution to owning plugins
gumadeiras Mar 16, 2026
841025d
Plugin SDK: add narrow setup subpaths
gumadeiras Mar 16, 2026
7d4ccee
Plugin SDK: update entrypoint metadata
gumadeiras Mar 16, 2026
80bef82
fix(slack): harden bolt import interop (#45953)
merc1305 Mar 16, 2026
8ad8069
Tests: fix green check typing regressions
gumadeiras Mar 16, 2026
55253e2
Plugins: avoid booting bundled providers for catalog hooks
gumadeiras Mar 16, 2026
1b31ede
fix: bypass telegram runtime proxy during health checks
obviyus Mar 16, 2026
5f78057
fix: align telegram probe test mock
obviyus Mar 16, 2026
3009e68
test: remove stale synology zod mock
obviyus Mar 16, 2026
56e23a8
fix(android): reduce chat recomposition churn
obviyus Mar 16, 2026
a41be25
fix(android): preserve chat message identity on refresh
obviyus Mar 16, 2026
3e360ec
fix(android): shrink chat image attachments
obviyus Mar 16, 2026
7deb543
Browser: support non-Chrome existing-session profiles via userDataDir…
velvet-shark Mar 16, 2026
0b05530
fix(local-storage): improve VITEST environment check for localStorage…
BunsDev Mar 16, 2026
7178a0d
fix: normalize discord commands allowFrom auth
obviyus Mar 16, 2026
e2b8ef3
test: update discord subagent hook mocks
obviyus Mar 16, 2026
ac66d38
test: mock telegram native command reply pipeline
obviyus Mar 16, 2026
64e412e
fix(android): lazy-init node runtime after onboarding
obviyus Mar 16, 2026
4337b1e
docs(config): refresh generated baseline
obviyus Mar 16, 2026
541e697
Plugins: share channel plugin id resolution
gumadeiras Mar 16, 2026
1b234b9
Gateway: defer full channel plugins until after listen
gumadeiras Mar 16, 2026
96ed010
Gateway: gate deferred channel startup behind opt-in
gumadeiras Mar 16, 2026
1f1a93a
Docs: document deferred channel startup opt-in
gumadeiras Mar 16, 2026
f8bcfb9
feat(skills): preserve all skills in prompt via compact fallback befo…
snese Mar 16, 2026
771fbea
Gateway: simplify startup and stabilize mock responses tests
gumadeiras Mar 16, 2026
ce1d954
test: fix stale web search and boot-md contracts
obviyus Mar 16, 2026
d352be8
Gateway tests: centralize mock responses provider setup
gumadeiras Mar 16, 2026
13894ec
Gateway tests: share ordered client teardown helper
gumadeiras Mar 16, 2026
8a226ff
Infra: ignore ciao probing cancellations
gumadeiras Mar 16, 2026
c28a522
Docs: repair unreleased changelog attribution
vincentkoc Mar 16, 2026
4649f82
Docs: normalize unreleased changelog refs
vincentkoc Mar 16, 2026
2c3c48f
Channels: ignore enabled-only disabled plugin config
gumadeiras Mar 16, 2026
97a7dcf
perf: reduce status json startup memory
obviyus Mar 16, 2026
7e26589
perf: lazy-load status route startup helpers
obviyus Mar 16, 2026
09df232
Plugins: stage local bundled runtime tree
gumadeiras Mar 16, 2026
546e4d9
Build: share root dist chunks across tsdown entries
gumadeiras Mar 16, 2026
df3a190
fix(logging): make logger import browser-safe
altaywtf Mar 16, 2026
412811e
fix(changelog): add entry for Control UI logger import fix (#48469)
altaywtf Mar 16, 2026
2de2837
Plugins: remove public extension-api surface (#48462)
Takhoffman Mar 16, 2026
abce640
fix(ui): language dropdown selection not persisting after refresh (#4…
git-jxj Mar 16, 2026
eeb140b
fix(plugins): late-binding subagent runtime for non-gateway load path…
jalehman Mar 16, 2026
04985da
fix: enable auto-scroll during assistant response streaming
Feb 13, 2026
2ab25ba
fix(ui): align chatStream lifecycle type with nullable state
BunsDev Mar 16, 2026
10ef58d
fix(whatsapp): restore implicit reply mentions for LID identities (#4…
sparkyrider Mar 16, 2026
a53030a
fix(compaction): stabilize toolResult trim/prune flow in safeguard (#…
SayrWolfridge Mar 16, 2026
313e5bb
Fix launcher startup regressions (#48501)
Takhoffman Mar 16, 2026
6ba4d0d
fix: remove orphaned tool_result blocks during compaction (#15691) (#…
claw-sylphx Mar 16, 2026
4863b65
docs: rename onboarding user-facing wizard copy
Takhoffman Mar 17, 2026
94c27f3
fix(plugins): keep built plugin loading on one module graph (#48595)
huntharo Mar 17, 2026
750ce39
Plugins: stabilize global catalog contracts
vincentkoc Mar 16, 2026
0f01357
Channels: add global threading and directory contracts
vincentkoc Mar 16, 2026
02df22a
Tests: improve extension runner discovery
vincentkoc Mar 16, 2026
8b2f0cb
CI: run global contract lane
vincentkoc Mar 16, 2026
4194bba
Plugins: speed up auth-choice contracts
vincentkoc Mar 17, 2026
0a93e22
Plugins: fix catalog contract mocks
vincentkoc Mar 17, 2026
6c1433a
refactor: move provider catalogs into extensions
steipete Mar 17, 2026
e554eee
refactor: route bundled channel setup helpers through private sdk bri…
steipete Mar 17, 2026
8a10903
test: fix check contract type drift
steipete Mar 17, 2026
6805a80
Tests: lock plugin slash commands to one runtime graph
vincentkoc Mar 17, 2026
7959be4
Tests: cover Discord provider plugin registry
vincentkoc Mar 17, 2026
9c80d71
Tests: pin loader command activation semantics
vincentkoc Mar 17, 2026
e88c6d8
Tests: cover Telegram plugin auth on real registry
vincentkoc Mar 17, 2026
1c0db5b
refactor(slack): share setup helpers
steipete Mar 17, 2026
b230e52
refactor(whatsapp): reuse shared normalize helpers
steipete Mar 17, 2026
029f5d6
Tlon: lazy-load channel runtime paths
vincentkoc Mar 17, 2026
ad05cd9
Tests: document Discord plugin auth gating
vincentkoc Mar 17, 2026
662031a
feat(plugins): add speech provider registration
steipete Mar 17, 2026
6da9ba3
docs(plugins): document capability ownership model
steipete Mar 17, 2026
76500c7
fix: detect Ollama "prompt too long" as context overflow error (#34019)
lishuaigit Mar 17, 2026
3aa4199
agent: preemptive context overflow detection during tool loops (#29371)
keshav55 Mar 17, 2026
7c2c20a
refactor: untangle bundled channel sdk bridges
steipete Mar 17, 2026
8578135
feat(plugins): expand speech runtime ownership
steipete Mar 17, 2026
ed248c7
docs(plugins): document speech runtime ownership
steipete Mar 17, 2026
1ffe8fd
fix: stabilize docker test suite
steipete Mar 17, 2026
fe4368c
fix: align thinking defaults and plugin sdk exports
steipete Mar 17, 2026
683be73
refactor: point onboarding provider config to extensions
steipete Mar 17, 2026
5a763ac
fix: restore check after upstream type drift
steipete Mar 17, 2026
7df0ced
refactor: move provider onboarding into extensions
steipete Mar 17, 2026
f6d3aaa
refactor: move remaining provider onboarding into extensions
steipete Mar 17, 2026
2182137
refactor: move gateway onboarding into extensions
steipete Mar 17, 2026
763eff8
refactor: move plugin-specific config into extensions
steipete Mar 17, 2026
03f5036
refactor: rename kimi coding surface to kimi
steipete Mar 17, 2026
77d6274
docs: rename kimi coding package description
steipete Mar 17, 2026
2497b81
refactor: add shared setup sdk subpath
steipete Mar 17, 2026
a71c611
refactor: add plugin sdk setup entrypoint
steipete Mar 17, 2026
622f132
feat(tts): add microsoft voice listing
steipete Mar 17, 2026
5602973
docs(plugins): add capability contract example
steipete Mar 17, 2026
5f5b409
fix: remove duplicate whatsapp dm policy import
obviyus Mar 17, 2026
57f1ab1
feat(tts): enrich speech voice metadata
steipete Mar 17, 2026
14907d3
docs(plugins): note richer voice metadata
steipete Mar 17, 2026
3e010e2
feat(plugins): add media understanding provider registration
steipete Mar 17, 2026
3566e88
docs(plugins): document media capability ownership
steipete Mar 17, 2026
c64f6ad
refactor: finish provider auth extraction and canonicalize kimi
steipete Mar 17, 2026
e064c11
Zalo: lazy-load channel runtime paths
vincentkoc Mar 17, 2026
c081dc5
feat(plugins): move media understanding into vendor plugins
steipete Mar 17, 2026
71a79bd
docs(plugins): document media understanding runtime
steipete Mar 17, 2026
095a9f6
fix: handle Parallels poweroff snapshot restores
steipete Mar 17, 2026
f90d432
Plugins: honor native command aliases at dispatch
vincentkoc Mar 17, 2026
75b8117
refactor(slack): share plugin base config
steipete Mar 17, 2026
ba79d90
refactor(whatsapp): share plugin base config
steipete Mar 17, 2026
3cc1c7b
refactor(telegram): share plugin base config
steipete Mar 17, 2026
a8853d2
refactor(signal): share plugin base config
steipete Mar 17, 2026
31a8225
refactor(imessage): share plugin base config
steipete Mar 17, 2026
c3571d9
refactor(nextcloud-talk): share setup allowlist prompt
steipete Mar 17, 2026
7758873
refactor(slack): share setup wizard base
steipete Mar 17, 2026
6d6e08b
refactor(signal): share setup wizard base
steipete Mar 17, 2026
4f7ee60
refactor(setup): import docs helpers directly
steipete Mar 17, 2026
a3474dd
refactor(discord): share setup wizard base
steipete Mar 17, 2026
b058077
refactor(telegram): share setup wizard base
steipete Mar 17, 2026
a0e7e3c
refactor(discord): share plugin base config
steipete Mar 17, 2026
9c48321
refactor(imessage): share setup wizard base
steipete Mar 17, 2026
7fc134d
refactor(setup): share patched account adapters
steipete Mar 17, 2026
81ef52a
refactor(zalouser): reuse patched setup adapter
steipete Mar 17, 2026
4fd75e5
refactor(setup): reuse patched adapters in slack and telegram
steipete Mar 17, 2026
387d9fa
refactor(setup): reuse patched adapters in discord and signal
steipete Mar 17, 2026
5ddbba1
refactor(imessage): reuse patched setup adapter
steipete Mar 17, 2026
78869f1
refactor(mattermost): reuse patched setup adapter
steipete Mar 17, 2026
c518426
refactor(setup): support account-scoped default patches
steipete Mar 17, 2026
4ae7148
refactor(setup): share scoped config prelude
steipete Mar 17, 2026
233ef31
refactor(setup): reuse scoped config prelude in patched adapters
steipete Mar 17, 2026
6a27db0
refactor(outbound): share thread id normalization
steipete Mar 17, 2026
8357372
refactor(slack): share setup token credential config
steipete Mar 17, 2026
a20b64c
refactor(providers): share api-key catalog helper
steipete Mar 17, 2026
0a6140a
refactor(providers): share catalog template matcher
steipete Mar 17, 2026
3918374
refactor(providers): share paired api-key catalogs
steipete Mar 17, 2026
08d120e
refactor(slack): share action adapter
steipete Mar 17, 2026
45cb02b
refactor(plugins): share MCP server map extraction
steipete Mar 17, 2026
f4fa84a
feat(plugins): tighten media runtime integration
steipete Mar 17, 2026
afc0172
docs(plugins): add capability checklist template
steipete Mar 17, 2026
9ebe38b
refactor: untangle remaining plugin sdk boundaries
steipete Mar 17, 2026
70da383
test: fix rebase fallout
steipete Mar 17, 2026
529272d
WhatsApp: lazy-load channel auth helpers
vincentkoc Mar 17, 2026
9183081
refactor: move provider auth helpers into plugin layer
steipete Mar 17, 2026
6d6825e
refactor: add shared provider auth modules
steipete Mar 17, 2026
4bba288
feat(plugins): add web search runtime capability
steipete Mar 17, 2026
631f6f4
fix(extensions): restore setup and catalog tests
steipete Mar 17, 2026
73703d9
refactor: remove onboard auth compat barrels
steipete Mar 17, 2026
0cfc80b
refactor: finish public plugin sdk boundary seams
steipete Mar 17, 2026
87b9a06
refactor: add shared provider model definitions
steipete Mar 17, 2026
5572e69
Agents: add provider attribution registry (#48735)
vincentkoc Mar 17, 2026
38bc364
Runtime: narrow WhatsApp login tool surface
vincentkoc Mar 17, 2026
06459ca
Agents: run bundle MCP tools in embedded Pi (#48611)
vincentkoc Mar 17, 2026
ad7924b
Agents: add OpenAI attribution headers (#48737)
vincentkoc Mar 17, 2026
dde89d2
refactor: isolate provider sdk auth and model helpers
steipete Mar 17, 2026
68d2bd2
Plugins: reject conflicting native command aliases
vincentkoc Mar 17, 2026
21f5675
Setup: trim channel setup import cycles
vincentkoc Mar 17, 2026
7fa3825
feat(plugins): derive bundled web search providers from plugins
steipete Mar 17, 2026
50c3321
feat(media): route image tool through media providers
steipete Mar 17, 2026
da34f81
fix(secrets): scope message SecretRef resolution and harden doctor/st…
joshavant Mar 17, 2026
d33c166
fix: update test mocks for refactored plugin-sdk imports in Telegram …
wzrrrrrrr Mar 17, 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.
14 changes: 7 additions & 7 deletions .agent/workflows/update_clawdbot.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
description: Update Clawdbot from upstream when branch has diverged (ahead/behind)
description: Update OpenClaw from upstream when branch has diverged (ahead/behind)
---

# Clawdbot Upstream Sync Workflow
# OpenClaw Upstream Sync Workflow

Use this workflow when your fork has diverged from upstream (e.g., "18 commits ahead, 29 commits behind").

Expand Down Expand Up @@ -132,16 +132,16 @@ pnpm mac:package

```bash
# Kill running app
pkill -x "Clawdbot" || true
pkill -x "OpenClaw" || true

# Move old version
mv /Applications/Clawdbot.app /tmp/Clawdbot-backup.app
mv /Applications/OpenClaw.app /tmp/OpenClaw-backup.app

# Install new build
cp -R dist/Clawdbot.app /Applications/
cp -R dist/OpenClaw.app /Applications/

# Launch
open /Applications/Clawdbot.app
open /Applications/OpenClaw.app
```

---
Expand Down Expand Up @@ -235,7 +235,7 @@ If upstream introduced new model configurations:
# Check for OpenRouter API key requirements
grep -r "openrouter\|OPENROUTER" src/ --include="*.ts" --include="*.js"

# Update clawdbot.json with fallback chains
# Update openclaw.json with fallback chains
# Add model fallback configurations as needed
```

Expand Down
62 changes: 62 additions & 0 deletions .agents/skills/parallels-discord-roundtrip/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
name: parallels-discord-roundtrip
description: Run the macOS Parallels smoke harness with Discord end-to-end roundtrip verification, including guest send, host verification, host reply, and guest readback.
---

# Parallels Discord Roundtrip

Use when macOS Parallels smoke must prove Discord two-way delivery end to end.

## Goal

Cover:

- install on fresh macOS snapshot
- onboard + gateway health
- guest `message send` to Discord
- host sees that message on Discord
- host posts a new Discord message
- guest `message read` sees that new message

## Inputs

- host env var with Discord bot token
- Discord guild ID
- Discord channel ID
- `OPENAI_API_KEY`

## Preferred run

```bash
export OPENCLAW_PARALLELS_DISCORD_TOKEN="$(
ssh peters-mac-studio-1 'jq -r ".channels.discord.token" ~/.openclaw/openclaw.json' | tr -d '\n'
)"

pnpm test:parallels:macos \
--discord-token-env OPENCLAW_PARALLELS_DISCORD_TOKEN \
--discord-guild-id 1456350064065904867 \
--discord-channel-id 1456744319972282449 \
--json
```

## Notes

- Snapshot target: closest to `macOS 26.3.1 fresh`.
- Snapshot resolver now prefers matching `*-poweroff*` clones when the base hint also matches. That lets the harness reuse disk-only recovery snapshots without passing a longer hint.
- If Windows/Linux snapshot restore logs show `PET_QUESTION_SNAPSHOT_STATE_INCOMPATIBLE_CPU`, drop the suspended state once, create a `*-poweroff*` replacement snapshot, and rerun. The smoke scripts now auto-start restored power-off snapshots.
- Harness configures Discord inside the guest; no checked-in token/config.
- Use the `openclaw` wrapper for guest `message send/read`; `node openclaw.mjs message ...` does not expose the lazy message subcommands the same way.
- Write `channels.discord.guilds` in one JSON object (`--strict-json`), not dotted `config set channels.discord.guilds.<snowflake>...` paths; numeric snowflakes get treated like array indexes.
- Avoid `prlctl enter` / expect for long Discord setup scripts; it line-wraps/corrupts long commands. Use `prlctl exec --current-user /bin/sh -lc ...` for the Discord config phase.
- Full 3-OS sweeps: the shared build lock is safe in parallel, but snapshot restore is still a Parallels bottleneck. Prefer serialized Windows/Linux restore-heavy reruns if the host is already under load.
- Harness cleanup deletes the temporary Discord smoke messages at exit.
- Per-phase logs: `/tmp/openclaw-parallels-smoke.*`
- Machine summary: pass `--json`
- If roundtrip flakes, inspect `fresh.discord-roundtrip.log` and `discord-last-readback.json` in the run dir first.

## Pass criteria

- fresh lane or upgrade lane requested passes
- summary reports `discord=pass` for that lane
- guest outbound nonce appears in channel history
- host inbound nonce appears in `openclaw message read` output
2 changes: 2 additions & 0 deletions .detect-secrets.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,5 @@ pattern = grep -q 'N[O]DE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache' ~/.bash
pattern = env: \{ MISTRAL_API_K[E]Y: "sk-\.\.\." \},
pattern = "ap[i]Key": "xxxxx",
pattern = ap[i]Key: "A[I]za\.\.\.",
# Sparkle appcast signatures are release metadata, not credentials.
pattern = sparkle:edSignature="[A-Za-z0-9+/=]+"
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
.git
.worktrees

# Sensitive files – docker-setup.sh writes .env with OPENCLAW_GATEWAY_TOKEN
# into the project root; keep it out of the build context.
.env
.env.*

.bun-cache
.bun
.tmp
Expand Down
54 changes: 54 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Protect the ownership rules themselves.
/.github/CODEOWNERS @steipete

# WARNING: GitHub CODEOWNERS uses last-match-wins semantics.
# If you add overlapping rules below the secops block, include @openclaw/secops
# on those entries too or you can silently remove required secops review.
# Security-sensitive code, config, and docs require secops review.
/SECURITY.md @openclaw/secops
/.github/dependabot.yml @openclaw/secops
/.github/codeql/ @openclaw/secops
/.github/workflows/codeql.yml @openclaw/secops
/src/security/ @openclaw/secops
/src/secrets/ @openclaw/secops
/src/config/*secret*.ts @openclaw/secops
/src/config/**/*secret*.ts @openclaw/secops
/src/gateway/*auth*.ts @openclaw/secops
/src/gateway/**/*auth*.ts @openclaw/secops
/src/gateway/*secret*.ts @openclaw/secops
/src/gateway/**/*secret*.ts @openclaw/secops
/src/gateway/security-path*.ts @openclaw/secops
/src/gateway/resolve-configured-secret-input-string*.ts @openclaw/secops
/src/gateway/protocol/**/*secret*.ts @openclaw/secops
/src/gateway/server-methods/secrets*.ts @openclaw/secops
/src/agents/*auth*.ts @openclaw/secops
/src/agents/**/*auth*.ts @openclaw/secops
/src/agents/auth-profiles*.ts @openclaw/secops
/src/agents/auth-health*.ts @openclaw/secops
/src/agents/auth-profiles/ @openclaw/secops
/src/agents/sandbox.ts @openclaw/secops
/src/agents/sandbox-*.ts @openclaw/secops
/src/agents/sandbox/ @openclaw/secops
/src/infra/secret-file*.ts @openclaw/secops
/src/cron/stagger.ts @openclaw/secops
/src/cron/service/jobs.ts @openclaw/secops
/docs/security/ @openclaw/secops
/docs/gateway/authentication.md @openclaw/secops
/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md @openclaw/secops
/docs/gateway/sandboxing.md @openclaw/secops
/docs/gateway/secrets-plan-contract.md @openclaw/secops
/docs/gateway/secrets.md @openclaw/secops
/docs/gateway/security/ @openclaw/secops
/docs/cli/approvals.md @openclaw/secops
/docs/cli/sandbox.md @openclaw/secops
/docs/cli/security.md @openclaw/secops
/docs/cli/secrets.md @openclaw/secops
/docs/reference/secretref-credential-surface.md @openclaw/secops
/docs/reference/secretref-user-supplied-credentials-matrix.json @openclaw/secops

# Release workflow and its supporting release-path checks.
/.github/workflows/openclaw-npm-release.yml @openclaw/openclaw-release-managers
/docs/reference/RELEASING.md @openclaw/openclaw-release-managers
/scripts/openclaw-npm-publish.sh @openclaw/openclaw-release-managers
/scripts/openclaw-npm-release-check.ts @openclaw/openclaw-release-managers
/scripts/release-check.ts @openclaw/openclaw-release-managers
1 change: 0 additions & 1 deletion .github/FUNDING.yml

This file was deleted.

31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,37 @@ body:
label: Install method
description: How OpenClaw was installed or launched.
placeholder: npm global / pnpm dev / docker / mac app
- type: input
id: model
attributes:
label: Model
description: Effective model under test.
placeholder: minimax/text-01 / openrouter/anthropic/claude-opus-4.1 / anthropic/claude-sonnet-4.5
validations:
required: true
- type: input
id: provider_chain
attributes:
label: Provider / routing chain
description: Effective request path through gateways, proxies, providers, or model routers.
placeholder: openclaw -> cloudflare-ai-gateway -> minimax
validations:
required: true
- type: input
id: config_location
attributes:
label: Config file / key location
description: Optional. Relevant config source or key path if this bug depends on overrides or custom provider setup. Redact secrets.
placeholder: ~/.openclaw/openclaw.json ; models.providers.cloudflare-ai-gateway.baseUrl ; ~/.openclaw/agents/<agentId>/agent/models.json
- type: textarea
id: provider_setup_details
attributes:
label: Additional provider/model setup details
description: Optional. Include redacted routing details, per-agent overrides, auth-profile interactions, env/config context, or anything else needed to explain the effective provider/model setup. Do not include API keys, tokens, or passwords.
placeholder: |
Default route is openclaw -> cloudflare-ai-gateway -> minimax.
Previous setup was openclaw -> cloudflare-ai-gateway -> openrouter -> minimax.
Relevant config lives in ~/.openclaw/openclaw.json under models.providers.minimax and models.providers.cloudflare-ai-gateway.
- type: textarea
id: logs
attributes:
Expand Down
16 changes: 10 additions & 6 deletions .github/actions/setup-node-env/action.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
name: Setup Node environment
description: >
Initialize submodules with retry, install Node 22, pnpm, optionally Bun,
Initialize submodules with retry, install Node 24 by default, pnpm, optionally Bun,
and optionally run pnpm install. Requires actions/checkout to run first.
inputs:
node-version:
description: Node.js version to install.
required: false
default: "22.x"
default: "24.x"
cache-key-suffix:
description: Suffix appended to the pnpm store cache key.
required: false
default: "node24"
pnpm-version:
description: pnpm version for corepack.
required: false
Expand All @@ -16,7 +20,7 @@ inputs:
required: false
default: "true"
use-sticky-disk:
description: Use Blacksmith sticky disks for pnpm store caching.
description: Request Blacksmith sticky-disk pnpm caching on trusted runs; pull_request runs fall back to actions/cache.
required: false
default: "false"
install-deps:
Expand Down Expand Up @@ -45,7 +49,7 @@ runs:
exit 1
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses: actions/setup-node@v6
with:
node-version: ${{ inputs.node-version }}
check-latest: false
Expand All @@ -54,12 +58,12 @@ runs:
uses: ./.github/actions/setup-pnpm-store-cache
with:
pnpm-version: ${{ inputs.pnpm-version }}
cache-key-suffix: "node22"
cache-key-suffix: ${{ inputs.cache-key-suffix }}
use-sticky-disk: ${{ inputs.use-sticky-disk }}

- name: Setup Bun
if: inputs.install-bun == 'true'
uses: oven-sh/setup-bun@v2
uses: oven-sh/setup-bun@v2.1.3
with:
bun-version: "1.3.9"

Expand Down
20 changes: 11 additions & 9 deletions .github/actions/setup-pnpm-store-cache/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ inputs:
cache-key-suffix:
description: Suffix appended to the cache key.
required: false
default: "node22"
default: "node24"
use-sticky-disk:
description: Use Blacksmith sticky disks instead of actions/cache for pnpm store.
description: Use Blacksmith sticky disks instead of actions/cache for pnpm store on trusted runs; pull_request runs fall back to actions/cache.
required: false
default: "false"
use-restore-keys:
description: Whether to use restore-keys fallback for actions/cache.
required: false
default: "true"
use-actions-cache:
description: Whether to restore/save pnpm store with actions/cache.
description: Whether to restore/save pnpm store with actions/cache, including pull_request fallback when sticky disks are disabled.
required: false
default: "true"
runs:
Expand Down Expand Up @@ -51,22 +51,24 @@ runs:
run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"

- name: Mount pnpm store sticky disk
if: inputs.use-sticky-disk == 'true'
# Keep persistent sticky-disk state off untrusted PR runs.
if: inputs.use-sticky-disk == 'true' && github.event_name != 'pull_request'
uses: useblacksmith/stickydisk@v1
with:
key: ${{ github.repository }}-pnpm-store-${{ runner.os }}-${{ inputs.cache-key-suffix }}
key: ${{ github.repository }}-pnpm-store-${{ runner.os }}-${{ github.ref_name }}-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }}
path: ${{ steps.pnpm-store.outputs.path }}

- name: Restore pnpm store cache (exact key only)
if: inputs.use-actions-cache == 'true' && inputs.use-sticky-disk != 'true' && inputs.use-restore-keys != 'true'
uses: actions/cache@v4
# PRs that request sticky disks still need a safe cache restore path.
if: inputs.use-actions-cache == 'true' && (inputs.use-sticky-disk != 'true' || github.event_name == 'pull_request') && inputs.use-restore-keys != 'true'
uses: actions/cache@v5
with:
path: ${{ steps.pnpm-store.outputs.path }}
key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }}

- name: Restore pnpm store cache (with fallback keys)
if: inputs.use-actions-cache == 'true' && inputs.use-sticky-disk != 'true' && inputs.use-restore-keys == 'true'
uses: actions/cache@v4
if: inputs.use-actions-cache == 'true' && (inputs.use-sticky-disk != 'true' || github.event_name == 'pull_request') && inputs.use-restore-keys == 'true'
uses: actions/cache@v5
with:
path: ${{ steps.pnpm-store.outputs.path }}
key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }}
Expand Down
Loading
Loading