Skip to content

Commit f68679c

Browse files
Merge branch 'main' into fix/problem-active-memory-partial-transcript-surrogate
2 parents c53382e + 8245ae4 commit f68679c

230 files changed

Lines changed: 9109 additions & 1537 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/full-release-validation.yml

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ concurrency:
119119
env:
120120
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
121121
GH_REPO: ${{ github.repository }}
122+
# Read retries and one-shot dispatch recovery share this classifier; dispatch POSTs never retry.
123+
GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN: "HTTP 5[0-9][0-9]|Server Error|error connecting to|context deadline exceeded|connection reset by peer|connection refused|TLS handshake timeout|i/o timeout|network is unreachable|(^|[^A-Za-z0-9_])EOF([^A-Za-z0-9_]|$)|ETIMEDOUT|ECONNRESET|EAI_AGAIN"
122124
NODE_VERSION: "24.15.0"
123125

124126
jobs:
@@ -290,7 +292,7 @@ jobs:
290292
printf '%s\n' "$output"
291293
return 0
292294
fi
293-
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"Sorry. Your account was suspended"* ]]; then
295+
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"HTTP 429"* || "$output" == *"abuse detection"* || "$output" == *"Sorry. Your account was suspended"* || "$output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
294296
echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
295297
sleep $((attempt * 10))
296298
continue
@@ -308,6 +310,11 @@ jobs:
308310
set -e
309311
printf '%s\n' "$dispatch_output"
310312
313+
if [[ "$dispatch_status" -ne 0 && ! "$dispatch_output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
314+
echo "::error::${workflow} dispatch failed with non-ambiguous status ${dispatch_status}; refusing adoption polling." >&2
315+
exit "$dispatch_status"
316+
fi
317+
311318
run_id=""
312319
for _ in $(seq 1 60); do
313320
if matches_json="$(
@@ -450,7 +457,7 @@ jobs:
450457
printf '%s\n' "$output"
451458
return 0
452459
fi
453-
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"Sorry. Your account was suspended"* ]]; then
460+
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"HTTP 429"* || "$output" == *"abuse detection"* || "$output" == *"Sorry. Your account was suspended"* || "$output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
454461
echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
455462
sleep $((attempt * 10))
456463
continue
@@ -468,6 +475,11 @@ jobs:
468475
set -e
469476
printf '%s\n' "$dispatch_output"
470477
478+
if [[ "$dispatch_status" -ne 0 && ! "$dispatch_output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
479+
echo "::error::${workflow} dispatch failed with non-ambiguous status ${dispatch_status}; refusing adoption polling." >&2
480+
exit "$dispatch_status"
481+
fi
482+
471483
run_id=""
472484
for _ in $(seq 1 60); do
473485
if matches_json="$(
@@ -620,7 +632,7 @@ jobs:
620632
printf '%s\n' "$output"
621633
return 0
622634
fi
623-
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"Sorry. Your account was suspended"* ]]; then
635+
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"HTTP 429"* || "$output" == *"abuse detection"* || "$output" == *"Sorry. Your account was suspended"* || "$output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
624636
echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
625637
sleep $((attempt * 10))
626638
continue
@@ -638,6 +650,11 @@ jobs:
638650
set -e
639651
printf '%s\n' "$dispatch_output"
640652
653+
if [[ "$dispatch_status" -ne 0 && ! "$dispatch_output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
654+
echo "::error::${workflow} dispatch failed with non-ambiguous status ${dispatch_status}; refusing adoption polling." >&2
655+
exit "$dispatch_status"
656+
fi
657+
641658
run_id=""
642659
for _ in $(seq 1 60); do
643660
if matches_json="$(
@@ -883,7 +900,7 @@ jobs:
883900
printf '%s\n' "$output"
884901
return 0
885902
fi
886-
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"Sorry. Your account was suspended"* ]]; then
903+
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"HTTP 429"* || "$output" == *"abuse detection"* || "$output" == *"Sorry. Your account was suspended"* || "$output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
887904
echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
888905
sleep $((attempt * 10))
889906
continue
@@ -911,6 +928,11 @@ jobs:
911928
set -e
912929
printf '%s\n' "$dispatch_output"
913930
931+
if [[ "$dispatch_status" -ne 0 && ! "$dispatch_output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
932+
echo "::error::npm-telegram-beta-e2e.yml dispatch failed with non-ambiguous status ${dispatch_status}; refusing adoption polling." >&2
933+
exit "$dispatch_status"
934+
fi
935+
914936
run_id=""
915937
for _ in $(seq 1 60); do
916938
if matches_json="$(
@@ -1026,7 +1048,7 @@ jobs:
10261048
printf '%s\n' "$output"
10271049
return 0
10281050
fi
1029-
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"Sorry. Your account was suspended"* ]]; then
1051+
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"HTTP 429"* || "$output" == *"abuse detection"* || "$output" == *"Sorry. Your account was suspended"* || "$output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
10301052
echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
10311053
sleep $((attempt * 10))
10321054
continue
@@ -1067,6 +1089,11 @@ jobs:
10671089
set -e
10681090
printf '%s\n' "$dispatch_output"
10691091
1092+
if [[ "$dispatch_status" -ne 0 && ! "$dispatch_output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
1093+
echo "::error::openclaw-performance.yml dispatch failed with non-ambiguous status ${dispatch_status}; refusing adoption polling." >&2
1094+
exit "$dispatch_status"
1095+
fi
1096+
10701097
run_id=""
10711098
for _ in $(seq 1 60); do
10721099
if matches_json="$(
@@ -1181,7 +1208,7 @@ jobs:
11811208
printf '%s\n' "$output"
11821209
return 0
11831210
fi
1184-
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"Sorry. Your account was suspended"* ]]; then
1211+
if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* || "$output" == *"HTTP 429"* || "$output" == *"abuse detection"* || "$output" == *"Sorry. Your account was suspended"* || "$output" =~ $GH_TRANSIENT_SERVER_OR_NETWORK_PATTERN ]]; then
11851212
echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
11861213
sleep $((attempt * 10))
11871214
continue

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Docs: https://docs.openclaw.ai
2626
- **Google Chat request deadlines:** bound control calls to 30 seconds while giving media transfers size-aware total budgets and a separate 30-second stalled-body guard, preventing hung Chat API requests without breaking large attachment uploads. (#102227) Thanks @hugenshen.
2727
- **Google Gemini prefixed model IDs:** recognize `google/gemini-*` and `models/gemini-*` when selecting multimodal function-response behavior, preserving the Gemini 2 image fallback without regressing Gemini 3 inline image responses. (#102382) Thanks @LiLan0125.
2828
- **Generated provider model catalogs:** keep MiniMax and NVIDIA catalog rows when they advertise audio or video metadata while projecting runtime model inputs to text/image, preventing configured multimodal primaries from being dropped and falling back. (#97858, #97048) Thanks @ly-wang19 and @zackchiutw.
29+
- **CLI audio transcript files:** treat inferred Whisper and Parakeet text files as authoritative so empty or missing output cannot expose progress/status stdout as user speech. (#87393, #87384) Thanks @kesslerio.
2930
- **Browser actions on Node 24:** keep browser request cancellation bound to the client and response lifetime instead of Node 24.16+'s prematurely aborted body-stream signal, preventing valid POST actions from failing after JSON parsing. Thanks @obviyus and @vincentkoc.
3031
- **SecretRef model credentials:** keep resolved provider secrets behind process-local sentinels through auth storage, stream setup, SDK configuration, and managed local-provider probing, then inject plaintext only at the final network or provider-plugin boundary while retaining exact-value log redaction. (#102008, #102009)
3132
- **Lean local model shell access:** keep `exec` directly visible beside the default structured Tool Search controls so coding-tuned local models can use their shell fallback instead of searching for missing domain tools. (#87587) Thanks @vincentkoc.

0 commit comments

Comments
 (0)