Skip to content

Commit 4834f75

Browse files
authored
Merge branch 'main' into feat/message-pagination-universal
2 parents f7d9d41 + c1b9e36 commit 4834f75

2,020 files changed

Lines changed: 144993 additions & 25911 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/labeler.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,11 @@
378378
- any-glob-to-any-file:
379379
- "extensions/deepinfra/**"
380380
- "docs/providers/deepinfra.md"
381+
"extensions: featherless":
382+
- changed-files:
383+
- any-glob-to-any-file:
384+
- "extensions/featherless/**"
385+
- "docs/providers/featherless.md"
381386
"extensions: gmi":
382387
- changed-files:
383388
- any-glob-to-any-file:
@@ -448,6 +453,11 @@
448453
- changed-files:
449454
- any-glob-to-any-file:
450455
- "extensions/kimi-coding/**"
456+
"extensions: longcat":
457+
- changed-files:
458+
- any-glob-to-any-file:
459+
- "extensions/longcat/**"
460+
- "docs/providers/longcat.md"
451461
"extensions: minimax":
452462
- changed-files:
453463
- any-glob-to-any-file:

.github/workflows/android-release.yml

Lines changed: 469 additions & 0 deletions
Large diffs are not rendered by default.

.github/workflows/ci-check-testbox.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ jobs:
3232
permissions:
3333
contents: read
3434
name: "check"
35-
runs-on: blacksmith-32vcpu-ubuntu-2404
35+
# Pull requests only validate the hydration steps; real Testbox leases arrive via dispatch.
36+
runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04' || 'blacksmith-32vcpu-ubuntu-2404' }}
3637
timeout-minutes: ${{ fromJSON(inputs.timeout_minutes || '120') }}
3738
steps:
39+
# Testbox lifecycle actions require Blacksmith VM metadata; PRs validate our setup steps only.
3840
- name: Begin Testbox
41+
if: github.event_name == 'workflow_dispatch'
3942
uses: useblacksmith/begin-testbox@233448af4bfdc6fca509a7f0974411ac6d8a8043
4043
with:
4144
testbox_id: ${{ inputs.testbox_id }}
@@ -177,6 +180,6 @@ jobs:
177180

178181
- name: Run Testbox
179182
uses: useblacksmith/run-testbox@3f60ff9ceb2c10c3feefa87dc0c6490cffae059d
180-
if: always()
183+
if: github.event_name == 'workflow_dispatch' && always()
181184
env:
182185
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

.github/workflows/ci.yml

