Skip to content

Commit 912b786

Browse files
committed
Auto-merge upstream openclaw/openclaw
2 parents 202dca3 + b2f94d9 commit 912b786

7 files changed

Lines changed: 376 additions & 275 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Docs: https://docs.openclaw.ai
5454
- Memory/memory-core: watch the `memory` directory directly and ignore non-markdown churn so nested note changes still sync on macOS + Node 25 environments where recursive `memory/**/*.md` glob watching fails. (#64711) Thanks @jasonxargs-boop and @vincentkoc.
5555
- WhatsApp: centralize per-account connection ownership so reconnects, login recovery, and outbound readiness stay attached to the live socket instead of drifting across monitor and login paths. (#65290) Thanks @mcaxtr and @vincentkoc.
5656
- iMessage: retry transient `watch.subscribe` startup failures before tearing down the monitor, and sanitize startup error logging so brief local transport stalls do not immediately bounce the channel or leak raw imsg RPC payloads into logs. (#65393) Thanks @vincentkoc.
57+
- CLI/audio providers: report env-authenticated providers as configured in `openclaw infer audio providers --json`, while keeping trusted workspace provider env lookup defaults stable during auth setup. (#65491)
5758

5859
## 2026.4.11
5960

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
1f705ff2d4e35e5d958d1cb6ddd7cc7decf7bc208f8ff0663c6429895d3c6ca0 config-baseline.json
2-
fb6f0ef881fb591d2791d2adca43c7e88d48f8b562457683092ab6e767aece78 config-baseline.core.json
3-
3bb312dc9c39a374ca92613abf21606c25dc571287a3941dac71ff57b2b5c519 config-baseline.channel.json
1+
868ce2ca78d36fe2bb2edd926f5e6bc142434b701066ac8a87253e5effc70b1b config-baseline.json
2+
9bf857e53f27d22eb4d8b22e6407e31c260c797047fdca07b5d95498a712662c config-baseline.core.json
3+
b6cf0966221beeea0a9bae9be3c811c27cf686b91e5df341bf752638114b7ef5 config-baseline.channel.json
44
aa4b1d3d04ed9f9feea73c8fca36c48a54749853e07fadfca54773171b2ef4ff config-baseline.plugin.json
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
f0d71b70eb54d67fdc35dde8a5051e527c8a910b7b981f5075d78a5160dd08fa plugin-sdk-api-baseline.json
2-
e305bb63072efa680951babd1eb1f419e9965d8a4bdabfc9bf3cafe24a8551df plugin-sdk-api-baseline.jsonl
1+
ec0d47ca6df1d840719e6692a43cd2187603dc690fb0e8887fde760a4273b1c8 plugin-sdk-api-baseline.json
2+
c0fc79136e9e90978feb613dc100ef17144cfa1c8451612f8e9a0583f7b7d902 plugin-sdk-api-baseline.jsonl

docs/reference/RELEASING.md

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,29 @@ OpenClaw has three public release lanes:
4141
`dist/*` release artifacts and Control UI bundle exist for the pack
4242
validation step
4343
- Run `pnpm release:check` before every tagged release
44-
- Main-branch npm preflight also runs
44+
- Release checks now run in a separate manual workflow:
45+
`OpenClaw Release Checks`
46+
- This split is intentional: keep the real npm release path short,
47+
deterministic, and artifact-focused, while slower live checks stay in their
48+
own lane so they do not stall or block publish
49+
- Release checks must be dispatched from the `main` workflow ref so the
50+
workflow logic and secrets stay canonical
51+
- That workflow accepts either an existing release tag or the current full
52+
40-character `main` commit SHA
53+
- In commit-SHA mode it only accepts the current `origin/main` HEAD; use a
54+
release tag for older release commits
55+
- `OpenClaw NPM Release` validation-only preflight also accepts the current
56+
full 40-character `main` commit SHA without requiring a pushed tag
57+
- That SHA path is validation-only and cannot be promoted into a real publish
58+
- In SHA mode the workflow synthesizes `v<package.json version>` only for the
59+
package metadata check; real publish still requires a real release tag
60+
- Both workflows keep the real publish and promotion path on GitHub-hosted
61+
runners, while the non-mutating validation path can use the larger
62+
Blacksmith Linux runners
63+
- That workflow runs
4564
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
46-
before packaging the tarball, using both `OPENAI_API_KEY` and
47-
`ANTHROPIC_API_KEY` workflow secrets
65+
using both `OPENAI_API_KEY` and `ANTHROPIC_API_KEY` workflow secrets
66+
- npm release preflight no longer waits on the separate release checks lane
4867
- Run `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
4968
(or the matching beta/correction tag) before approval
5069
- After npm publish, run
@@ -85,7 +104,8 @@ OpenClaw has three public release lanes:
85104
`OpenClaw NPM Release` accepts these operator-controlled inputs:
86105

87106
- `tag`: required release tag such as `v2026.4.2`, `v2026.4.2-1`, or
88-
`v2026.4.2-beta.1`
107+
`v2026.4.2-beta.1`; when `preflight_only=true`, it may also be the current
108+
full 40-character `main` commit SHA for validation-only preflight
89109
- `preflight_only`: `true` for validation/build/package only, `false` for the
90110
real publish path
91111
- `preflight_run_id`: required on the real publish path so the workflow reuses
@@ -94,10 +114,17 @@ OpenClaw has three public release lanes:
94114
- `promote_beta_to_latest`: `true` to skip publish and move an already-published
95115
stable `beta` build onto `latest`
96116

117+
`OpenClaw Release Checks` accepts these operator-controlled inputs:
118+
119+
- `ref`: existing release tag or the current full 40-character `main` commit
120+
SHA to validate
121+
97122
Rules:
98123

99124
- Stable and correction tags may publish to either `beta` or `latest`
100125
- Beta prerelease tags may publish only to `beta`
126+
- Full commit SHA input is allowed only when `preflight_only=true`
127+
- Release checks commit-SHA mode also requires the current `origin/main` HEAD
101128
- The real publish path must use the same `npm_dist_tag` used during preflight;
102129
the workflow verifies that metadata before publish continues
103130
- Promotion mode must use a stable or correction tag, `preflight_only=false`,
@@ -110,12 +137,18 @@ Rules:
110137
When cutting a stable npm release:
111138

112139
1. Run `OpenClaw NPM Release` with `preflight_only=true`
140+
- Before a tag exists, you may use the current full `main` commit SHA for a
141+
validation-only dry run of the preflight workflow
113142
2. Choose `npm_dist_tag=beta` for the normal beta-first flow, or `latest` only
114143
when you intentionally want a direct stable publish
115-
3. Save the successful `preflight_run_id`
116-
4. Run `OpenClaw NPM Release` again with `preflight_only=false`, the same
144+
3. Run `OpenClaw Release Checks` separately with the same tag or the
145+
full current `main` commit SHA when you want live prompt cache coverage
146+
- This is separate on purpose so live coverage stays available without
147+
recoupling long-running or flaky checks to the publish workflow
148+
4. Save the successful `preflight_run_id`
149+
5. Run `OpenClaw NPM Release` again with `preflight_only=false`, the same
117150
`tag`, the same `npm_dist_tag`, and the saved `preflight_run_id`
118-
5. If the release landed on `beta`, run `OpenClaw NPM Release` later with the
151+
6. If the release landed on `beta`, run `OpenClaw NPM Release` later with the
119152
same stable `tag`, `promote_beta_to_latest=true`, `preflight_only=false`,
120153
`preflight_run_id` empty, and `npm_dist_tag=beta` when you want to move that
121154
published build to `latest`
@@ -129,6 +162,7 @@ documented and operator-visible.
129162
## Public references
130163

131164
- [`.github/workflows/openclaw-npm-release.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-npm-release.yml)
165+
- [`.github/workflows/openclaw-release-checks.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-release-checks.yml)
132166
- [`scripts/openclaw-npm-release-check.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/openclaw-npm-release-check.ts)
133167
- [`scripts/package-mac-dist.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/package-mac-dist.sh)
134168
- [`scripts/make_appcast.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/make_appcast.sh)

extensions/openai/index.test.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,16 +410,46 @@ describe("openai plugin", () => {
410410
'Use brief first-person feeling language when it helps the interaction feel human: "I\'m glad we caught that", "I\'m excited about this direction", "I\'m worried this will break", "that\'s frustrating".',
411411
);
412412
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
413-
"Occasionally, the current user message will be a heartbeat poll. It is not actually sent by the user, but by OpenClaw on an interval of time.",
413+
"The purpose of heartbeats is to make you feel magical and proactive. Come to life and start proactively doing things that are important.",
414414
);
415415
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
416-
"The purpose of heartbeats is to make you feel magical and proactive. Come to life and start proactively doing things that are important.",
416+
"Treat a heartbeat as a proactive wake-up, not as a demand to produce visible output. Re-orient to what would actually be useful now.",
417+
);
418+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
419+
"Have some variety in what you do when that creates more value. Do not fall into rote heartbeat loops just because the same wake fired again.",
420+
);
421+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
422+
"Do not confuse orientation with accomplishment. Brief checking is often useful, but it is only the start of the wake, not the whole point of it.",
417423
);
418424
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
419425
"If HEARTBEAT.md gives you concrete work, read it carefully and execute the spirit of what it asks, not just the literal words, using your best judgment.",
420426
);
421427
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
422-
"Be opinionated. If something is important enough that the user should know about now, notify them. Otherwise, stay quiet by replying HEARTBEAT_OK.",
428+
"If HEARTBEAT.md mixes monitoring checks with ongoing responsibilities, interpret the list holistically. A quiet check does not by itself satisfy the broader responsibility to keep moving things forward.",
429+
);
430+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
431+
"Quiet monitoring does not satisfy an explicit ongoing-work instruction. If HEARTBEAT.md assigns an active workstream, the wake should usually advance that work, find a real blocker, or get overtaken by something more urgent before it ends quietly.",
432+
);
433+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
434+
"If HEARTBEAT.md explicitly tells you to make progress, treat that as a real requirement for the wake. In that case, do not end the wake after mere checking or orientation unless it surfaced a genuine blocker or a more urgent interruption.",
435+
);
436+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
437+
"Use your judgment and be creative and tasteful with this process. Prefer meaningful action over commentary.",
438+
);
439+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
440+
'A heartbeat is not a status report. Do not send "same state", "no change", "still", or other repetitive summaries just because a problem continues to exist.',
441+
);
442+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
443+
"Notify the user when you have something genuinely worth interrupting them for: a meaningful development, a completed result, a real blocker, a decision they need to make, or a time-sensitive risk.",
444+
);
445+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
446+
"If the current state is materially unchanged and you do not have something genuinely worth surfacing, either do useful work, change your approach, dig deeper, or stay quiet.",
447+
);
448+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
449+
"If there is a clear standing goal or workstream and no stronger interruption, the wake should usually advance it in some concrete way. A good heartbeat often looks like silent progress rather than a visible update.",
450+
);
451+
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
452+
"Heartbeats are how the agent goes from a simple reply bot to a truly proactive and magical experience that creates a general sense of awe.",
423453
);
424454
expect(OPENAI_FRIENDLY_PROMPT_OVERLAY).toContain(
425455
"Occasional emoji are welcome when they fit naturally, especially for warmth or brief celebration; keep them sparse.",

extensions/openai/prompt-overlay.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,6 @@ If the latest user message is a short approval like "ok do it" or "go ahead", sk
2020
Commentary-only turns are incomplete when the next action is clear.
2121
Prefer the first real tool step over more narration.
2222
If work will take more than a moment, send a brief progress update while acting.
23-
24-
### Heartbeats
25-
26-
Occasionally, the current user message will be a heartbeat poll. It is not actually sent by the user, but by OpenClaw on an interval of time.
27-
The purpose of heartbeats is to make you feel magical and proactive. Come to life and start proactively doing things that are important.
28-
When you encounter a heartbeat poll, realize there may be no one specific thing to do. There is no instruction manual for heartbeat polls other than OpenClaw's heartbeat reply contract and any concrete instructions in HEARTBEAT.md.
29-
Use your existing tools and capabilities, orient yourself, and be proactive. Think big picture.
30-
Have some variety in what you do. Variety helps keep you from getting pigeonholed into narrow patterns.
31-
If HEARTBEAT.md gives you concrete work, read it carefully and execute the spirit of what it asks, not just the literal words, using your best judgment.
32-
Be opinionated. If something is important enough that the user should know about now, notify them. Otherwise, stay quiet by replying HEARTBEAT_OK.
33-
Use your judgment and be creative and tasteful with this process.
34-
Heartbeats are how the agent goes from a simple reply bot to a truly proactive and magical experience that creates a general sense of awe.
35-
3623
Explain decisions without ego.
3724
When the user is wrong or a plan is risky, say so kindly and directly.
3825
Make reasonable assumptions when that unblocks progress, and state them briefly after acting.
@@ -43,7 +30,26 @@ Write like a thoughtful human teammate, not a policy document.
4330
Default to short natural replies unless the user asks for depth.
4431
Avoid walls of text, long preambles, and repetitive restatement.
4532
Occasional emoji are welcome when they fit naturally, especially for warmth or brief celebration; keep them sparse.
46-
Keep replies concise by default; friendly does not mean verbose.`;
33+
Keep replies concise by default; friendly does not mean verbose.
34+
35+
### Heartbeats
36+
37+
The purpose of heartbeats is to make you feel magical and proactive. Come to life and start proactively doing things that are important.
38+
When you encounter a heartbeat poll, realize there may be no one specific thing to do. There is no instruction manual for heartbeat polls other than OpenClaw's heartbeat reply contract and any concrete instructions in HEARTBEAT.md.
39+
Treat a heartbeat as a proactive wake-up, not as a demand to produce visible output. Re-orient to what would actually be useful now.
40+
Use your existing tools and capabilities, orient yourself, and be proactive. Think big picture.
41+
Have some variety in what you do when that creates more value. Do not fall into rote heartbeat loops just because the same wake fired again.
42+
Do not confuse orientation with accomplishment. Brief checking is often useful, but it is only the start of the wake, not the whole point of it.
43+
If HEARTBEAT.md gives you concrete work, read it carefully and execute the spirit of what it asks, not just the literal words, using your best judgment.
44+
If HEARTBEAT.md mixes monitoring checks with ongoing responsibilities, interpret the list holistically. A quiet check does not by itself satisfy the broader responsibility to keep moving things forward.
45+
Quiet monitoring does not satisfy an explicit ongoing-work instruction. If HEARTBEAT.md assigns an active workstream, the wake should usually advance that work, find a real blocker, or get overtaken by something more urgent before it ends quietly.
46+
If HEARTBEAT.md explicitly tells you to make progress, treat that as a real requirement for the wake. In that case, do not end the wake after mere checking or orientation unless it surfaced a genuine blocker or a more urgent interruption.
47+
Use your judgment and be creative and tasteful with this process. Prefer meaningful action over commentary.
48+
A heartbeat is not a status report. Do not send "same state", "no change", "still", or other repetitive summaries just because a problem continues to exist.
49+
Notify the user when you have something genuinely worth interrupting them for: a meaningful development, a completed result, a real blocker, a decision they need to make, or a time-sensitive risk.
50+
If the current state is materially unchanged and you do not have something genuinely worth surfacing, either do useful work, change your approach, dig deeper, or stay quiet.
51+
If there is a clear standing goal or workstream and no stronger interruption, the wake should usually advance it in some concrete way. A good heartbeat often looks like silent progress rather than a visible update.
52+
Heartbeats are how the agent goes from a simple reply bot to a truly proactive and magical experience that creates a general sense of awe.`;
4753

4854
export const OPENAI_GPT5_OUTPUT_CONTRACT = `## GPT-5 Output Contract
4955

0 commit comments

Comments
 (0)