Lines changed: 100 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -315,12 +315,6 @@ jobs:
315315
if (runNodeFull) {
316316
checksFastCoreTasks.push(
317317
{ check_name: "checks-fast-bundled-protocol", runtime: "node", task: "bundled-protocol" },
318-
{
319-
check_name: "QA Smoke CI",
320-
runtime: "node",
321-
task: "qa-smoke-ci",
322-
runner: "blacksmith-16vcpu-ubuntu-2404",
323-
},
324318
{ check_name: "checks-fast-bun-launcher", runtime: "bun", task: "bun-launcher" },
325319
);
326320
} else {
@@ -852,7 +846,7 @@ jobs:
852846
contents: read
853847
needs: [preflight]
854848
if: ${{ !cancelled() && always() && needs.preflight.outputs.run_native_i18n == 'true' }}
855-
runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-24.04' }}
849+
runs-on: ${{ github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (github.repository == 'openclaw/openclaw' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
856850
timeout-minutes: 10
857851
steps:
858852
- name: Checkout
@@ -906,31 +900,6 @@ jobs:
906900
pnpm test:bundled
907901
pnpm protocol:check
908902
;;
909-
qa-smoke-ci)
910-
output_dir=".artifacts/qa-e2e/smoke-ci-profile"
911-
package_dir=".artifacts/qa-e2e/smoke-ci-package"
912-
export OPENCLAW_BUILD_PRIVATE_QA=1
913-
export OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
914-
export OPENCLAW_DISABLE_BUNDLED_PLUGINS=0
915-
export OPENCLAW_QA_REDACT_PUBLIC_METADATA=1
916-
export OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS=180000
917-
export NODE_OPTIONS=--max-old-space-size=16384
918-
node scripts/package-openclaw-for-docker.mjs \
919-
--output-dir "$package_dir" \
920-
--output-name openclaw-current.tgz
921-
export OPENCLAW_CURRENT_PACKAGE_TGZ="$PWD/$package_dir/openclaw-current.tgz"
922-
qa_exit_code=0
923-
pnpm openclaw qa run \
924-
--repo-root . \
925-
--qa-profile smoke-ci \
926-
--concurrency 8 \
927-
--output-dir "$output_dir" || qa_exit_code=$?
928-
echo "QA smoke profile evidence: \`${output_dir}\`" >> "$GITHUB_STEP_SUMMARY"
929-
if [ "$qa_exit_code" -ne 0 ]; then
930-
echo "::error title=QA smoke profile failed::smoke-ci exited ${qa_exit_code}; evidence upload will still run"
931-
exit "$qa_exit_code"
932-
fi
933-
;;
934903
contracts-plugins-ci-routing)
935904
pnpm test:contracts:plugins
936905
pnpm test src/commands/status.scan-result.test.ts src/scripts/ci-changed-scope.test.ts test/scripts/changed-lanes.test.ts test/scripts/ci-workflow-guards.test.ts test/scripts/run-vitest.test.ts test/scripts/test-projects.test.ts
@@ -947,15 +916,111 @@ jobs:
947916
;;
948917
esac
949918
919+
qa-smoke-ci-shard:
920+
permissions:
921+
contents: read
922+
name: QA Smoke CI (${{ matrix.name }})
923+
needs: [preflight]
924+
if: needs.preflight.outputs.run_checks_fast == 'true'
925+
runs-on: ${{ github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (github.repository == 'openclaw/openclaw' && 'blacksmith-16vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
926+
timeout-minutes: 60
927+
strategy:
928+
fail-fast: false
929+
max-parallel: 3
930+
matrix:
931+
include:
932+
- name: matrix
933+
slug: matrix
934+
- name: telegram 1/2
935+
slug: telegram-1-of-2
936+
- name: telegram 2/2
937+
slug: telegram-2-of-2
938+
steps:
939+
- *linux_node_checkout_step
940+
- name: Setup Node environment
941+
uses: ./.github/actions/setup-node-env
942+
with:
943+
install-bun: "false"
944+
945+
- name: Run smoke profile shard
946+
env:
947+
SHARD_SLUG: ${{ matrix.slug }}
948+
shell: bash
949+
run: |
950+
set -euo pipefail
951+
output_dir=".artifacts/qa-e2e/smoke-ci-profile-${SHARD_SLUG}"
952+
package_dir=".artifacts/qa-e2e/smoke-ci-package-${SHARD_SLUG}"
953+
export OPENCLAW_BUILD_PRIVATE_QA=1
954+
export OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
955+
export OPENCLAW_DISABLE_BUNDLED_PLUGINS=0
956+
export OPENCLAW_QA_REDACT_PUBLIC_METADATA=1
957+
export OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS=180000
958+
export NODE_OPTIONS=--max-old-space-size=16384
959+
node scripts/package-openclaw-for-docker.mjs \
960+
--output-dir "$package_dir" \
961+
--output-name openclaw-current.tgz
962+
export OPENCLAW_CURRENT_PACKAGE_TGZ="$PWD/$package_dir/openclaw-current.tgz"
963+
SHARD_SCENARIO_IDS_JSON="$(
964+
node --import tsx --input-type=module <<'EOF'
965+
import { createQaSmokeCiMatrix } from "./extensions/qa-lab/src/ci-smoke-plan.ts";
966+
967+
const shard = createQaSmokeCiMatrix().include.find(
968+
(candidate) => candidate.slug === process.env.SHARD_SLUG,
969+
);
970+
if (!shard) {
971+
throw new Error(`unknown QA smoke shard: ${process.env.SHARD_SLUG}`);
972+
}
973+
process.stdout.write(JSON.stringify(shard.scenario_ids));
974+
EOF
975+
)"
976+
export SHARD_SCENARIO_IDS_JSON
977+
mapfile -t scenario_ids < <(
978+
node -e 'for (const id of JSON.parse(process.env.SHARD_SCENARIO_IDS_JSON)) console.log(id)'
979+
)
980+
scenario_args=()
981+
for scenario_id in "${scenario_ids[@]}"; do
982+
scenario_args+=(--scenario "$scenario_id")
983+
done
984+
qa_exit_code=0
985+
pnpm openclaw qa run \
986+
--repo-root . \
987+
--qa-profile smoke-ci \
988+
--concurrency 8 \
989+
--output-dir "$output_dir" \
990+
"${scenario_args[@]}" || qa_exit_code=$?
991+
echo "QA smoke profile evidence: \`${output_dir}\`" >> "$GITHUB_STEP_SUMMARY"
992+
if [ "$qa_exit_code" -ne 0 ]; then
993+
echo "::error title=QA smoke profile failed::smoke-ci shard ${SHARD_SLUG} exited ${qa_exit_code}; evidence upload will still run"
994+
exit "$qa_exit_code"
995+
fi
996+
950997
- name: Upload QA smoke profile evidence
951-
if: always() && matrix.task == 'qa-smoke-ci'
998+
if: always()
952999
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
9531000
with:
954-
name: qa-smoke-profile-${{ github.run_id }}-${{ github.run_attempt }}
955-
path: .artifacts/qa-e2e/smoke-ci-profile/
1001+
name: qa-smoke-profile-${{ matrix.slug }}-${{ github.run_id }}-${{ github.run_attempt }}
1002+
path: .artifacts/qa-e2e/smoke-ci-profile-${{ matrix.slug }}/
9561003
if-no-files-found: warn
9571004
retention-days: 7
9581005

1006+
qa-smoke-ci:
1007+
permissions:
1008+
contents: read
1009+
name: QA Smoke CI
1010+
needs: [preflight, qa-smoke-ci-shard]
1011+
if: always() && needs.preflight.outputs.run_checks_fast == 'true'
1012+
runs-on: ubuntu-24.04
1013+
timeout-minutes: 5
1014+
steps:
1015+
- name: Verify QA smoke shards
1016+
env:
1017+
QA_SMOKE_SHARDS_RESULT: ${{ needs.qa-smoke-ci-shard.result }}
1018+
run: |
1019+
if [ "$QA_SMOKE_SHARDS_RESULT" != "success" ]; then
1020+
echo "QA Smoke CI shards finished with result: $QA_SMOKE_SHARDS_RESULT" >&2
1021+
exit 1
1022+
fi
1023+
9591024
checks-fast-plugin-contracts-shard:
9601025
permissions:
9611026
contents: read

.github/workflows/ios-periphery-comment.yml

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -464,19 +464,31 @@ jobs:
464464
return;
465465
}
466466
467-
if (existing) {
468-
await github.rest.issues.updateComment({
467+
const writeComment = async () => {
468+
if (existing) {
469+
await github.rest.issues.updateComment({
470+
owner,
471+
repo,
472+
comment_id: existing.id,
473+
body,
474+
});
475+
return;
476+
}
477+
478+
await github.rest.issues.createComment({
469479
owner,
470480
repo,
471-
comment_id: existing.id,
481+
issue_number: livePull.data.number,
472482
body,
473483
});
474-
return;
475-
}
484+
};
476485
477-
await github.rest.issues.createComment({
478-
owner,
479-
repo,
480-
issue_number: livePull.data.number,
481-
body,
482-
});
486+
try {
487+
await writeComment();
488+
} catch (error) {
489+
if (error && typeof error === "object" && error.status === 403) {
490+
core.warning(`Skipping Periphery PR comment for #${pr.number}; GitHub token cannot write issue comments for this workflow_run.`);
491+
return;
492+
}
493+
throw error;
494+
}

.github/workflows/openclaw-live-and-e2e-checks-reusable.yml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1727,6 +1727,7 @@ jobs:
17271727
env:
17281728
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
17291729
OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
1730+
ANTHROPIC_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
17301731
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
17311732
ANTHROPIC_API_TOKEN: ${{ secrets.ANTHROPIC_API_TOKEN }}
17321733
ANTHROPIC_API_KEY_OLD: ${{ secrets.ANTHROPIC_API_KEY_OLD }}
@@ -1821,7 +1822,7 @@ jobs:
18211822
}
18221823
18231824
case "${LIVE_MODEL_PROVIDERS}" in
1824-
anthropic) require_any Anthropic ANTHROPIC_API_KEY ANTHROPIC_API_KEY_OLD ANTHROPIC_API_TOKEN ;;
1825+
anthropic) require_any Anthropic ANTHROPIC_OAUTH_TOKEN ANTHROPIC_API_KEY ANTHROPIC_API_KEY_OLD ANTHROPIC_API_TOKEN ;;
18251826
google) require_any Google GEMINI_API_KEY GOOGLE_API_KEY ;;
18261827
minimax) require_any MiniMax MINIMAX_API_KEY ;;
18271828
moonshot) require_any Moonshot MOONSHOT_API_KEY KIMI_API_KEY ;;
@@ -1851,6 +1852,7 @@ jobs:
18511852
env:
18521853
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
18531854
OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
1855+
ANTHROPIC_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
18541856
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
18551857
ANTHROPIC_API_TOKEN: ${{ secrets.ANTHROPIC_API_TOKEN }}
18561858
ANTHROPIC_API_KEY_OLD: ${{ secrets.ANTHROPIC_API_KEY_OLD }}
@@ -1996,7 +1998,7 @@ jobs:
19961998
IFS=',' read -r -a providers <<<"${OPENCLAW_LIVE_PROVIDERS}"
19971999
for provider in "${providers[@]}"; do
19982000
case "$provider" in
1999-
anthropic) require_any Anthropic ANTHROPIC_API_KEY ANTHROPIC_API_KEY_OLD ANTHROPIC_API_TOKEN ;;
2001+
anthropic) require_any Anthropic ANTHROPIC_OAUTH_TOKEN ANTHROPIC_API_KEY ANTHROPIC_API_KEY_OLD ANTHROPIC_API_TOKEN ;;
20002002
google) require_any Google GEMINI_API_KEY GOOGLE_API_KEY ;;
20012003
minimax) require_any MiniMax MINIMAX_API_KEY ;;
20022004
moonshot) require_any Moonshot MOONSHOT_API_KEY KIMI_API_KEY ;;
@@ -2213,6 +2215,7 @@ jobs:
22132215
env:
22142216
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
22152217
OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
2218+
ANTHROPIC_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
22162219
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
22172220
ANTHROPIC_API_TOKEN: ${{ secrets.ANTHROPIC_API_TOKEN }}
22182221
ANTHROPIC_API_KEY_OLD: ${{ secrets.ANTHROPIC_API_KEY_OLD }}
@@ -2316,6 +2319,11 @@ jobs:
23162319
echo "OPENCLAW_TEST_CONSOLE=1" >> "$GITHUB_ENV"
23172320
;;
23182321
live-acp-bind-docker)
2322+
if [[ -n "${OPENCLAW_CLAUDE_CREDENTIALS_JSON:-}" || -n "${CLAUDE_CODE_OAUTH_TOKEN:-}" ]]; then
2323+
echo "OPENCLAW_LIVE_ACP_BIND_CLAUDE_AUTH=subscription" >> "$GITHUB_ENV"
2324+
else
2325+
echo "OPENCLAW_LIVE_ACP_BIND_CLAUDE_AUTH=api-key" >> "$GITHUB_ENV"
2326+
fi
23192327
if [[ -n "${GEMINI_API_KEY:-}" || -n "${GOOGLE_API_KEY:-}" ]]; then
23202328
echo "OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini" >> "$GITHUB_ENV"
23212329
else
@@ -2551,6 +2559,11 @@ jobs:
25512559
echo "OPENCLAW_TEST_CONSOLE=1" >> "$GITHUB_ENV"
25522560
;;
25532561
live-acp-bind-docker)
2562+
if [[ -n "${OPENCLAW_CLAUDE_CREDENTIALS_JSON:-}" || -n "${CLAUDE_CODE_OAUTH_TOKEN:-}" ]]; then
2563+
echo "OPENCLAW_LIVE_ACP_BIND_CLAUDE_AUTH=subscription" >> "$GITHUB_ENV"
2564+
else
2565+
echo "OPENCLAW_LIVE_ACP_BIND_CLAUDE_AUTH=api-key" >> "$GITHUB_ENV"
2566+
fi
25542567
if [[ -n "${GEMINI_API_KEY:-}" || -n "${GOOGLE_API_KEY:-}" ]]; then
25552568
echo "OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini" >> "$GITHUB_ENV"
25562569
else

0 commit comments

Comments
 (0)