chore(i18n): refresh id translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-02 23:42:06 +00:00
parent 04f3d82de0
commit d286ca2eee
8 changed files with 1244 additions and 1365 deletions

View File

@ -1,71 +1,71 @@
---
read_when:
- Anda perlu memahami mengapa sebuah job CI berjalan atau tidak
- Anda sedang menelusuri masalah pada pemeriksaan GitHub Actions yang gagal
- Anda sedang mengoordinasikan eksekusi validasi rilis atau eksekusi ulangnya
- Anda perlu memahami mengapa pekerjaan CI berjalan atau tidak berjalan
- Anda sedang men-debug pemeriksaan GitHub Actions yang gagal
- Anda sedang mengoordinasikan proses validasi rilis atau pengulangannya
- Anda sedang mengubah pengiriman ClawSweeper atau penerusan aktivitas GitHub
summary: Graf pekerjaan CI, gerbang cakupan, payung rilis, dan padanan perintah lokal
title: Alur CI
summary: Graf tugas CI, gerbang cakupan, payung rilis, dan padanan perintah lokal
title: Pipeline CI
x-i18n:
generated_at: "2026-05-02T22:17:55Z"
generated_at: "2026-05-02T23:39:24Z"
model: gpt-5.5
provider: openai
source_hash: a8033b928b26adfa340200ea69fd63d339a6e65c21659b8119a68b23b8b16016
source_hash: 321fe0a061044f75b8e1d03b4d3e76d4f8dd2dae0ebc58831887fc20af953cf1
source_path: ci.md
workflow: 16
---
OpenClaw CI berjalan pada setiap push ke `main` dan setiap pull request. Job `preflight` mengklasifikasikan diff dan menonaktifkan lane yang mahal ketika hanya area yang tidak terkait yang berubah. Run `workflow_dispatch` manual sengaja melewati scoping cerdas dan menyebar ke seluruh grafik untuk kandidat rilis dan validasi luas. Lane Android tetap opsional melalui `include_android`. Cakupan Plugin khusus rilis berada di workflow terpisah [`Prarilis Plugin`](#plugin-prerelease) dan hanya berjalan dari [`Validasi Rilis Penuh`](#full-release-validation) atau dispatch manual eksplisit.
OpenClaw CI berjalan pada setiap push ke `main` dan setiap pull request. Job `preflight` mengklasifikasikan diff dan mematikan lane yang mahal ketika hanya area yang tidak terkait yang berubah. Run `workflow_dispatch` manual secara sengaja melewati scoping cerdas dan menyebarkan seluruh graph untuk kandidat rilis dan validasi luas. Lane Android tetap opt-in melalui `include_android`. Cakupan Plugin khusus rilis berada di workflow [`Plugin Prerelease`](#plugin-prerelease) terpisah dan hanya berjalan dari [`Full Release Validation`](#full-release-validation) atau dispatch manual eksplisit.
## Ringkasan pipeline
## Ikhtisar pipeline
| Job | Tujuan | Kapan berjalan |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| `preflight` | Mendeteksi perubahan khusus docs, scope yang berubah, ekstensi yang berubah, dan membangun manifest CI | Selalu pada push dan PR non-draf |
| `security-scm-fast` | Deteksi kunci privat dan audit workflow melalui `zizmor` | Selalu pada push dan PR non-draf |
| `security-dependency-audit` | Audit lockfile produksi bebas dependensi terhadap advisory npm | Selalu pada push dan PR non-draf |
| `security-fast` | Agregat wajib untuk job keamanan cepat | Selalu pada push dan PR non-draf |
| `check-dependencies` | Pass khusus dependensi Knip produksi ditambah penjaga allowlist file tidak terpakai | Perubahan relevan Node |
| `build-artifacts` | Membangun `dist/`, Control UI, pemeriksaan artefak build, dan artefak downstream yang dapat digunakan ulang | Perubahan relevan Node |
| `checks-fast-core` | Lane kebenaran Linux cepat seperti pemeriksaan bundled/kontrak-plugin/protokol | Perubahan relevan Node |
| `checks-fast-contracts-channels` | Pemeriksaan kontrak kanal yang di-shard dengan hasil pemeriksaan agregat yang stabil | Perubahan relevan Node |
| `checks-node-core-test` | Shard pengujian Node inti, mengecualikan lane kanal, bundled, kontrak, dan ekstensi | Perubahan relevan Node |
| `check` | Ekuivalen gate lokal utama yang di-shard: tipe prod, lint, guard, tipe pengujian, dan smoke ketat | Perubahan relevan Node |
| `check-additional` | Arsitektur, batas, drift snapshot prompt, guard surface ekstensi, batas paket, dan shard gateway-watch | Perubahan relevan Node |
| `build-smoke` | Pengujian smoke CLI yang sudah dibuild dan smoke memori startup | Perubahan relevan Node |
| `checks` | Verifier untuk pengujian kanal artefak build | Perubahan relevan Node |
| `checks-node-compat-node22` | Lane build dan smoke kompatibilitas Node 22 | Dispatch CI manual untuk rilis |
| `check-docs` | Pemformatan docs, lint, dan pemeriksaan tautan rusak | Docs berubah |
| `skills-python` | Ruff + pytest untuk skills yang didukung Python | Perubahan relevan skill Python |
| `checks-windows` | Pengujian proses/path khusus Windows ditambah regresi specifier impor runtime bersama | Perubahan relevan Windows |
| `macos-node` | Lane pengujian TypeScript macOS menggunakan artefak build bersama | Perubahan relevan macOS |
| `macos-swift` | Swift lint, build, dan pengujian untuk aplikasi macOS | Perubahan relevan macOS |
| `android` | Pengujian unit Android untuk kedua flavor ditambah satu build APK debug | Perubahan relevan Android |
| `test-performance-agent` | Optimisasi pengujian lambat Codex harian setelah aktivitas tepercaya | CI utama sukses atau dispatch manual |
| `openclaw-performance` | Laporan performa runtime Kova harian/sesuai permintaan dengan lane mock-provider, deep-profile, dan live GPT 5.4 | Terjadwal dan dispatch manual |
| Job | Tujuan | Kapan berjalan |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| `preflight` | Mendeteksi perubahan khusus docs, scope yang berubah, extension yang berubah, dan membangun manifes CI | Selalu pada push dan PR non-draft |
| `security-scm-fast` | Deteksi kunci privat dan audit workflow melalui `zizmor` | Selalu pada push dan PR non-draft |
| `security-dependency-audit` | Audit lockfile produksi tanpa dependensi terhadap advisory npm | Selalu pada push dan PR non-draft |
| `security-fast` | Agregat wajib untuk job keamanan cepat | Selalu pada push dan PR non-draft |
| `check-dependencies` | Pass khusus dependensi Knip produksi plus guard allowlist file yang tidak digunakan | Perubahan relevan Node |
| `build-artifacts` | Membangun `dist/`, Control UI, pemeriksaan artefak build, dan artefak downstream yang dapat digunakan ulang | Perubahan relevan Node |
| `checks-fast-core` | Lane kebenaran Linux cepat seperti pemeriksaan bundled/kontrak-Plugin/protokol | Perubahan relevan Node |
| `checks-fast-contracts-channels` | Pemeriksaan kontrak channel yang di-shard dengan hasil pemeriksaan agregat yang stabil | Perubahan relevan Node |
| `checks-node-core-test` | Shard pengujian Node inti, mengecualikan lane channel, bundled, kontrak, dan extension | Perubahan relevan Node |
| `check` | Ekuivalen gate lokal utama yang di-shard: tipe prod, lint, guard, tipe pengujian, dan smoke ketat | Perubahan relevan Node |
| `check-additional` | Arsitektur, boundary, drift snapshot prompt, guard permukaan extension, package-boundary, dan shard gateway-watch | Perubahan relevan Node |
| `build-smoke` | Pengujian smoke CLI hasil build dan smoke memori startup | Perubahan relevan Node |
| `checks` | Verifier untuk pengujian channel artefak hasil build | Perubahan relevan Node |
| `checks-node-compat-node22` | Lane build dan smoke kompatibilitas Node 22 | Dispatch CI manual untuk rilis |
| `check-docs` | Format docs, lint, dan pemeriksaan tautan rusak | Docs berubah |
| `skills-python` | Ruff + pytest untuk skills yang didukung Python | Perubahan relevan skill Python |
| `checks-windows` | Pengujian proses/path khusus Windows plus regresi specifier impor runtime bersama | Perubahan relevan Windows |
| `macos-node` | Lane pengujian TypeScript macOS menggunakan artefak hasil build bersama | Perubahan relevan macOS |
| `macos-swift` | Lint, build, dan pengujian Swift untuk aplikasi macOS | Perubahan relevan macOS |
| `android` | Pengujian unit Android untuk kedua flavor plus satu build APK debug | Perubahan relevan Android |
| `test-performance-agent` | Optimisasi pengujian lambat Codex harian setelah aktivitas tepercaya | CI utama berhasil atau dispatch manual |
| `openclaw-performance` | Laporan performa runtime Kova harian/on-demand dengan lane mock-provider, deep-profile, dan live GPT 5.4 | Terjadwal dan dispatch manual |
## Urutan fail-fast
1. `preflight` memutuskan lane mana yang ada sama sekali. Logika `docs-scope` dan `changed-scope` adalah langkah di dalam job ini, bukan job mandiri.
1. `preflight` menentukan lane mana yang ada sama sekali. Logika `docs-scope` dan `changed-scope` adalah langkah di dalam job ini, bukan job mandiri.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs`, dan `skills-python` gagal cepat tanpa menunggu job artefak dan matriks platform yang lebih berat.
3. `build-artifacts` tumpang tindih dengan lane Linux cepat sehingga konsumen downstream dapat mulai segera setelah build bersama siap.
3. `build-artifacts` berjalan tumpang tindih dengan lane Linux cepat sehingga konsumen downstream dapat mulai segera setelah build bersama siap.
4. Lane platform dan runtime yang lebih berat menyebar setelah itu: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift`, dan `android`.
GitHub dapat menandai job yang digantikan sebagai `cancelled` ketika push yang lebih baru masuk ke PR atau ref `main` yang sama. Perlakukan itu sebagai noise CI kecuali run terbaru untuk ref yang sama juga gagal. Pemeriksaan shard agregat menggunakan `!cancelled() && always()` sehingga tetap melaporkan kegagalan shard normal tetapi tidak mengantre setelah seluruh workflow sudah digantikan. Kunci konkurensi CI otomatis diberi versi (`CI-v7-*`) sehingga zombie sisi GitHub di grup antrean lama tidak dapat memblokir run main yang lebih baru tanpa batas. Run suite penuh manual menggunakan `CI-manual-v1-*` dan tidak membatalkan run yang sedang berjalan.
GitHub dapat menandai job yang tergantikan sebagai `cancelled` ketika push yang lebih baru masuk ke PR yang sama atau ref `main`. Perlakukan itu sebagai noise CI kecuali run terbaru untuk ref yang sama juga gagal. Pemeriksaan shard agregat menggunakan `!cancelled() && always()` sehingga tetap melaporkan kegagalan shard normal tetapi tidak antre setelah seluruh workflow sudah tergantikan. Kunci konkurensi CI otomatis diberi versi (`CI-v7-*`) sehingga zombie sisi GitHub di grup antrean lama tidak dapat memblokir run main yang lebih baru tanpa batas. Run full-suite manual menggunakan `CI-manual-v1-*` dan tidak membatalkan run yang sedang berlangsung.
## Scope dan routing
Logika scope berada di `scripts/ci-changed-scope.mjs` dan dicakup oleh pengujian unit di `src/scripts/ci-changed-scope.test.ts`. Dispatch manual melewati deteksi changed-scope dan membuat manifest preflight bertindak seolah-olah setiap area berscope berubah.
Logika scope berada di `scripts/ci-changed-scope.mjs` dan dicakup oleh pengujian unit di `src/scripts/ci-changed-scope.test.ts`. Dispatch manual melewati deteksi changed-scope dan membuat manifes preflight bertindak seolah setiap area berscope berubah.
- **Edit workflow CI** memvalidasi grafik CI Node ditambah linting workflow, tetapi tidak memaksa build native Windows, Android, atau macOS dengan sendirinya; lane platform tersebut tetap berscope ke perubahan sumber platform.
- **Edit khusus routing CI, edit fixture pengujian inti murah tertentu, dan edit helper/test-routing kontrak Plugin yang sempit** menggunakan jalur manifest cepat khusus Node: `preflight`, keamanan, dan satu tugas `checks-fast-core`. Jalur itu melewati artefak build, kompatibilitas Node 22, kontrak kanal, shard inti penuh, shard Plugin bundled, dan matriks guard tambahan ketika perubahan terbatas pada surface routing atau helper yang diuji langsung oleh tugas cepat tersebut.
- **Pemeriksaan Node Windows** berscope ke wrapper proses/path khusus Windows, helper runner npm/pnpm/UI, konfigurasi manajer paket, dan surface workflow CI yang menjalankan lane tersebut; perubahan sumber, Plugin, install-smoke, dan khusus pengujian yang tidak terkait tetap berada di lane Linux Node.
- **Edit workflow CI** memvalidasi graph CI Node plus linting workflow, tetapi tidak memaksa build native Windows, Android, atau macOS dengan sendirinya; lane platform tersebut tetap dibatasi ke perubahan source platform.
- **Edit khusus routing CI, edit fixture pengujian inti murah tertentu, dan edit helper/routing pengujian kontrak Plugin yang sempit** menggunakan jalur manifes cepat khusus Node: `preflight`, keamanan, dan satu tugas `checks-fast-core`. Jalur itu melewati artefak build, kompatibilitas Node 22, kontrak channel, shard inti penuh, shard bundled-Plugin, dan matriks guard tambahan ketika perubahan terbatas pada permukaan routing atau helper yang langsung diuji tugas cepat tersebut.
- **Pemeriksaan Node Windows** dibatasi ke wrapper proses/path khusus Windows, helper runner npm/pnpm/UI, konfigurasi package manager, dan permukaan workflow CI yang menjalankan lane tersebut; perubahan source, Plugin, install-smoke, dan khusus pengujian yang tidak terkait tetap berada di lane Node Linux.
Keluarga pengujian Node paling lambat dipecah atau diseimbangkan agar setiap job tetap kecil tanpa memesan runner secara berlebihan: kontrak kanal berjalan sebagai tiga shard berbobot, lane unit inti kecil dipasangkan, auto-reply berjalan sebagai empat worker seimbang (dengan subtree reply dipecah menjadi shard agent-runner, dispatch, dan commands/state-routing), dan konfigurasi agentic Gateway/Plugin disebar di seluruh job Node agentic khusus sumber yang sudah ada alih-alih menunggu artefak build. Pengujian browser, QA, media, dan Plugin lain-lain yang luas menggunakan konfigurasi Vitest khususnya sendiri, bukan catch-all Plugin bersama. Shard include-pattern mencatat entri waktu menggunakan nama shard CI, sehingga `.artifacts/vitest-shard-timings.json` dapat membedakan seluruh konfigurasi dari shard yang difilter. `check-additional` menjaga pekerjaan kompilasi/canary batas paket tetap bersama dan memisahkan arsitektur topologi runtime dari cakupan gateway watch; shard guard batas menjalankan guard independen kecilnya secara bersamaan di dalam satu job, termasuk `pnpm prompt:snapshots:check` sehingga drift prompt jalur lancar Codex dipasangkan ke PR yang menyebabkannya. Gateway watch, pengujian kanal, dan shard batas dukungan inti berjalan secara bersamaan di dalam `build-artifacts` setelah `dist/` dan `dist-runtime/` sudah dibuild.
Keluarga pengujian Node paling lambat dipecah atau diseimbangkan agar setiap job tetap kecil tanpa memesan runner berlebihan: kontrak channel berjalan sebagai tiga shard berbobot, lane unit inti kecil dipasangkan, auto-reply berjalan sebagai empat worker seimbang (dengan subtree reply dipecah menjadi shard agent-runner, dispatch, dan commands/state-routing), dan konfigurasi agentic Gateway/Plugin disebar ke job Node agentic khusus source yang sudah ada alih-alih menunggu artefak hasil build. Pengujian browser luas, QA, media, dan Plugin lain-lain menggunakan konfigurasi Vitest khususnya, bukan catch-all Plugin bersama. Shard include-pattern mencatat entri timing menggunakan nama shard CI, sehingga `.artifacts/vitest-shard-timings.json` dapat membedakan seluruh konfigurasi dari shard yang difilter. `check-additional` menjaga pekerjaan compile/canary package-boundary tetap bersama dan memisahkan arsitektur topologi runtime dari cakupan gateway watch; shard guard boundary menjalankan guard independen kecilnya secara konkuren di dalam satu job, termasuk `pnpm prompt:snapshots:check` sehingga drift prompt happy-path runtime Codex dipakukan ke PR yang menyebabkannya. Gateway watch, pengujian channel, dan shard support-boundary inti berjalan konkuren di dalam `build-artifacts` setelah `dist/` dan `dist-runtime/` sudah dibangun.
Android CI menjalankan `testPlayDebugUnitTest` dan `testThirdPartyDebugUnitTest`, lalu membuild APK debug Play. Flavor pihak ketiga tidak memiliki source set atau manifest terpisah; lane pengujian unitnya tetap mengompilasi flavor dengan flag BuildConfig SMS/call-log, sambil menghindari job packaging APK debug duplikat pada setiap push yang relevan dengan Android.
CI Android menjalankan `testPlayDebugUnitTest` dan `testThirdPartyDebugUnitTest`, lalu membangun APK debug Play. Flavor pihak ketiga tidak memiliki source set atau manifes terpisah; lane pengujian unitnya tetap mengompilasi flavor dengan flag BuildConfig SMS/call-log, sambil menghindari job packaging APK debug duplikat pada setiap push relevan Android.
Shard `check-dependencies` menjalankan `pnpm deadcode:dependencies` (pass khusus dependensi Knip produksi yang dipin ke versi Knip terbaru, dengan usia rilis minimum pnpm dinonaktifkan untuk instalasi `dlx`) dan `pnpm deadcode:unused-files`, yang membandingkan temuan file tidak terpakai produksi Knip terhadap `scripts/deadcode-unused-files.allowlist.mjs`. Guard file tidak terpakai gagal ketika PR menambahkan file tidak terpakai baru yang belum ditinjau atau meninggalkan entri allowlist usang, sambil mempertahankan surface Plugin dinamis, generated, build, live-test, dan bridge paket yang disengaja yang tidak dapat diselesaikan Knip secara statis.
Shard `check-dependencies` menjalankan `pnpm deadcode:dependencies` (pass khusus dependensi Knip produksi yang dipin ke versi Knip terbaru, dengan usia rilis minimum pnpm dinonaktifkan untuk install `dlx`) dan `pnpm deadcode:unused-files`, yang membandingkan temuan file produksi yang tidak digunakan dari Knip terhadap `scripts/deadcode-unused-files.allowlist.mjs`. Guard file yang tidak digunakan gagal ketika PR menambahkan file tidak digunakan baru yang belum ditinjau atau meninggalkan entri allowlist usang, sambil mempertahankan permukaan Plugin dinamis, generated, build, live-test, dan bridge package yang disengaja yang tidak dapat diselesaikan Knip secara statis.
## Penerusan aktivitas ClawSweeper
@ -74,21 +74,21 @@ Shard `check-dependencies` menjalankan `pnpm deadcode:dependencies` (pass khusus
Workflow ini memiliki empat lane:
- `clawsweeper_item` untuk permintaan tinjauan issue dan pull request yang tepat;
- `clawsweeper_comment` untuk perintah ClawSweeper eksplisit dalam komentar issue;
- `clawsweeper_comment` untuk perintah ClawSweeper eksplisit di komentar issue;
- `clawsweeper_commit_review` untuk permintaan tinjauan tingkat commit pada push `main`;
- `github_activity` untuk aktivitas GitHub umum yang dapat diperiksa agen ClawSweeper.
Lane `github_activity` hanya meneruskan metadata yang dinormalisasi: jenis peristiwa, tindakan, aktor, repositori, nomor item, URL, judul, status, dan kutipan pendek untuk komentar atau tinjauan jika ada. Lane ini sengaja menghindari penerusan seluruh body Webhook. Workflow penerima di `openclaw/clawsweeper` adalah `.github/workflows/github-activity.yml`, yang memposting peristiwa yang dinormalisasi ke hook OpenClaw Gateway untuk agen ClawSweeper.
Lane `github_activity` hanya meneruskan metadata yang dinormalisasi: tipe event, aksi, aktor, repositori, nomor item, URL, judul, status, dan kutipan pendek untuk komentar atau tinjauan ketika ada. Lane ini sengaja menghindari penerusan body webhook penuh. Workflow penerima di `openclaw/clawsweeper` adalah `.github/workflows/github-activity.yml`, yang memposting event yang dinormalisasi ke hook OpenClaw Gateway untuk agen ClawSweeper.
Aktivitas umum adalah observasi, bukan pengiriman secara default. Agen ClawSweeper menerima target Discord di prompt-nya dan hanya boleh memposting ke `#clawsweeper` ketika peristiwa tersebut mengejutkan, dapat ditindaklanjuti, berisiko, atau berguna secara operasional. Pembukaan rutin, edit, churn bot, noise Webhook duplikat, dan lalu lintas tinjauan normal seharusnya menghasilkan `NO_REPLY`.
Aktivitas umum adalah observasi, bukan pengiriman secara default. Agen ClawSweeper menerima target Discord di prompt-nya dan sebaiknya memposting ke `#clawsweeper` hanya ketika event tersebut mengejutkan, dapat ditindaklanjuti, berisiko, atau berguna secara operasional. Pembukaan rutin, edit, churn bot, noise webhook duplikat, dan traffic tinjauan normal sebaiknya menghasilkan `NO_REPLY`.
Perlakukan judul GitHub, komentar, body, teks tinjauan, nama branch, dan pesan commit sebagai data yang tidak tepercaya di seluruh jalur ini. Semua itu adalah input untuk perangkuman dan triage, bukan instruksi untuk workflow atau runtime agen.
Perlakukan judul, komentar, body, teks tinjauan, nama branch, dan pesan commit GitHub sebagai data yang tidak tepercaya di seluruh jalur ini. Semua itu adalah input untuk peringkasan dan triage, bukan instruksi untuk workflow atau runtime agen.
## Dispatch manual
Dispatch CI manual menjalankan grafik job yang sama seperti CI normal, tetapi memaksa setiap lane berscope non-Android aktif: shard Linux Node, shard Plugin terbundel, kontrak channel, kompatibilitas Node 22, `check`, `check-additional`, smoke build, pemeriksaan docs, Python skills, Windows, macOS, dan i18n Control UI. Dispatch CI manual mandiri hanya menjalankan Android dengan `include_android=true`; payung rilis penuh mengaktifkan Android dengan meneruskan `include_android=true`. Pemeriksaan statis prarilis Plugin, shard khusus rilis `agentic-plugins`, sweep batch ekstensi penuh, dan lane Docker prarilis Plugin dikecualikan dari CI. Suite prarilis Docker hanya berjalan ketika `Full Release Validation` mendispatch workflow `Plugin Prerelease` terpisah dengan gate validasi rilis diaktifkan.
Dispatch CI manual menjalankan grafik pekerjaan yang sama seperti CI normal, tetapi memaksa setiap lane berscope non-Android aktif: shard Linux Node, shard plugin bawaan, kontrak channel, kompatibilitas Node 22, `check`, `check-additional`, build smoke, pemeriksaan docs, Python skills, Windows, macOS, dan i18n Control UI. Dispatch CI manual mandiri menjalankan Android saja dengan `include_android=true`; payung rilis penuh mengaktifkan Android dengan meneruskan `include_android=true`. Pemeriksaan statis prarilis plugin, shard khusus rilis `agentic-plugins`, sweep batch ekstensi penuh, dan lane Docker prarilis plugin dikecualikan dari CI. Suite prarilis Docker hanya berjalan ketika `Full Release Validation` men-dispatch workflow `Plugin Prerelease` terpisah dengan gate validasi rilis diaktifkan.
Run manual menggunakan grup konkurensi unik sehingga suite penuh kandidat rilis tidak dibatalkan oleh run push atau PR lain pada ref yang sama. Input opsional `target_ref` memungkinkan pemanggil tepercaya menjalankan grafik itu terhadap branch, tag, atau SHA commit penuh sambil menggunakan file workflow dari ref dispatch yang dipilih.
Run manual menggunakan grup konkurensi unik sehingga suite penuh kandidat rilis tidak dibatalkan oleh run push atau PR lain pada ref yang sama. Input opsional `target_ref` memungkinkan pemanggil tepercaya menjalankan grafik tersebut terhadap branch, tag, atau SHA commit penuh sambil menggunakan file workflow dari ref dispatch yang dipilih.
```bash
gh workflow run ci.yml --ref release/YYYY.M.D
@ -98,38 +98,38 @@ gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
## Runner
| Runner | Job |
| Runner | Pekerjaan |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, job keamanan cepat dan agregat (`security-scm-fast`, `security-dependency-audit`, `security-fast`), pemeriksaan protokol/kontrak/terbundel cepat, pemeriksaan kontrak channel tershard, shard `check` kecuali lint, shard dan agregat `check-additional`, verifier agregat pengujian Node, pemeriksaan docs, Python skills, workflow-sanity, labeler, auto-response; preflight install-smoke juga menggunakan Ubuntu yang dihosting GitHub agar matriks Blacksmith dapat masuk antrean lebih awal |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, shard ekstensi berbobot lebih ringan, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types`, dan `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard pengujian Linux Node, shard pengujian Plugin terbundel, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (cukup sensitif CPU sehingga 8 vCPU lebih mahal daripada penghematan yang diberikannya); build Docker install-smoke (biaya waktu antrean 32-vCPU lebih besar daripada penghematan yang diberikannya) |
| `ubuntu-24.04` | `preflight`, pekerjaan keamanan cepat dan agregat (`security-scm-fast`, `security-dependency-audit`, `security-fast`), pemeriksaan protokol/kontrak/bawaan cepat, pemeriksaan kontrak channel bershard, shard `check` kecuali lint, shard dan agregat `check-additional`, pemverifikasi agregat pengujian Node, pemeriksaan docs, Python skills, workflow-sanity, labeler, auto-response; preflight install-smoke juga menggunakan Ubuntu yang di-host GitHub agar matriks Blacksmith dapat antre lebih awal |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, shard ekstensi berbobot lebih rendah, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types`, dan `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard pengujian Linux Node, shard pengujian plugin bawaan, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (cukup sensitif terhadap CPU sehingga 8 vCPU biayanya lebih besar daripada penghematannya); build Docker install-smoke (biaya waktu antre 32-vCPU lebih besar daripada penghematannya) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` pada `openclaw/openclaw`; fork fallback ke `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` pada `openclaw/openclaw`; fork fallback ke `macos-latest` |
## Padanan Lokal
## Padanan lokal
```bash
pnpm changed:lanes # inspect the local changed-lane classifier for origin/main...HEAD
pnpm check:changed # smart local check gate: changed typecheck/lint/guards by boundary lane
pnpm check # fast local gate: prod tsgo + sharded lint + parallel fast guards
pnpm changed:lanes # periksa pengklasifikasi changed-lane lokal untuk origin/main...HEAD
pnpm check:changed # gate pemeriksaan lokal cerdas: typecheck/lint/guard yang berubah berdasarkan lane batas
pnpm check # gate lokal cepat: prod tsgo + lint bershard + guard cepat paralel
pnpm check:test-types
pnpm check:timed # same gate with per-stage timings
pnpm check:timed # gate yang sama dengan waktu per tahap
pnpm build:strict-smoke
pnpm check:architecture
pnpm test:gateway:watch-regression
pnpm test # vitest tests
pnpm test:changed # cheap smart changed Vitest targets
pnpm test # pengujian vitest
pnpm test:changed # target Vitest changed cerdas yang murah
pnpm test:channels
pnpm test:contracts:channels
pnpm check:docs # docs format + lint + broken links
pnpm build # build dist when CI artifact/build-smoke lanes matter
pnpm ci:timings # summarize the latest origin/main push CI run
pnpm ci:timings:recent # compare recent successful main CI runs
node scripts/ci-run-timings.mjs <run-id> # summarize wall time, queue time, and slowest jobs
node scripts/ci-run-timings.mjs --latest-main # ignore issue/comment noise and choose origin/main push CI
node scripts/ci-run-timings.mjs --recent 10 # compare recent successful main CI runs
pnpm check:docs # format docs + lint + tautan rusak
pnpm build # build dist saat lane artefak CI/build-smoke penting
pnpm ci:timings # ringkas run CI push origin/main terbaru
pnpm ci:timings:recent # bandingkan run CI main berhasil terbaru
node scripts/ci-run-timings.mjs <run-id> # ringkas waktu wall, waktu antre, dan pekerjaan paling lambat
node scripts/ci-run-timings.mjs --latest-main # abaikan noise issue/comment dan pilih CI push origin/main
node scripts/ci-run-timings.mjs --recent 10 # bandingkan run CI main berhasil terbaru
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json
pnpm perf:kova:summary --report .artifacts/kova/reports/mock-provider/report.json --output .artifacts/kova/summary.md
@ -137,7 +137,7 @@ pnpm perf:kova:summary --report .artifacts/kova/reports/mock-provider/report.jso
## Performa OpenClaw
`OpenClaw Performance` adalah workflow performa produk/runtime. Workflow ini berjalan harian di `main` dan dapat didispatch secara manual:
`OpenClaw Performance` adalah workflow performa produk/runtime. Workflow ini berjalan harian pada `main` dan dapat di-dispatch secara manual:
```bash
gh workflow run openclaw-performance.yml --ref main -f profile=diagnostic -f repeat=3
@ -146,28 +146,21 @@ gh workflow run openclaw-performance.yml --ref main -f profile=smoke -f repeat=1
Workflow menginstal OCM dari rilis yang dipin dan Kova dari input `kova_ref` yang dipin, lalu menjalankan tiga lane:
- `mock-provider`: skenario diagnostik Kova terhadap runtime build lokal dengan autentikasi kompatibel OpenAI palsu yang deterministik.
- `mock-provider`: skenario diagnostik Kova terhadap runtime build lokal dengan auth kompatibel OpenAI palsu yang deterministik.
- `mock-deep-profile`: profiling CPU/heap/trace untuk hotspot startup, gateway, dan agent-turn.
- `live-gpt54`: turn agen OpenAI `openai/gpt-5.4` nyata, dilewati ketika `OPENAI_API_KEY` tidak tersedia.
- `live-gpt54`: giliran agen OpenAI `openai/gpt-5.4` nyata, dilewati ketika `OPENAI_API_KEY` tidak tersedia.
Lane mock-provider juga menjalankan probe sumber native OpenClaw setelah pass Kova: timing boot gateway dan memori di seluruh kasus startup default, hook, dan 50-Plugin; loop hello `channel-chat-baseline` mock-OpenAI berulang; dan perintah startup CLI terhadap gateway yang sudah diboot. Ringkasan Markdown probe sumber berada di `source/index.md` dalam bundel laporan, dengan JSON mentah di sebelahnya.
Lane mock-provider juga menjalankan probe sumber native OpenClaw setelah pass Kova: timing boot gateway dan memori di seluruh kasus startup default, hook, dan 50-plugin; loop hello `channel-chat-baseline` mock-OpenAI berulang; dan perintah startup CLI terhadap gateway yang sudah diboot. Ringkasan Markdown probe sumber berada di `source/index.md` dalam bundle laporan, dengan JSON mentah di sebelahnya.
Setiap lane mengunggah artefak GitHub. Ketika `CLAWGRIT_REPORTS_TOKEN` dikonfigurasi, workflow juga mengcommit `report.json`, `report.md`, bundel, `index.md`, dan artefak probe sumber ke `openclaw/clawgrit-reports` di bawah `openclaw-performance/<ref>/<run-id>-<attempt>/<lane>/`. Pointer branch saat ini ditulis sebagai `openclaw-performance/<ref>/latest-<lane>.json`.
Setiap lane mengunggah artefak GitHub. Ketika `CLAWGRIT_REPORTS_TOKEN` dikonfigurasi, workflow juga meng-commit `report.json`, `report.md`, bundle, `index.md`, dan artefak source-probe ke `openclaw/clawgrit-reports` di bawah `openclaw-performance/<ref>/<run-id>-<attempt>/<lane>/`. Pointer branch saat ini ditulis sebagai `openclaw-performance/<ref>/latest-<lane>.json`.
## Validasi Rilis Penuh
`Full Release Validation` adalah workflow payung manual untuk "menjalankan semuanya sebelum rilis." Workflow ini menerima branch, tag, atau SHA commit penuh, mendispatch workflow `CI` manual dengan target tersebut, mendispatch `Plugin Prerelease` untuk bukti khusus rilis Plugin/paket/statis/Docker, dan mendispatch `OpenClaw Release Checks` untuk smoke install, acceptance paket, suite jalur rilis Docker, live/E2E, OpenWebUI, paritas QA Lab, Matrix, dan lane Telegram. Dengan `rerun_group=all` dan `release_profile=full`, workflow ini juga menjalankan `NPM Telegram Beta E2E` terhadap artefak `release-package-under-test` dari pemeriksaan rilis. Setelah penerbitan, teruskan `npm_telegram_package_spec` untuk menjalankan ulang lane paket Telegram yang sama terhadap paket npm yang diterbitkan.
`Full Release Validation` adalah workflow payung manual untuk "jalankan semuanya sebelum rilis." Workflow ini menerima branch, tag, atau SHA commit penuh, men-dispatch workflow `CI` manual dengan target tersebut, men-dispatch `Plugin Prerelease` untuk bukti plugin/package/static/Docker khusus rilis, dan men-dispatch `OpenClaw Release Checks` untuk install smoke, penerimaan package, suite jalur rilis Docker, live/E2E, OpenWebUI, paritas QA Lab, Matrix, dan lane Telegram. Dengan `rerun_group=all` dan `release_profile=full`, workflow ini juga menjalankan `NPM Telegram Beta E2E` terhadap artefak `release-package-under-test` dari pemeriksaan rilis. Setelah publikasi, teruskan `npm_telegram_package_spec` untuk menjalankan ulang lane package Telegram yang sama terhadap package npm yang sudah dipublikasikan.
Lihat [Validasi rilis penuh](/id/reference/full-release-validation) untuk
matriks tahap, nama job workflow persis, perbedaan profil, artefak, dan
handle rerun terfokus.
Lihat [Validasi rilis penuh](/id/reference/full-release-validation) untuk matriks tahap, nama pekerjaan workflow yang tepat, perbedaan profil, artefak, dan handle rerun terfokus.
`OpenClaw Release Publish` adalah workflow rilis mutating manual. Dispatch dari
`release/YYYY.M.D` atau `main` setelah tag rilis ada dan setelah preflight npm
OpenClaw berhasil. Workflow ini memverifikasi `pnpm plugins:sync:check`,
mendispatch `Plugin NPM Release` untuk semua paket Plugin yang dapat dipublikasikan, mendispatch
`Plugin ClawHub Release` untuk SHA rilis yang sama, dan baru kemudian mendispatch
`OpenClaw NPM Release` dengan `preflight_run_id` yang disimpan.
`OpenClaw Release Publish` adalah workflow rilis mutasi manual. Dispatch dari `release/YYYY.M.D` atau `main` setelah tag rilis ada dan setelah preflight npm OpenClaw berhasil. Workflow ini memverifikasi `pnpm plugins:sync:check`, men-dispatch `Plugin NPM Release` untuk semua package plugin yang dapat dipublikasikan, men-dispatch `Plugin ClawHub Release` untuk SHA rilis yang sama, dan baru kemudian men-dispatch `OpenClaw NPM Release` dengan `preflight_run_id` yang tersimpan.
```bash
gh workflow run openclaw-release-publish.yml \
@ -177,41 +170,33 @@ gh workflow run openclaw-release-publish.yml \
-f npm_dist_tag=beta
```
Untuk bukti commit yang dipin pada branch yang bergerak cepat, gunakan helper alih-alih
`gh workflow run ... --ref main -f ref=<sha>`:
Untuk bukti commit yang dipin pada branch yang bergerak cepat, gunakan helper alih-alih `gh workflow run ... --ref main -f ref=<sha>`:
```bash
pnpm ci:full-release --sha <full-sha>
```
Ref dispatch workflow GitHub harus berupa branch atau tag, bukan SHA commit mentah. Helper
mendorong branch sementara `release-ci/<sha>-...` pada SHA target,
mendispatch `Full Release Validation` dari ref yang dipin itu, memverifikasi setiap
workflow anak `headSha` cocok dengan target, dan menghapus branch sementara ketika
run selesai. Verifier payung juga gagal jika ada workflow anak yang berjalan pada
SHA berbeda.
Ref dispatch workflow GitHub harus berupa branch atau tag, bukan SHA commit mentah. Helper mendorong branch sementara `release-ci/<sha>-...` pada SHA target, men-dispatch `Full Release Validation` dari ref yang dipin tersebut, memverifikasi setiap `headSha` workflow anak cocok dengan target, dan menghapus branch sementara ketika run selesai. Pemverifikasi payung juga gagal jika ada workflow anak yang berjalan pada SHA berbeda.
`release_profile` mengontrol cakupan live/provider yang diteruskan ke pemeriksaan rilis. Workflow
rilis manual default ke `stable`; gunakan `full` hanya ketika Anda
sengaja menginginkan matriks advisory provider/media yang luas.
`release_profile` mengontrol keluasan live/provider yang diteruskan ke pemeriksaan rilis. Workflow rilis manual default ke `stable`; gunakan `full` hanya ketika Anda sengaja menginginkan matriks provider/media advisory yang luas.
- `minimum` mempertahankan lane OpenAI/core paling cepat yang kritis untuk rilis.
- `minimum` mempertahankan lane OpenAI/core tercepat yang kritis untuk rilis.
- `stable` menambahkan set provider/backend stabil.
- `full` menjalankan matriks advisory provider/media yang luas.
- `full` menjalankan matriks provider/media advisory yang luas.
Payung mencatat id run anak yang didispatch, dan job final `Verify full validation` memeriksa ulang conclusion run anak saat ini serta menambahkan tabel job terlambat untuk setiap run anak. Jika workflow anak dijalankan ulang dan menjadi hijau, jalankan ulang hanya job verifier induk untuk menyegarkan hasil payung dan ringkasan timing.
Payung mencatat id run anak yang di-dispatch, dan pekerjaan final `Verify full validation` memeriksa ulang kesimpulan run anak saat ini serta menambahkan tabel pekerjaan paling lambat untuk setiap run anak. Jika workflow anak dijalankan ulang dan menjadi hijau, jalankan ulang hanya pekerjaan pemverifikasi induk untuk menyegarkan hasil payung dan ringkasan timing.
Untuk pemulihan, baik `Full Release Validation` maupun `OpenClaw Release Checks` menerima `rerun_group`. Gunakan `all` untuk kandidat rilis, `ci` hanya untuk child CI penuh normal, `plugin-prerelease` hanya untuk child prarilis Plugin, `release-checks` untuk setiap child rilis, atau grup yang lebih sempit: `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live`, atau `npm-telegram` pada umbrella. Ini menjaga rerun release box yang gagal tetap terbatas setelah perbaikan terfokus.
`OpenClaw Release Checks` menggunakan ref workflow tepercaya untuk menyelesaikan ref yang dipilih satu kali menjadi tarball `release-package-under-test`, lalu meneruskan artefak itu ke workflow Docker jalur rilis live/E2E dan shard penerimaan paket. Ini menjaga byte paket tetap konsisten di seluruh release box dan menghindari pemaketan ulang kandidat yang sama dalam beberapa job child.
`OpenClaw Release Checks` menggunakan ref workflow tepercaya untuk me-resolve ref terpilih sekali menjadi tarball `release-package-under-test`, lalu meneruskan artefak itu ke workflow Docker jalur rilis live/E2E dan shard penerimaan paket. Ini menjaga byte paket tetap konsisten di seluruh release box dan menghindari pengemasan ulang kandidat yang sama di beberapa job child.
Run `Full Release Validation` duplikat untuk `ref=main` dan `rerun_group=all`
menggantikan umbrella yang lebih lama. Monitor parent membatalkan workflow child apa pun yang
sudah didispatch saat parent dibatalkan, sehingga validasi main yang lebih baru
tidak tertahan di belakang run release-check usang berdurasi dua jam. Validasi branch/tag rilis
sudah dikirim saat parent dibatalkan, sehingga validasi main yang lebih baru
tidak antre di belakang run release-check basi selama dua jam. Validasi branch/tag rilis
dan grup rerun terfokus tetap memakai `cancel-in-progress: false`.
## Shard Live dan E2E
## Shard live dan E2E
Child live/E2E rilis tetap mempertahankan cakupan native `pnpm test:live` yang luas, tetapi menjalankannya sebagai shard bernama melalui `scripts/test-live-shard.mjs`, bukan satu job serial:
@ -225,61 +210,61 @@ Child live/E2E rilis tetap mempertahankan cakupan native `pnpm test:live` yang l
- `native-live-extensions-openai`
- `native-live-extensions-o-z-other`
- `native-live-extensions-xai`
- shard audio/video media terpisah dan shard musik yang difilter berdasarkan provider
- shard media audio/video terpisah dan shard musik yang difilter berdasarkan provider
Ini mempertahankan cakupan file yang sama sekaligus membuat kegagalan provider live yang lambat lebih mudah dijalankan ulang dan didiagnosis. Nama shard agregat `native-live-extensions-o-z`, `native-live-extensions-media`, dan `native-live-extensions-media-music` tetap valid untuk rerun manual sekali jalan.
Ini mempertahankan cakupan file yang sama sambil membuat kegagalan provider live yang lambat lebih mudah di-rerun dan didiagnosis. Nama shard agregat `native-live-extensions-o-z`, `native-live-extensions-media`, dan `native-live-extensions-media-music` tetap valid untuk rerun manual sekali jalan.
Shard media live native berjalan di `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, yang dibuat oleh workflow `Live Media Runner Image`. Image itu memasang `ffmpeg` dan `ffprobe` terlebih dahulu; job media hanya memverifikasi binary sebelum setup. Pertahankan suite live berbasis Docker pada runner Blacksmith normal — job container bukan tempat yang tepat untuk menjalankan pengujian Docker bertingkat.
Shard media live native berjalan di `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, yang dibuat oleh workflow `Live Media Runner Image`. Image itu sudah memasang `ffmpeg` dan `ffprobe`; job media hanya memverifikasi biner sebelum setup. Pertahankan suite live berbasis Docker pada runner Blacksmith normal — job container bukan tempat yang tepat untuk meluncurkan pengujian Docker bersarang.
Shard model/backend live berbasis Docker menggunakan image bersama terpisah `ghcr.io/openclaw/openclaw-live-test:<sha>` per commit yang dipilih. Workflow rilis live membuat dan mendorong image itu satu kali, lalu shard model live Docker, Gateway yang di-shard berdasarkan provider, backend CLI, bind ACP, dan harness Codex berjalan dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. Shard Docker Gateway membawa batas `timeout` eksplisit tingkat skrip di bawah timeout job workflow sehingga container atau jalur pembersihan yang macet gagal cepat alih-alih menghabiskan seluruh anggaran release-check. Jika shard tersebut membangun ulang target Docker sumber penuh secara independen, run rilis salah konfigurasi dan akan membuang waktu nyata pada build image duplikat.
Shard model/backend live berbasis Docker menggunakan image bersama terpisah `ghcr.io/openclaw/openclaw-live-test:<sha>` per commit terpilih. Workflow rilis live membuat dan push image itu sekali, lalu shard model live Docker, Gateway yang di-shard berdasarkan provider, backend CLI, bind ACP, dan harness Codex berjalan dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. Shard Docker Gateway membawa batas `timeout` tingkat skrip eksplisit di bawah timeout job workflow agar container atau jalur cleanup yang macet gagal cepat alih-alih menghabiskan seluruh anggaran release-check. Jika shard tersebut membangun ulang target Docker sumber penuh secara independen, run rilis salah konfigurasi dan akan membuang waktu dinding untuk build image duplikat.
## Penerimaan Paket
Gunakan `Package Acceptance` ketika pertanyaannya adalah "apakah paket OpenClaw yang dapat dipasang ini berfungsi sebagai produk?" Ini berbeda dari CI normal: CI normal memvalidasi source tree, sementara penerimaan paket memvalidasi satu tarball melalui harness Docker E2E yang sama yang digunakan pengguna setelah install atau update.
Gunakan `Package Acceptance` ketika pertanyaannya adalah "apakah paket OpenClaw yang dapat diinstal ini bekerja sebagai produk?" Ini berbeda dari CI normal: CI normal memvalidasi source tree, sedangkan penerimaan paket memvalidasi satu tarball melalui harness Docker E2E yang sama yang digunakan pengguna setelah install atau update.
### Job
1. `resolve_package` melakukan checkout `workflow_ref`, menyelesaikan satu kandidat paket, menulis `.artifacts/docker-e2e-package/openclaw-current.tgz`, menulis `.artifacts/docker-e2e-package/package-candidate.json`, mengunggah keduanya sebagai artefak `package-under-test`, dan mencetak sumber, ref workflow, ref paket, versi, SHA-256, serta profil dalam ringkasan langkah GitHub.
2. `docker_acceptance` memanggil `openclaw-live-and-e2e-checks-reusable.yml` dengan `ref=workflow_ref` dan `package_artifact_name=package-under-test`. Workflow reusable mengunduh artefak itu, memvalidasi inventaris tarball, menyiapkan image Docker package-digest bila diperlukan, dan menjalankan lane Docker yang dipilih terhadap paket itu, bukan memaketkan checkout workflow. Saat suatu profil memilih beberapa `docker_lanes` bertarget, workflow reusable menyiapkan paket dan image bersama satu kali, lalu menyebarkan lane tersebut sebagai job Docker bertarget paralel dengan artefak unik.
3. `package_telegram` secara opsional memanggil `NPM Telegram Beta E2E`. Ini berjalan ketika `telegram_mode` bukan `none` dan memasang artefak `package-under-test` yang sama ketika Penerimaan Paket menyelesaikan satu paket; dispatch Telegram mandiri masih dapat memasang spec npm yang sudah dipublikasikan.
1. `resolve_package` checkout `workflow_ref`, me-resolve satu kandidat paket, menulis `.artifacts/docker-e2e-package/openclaw-current.tgz`, menulis `.artifacts/docker-e2e-package/package-candidate.json`, mengunggah keduanya sebagai artefak `package-under-test`, dan mencetak sumber, ref workflow, ref paket, versi, SHA-256, dan profil dalam ringkasan langkah GitHub.
2. `docker_acceptance` memanggil `openclaw-live-and-e2e-checks-reusable.yml` dengan `ref=workflow_ref` dan `package_artifact_name=package-under-test`. Workflow reusable mengunduh artefak itu, memvalidasi inventaris tarball, menyiapkan image Docker package-digest bila diperlukan, dan menjalankan lane Docker terpilih terhadap paket itu, bukan mengemas checkout workflow. Ketika sebuah profil memilih beberapa `docker_lanes` bertarget, workflow reusable menyiapkan paket dan image bersama sekali, lalu menyebarkan lane tersebut sebagai job Docker bertarget paralel dengan artefak unik.
3. `package_telegram` secara opsional memanggil `NPM Telegram Beta E2E`. Ini berjalan ketika `telegram_mode` bukan `none` dan menginstal artefak `package-under-test` yang sama ketika Penerimaan Paket me-resolve satu paket; dispatch Telegram mandiri tetap dapat menginstal spec npm yang sudah dipublikasikan.
4. `summary` menggagalkan workflow jika resolusi paket, penerimaan Docker, atau lane Telegram opsional gagal.
### Sumber kandidat
- `source=npm` hanya menerima `openclaw@alpha`, `openclaw@beta`, `openclaw@latest`, atau versi rilis OpenClaw persis seperti `openclaw@2026.4.27-beta.2`. Gunakan ini untuk penerimaan prarilis/stabil yang sudah dipublikasikan.
- `source=ref` memaketkan branch, tag, atau SHA commit penuh `package_ref` tepercaya. Resolver mengambil branch/tag OpenClaw, memverifikasi commit yang dipilih dapat dijangkau dari riwayat branch repositori atau tag rilis, memasang dependensi dalam worktree detached, dan memaketkannya dengan `scripts/package-openclaw-for-docker.mjs`.
- `source=npm` hanya menerima `openclaw@beta`, `openclaw@latest`, atau versi rilis OpenClaw persis seperti `openclaw@2026.4.27-beta.2`. Gunakan ini untuk penerimaan prarilis/stabil yang telah dipublikasikan.
- `source=ref` mengemas branch, tag, atau SHA commit penuh `package_ref` tepercaya. Resolver mengambil branch/tag OpenClaw, memverifikasi commit terpilih dapat dijangkau dari riwayat branch repositori atau tag rilis, memasang dependensi dalam worktree terlepas, dan mengemasnya dengan `scripts/package-openclaw-for-docker.mjs`.
- `source=url` mengunduh `.tgz` HTTPS; `package_sha256` wajib.
- `source=artifact` mengunduh satu `.tgz` dari `artifact_run_id` dan `artifact_name`; `package_sha256` opsional tetapi sebaiknya disediakan untuk artefak yang dibagikan secara eksternal.
Pisahkan `workflow_ref` dan `package_ref`. `workflow_ref` adalah kode workflow/harness tepercaya yang menjalankan pengujian. `package_ref` adalah commit sumber yang dipaketkan ketika `source=ref`. Ini memungkinkan harness pengujian saat ini memvalidasi commit sumber tepercaya yang lebih lama tanpa menjalankan logika workflow lama.
Jaga `workflow_ref` dan `package_ref` tetap terpisah. `workflow_ref` adalah kode workflow/harness tepercaya yang menjalankan pengujian. `package_ref` adalah commit sumber yang dikemas ketika `source=ref`. Ini memungkinkan harness pengujian saat ini memvalidasi commit sumber tepercaya yang lebih lama tanpa menjalankan logika workflow lama.
### Profil suite
- `smoke``npm-onboard-channel-agent`, `gateway-network`, `config-reload`
- `package``npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `published-upgrade-survivor`, `plugins-offline`, `plugin-update`
- `product``package` plus `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui`
- `full`chunk jalur rilis Docker penuh dengan OpenWebUI
- `full`potongan jalur rilis Docker penuh dengan OpenWebUI
- `custom``docker_lanes` persis; wajib ketika `suite_profile=custom`
Profil `package` menggunakan cakupan Plugin offline sehingga validasi paket yang dipublikasikan tidak bergantung pada ketersediaan ClawHub live. Lane Telegram opsional menggunakan kembali artefak `package-under-test` dalam `NPM Telegram Beta E2E`, dengan jalur spec npm yang dipublikasikan tetap dipertahankan untuk dispatch mandiri.
Profil `package` menggunakan cakupan Plugin offline agar validasi paket yang dipublikasikan tidak bergantung pada ketersediaan ClawHub live. Lane Telegram opsional menggunakan ulang artefak `package-under-test` di `NPM Telegram Beta E2E`, dengan jalur spec npm yang dipublikasikan tetap dipertahankan untuk dispatch mandiri.
Untuk kebijakan khusus pengujian update dan Plugin, termasuk perintah lokal,
lane Docker, input Penerimaan Paket, default rilis, dan triase kegagalan,
lihat [Menguji update dan Plugin](/id/help/testing-updates-plugins).
Release checks memanggil Penerimaan Paket dengan `source=artifact`, artefak paket rilis yang disiapkan, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`, `published_upgrade_survivor_baselines=all-since-2026.4.23`, `published_upgrade_survivor_scenarios=reported-issues`, dan `telegram_mode=mock-openai`. Ini menjaga bukti migrasi paket, update, pembersihan dependensi Plugin usang, perbaikan install Plugin yang dikonfigurasi, Plugin offline, plugin-update, dan Telegram pada tarball paket terselesaikan yang sama. Setel `package_acceptance_package_spec` pada Full Release Validation atau OpenClaw Release Checks untuk menjalankan matriks yang sama terhadap paket npm yang sudah dikirim, bukan artefak yang dibuat dari SHA. Release checks lintas-OS tetap mencakup onboarding, installer, dan perilaku platform yang spesifik OS; validasi produk paket/update harus dimulai dengan Penerimaan Paket. Lane Docker `published-upgrade-survivor` memvalidasi satu baseline paket yang dipublikasikan per run. Dalam Penerimaan Paket, tarball `package-under-test` yang diselesaikan selalu menjadi kandidat dan `published_upgrade_survivor_baseline` memilih baseline publikasi fallback, default-nya `openclaw@latest`; perintah rerun lane yang gagal mempertahankan baseline itu. Setel `published_upgrade_survivor_baselines=all-since-2026.4.23` untuk memperluas Full Release CI ke setiap rilis npm stabil dari `2026.4.23` hingga `latest`; `release-history` tetap tersedia untuk sampling manual yang lebih luas dengan anchor pra-tanggal yang lebih lama. Setel `published_upgrade_survivor_scenarios=reported-issues` untuk memperluas baseline yang sama ke fixture berbentuk issue untuk config Feishu, file bootstrap/persona yang dipertahankan, install Plugin OpenClaw yang dikonfigurasi, jalur log tilde, dan root dependensi Plugin legacy yang usang. Workflow `Update Migration` terpisah menggunakan lane Docker `update-migration` dengan `all-since-2026.4.23` dan `plugin-deps-cleanup` ketika pertanyaannya adalah pembersihan update publikasi yang menyeluruh, bukan keluasan Full Release CI normal. Run agregat lokal dapat meneruskan spec paket persis dengan `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, mempertahankan satu lane dengan `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` seperti `openclaw@2026.4.15`, atau menyetel `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` untuk matriks skenario. Lane yang dipublikasikan mengonfigurasi baseline dengan resep perintah `openclaw config set` bawaan, merekam langkah resep di `summary.json`, dan memeriksa `/healthz`, `/readyz`, plus status RPC setelah Gateway mulai. Lane fresh paket dan installer Windows juga memverifikasi bahwa paket yang terpasang dapat mengimpor override browser-control dari jalur Windows absolut mentah. Smoke agent-turn lintas-OS OpenAI default ke `OPENCLAW_CROSS_OS_OPENAI_MODEL` ketika disetel, jika tidak `openai/gpt-5.4`, sehingga bukti install dan Gateway tetap memakai model pengujian GPT-5 sambil menghindari default GPT-4.x.
Release check memanggil Penerimaan Paket dengan `source=artifact`, artefak paket rilis yang sudah disiapkan, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`, `published_upgrade_survivor_baselines=all-since-2026.4.23`, `published_upgrade_survivor_scenarios=reported-issues`, dan `telegram_mode=mock-openai`. Ini menjaga migrasi paket, update, cleanup dependensi Plugin basi, perbaikan install Plugin terkonfigurasi, Plugin offline, update Plugin, dan bukti Telegram pada tarball paket hasil resolusi yang sama. Setel `package_acceptance_package_spec` pada Full Release Validation atau OpenClaw Release Checks untuk menjalankan matriks yang sama terhadap paket npm yang sudah dikirim, bukan artefak yang dibuat dari SHA. Release check lintas OS tetap mencakup onboarding, installer, dan perilaku platform spesifik OS; validasi produk paket/update sebaiknya dimulai dengan Penerimaan Paket. Lane Docker `published-upgrade-survivor` memvalidasi satu baseline paket yang dipublikasikan per run. Dalam Penerimaan Paket, tarball `package-under-test` yang di-resolve selalu menjadi kandidat dan `published_upgrade_survivor_baseline` memilih baseline fallback yang dipublikasikan, dengan default `openclaw@latest`; perintah rerun lane yang gagal mempertahankan baseline itu. Setel `published_upgrade_survivor_baselines=all-since-2026.4.23` untuk memperluas Full Release CI ke setiap rilis npm stabil dari `2026.4.23` hingga `latest`; `release-history` tetap tersedia untuk sampling manual yang lebih luas dengan anchor pra-tanggal yang lebih lama. Setel `published_upgrade_survivor_scenarios=reported-issues` untuk memperluas baseline yang sama ke fixture berbentuk issue untuk config Feishu, file bootstrap/persona yang dipertahankan, install Plugin OpenClaw terkonfigurasi, path log tilde, dan root dependensi Plugin legacy basi. Workflow `Update Migration` terpisah menggunakan lane Docker `update-migration` dengan `all-since-2026.4.23` dan `plugin-deps-cleanup` ketika pertanyaannya adalah cleanup update yang dipublikasikan secara menyeluruh, bukan keluasan Full Release CI normal. Run agregat lokal dapat meneruskan spec paket persis dengan `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, mempertahankan satu lane dengan `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` seperti `openclaw@2026.4.15`, atau menyetel `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` untuk matriks skenario. Lane yang dipublikasikan mengonfigurasi baseline dengan resep perintah `openclaw config set` bawaan, mencatat langkah resep di `summary.json`, dan mem-probe `/healthz`, `/readyz`, plus status RPC setelah Gateway start. Lane fresh paket dan installer Windows juga memverifikasi bahwa paket terinstal dapat mengimpor override browser-control dari path Windows absolut mentah. Smoke agent-turn lintas OS OpenAI default ke `OPENCLAW_CROSS_OS_OPENAI_MODEL` bila disetel, jika tidak `openai/gpt-5.4`, sehingga bukti install dan Gateway tetap memakai model pengujian GPT-5 sambil menghindari default GPT-4.x.
### Jendela kompatibilitas legacy
Penerimaan Paket memiliki jendela kompatibilitas legacy terbatas untuk paket yang sudah dipublikasikan. Paket hingga `2026.4.25`, termasuk `2026.4.25-beta.*`, dapat menggunakan jalur kompatibilitas:
- entri QA privat yang diketahui dalam `dist/postinstall-inventory.json` dapat menunjuk ke file yang dihilangkan dari tarball;
- `doctor-switch` dapat melewati subkasus persistensi `gateway install --wrapper` ketika paket tidak mengekspos flag itu;
- `update-channel-switch` dapat memangkas `pnpm.patchedDependencies` yang hilang dari fixture git palsu turunan tarball dan dapat mencatat `update.channel` tersimpan yang hilang;
- smoke Plugin dapat membaca lokasi catatan install legacy atau menerima persistensi catatan install marketplace yang hilang;
- `plugin-update` dapat mengizinkan migrasi metadata config sambil tetap mewajibkan catatan install dan perilaku tanpa reinstall tetap tidak berubah.
- entri QA privat yang diketahui di `dist/postinstall-inventory.json` boleh menunjuk ke file yang dihilangkan dari tarball;
- `doctor-switch` boleh melewati subkasus persistensi `gateway install --wrapper` ketika paket tidak mengekspos flag itu;
- `update-channel-switch` boleh memangkas `pnpm.patchedDependencies` yang hilang dari fixture git palsu turunan tarball dan boleh mencatat `update.channel` persisten yang hilang;
- smoke Plugin boleh membaca lokasi install-record legacy atau menerima persistensi install-record marketplace yang hilang;
- `plugin-update` boleh mengizinkan migrasi metadata config sambil tetap mewajibkan install record dan perilaku tanpa reinstall tetap tidak berubah.
Paket `2026.4.26` yang dipublikasikan juga dapat memperingatkan untuk file stamp metadata build lokal yang sudah dikirim. Paket yang lebih baru harus memenuhi kontrak modern; kondisi yang sama gagal, bukan memperingatkan atau dilewati.
Paket `2026.4.26` yang dipublikasikan juga boleh memperingatkan untuk file stamp metadata build lokal yang sudah dikirim. Paket yang lebih baru harus memenuhi kontrak modern; kondisi yang sama akan gagal, bukan memperingatkan atau dilewati.
### Contoh
@ -322,110 +307,110 @@ gh workflow run package-acceptance.yml \
-f docker_lanes='install-e2e plugin-update'
```
Saat men-debug proses penerimaan paket yang gagal, mulai dari ringkasan `resolve_package` untuk mengonfirmasi sumber paket, versi, dan SHA-256. Lalu periksa proses turunan `docker_acceptance` dan artefak Docker-nya: `.artifacts/docker-tests/**/summary.json`, `failures.json`, log lane, timing fase, dan perintah jalankan ulang. Utamakan menjalankan ulang profil paket yang gagal atau lane Docker persisnya daripada menjalankan ulang validasi rilis penuh.
Saat men-debug eksekusi penerimaan paket yang gagal, mulai dari ringkasan `resolve_package` untuk mengonfirmasi sumber paket, versi, dan SHA-256. Lalu periksa eksekusi anak `docker_acceptance` dan artefak Docker-nya: `.artifacts/docker-tests/**/summary.json`, `failures.json`, log lane, pengaturan waktu fase, dan perintah eksekusi ulang. Lebih baik jalankan ulang profil paket yang gagal atau lane Docker yang tepat daripada menjalankan ulang validasi rilis penuh.
## Smoke instalasi
Workflow `Install Smoke` yang terpisah menggunakan ulang skrip cakupan yang sama melalui job `preflight` miliknya sendiri. Workflow ini membagi cakupan smoke menjadi `run_fast_install_smoke` dan `run_full_install_smoke`.
Alur kerja `Install Smoke` terpisah menggunakan kembali skrip cakupan yang sama melalui job `preflight` miliknya sendiri. Alur ini membagi cakupan smoke menjadi `run_fast_install_smoke` dan `run_full_install_smoke`.
- **Jalur cepat** berjalan untuk pull request yang menyentuh permukaan Docker/paket, perubahan paket/manifes Plugin bawaan, atau permukaan Plugin SDK core plugin/channel/gateway yang diuji oleh job smoke Docker. Perubahan Plugin bawaan khusus sumber, edit khusus pengujian, dan edit khusus dokumentasi tidak mencadangkan worker Docker. Jalur cepat membangun image Dockerfile root satu kali, memeriksa CLI, menjalankan smoke CLI agents delete shared-workspace, menjalankan e2e container gateway-network, memverifikasi arg build ekstensi bawaan, dan menjalankan profil Docker Plugin bawaan terbatas di bawah batas waktu perintah agregat 240 detik (setiap Docker run skenario dibatasi secara terpisah).
- **Jalur penuh** mempertahankan instalasi paket QR serta cakupan Docker/update installer untuk proses terjadwal malam, dispatch manual, pemeriksaan rilis workflow-call, dan pull request yang benar-benar menyentuh permukaan installer/paket/Docker. Dalam mode penuh, install-smoke menyiapkan atau menggunakan ulang satu image smoke Dockerfile root GHCR target-SHA, lalu menjalankan instalasi paket QR, smoke Dockerfile/gateway root, smoke installer/update, dan E2E Docker Plugin bawaan cepat sebagai job terpisah agar pekerjaan installer tidak menunggu di belakang smoke image root.
- **Jalur cepat** berjalan untuk pull request yang menyentuh permukaan Docker/paket, perubahan paket/manifes Plugin bawaan, atau permukaan Plugin inti/channel/Gateway/Plugin SDK yang diuji oleh job smoke Docker. Perubahan Plugin bawaan yang hanya menyentuh sumber, edit hanya pengujian, dan edit hanya dokumentasi tidak mencadangkan worker Docker. Jalur cepat membangun image Dockerfile root satu kali, memeriksa CLI, menjalankan smoke CLI hapus agen workspace bersama, menjalankan e2e gateway-network kontainer, memverifikasi arg build ekstensi bawaan, dan menjalankan profil Docker Plugin bawaan terbatas dengan batas waktu perintah agregat 240 detik (setiap eksekusi Docker skenario dibatasi secara terpisah).
- **Jalur penuh** mempertahankan instalasi paket QR dan cakupan Docker/update penginstal untuk eksekusi terjadwal malam, dispatch manual, pemeriksaan rilis workflow-call, dan pull request yang benar-benar menyentuh permukaan penginstal/paket/Docker. Dalam mode penuh, install-smoke menyiapkan atau menggunakan kembali satu image smoke Dockerfile root GHCR target-SHA, lalu menjalankan instalasi paket QR, smoke Dockerfile root/Gateway, smoke penginstal/update, dan E2E Docker Plugin bawaan jalur cepat sebagai job terpisah sehingga pekerjaan penginstal tidak menunggu di belakang smoke image root.
Push `main` (termasuk commit merge) tidak memaksa jalur penuh; ketika logika cakupan perubahan akan meminta cakupan penuh pada push, workflow mempertahankan smoke Docker cepat dan menyerahkan smoke instalasi penuh ke validasi malam atau rilis.
Push `main` (termasuk commit merge) tidak memaksa jalur penuh; ketika logika cakupan perubahan akan meminta cakupan penuh pada push, alur kerja mempertahankan smoke Docker cepat dan menyerahkan smoke instalasi penuh ke validasi malam atau rilis.
Smoke image-provider instalasi global Bun yang lambat dikendalikan secara terpisah oleh `run_bun_global_install_smoke`. Smoke ini berjalan pada jadwal malam dan dari workflow pemeriksaan rilis, dan dispatch manual `Install Smoke` dapat ikut menyertakannya, tetapi pull request dan push `main` tidak. Pengujian Docker QR dan installer tetap memiliki Dockerfile berfokus instalasinya sendiri.
Smoke penyedia image instalasi global Bun yang lambat dipagari secara terpisah oleh `run_bun_global_install_smoke`. Ini berjalan pada jadwal malam dan dari alur kerja pemeriksaan rilis, dan dispatch manual `Install Smoke` dapat memilih untuk mengaktifkannya, tetapi pull request dan push `main` tidak. Pengujian Docker QR dan penginstal mempertahankan Dockerfile mereka sendiri yang berfokus pada instalasi.
## Docker E2E lokal
## E2E Docker lokal
`pnpm test:docker:all` melakukan prebuild satu image live-test bersama, mengemas OpenClaw sekali sebagai tarball npm, dan membangun dua image bersama `scripts/e2e/Dockerfile`:
`pnpm test:docker:all` melakukan prabangun satu image live-test bersama, mengemas OpenClaw sekali sebagai tarball npm, dan membangun dua image bersama `scripts/e2e/Dockerfile`:
- runner Node/Git kosong untuk lane installer/update/plugin-dependency;
- runner Node/Git polos untuk lane penginstal/update/dependensi-Plugin;
- image fungsional yang menginstal tarball yang sama ke `/app` untuk lane fungsionalitas normal.
Definisi lane Docker berada di `scripts/lib/docker-e2e-scenarios.mjs`, logika planner berada di `scripts/lib/docker-e2e-plan.mjs`, dan runner hanya mengeksekusi rencana yang dipilih. Scheduler memilih image per lane dengan `OPENCLAW_DOCKER_E2E_BARE_IMAGE` dan `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, lalu menjalankan lane dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`.
Definisi lane Docker berada di `scripts/lib/docker-e2e-scenarios.mjs`, logika perencana berada di `scripts/lib/docker-e2e-plan.mjs`, dan runner hanya mengeksekusi rencana yang dipilih. Scheduler memilih image per lane dengan `OPENCLAW_DOCKER_E2E_BARE_IMAGE` dan `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, lalu menjalankan lane dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`.
### Yang dapat disetel
### Parameter yang dapat disetel
| Variabel | Default | Tujuan |
| -------------------------------------- | ------- | --------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Jumlah slot main-pool untuk lane normal. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Jumlah slot tail-pool yang sensitif provider. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Batas lane live serentak agar provider tidak melakukan throttle. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Batas lane instalasi npm serentak. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Batas lane multi-service serentak. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Jeda antarawal lane untuk menghindari badai create daemon Docker; atur `0` tanpa jeda. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Batas waktu fallback per lane (120 menit); lane live/tail terpilih memakai batas lebih ketat. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` mencetak rencana scheduler tanpa menjalankan lane. |
| `OPENCLAW_DOCKER_ALL_LANES` | unset | Daftar lane persis yang dipisahkan koma; melewati smoke cleanup agar agent dapat mereproduksi satu lane yang gagal. |
| Variabel | Bawaan | Tujuan |
| -------------------------------------- | ------- | --------------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Jumlah slot pool utama untuk lane normal. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Jumlah slot pool akhir yang sensitif terhadap penyedia. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Batas lane live serentak agar penyedia tidak melakukan throttling. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Batas lane instalasi npm serentak. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Batas lane multi-layanan serentak. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Jeda antar-start lane untuk menghindari lonjakan pembuatan daemon Docker; setel `0` untuk tanpa jeda. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Batas waktu fallback per lane (120 menit); lane live/akhir terpilih menggunakan batas lebih ketat. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` mencetak rencana scheduler tanpa menjalankan lane. |
| `OPENCLAW_DOCKER_ALL_LANES` | unset | Daftar lane tepat yang dipisahkan koma; melewati smoke pembersihan agar agen dapat mereproduksi satu lane yang gagal. |
Lane yang lebih berat daripada batas efektifnya masih dapat dimulai dari pool kosong, lalu berjalan sendiri sampai kapasitas dilepas. Preflight agregat lokal memeriksa Docker, menghapus container OpenClaw E2E usang, memancarkan status active-lane, menyimpan timing lane untuk pengurutan paling lama lebih dulu, dan secara default berhenti menjadwalkan lane pooled baru setelah kegagalan pertama.
Lane yang lebih berat dari batas efektifnya tetap dapat mulai dari pool kosong, lalu berjalan sendiri hingga melepas kapasitas. Agregat lokal melakukan preflight Docker, menghapus kontainer OpenClaw E2E usang, memancarkan status lane aktif, mempertahankan pengaturan waktu lane untuk pengurutan yang terlama lebih dulu, dan secara bawaan berhenti menjadwalkan lane pool baru setelah kegagalan pertama.
### Workflow live/E2E yang dapat digunakan ulang
### Alur kerja live/E2E yang dapat digunakan kembali
Workflow live/E2E yang dapat digunakan ulang menanyakan `scripts/test-docker-all.mjs --plan-json` cakupan paket, jenis image, image live, lane, dan kredensial mana yang diperlukan. `scripts/docker-e2e.mjs` lalu mengonversi rencana itu menjadi output dan ringkasan GitHub. Workflow ini mengemas OpenClaw melalui `scripts/package-openclaw-for-docker.mjs`, mengunduh artefak paket dari run saat ini, atau mengunduh artefak paket dari `package_artifact_run_id`; memvalidasi inventaris tarball; membangun dan mendorong image Docker E2E bare/functional GHCR bertag digest paket melalui cache layer Docker Blacksmith saat rencana memerlukan lane yang sudah terinstal paket; dan menggunakan ulang input `docker_e2e_bare_image`/`docker_e2e_functional_image` yang disediakan atau image digest paket yang sudah ada alih-alih membangun ulang. Pull image Docker dicoba ulang dengan batas waktu 180 detik per percobaan yang terbatas agar stream registry/cache yang macet cepat dicoba ulang alih-alih menghabiskan sebagian besar jalur kritis CI.
Alur kerja live/E2E yang dapat digunakan kembali menanyakan `scripts/test-docker-all.mjs --plan-json` cakupan paket, jenis image, image live, lane, dan kredensial mana yang diperlukan. `scripts/docker-e2e.mjs` lalu mengonversi rencana tersebut menjadi output dan ringkasan GitHub. Alur ini mengemas OpenClaw melalui `scripts/package-openclaw-for-docker.mjs`, mengunduh artefak paket dari eksekusi saat ini, atau mengunduh artefak paket dari `package_artifact_run_id`; memvalidasi inventaris tarball; membangun dan mendorong image E2E Docker GHCR bare/fungsional bertag digest paket melalui cache layer Docker Blacksmith saat rencana membutuhkan lane dengan paket terinstal; dan menggunakan kembali input `docker_e2e_bare_image`/`docker_e2e_functional_image` yang disediakan atau image digest paket yang ada alih-alih membangun ulang. Pull image Docker dicoba ulang dengan batas waktu 180 detik per percobaan yang terbatas sehingga stream registry/cache yang tersangkut mencoba ulang dengan cepat alih-alih menghabiskan sebagian besar jalur kritis CI.
### Chunk jalur rilis
Cakupan Docker rilis menjalankan job chunk yang lebih kecil dengan `OPENCLAW_SKIP_DOCKER_BUILD=1` sehingga setiap chunk hanya menarik jenis image yang dibutuhkannya dan mengeksekusi beberapa lane melalui scheduler berbobot yang sama:
Cakupan Docker rilis menjalankan job yang dibagi menjadi chunk lebih kecil dengan `OPENCLAW_SKIP_DOCKER_BUILD=1` sehingga setiap chunk hanya menarik jenis image yang dibutuhkan dan mengeksekusi beberapa lane melalui scheduler berbobot yang sama:
- `OPENCLAW_DOCKER_ALL_PROFILE=release-path`
- `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h`
Chunk Docker rilis saat ini adalah `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, dan `plugins-runtime-install-a` hingga `plugins-runtime-install-h`. `plugins-runtime-core`, `plugins-runtime`, dan `plugins-integrations` tetap menjadi alias agregat Plugin/runtime. Alias lane `install-e2e` tetap menjadi alias jalankan ulang manual agregat untuk kedua lane installer provider.
Chunk Docker rilis saat ini adalah `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, dan `plugins-runtime-install-a` hingga `plugins-runtime-install-h`. `plugins-runtime-core`, `plugins-runtime`, dan `plugins-integrations` tetap menjadi alias agregat Plugin/runtime. Alias lane `install-e2e` tetap menjadi alias eksekusi ulang manual agregat untuk kedua lane penginstal penyedia.
OpenWebUI digabungkan ke dalam `plugins-runtime-services` saat cakupan release-path penuh memintanya, dan mempertahankan chunk mandiri `openwebui` hanya untuk dispatch khusus OpenWebUI. Lane pembaruan bundled-channel mencoba ulang sekali untuk kegagalan jaringan npm sementara.
OpenWebUI digabungkan ke dalam `plugins-runtime-services` ketika cakupan release-path penuh memintanya, dan mempertahankan chunk `openwebui` mandiri hanya untuk dispatch khusus OpenWebUI. Lane update channel bawaan mencoba ulang sekali untuk kegagalan jaringan npm sementara.
Setiap chunk mengunggah `.artifacts/docker-tests/` dengan log lane, timing, `summary.json`, `failures.json`, timing fase, JSON rencana scheduler, tabel slow-lane, dan perintah jalankan ulang per lane. Input workflow `docker_lanes` menjalankan lane terpilih terhadap image yang sudah disiapkan alih-alih job chunk, sehingga debugging lane gagal tetap terbatas pada satu job Docker tertarget dan menyiapkan, mengunduh, atau menggunakan ulang artefak paket untuk run itu; jika lane terpilih adalah lane Docker live, job tertarget membangun image live-test secara lokal untuk jalankan ulang itu. Perintah jalankan ulang GitHub per lane yang dihasilkan menyertakan `package_artifact_run_id`, `package_artifact_name`, dan input image yang disiapkan saat nilai tersebut ada, sehingga lane yang gagal dapat menggunakan ulang paket dan image persis dari run yang gagal.
Setiap chunk mengunggah `.artifacts/docker-tests/` dengan log lane, pengaturan waktu, `summary.json`, `failures.json`, pengaturan waktu fase, JSON rencana scheduler, tabel lane lambat, dan perintah eksekusi ulang per lane. Input alur kerja `docker_lanes` menjalankan lane yang dipilih terhadap image yang telah disiapkan alih-alih job chunk, yang menjaga debugging lane gagal tetap terbatas pada satu job Docker bertarget dan menyiapkan, mengunduh, atau menggunakan kembali artefak paket untuk eksekusi tersebut; jika lane yang dipilih adalah lane Docker live, job bertarget membangun image live-test secara lokal untuk eksekusi ulang tersebut. Perintah eksekusi ulang GitHub per lane yang dihasilkan menyertakan `package_artifact_run_id`, `package_artifact_name`, dan input image yang telah disiapkan saat nilai tersebut ada, sehingga lane yang gagal dapat menggunakan kembali paket dan image yang tepat dari eksekusi yang gagal.
```bash
pnpm test:docker:rerun <run-id> # download Docker artifacts and print combined/per-lane targeted rerun commands
pnpm test:docker:timings <summary> # slow-lane and phase critical-path summaries
```
Workflow live/E2E terjadwal menjalankan suite Docker release-path penuh setiap hari.
Alur kerja live/E2E terjadwal menjalankan suite Docker release-path penuh setiap hari.
## Prarilis Plugin
`Plugin Prerelease` adalah cakupan produk/paket yang lebih mahal, jadi ini adalah workflow terpisah yang di-dispatch oleh `Full Release Validation` atau oleh operator eksplisit. Pull request normal, push `main`, dan dispatch CI manual mandiri tidak menjalankan suite tersebut. Workflow ini menyeimbangkan pengujian Plugin bawaan di delapan worker ekstensi; job shard ekstensi tersebut menjalankan hingga dua grup konfigurasi Plugin sekaligus dengan satu worker Vitest per grup dan heap Node yang lebih besar agar batch Plugin yang berat impor tidak membuat job CI tambahan. Jalur prarilis Docker khusus rilis mengelompokkan lane Docker tertarget dalam grup kecil untuk menghindari pencadangan puluhan runner untuk job berdurasi satu hingga tiga menit.
`Plugin Prerelease` adalah cakupan produk/paket yang lebih mahal, jadi ini adalah alur kerja terpisah yang di-dispatch oleh `Full Release Validation` atau oleh operator eksplisit. Pull request normal, push `main`, dan dispatch CI manual mandiri menonaktifkan suite tersebut. Alur ini menyeimbangkan pengujian Plugin bawaan di delapan worker ekstensi; job shard ekstensi tersebut menjalankan hingga dua grup konfigurasi Plugin sekaligus dengan satu worker Vitest per grup dan heap Node yang lebih besar agar batch Plugin dengan impor berat tidak membuat job CI tambahan. Jalur prarilis Docker khusus rilis mengelompokkan lane Docker bertarget dalam grup kecil untuk menghindari pencadangan puluhan runner untuk job berdurasi satu hingga tiga menit.
## QA Lab
QA Lab memiliki lane CI khusus di luar workflow utama yang dicakup secara cerdas. Paritas agentic berada di bawah harness QA dan rilis yang luas, bukan workflow PR mandiri. Gunakan `Full Release Validation` dengan `rerun_group=qa-parity` saat paritas harus ikut dalam run validasi luas.
QA Lab memiliki lane CI khusus di luar alur kerja bercakupan cerdas utama. Paritas agentic ditempatkan di bawah harness QA dan rilis luas, bukan alur kerja PR mandiri. Gunakan `Full Release Validation` dengan `rerun_group=qa-parity` ketika paritas harus ikut dalam eksekusi validasi luas.
- Workflow `QA-Lab - All Lanes` berjalan setiap malam pada `main` dan pada dispatch manual; workflow ini mem-fan out lane paritas mock, lane Matrix live, serta lane Telegram dan Discord live sebagai job paralel. Job live menggunakan environment `qa-live-shared`, dan Telegram/Discord menggunakan lease Convex.
- Alur kerja `QA-Lab - All Lanes` berjalan setiap malam di `main` dan pada dispatch manual; alur ini menyebarkan lane paritas mock, lane Matrix live, serta lane Telegram dan Discord live sebagai job paralel. Job live menggunakan lingkungan `qa-live-shared`, dan Telegram/Discord menggunakan lease Convex.
Pemeriksaan rilis menjalankan lane transport live Matrix dan Telegram dengan provider mock deterministik dan model mock-qualified (`mock-openai/gpt-5.5` dan `mock-openai/gpt-5.5-alt`) sehingga kontrak channel terisolasi dari latensi model live dan startup provider-plugin normal. Gateway transport live menonaktifkan pencarian memori karena paritas QA mencakup perilaku memori secara terpisah; konektivitas provider dicakup oleh suite model live, provider native, dan provider Docker yang terpisah.
Pemeriksaan rilis menjalankan lane transport live Matrix dan Telegram dengan penyedia mock deterministik dan model yang memenuhi syarat mock (`mock-openai/gpt-5.5` dan `mock-openai/gpt-5.5-alt`) sehingga kontrak channel terisolasi dari latensi model live dan startup Plugin penyedia normal. Gateway transport live menonaktifkan pencarian memori karena paritas QA mencakup perilaku memori secara terpisah; konektivitas penyedia dicakup oleh suite model live, penyedia native, dan penyedia Docker yang terpisah.
Matrix menggunakan `--profile fast` untuk gate terjadwal dan rilis, menambahkan `--fail-fast` hanya ketika CLI yang di-checkout mendukungnya. Default CLI dan input workflow manual tetap `all`; dispatch manual `matrix_profile=all` selalu men-shard cakupan Matrix penuh ke dalam job `transport`, `media`, `e2ee-smoke`, `e2ee-deep`, dan `e2ee-cli`.
Matrix menggunakan `--profile fast` untuk gate terjadwal dan rilis, menambahkan `--fail-fast` hanya ketika CLI yang di-checkout mendukungnya. Bawaan CLI dan input alur kerja manual tetap `all`; dispatch manual `matrix_profile=all` selalu membagi cakupan Matrix penuh menjadi job `transport`, `media`, `e2ee-smoke`, `e2ee-deep`, dan `e2ee-cli`.
`OpenClaw Release Checks` juga menjalankan lane QA Lab yang kritis untuk rilis sebelum persetujuan rilis; gate paritas QA-nya menjalankan paket kandidat dan baseline sebagai job lane paralel, lalu mengunduh kedua artefak ke job laporan kecil untuk perbandingan paritas akhir.
Untuk PR normal, ikuti bukti CI/check yang sesuai cakupan alih-alih memperlakukan paritas sebagai status wajib.
Untuk PR normal, ikuti bukti CI/pemeriksaan bercakupan alih-alih memperlakukan paritas sebagai status wajib.
## CodeQL
Alur kerja `CodeQL` sengaja merupakan pemindai keamanan lintas pertama yang sempit, bukan penyapuan repositori penuh. Penjaga harian, manual, dan pull request non-draf memindai kode alur kerja Actions ditambah permukaan JavaScript/TypeScript berisiko tertinggi dengan kueri keamanan berkeyakinan tinggi yang difilter ke `security-severity` tinggi/kritis.
Workflow `CodeQL` sengaja merupakan pemindai keamanan lintas-pertama yang sempit, bukan penyisiran repositori penuh. Pemindaian penjaga harian, manual, dan pull request non-draf memindai kode workflow Actions plus permukaan JavaScript/TypeScript berisiko tertinggi dengan kueri keamanan berkeyakinan tinggi yang difilter ke `security-severity` tinggi/kritis.
Penjaga pull request tetap ringan: penjaga ini hanya dimulai untuk perubahan di bawah `.github/actions`, `.github/codeql`, `.github/workflows`, `packages`, atau `src`, dan menjalankan matriks keamanan berkeyakinan tinggi yang sama seperti alur kerja terjadwal. CodeQL Android dan macOS tetap berada di luar bawaan PR.
Penjaga pull request tetap ringan: ia hanya dimulai untuk perubahan di bawah `.github/actions`, `.github/codeql`, `.github/workflows`, `packages`, atau `src`, dan menjalankan matriks keamanan berkeyakinan tinggi yang sama seperti workflow terjadwal. CodeQL Android dan macOS tetap berada di luar default PR.
### Kategori keamanan
| Kategori | Permukaan |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-security-high/core-auth-secrets` | Auth, rahasia, sandbox, Cron, dan baseline Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Kontrak implementasi channel inti ditambah runtime Plugin channel, Gateway, Plugin SDK, rahasia, titik sentuh audit |
| `/codeql-security-high/network-ssrf-boundary` | SSRF inti, parsing IP, penjaga jaringan, web-fetch, dan permukaan kebijakan SSRF Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | Server MCP, helper eksekusi proses, pengiriman keluar, dan gerbang eksekusi tool agen |
| `/codeql-security-high/plugin-trust-boundary` | Permukaan kepercayaan instalasi Plugin, loader, manifes, registry, instalasi package-manager, pemuatan sumber, dan kontrak paket Plugin SDK |
| `/codeql-security-high/core-auth-secrets` | Auth, secret, sandbox, cron, dan baseline gateway |
| `/codeql-security-high/channel-runtime-boundary` | Kontrak implementasi kanal inti plus runtime plugin kanal, gateway, Plugin SDK, secret, titik sentuh audit |
| `/codeql-security-high/network-ssrf-boundary` | Permukaan kebijakan SSRF inti, parsing IP, penjaga jaringan, web-fetch, dan SSRF Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | Server MCP, helper eksekusi proses, pengiriman keluar, dan gerbang eksekusi tool agent |
| `/codeql-security-high/plugin-trust-boundary` | Permukaan kepercayaan instalasi Plugin, loader, manifest, registry, instalasi package-manager, source-loading, dan kontrak paket Plugin SDK |
### Shard keamanan khusus platform
- `CodeQL Android Critical Security` — shard keamanan Android terjadwal. Membangun aplikasi Android secara manual untuk CodeQL di runner Blacksmith Linux terkecil yang diterima oleh kewarasan alur kerja. Mengunggah di bawah `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security` — shard keamanan macOS mingguan/manual. Membangun aplikasi macOS secara manual untuk CodeQL di Blacksmith macOS, memfilter hasil build dependensi keluar dari SARIF yang diunggah, dan mengunggah di bawah `/codeql-critical-security/macos`. Dipertahankan di luar bawaan harian karena build macOS mendominasi runtime meskipun bersih.
- `CodeQL Android Critical Security` — shard keamanan Android terjadwal. Membangun aplikasi Android secara manual untuk CodeQL pada runner Blacksmith Linux terkecil yang diterima oleh sanity workflow. Mengunggah di bawah `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security` — shard keamanan macOS mingguan/manual. Membangun aplikasi macOS secara manual untuk CodeQL pada Blacksmith macOS, memfilter hasil build dependensi dari SARIF yang diunggah, dan mengunggah di bawah `/codeql-critical-security/macos`. Dipertahankan di luar default harian karena build macOS mendominasi runtime bahkan saat bersih.
### Kategori Kualitas Kritis
`CodeQL Critical Quality` adalah shard non-keamanan yang sepadan. Ini hanya menjalankan kueri kualitas JavaScript/TypeScript non-keamanan dengan tingkat keparahan error di permukaan bernilai tinggi yang sempit pada runner Blacksmith Linux yang lebih kecil. Penjaga pull request-nya sengaja lebih kecil daripada profil terjadwal: PR non-draf hanya menjalankan shard `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract`, dan `plugin-sdk-reply-runtime` yang sepadan untuk perubahan kode eksekusi perintah/model/tool agen dan dispatch balasan, kode skema/migrasi/IO config, kode auth/rahasia/sandbox/keamanan, channel inti dan runtime Plugin channel terbundel, protokol Gateway/metode-server, runtime memori/perekat SDK, MCP/proses/pengiriman keluar, runtime provider/katalog model, diagnostik sesi/antrean pengiriman, loader Plugin, Plugin SDK/kontrak-paket, atau runtime balasan Plugin SDK. Perubahan config CodeQL dan alur kerja kualitas menjalankan semua dua belas shard kualitas PR.
`CodeQL Critical Quality` adalah shard non-keamanan yang sesuai. Ia hanya menjalankan kueri kualitas JavaScript/TypeScript non-keamanan dengan severity error pada permukaan bernilai tinggi yang sempit di runner Blacksmith Linux yang lebih kecil. Penjaga pull request-nya sengaja lebih kecil daripada profil terjadwal: PR non-draf hanya menjalankan shard `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract`, dan `plugin-sdk-reply-runtime` yang sesuai untuk eksekusi perintah/model/tool agent dan kode dispatch balasan, skema config/migration/kode IO, kode auth/secret/sandbox/keamanan, runtime kanal inti dan plugin kanal bawaan, protokol gateway/server-method, runtime memory/glue SDK, MCP/proses/pengiriman keluar, katalog model/runtime provider, diagnostik sesi/antrean pengiriman, loader plugin, kontrak Plugin SDK/paket, atau perubahan runtime balasan Plugin SDK. Perubahan config CodeQL dan workflow kualitas menjalankan semua dua belas shard kualitas PR.
Dispatch manual menerima:
@ -437,36 +422,36 @@ Profil sempit adalah hook pengajaran/iterasi untuk menjalankan satu shard kualit
| Kategori | Permukaan |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Kode batas keamanan auth, rahasia, sandbox, Cron, dan Gateway |
| `/codeql-critical-quality/config-boundary` | Skema config, migrasi, normalisasi, dan kontrak IO |
| `/codeql-critical-quality/core-auth-secrets` | Kode batas keamanan auth, secret, sandbox, cron, dan gateway |
| `/codeql-critical-quality/config-boundary` | Skema config, migration, normalisasi, dan kontrak IO |
| `/codeql-critical-quality/gateway-runtime-boundary` | Skema protokol Gateway dan kontrak metode server |
| `/codeql-critical-quality/channel-runtime-boundary` | Kontrak implementasi channel inti dan Plugin channel terbundel |
| `/codeql-critical-quality/channel-runtime-boundary` | Kontrak implementasi kanal inti dan plugin kanal bawaan |
| `/codeql-critical-quality/agent-runtime-boundary` | Eksekusi perintah, dispatch model/provider, dispatch dan antrean auto-reply, serta kontrak runtime control-plane ACP |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Server MCP dan bridge tool, helper supervisi proses, serta kontrak pengiriman keluar |
| `/codeql-critical-quality/memory-runtime-boundary` | SDK host memori, fasad runtime memori, alias Plugin SDK memori, perekat aktivasi runtime memori, dan perintah doctor memori |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Server MCP dan jembatan tool, helper supervisi proses, serta kontrak pengiriman keluar |
| `/codeql-critical-quality/memory-runtime-boundary` | SDK host memory, facade runtime memory, alias Plugin SDK memory, glue aktivasi runtime memory, dan perintah doctor memory |
| `/codeql-critical-quality/session-diagnostics-boundary` | Internal antrean balasan, antrean pengiriman sesi, helper binding/pengiriman sesi keluar, permukaan bundle event/log diagnostik, dan kontrak CLI doctor sesi |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch balasan masuk Plugin SDK, helper payload/chunking/runtime balasan, opsi balasan channel, antrean pengiriman, dan helper binding sesi/thread |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisasi katalog model, auth dan discovery provider, pendaftaran runtime provider, bawaan/katalog provider, serta registry web/search/fetch/embedding |
| `/codeql-critical-quality/ui-control-plane` | Bootstrap UI kontrol, persistensi lokal, alur kontrol Gateway, dan kontrak runtime control-plane tugas |
| `/codeql-critical-quality/web-media-runtime-boundary` | Fetch/search web inti, IO media, pemahaman media, image-generation, dan kontrak runtime media-generation |
| `/codeql-critical-quality/plugin-boundary` | Kontrak loader, registry, permukaan publik, dan entrypoint Plugin SDK |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Sumber Plugin SDK sisi paket yang dipublikasikan dan helper kontrak paket Plugin |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch balasan masuk Plugin SDK, helper payload/chunking/runtime balasan, opsi balasan kanal, antrean pengiriman, dan helper binding sesi/thread |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisasi katalog model, auth dan discovery provider, registrasi runtime provider, default/katalog provider, serta registry web/search/fetch/embedding |
| `/codeql-critical-quality/ui-control-plane` | Bootstrap UI kontrol, persistensi lokal, alur kontrol gateway, dan kontrak runtime control-plane tugas |
| `/codeql-critical-quality/web-media-runtime-boundary` | Kontrak runtime fetch/search web inti, IO media, pemahaman media, image-generation, dan media-generation |
| `/codeql-critical-quality/plugin-boundary` | Loader, registry, public-surface, dan kontrak entrypoint Plugin SDK |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Sumber Plugin SDK sisi paket yang dipublikasikan dan helper kontrak paket plugin |
Kualitas tetap terpisah dari keamanan agar temuan kualitas dapat dijadwalkan, diukur, dinonaktifkan, atau diperluas tanpa mengaburkan sinyal keamanan. Ekspansi CodeQL Swift, Python, dan Plugin terbundel harus ditambahkan kembali sebagai pekerjaan lanjutan yang terskop atau di-shard hanya setelah profil sempit memiliki runtime dan sinyal yang stabil.
Kualitas tetap terpisah dari keamanan agar temuan kualitas dapat dijadwalkan, diukur, dinonaktifkan, atau diperluas tanpa mengaburkan sinyal keamanan. Ekspansi CodeQL untuk Swift, Python, dan plugin bawaan harus ditambahkan kembali sebagai pekerjaan lanjutan yang terskop atau tershard hanya setelah profil sempit memiliki runtime dan sinyal yang stabil.
## Alur kerja pemeliharaan
## Workflow pemeliharaan
### Docs Agent
Alur kerja `Docs Agent` adalah lane pemeliharaan Codex berbasis event untuk menjaga dokumen yang ada tetap selaras dengan perubahan yang baru saja mendarat. Ini tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, dan dispatch manual dapat menjalankannya secara langsung. Pemanggilan workflow-run melewati saat `main` sudah bergerak maju atau saat run Docs Agent non-dilewati lain dibuat dalam satu jam terakhir. Saat berjalan, ini meninjau rentang commit dari SHA sumber Docs Agent non-dilewati sebelumnya hingga `main` saat ini, sehingga satu run per jam dapat mencakup semua perubahan main yang terkumpul sejak pass dokumen terakhir.
Workflow `Docs Agent` adalah jalur pemeliharaan Codex berbasis event untuk menjaga docs yang ada tetap selaras dengan perubahan yang baru saja mendarat. Ia tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, dan dispatch manual dapat menjalankannya langsung. Invokasi workflow-run dilewati ketika `main` sudah bergerak maju atau ketika run Docs Agent non-skipped lain dibuat dalam satu jam terakhir. Saat berjalan, ia meninjau rentang commit dari SHA sumber Docs Agent non-skipped sebelumnya ke `main` saat ini, sehingga satu run per jam dapat mencakup semua perubahan main yang terakumulasi sejak pemeriksaan docs terakhir.
### Test Performance Agent
Alur kerja `Test Performance Agent` adalah lane pemeliharaan Codex berbasis event untuk tes lambat. Ini tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, tetapi dilewati jika pemanggilan workflow-run lain sudah berjalan atau sedang berjalan pada hari UTC tersebut. Dispatch manual melewati gerbang aktivitas harian itu. Lane ini membangun laporan performa Vitest yang dikelompokkan untuk full-suite, membiarkan Codex hanya membuat perbaikan performa tes kecil yang mempertahankan cakupan alih-alih refactor luas, lalu menjalankan ulang laporan full-suite dan menolak perubahan yang mengurangi jumlah baseline tes yang lulus. Jika baseline memiliki tes yang gagal, Codex hanya boleh memperbaiki kegagalan yang jelas dan laporan full-suite pasca-agen harus lulus sebelum apa pun di-commit. Saat `main` maju sebelum push bot mendarat, lane ini me-rebase patch yang telah divalidasi, menjalankan ulang `pnpm check:changed`, dan mencoba ulang push; patch kedaluwarsa yang konflik dilewati. Ini menggunakan Ubuntu yang di-host GitHub agar action Codex dapat mempertahankan postur keamanan drop-sudo yang sama seperti agen dokumen.
Workflow `Test Performance Agent` adalah jalur pemeliharaan Codex berbasis event untuk test lambat. Ia tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, tetapi ia melewati jika invokasi workflow-run lain sudah berjalan atau sedang berjalan pada hari UTC tersebut. Dispatch manual melewati gerbang aktivitas harian itu. Jalur ini membangun laporan performa Vitest full-suite yang dikelompokkan, memungkinkan Codex hanya membuat perbaikan performa test kecil yang mempertahankan coverage, bukan refactor luas, lalu menjalankan ulang laporan full-suite dan menolak perubahan yang mengurangi jumlah test baseline yang lulus. Jika baseline memiliki test yang gagal, Codex hanya boleh memperbaiki kegagalan yang jelas dan laporan full-suite setelah agent harus lulus sebelum apa pun di-commit. Saat `main` maju sebelum push bot mendarat, jalur ini melakukan rebase patch yang telah divalidasi, menjalankan ulang `pnpm check:changed`, dan mencoba ulang push; patch basi yang konflik dilewati. Ia menggunakan Ubuntu yang di-host GitHub agar action Codex dapat mempertahankan postur keselamatan drop-sudo yang sama seperti agent docs.
### PR Duplikat Setelah Merge
Alur kerja `Duplicate PRs After Merge` adalah alur kerja maintainer manual untuk pembersihan duplikat pasca-land. Bawaannya adalah dry-run dan hanya menutup PR yang tercantum secara eksplisit saat `apply=true`. Sebelum mengubah GitHub, ini memverifikasi bahwa PR yang mendarat sudah di-merge dan bahwa setiap duplikat memiliki issue rujukan bersama atau hunk perubahan yang tumpang tindih.
Workflow `Duplicate PRs After Merge` adalah workflow maintainer manual untuk pembersihan duplikat pasca-land. Default-nya dry-run dan hanya menutup PR yang dicantumkan eksplisit ketika `apply=true`. Sebelum mengubah GitHub, ia memverifikasi bahwa PR yang mendarat sudah merged dan bahwa setiap duplikat memiliki issue rujukan bersama atau hunk perubahan yang tumpang tindih.
```bash
gh workflow run duplicate-after-merge.yml \
@ -475,29 +460,29 @@ gh workflow run duplicate-after-merge.yml \
-f apply=true
```
## Gerbang pemeriksaan lokal dan routing perubahan
## Gerbang check lokal dan routing perubahan
Logika changed-lane lokal berada di `scripts/changed-lanes.mjs` dan dieksekusi oleh `scripts/check-changed.mjs`. Gerbang pemeriksaan lokal itu lebih ketat tentang batas arsitektur daripada cakupan platform CI yang luas:
Logika changed-lane lokal berada di `scripts/changed-lanes.mjs` dan dieksekusi oleh `scripts/check-changed.mjs`. Gerbang check lokal itu lebih ketat terhadap batas arsitektur daripada cakupan platform CI yang luas:
- perubahan produksi inti menjalankan typecheck prod inti dan tes inti ditambah lint/penjaga inti;
- perubahan khusus tes inti hanya menjalankan typecheck tes inti ditambah lint inti;
- perubahan produksi ekstensi menjalankan typecheck prod ekstensi dan tes ekstensi ditambah lint ekstensi;
- perubahan khusus tes ekstensi menjalankan typecheck tes ekstensi ditambah lint ekstensi;
- perubahan Plugin SDK publik atau kontrak Plugin meluas ke typecheck ekstensi karena ekstensi bergantung pada kontrak inti tersebut (penyapuan ekstensi Vitest tetap merupakan pekerjaan tes eksplisit);
- bump versi khusus metadata rilis menjalankan pemeriksaan versi/config/dependensi-root tertarget;
- perubahan root/config yang tidak diketahui fail safe ke semua lane pemeriksaan.
- perubahan produksi inti menjalankan typecheck prod inti dan test inti plus lint/guard inti;
- perubahan khusus test inti hanya menjalankan typecheck test inti plus lint inti;
- perubahan produksi ekstensi menjalankan typecheck prod ekstensi dan test ekstensi plus lint ekstensi;
- perubahan khusus test ekstensi menjalankan typecheck test ekstensi plus lint ekstensi;
- perubahan Plugin SDK publik atau kontrak plugin meluas ke typecheck ekstensi karena ekstensi bergantung pada kontrak inti tersebut (penyisiran ekstensi Vitest tetap pekerjaan test eksplisit);
- bump versi khusus metadata rilis menjalankan check versi/config/dependensi-root yang ditargetkan;
- perubahan root/config yang tidak diketahui gagal secara aman ke semua jalur check.
Routing changed-test lokal berada di `scripts/test-projects.test-support.mjs` dan sengaja lebih murah daripada `check:changed`: edit tes langsung menjalankan dirinya sendiri, edit sumber memprioritaskan pemetaan eksplisit, lalu tes saudara dan dependen grafik impor. Config pengiriman group-room bersama adalah salah satu pemetaan eksplisit: perubahan pada config visible-reply grup, mode pengiriman balasan sumber, atau prompt sistem message-tool dirutekan melalui tes balasan inti ditambah regresi pengiriman Discord dan Slack agar perubahan bawaan bersama gagal sebelum push PR pertama. Gunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` hanya saat perubahan cukup luas pada harness sehingga set terpetakan murah bukan proxy yang dapat dipercaya.
Routing changed-test lokal berada di `scripts/test-projects.test-support.mjs` dan sengaja lebih murah daripada `check:changed`: edit test langsung menjalankan dirinya sendiri, edit sumber memilih mapping eksplisit, lalu test saudara dan dependen import-graph. Config pengiriman group-room bersama adalah salah satu mapping eksplisit: perubahan pada config balasan terlihat grup, mode pengiriman balasan sumber, atau prompt sistem message-tool diarahkan melalui test balasan inti plus regresi pengiriman Discord dan Slack sehingga perubahan default bersama gagal sebelum push PR pertama. Gunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` hanya ketika perubahan cukup luas pada harness sehingga set murah yang dipetakan bukan proxy tepercaya.
## Validasi Testbox
Jalankan Testbox dari root repo dan utamakan box baru yang sudah dihangatkan untuk pembuktian luas. Sebelum memakai gate lambat pada box yang digunakan ulang, kedaluwarsa, atau baru saja melaporkan sinkronisasi yang sangat besar secara tidak terduga, jalankan `pnpm testbox:sanity` di dalam box terlebih dahulu.
Jalankan Testbox dari root repo dan lebih utamakan box baru yang sudah dipanaskan untuk pembuktian luas. Sebelum memakai gate lambat pada box yang digunakan ulang, kedaluwarsa, atau baru saja melaporkan sinkronisasi yang besar secara tak terduga, jalankan `pnpm testbox:sanity` di dalam box terlebih dahulu.
Pemeriksaan sanity gagal cepat ketika file root yang diperlukan seperti `pnpm-lock.yaml` hilang atau ketika `git status --short` menampilkan setidaknya 200 penghapusan terlacak. Itu biasanya berarti status sinkronisasi jarak jauh bukan salinan PR yang dapat dipercaya; hentikan box tersebut dan hangatkan yang baru alih-alih men-debug kegagalan pengujian produk. Untuk PR penghapusan besar yang disengaja, atur `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` untuk proses sanity tersebut.
Pemeriksaan sanity gagal cepat saat file root wajib seperti `pnpm-lock.yaml` menghilang atau saat `git status --short` menunjukkan setidaknya 200 penghapusan terlacak. Itu biasanya berarti status sinkronisasi jarak jauh bukan salinan PR yang tepercaya; hentikan box tersebut dan panaskan yang baru alih-alih men-debug kegagalan uji produk. Untuk PR dengan penghapusan besar yang disengaja, setel `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` untuk proses sanity tersebut.
`pnpm testbox:run` juga menghentikan pemanggilan CLI Blacksmith lokal yang tetap berada dalam fase sinkronisasi selama lebih dari lima menit tanpa output pascasinkronisasi. Atur `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` untuk menonaktifkan pelindung tersebut, atau gunakan nilai milidetik yang lebih besar untuk diff lokal yang luar biasa besar.
`pnpm testbox:run` juga menghentikan pemanggilan Blacksmith CLI lokal yang tetap berada dalam fase sinkronisasi selama lebih dari lima menit tanpa keluaran pascasinkronisasi. Setel `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` untuk menonaktifkan guard tersebut, atau gunakan nilai milidetik yang lebih besar untuk diff lokal yang sangat besar.
Crabbox adalah jalur remote-box kedua milik repo untuk pembuktian Linux ketika Blacksmith tidak tersedia atau ketika kapasitas cloud milik sendiri lebih disukai. Hangatkan box, hidrasi melalui alur kerja proyek, lalu jalankan perintah melalui CLI Crabbox:
Crabbox adalah jalur remote-box kedua milik repo untuk pembuktian Linux saat Blacksmith tidak tersedia atau saat kapasitas cloud milik sendiri lebih disukai. Panaskan sebuah box, hidrasi melalui workflow proyek, lalu jalankan perintah melalui Crabbox CLI:
```bash
pnpm crabbox:warmup -- --idle-timeout 90m
@ -506,9 +491,9 @@ pnpm crabbox:run -- --id <cbx_id> --shell "OPENCLAW_TESTBOX=1 pnpm check:changed
pnpm crabbox:stop -- <cbx_id>
```
`.crabbox.yaml` mengelola default provider, sinkronisasi, dan hidrasi GitHub Actions. File ini mengecualikan `.git` lokal sehingga checkout Actions yang dihidrasi mempertahankan metadata Git jarak jauhnya sendiri alih-alih menyinkronkan remote dan penyimpanan objek lokal milik maintainer, serta mengecualikan artefak runtime/build lokal yang tidak boleh pernah ditransfer. `.github/workflows/crabbox-hydrate.yml` mengelola checkout, penyiapan Node/pnpm, pengambilan `origin/main`, dan serah-terima lingkungan non-rahasia yang kemudian dijadikan sumber oleh perintah `crabbox run --id <cbx_id>`.
`.crabbox.yaml` memiliki default provider, sinkronisasi, dan hidrasi GitHub Actions. File tersebut mengecualikan `.git` lokal sehingga checkout Actions yang terhidrasi mempertahankan metadata Git jarak jauhnya sendiri alih-alih menyinkronkan remote dan object store lokal milik maintainer, serta mengecualikan artefak runtime/build lokal yang tidak boleh pernah ditransfer. `.github/workflows/crabbox-hydrate.yml` memiliki checkout, penyiapan Node/pnpm, pengambilan `origin/main`, dan handoff lingkungan non-rahasia yang kemudian di-source oleh perintah `crabbox run --id <cbx_id>`.
## Terkait
- [Ikhtisar instalasi](/id/install)
- [Kanal pengembangan](/id/install/development-channels)
- [Channel pengembangan](/id/install/development-channels)

View File

@ -2,152 +2,152 @@
read_when:
- Mengedit teks prompt sistem, daftar alat, atau bagian waktu/Heartbeat
- Mengubah perilaku bootstrap ruang kerja atau injeksi Skills
summary: Apa isi prompt sistem OpenClaw dan bagaimana prompt tersebut disusun
summary: Apa yang dimuat dalam prompt sistem OpenClaw dan bagaimana prompt tersebut disusun
title: Prompt sistem
x-i18n:
generated_at: "2026-05-02T22:18:24Z"
generated_at: "2026-05-02T23:39:12Z"
model: gpt-5.5
provider: openai
source_hash: 3b8761a8722bb328b937e0832774be7b4e99602ae032c9a255f26843237c110c
source_hash: f8e0234453812c16cf5d273096d335049bf435ca76ade36200caf4bb344624e5
source_path: concepts/system-prompt.md
workflow: 16
---
OpenClaw membuat prompt sistem kustom untuk setiap eksekusi agen. Prompt tersebut **dimiliki OpenClaw** dan tidak menggunakan prompt default pi-coding-agent.
OpenClaw membangun prompt sistem khusus untuk setiap proses agen. Prompt tersebut **dimiliki OpenClaw** dan tidak menggunakan prompt default pi-coding-agent.
Prompt dirangkai oleh OpenClaw dan disuntikkan ke setiap eksekusi agen.
Prompt dirakit oleh OpenClaw dan disuntikkan ke setiap proses agen.
Plugin penyedia dapat menyumbangkan panduan prompt yang sadar cache tanpa mengganti
prompt lengkap milik OpenClaw. Runtime penyedia dapat:
Plugin penyedia dapat menyumbangkan panduan prompt yang sadar-cache tanpa mengganti
seluruh prompt yang dimiliki OpenClaw. Runtime penyedia dapat:
- mengganti sekumpulan kecil bagian inti bernama (`interaction_style`,
`tool_call_style`, `execution_bias`)
- menyuntikkan **prefiks stabil** di atas batas cache prompt
- menyuntikkan **sufiks dinamis** di bawah batas cache prompt
Gunakan kontribusi milik penyedia untuk penyesuaian spesifik keluarga model. Pertahankan mutasi prompt lama
Gunakan kontribusi milik penyedia untuk penyetelan khusus keluarga model. Pertahankan mutasi prompt lama
`before_prompt_build` untuk kompatibilitas atau perubahan prompt yang benar-benar global,
bukan perilaku penyedia normal.
Overlay keluarga OpenAI GPT-5 menjaga aturan eksekusi inti tetap kecil dan menambahkan
panduan spesifik model untuk penguncian persona, keluaran ringkas, disiplin alat,
pencarian paralel, cakupan deliverable, verifikasi, konteks yang kurang, dan
kebersihan alat terminal.
panduan khusus model untuk penguncian persona, keluaran ringkas, disiplin alat,
pencarian paralel, cakupan deliverable, verifikasi, konteks yang hilang, dan
higiene alat terminal.
## Struktur
Prompt sengaja dibuat ringkas dan menggunakan bagian tetap:
- **Peralatan**: pengingat sumber kebenaran alat terstruktur plus panduan penggunaan alat runtime.
- **Bias Eksekusi**: panduan tindak lanjut ringkas: bertindak dalam giliran pada
permintaan yang dapat ditindaklanjuti, teruskan hingga selesai atau terblokir, pulih dari hasil alat yang lemah,
periksa status yang dapat berubah secara langsung, dan verifikasi sebelum finalisasi.
- **Keamanan**: pengingat guardrail singkat untuk menghindari perilaku mencari kekuasaan atau melewati pengawasan.
- **Skills** (jika tersedia): memberi tahu model cara memuat instruksi skill sesuai kebutuhan.
- **Pembaruan Mandiri OpenClaw**: cara memeriksa config dengan aman menggunakan
`config.schema.lookup`, menambal config dengan `config.patch`, mengganti config lengkap
dengan `config.apply`, dan menjalankan `update.run` hanya atas permintaan pengguna yang eksplisit.
- **Tooling**: pengingat sumber kebenaran structured-tool plus panduan penggunaan alat runtime.
- **Execution Bias**: panduan tindak lanjut ringkas: bertindak dalam giliran pada
permintaan yang dapat ditindaklanjuti, lanjutkan sampai selesai atau terblokir, pulih dari hasil alat
yang lemah, periksa status yang dapat berubah secara langsung, dan verifikasi sebelum finalisasi.
- **Safety**: pengingat guardrail singkat untuk menghindari perilaku mencari kekuasaan atau melewati pengawasan.
- **Skills** (saat tersedia): memberi tahu model cara memuat instruksi skill sesuai kebutuhan.
- **OpenClaw Self-Update**: cara memeriksa konfigurasi dengan aman menggunakan
`config.schema.lookup`, menambal konfigurasi dengan `config.patch`, mengganti seluruh
konfigurasi dengan `config.apply`, dan menjalankan `update.run` hanya atas permintaan eksplisit pengguna.
Alat khusus pemilik `gateway` juga menolak menulis ulang
`tools.exec.ask` / `tools.exec.security`, termasuk alias lama `tools.bash.*`
yang dinormalisasi ke jalur exec terlindungi tersebut.
- **Workspace**: direktori kerja (`agents.defaults.workspace`).
- **Dokumentasi**: jalur lokal ke dokumentasi OpenClaw (repo atau paket npm) dan kapan membacanya.
- **File Workspace (disuntikkan)**: menunjukkan file bootstrap disertakan di bawah.
- **Sandbox** (jika diaktifkan): menunjukkan runtime sandbox, jalur sandbox, dan apakah exec dengan elevasi tersedia.
- **Tanggal & Waktu Saat Ini**: waktu lokal pengguna, zona waktu, dan format waktu.
- **Tag Balasan**: sintaks tag balasan opsional untuk penyedia yang didukung.
- **Heartbeat**: prompt Heartbeat dan perilaku ack, saat Heartbeat diaktifkan untuk agen default.
- **Runtime**: host, OS, node, model, root repo (jika terdeteksi), tingkat pemikiran (satu baris).
- **Penalaran**: tingkat visibilitas saat ini + petunjuk toggle /reasoning.
- **Documentation**: jalur lokal ke dokumentasi OpenClaw (repo atau paket npm) dan kapan membacanya.
- **Workspace Files (injected)**: menunjukkan file bootstrap disertakan di bawah.
- **Sandbox** (saat diaktifkan): menunjukkan runtime sandbox, jalur sandbox, dan apakah exec dengan elevasi tersedia.
- **Current Date & Time**: waktu lokal pengguna, zona waktu, dan format waktu.
- **Reply Tags**: sintaks tag balasan opsional untuk penyedia yang didukung.
- **Heartbeats**: prompt heartbeat dan perilaku ack, saat heartbeat diaktifkan untuk agen default.
- **Runtime**: host, OS, node, model, root repo (saat terdeteksi), tingkat berpikir (satu baris).
- **Reasoning**: tingkat visibilitas saat ini + petunjuk toggle /reasoning.
OpenClaw menjaga konten stabil besar, termasuk **Konteks Proyek**, di atas
OpenClaw menjaga konten stabil besar, termasuk **Project Context**, di atas
batas cache prompt internal. Bagian channel/sesi yang volatil seperti
panduan sematan Control UI, **Pesan**, **Suara**, **Konteks Chat Grup**,
**Reaksi**, **Heartbeat**, dan **Runtime** ditambahkan di bawah batas tersebut
panduan embed Control UI, **Messaging**, **Voice**, **Group Chat Context**,
**Reactions**, **Heartbeats**, dan **Runtime** ditambahkan di bawah batas tersebut
agar backend lokal dengan cache prefiks dapat menggunakan kembali prefiks workspace yang stabil
di seluruh giliran channel. Deskripsi alat juga sebaiknya menghindari penyematan nama
di seluruh giliran channel. Deskripsi alat juga harus menghindari penyematan nama
channel saat ini ketika skema yang diterima sudah membawa detail runtime tersebut.
Bagian Peralatan juga menyertakan panduan runtime untuk pekerjaan yang berjalan lama:
Bagian Tooling juga menyertakan panduan runtime untuk pekerjaan jangka panjang:
- gunakan cron untuk tindak lanjut di masa mendatang (`check back later`, pengingat, pekerjaan berulang)
alih-alih loop tidur `exec`, trik penundaan `yieldMs`, atau polling `process`
- gunakan cron untuk tindak lanjut di masa depan (`check back later`, pengingat, pekerjaan berulang)
alih-alih loop sleep `exec`, trik penundaan `yieldMs`, atau polling `process`
berulang
- gunakan `exec` / `process` hanya untuk perintah yang dimulai sekarang dan terus berjalan
di latar belakang
- saat wake penyelesaian otomatis diaktifkan, mulai perintah sekali dan andalkan
jalur wake berbasis push saat mengeluarkan output atau gagal
- saat bangun otomatis saat selesai diaktifkan, mulai perintah sekali dan andalkan
jalur bangun berbasis push saat ia memancarkan output atau gagal
- gunakan `process` untuk log, status, input, atau intervensi saat Anda perlu
memeriksa perintah yang sedang berjalan
- jika tugas lebih besar, lebih baik gunakan `sessions_spawn`; penyelesaian sub-agen
berbasis push dan otomatis mengumumkan kembali ke peminta
- jangan melakukan polling `subagents list` / `sessions_list` dalam loop hanya untuk menunggu
- jika tugas lebih besar, prioritaskan `sessions_spawn`; penyelesaian sub-agen bersifat
berbasis push dan otomatis mengumumkan kembali kepada peminta
- jangan polling `subagents list` / `sessions_list` dalam loop hanya untuk menunggu
penyelesaian
Saat alat eksperimental `update_plan` diaktifkan, Peralatan juga memberi tahu
Saat alat eksperimental `update_plan` diaktifkan, Tooling juga memberi tahu
model untuk menggunakannya hanya untuk pekerjaan multi-langkah yang tidak sepele, menjaga tepat satu
langkah `in_progress`, dan menghindari pengulangan seluruh rencana setelah setiap pembaruan.
Guardrail keamanan dalam prompt sistem bersifat nasihat. Guardrail ini memandu perilaku model tetapi tidak menegakkan kebijakan. Gunakan kebijakan alat, persetujuan exec, sandboxing, dan allowlist channel untuk penegakan keras; operator dapat menonaktifkannya sesuai desain.
Guardrail keamanan dalam prompt sistem bersifat saran. Guardrail tersebut memandu perilaku model tetapi tidak menegakkan kebijakan. Gunakan kebijakan alat, persetujuan exec, sandboxing, dan allowlist channel untuk penegakan keras; operator dapat menonaktifkannya sesuai desain.
Pada channel dengan kartu/tombol persetujuan native, prompt runtime kini memberi tahu
agen untuk mengandalkan UI persetujuan native tersebut terlebih dahulu. Agen sebaiknya hanya menyertakan perintah manual
agen untuk mengandalkan UI persetujuan native tersebut terlebih dahulu. Agen hanya boleh menyertakan perintah manual
`/approve` saat hasil alat mengatakan persetujuan chat tidak tersedia atau
persetujuan manual adalah satu-satunya jalur.
## Mode prompt
OpenClaw dapat merender prompt sistem yang lebih kecil untuk sub-agen. Runtime menetapkan
`promptMode` untuk setiap eksekusi (bukan config yang ditampilkan kepada pengguna):
`promptMode` untuk setiap proses (bukan konfigurasi yang menghadap pengguna):
- `full` (default): menyertakan semua bagian di atas.
- `minimal`: digunakan untuk sub-agen; menghilangkan **Skills**, **Pemanggilan Memori**, **Pembaruan Mandiri OpenClaw**,
**Alias Model**, **Identitas Pengguna**, **Tag Balasan**,
**Pesan**, **Balasan Senyap**, dan **Heartbeat**. Peralatan, **Keamanan**,
Workspace, Sandbox, Tanggal & Waktu Saat Ini (jika diketahui), Runtime, dan konteks yang disuntikkan
tetap tersedia.
- `minimal`: digunakan untuk sub-agen; menghilangkan **Skills**, **Memory Recall**, **OpenClaw
Self-Update**, **Model Aliases**, **User Identity**, **Reply Tags**,
**Messaging**, **Silent Replies**, dan **Heartbeats**. Tooling, **Safety**,
Workspace, Sandbox, Current Date & Time (saat diketahui), Runtime, dan konteks
yang disuntikkan tetap tersedia.
- `none`: hanya mengembalikan baris identitas dasar.
Saat `promptMode=minimal`, prompt tambahan yang disuntikkan diberi label **Konteks Subagen**
alih-alih **Konteks Chat Grup**.
Saat `promptMode=minimal`, prompt tambahan yang disuntikkan diberi label **Subagent
Context**, bukan **Group Chat Context**.
Untuk eksekusi balasan otomatis channel, OpenClaw dapat menghilangkan bagian **Balasan Senyap**
Untuk proses balasan otomatis channel, OpenClaw dapat menghilangkan bagian **Silent Replies**
generik saat konteks chat langsung/grup sudah menyertakan perilaku
`NO_REPLY` spesifik percakapan yang telah di-resolve. Ini menghindari pengulangan mekanika token
di prompt sistem global dan konteks channel sekaligus.
`NO_REPLY` khusus percakapan yang telah diselesaikan. Ini menghindari pengulangan mekanika token
baik di prompt sistem global maupun konteks channel.
## Snapshot prompt
OpenClaw menyimpan snapshot prompt jalur sukses yang sudah dikomit untuk runtime
Codex/alat pesan di bawah `test/fixtures/agents/prompt-snapshots/happy-path/`. Snapshot tersebut merender
parameter thread/giliran app-server terpilih plus stack lapisan prompt terikat model yang direkonstruksi
untuk giliran Telegram langsung, grup Discord, dan Heartbeat. Stack tersebut
menyertakan fixture prompt model Codex `gpt-5.5` yang dipin dan dihasilkan dari bentuk
katalog/cache model Codex, teks developer izin jalur sukses Codex,
instruksi developer OpenClaw, input giliran pengguna, dan referensi ke spesifikasi
alat dinamis.
OpenClaw menyimpan snapshot prompt yang di-commit untuk jalur bahagia runtime Codex di bawah
`test/fixtures/agents/prompt-snapshots/codex-runtime-happy-path/`. Snapshot ini merender
parameter thread/giliran app-server terpilih plus stack lapisan prompt terikat model
yang direkonstruksi untuk giliran langsung Telegram, grup Discord, dan heartbeat. Stack tersebut
mencakup fixture prompt model Codex `gpt-5.5` yang dipin dan dihasilkan dari bentuk
katalog/cache model Codex, teks developer izin jalur bahagia Codex,
instruksi developer OpenClaw, input giliran pengguna, dan referensi ke spesifikasi alat
dinamis.
Refresh fixture prompt model Codex yang dipin dengan
Segarkan fixture prompt model Codex yang dipin dengan
`pnpm prompt:snapshots:sync-codex-model`. Secara default, skrip mencari
cache runtime Codex di `$CODEX_HOME/models_cache.json`, lalu
`~/.codex/models_cache.json`, dan baru kemudian fallback ke konvensi checkout Codex
maintainer di `~/code/codex/codex-rs/models-manager/models.json`. Jika
tidak ada sumber tersebut, perintah keluar tanpa mengubah fixture yang dikomit.
Berikan `--catalog <path>` untuk me-refresh dari file `models_cache.json`
tidak ada sumber tersebut, perintah keluar tanpa mengubah fixture yang di-commit.
Berikan `--catalog <path>` untuk menyegarkan dari file `models_cache.json`
atau `models.json` tertentu.
Snapshot ini masih bukan tangkapan request OpenAI mentah byte demi byte. Codex
Snapshot ini masih bukan tangkapan permintaan OpenAI mentah byte-demi-byte. Codex
dapat menambahkan konteks workspace milik runtime seperti `AGENTS.md`, konteks
environment, memori, instruksi app/plugin, dan instruksi mode kolaborasi masa depan
lingkungan, memori, instruksi app/plugin, dan instruksi mode kolaborasi masa depan
di dalam runtime Codex setelah OpenClaw mengirim parameter thread dan giliran.
Regenerasi dengan `pnpm prompt:snapshots:gen` dan verifikasi drift dengan
`pnpm prompt:snapshots:check`. CI menjalankan pemeriksaan drift di shard
batas tambahan agar perubahan prompt dan pembaruan snapshot tetap melekat pada PR yang sama.
Regenerasikan dengan `pnpm prompt:snapshots:gen` dan verifikasi drift dengan
`pnpm prompt:snapshots:check`. CI menjalankan pemeriksaan drift di shard batas
tambahan agar perubahan prompt dan pembaruan snapshot tetap melekat pada PR yang sama.
## Injeksi bootstrap workspace
## Penyuntikan bootstrap workspace
File bootstrap dipangkas dan ditambahkan di bawah **Konteks Proyek** agar model melihat konteks identitas dan profil tanpa perlu membaca eksplisit:
File bootstrap dipangkas dan ditambahkan di bawah **Project Context** agar model melihat konteks identitas dan profil tanpa perlu pembacaan eksplisit:
- `AGENTS.md`
- `SOUL.md`
@ -155,47 +155,54 @@ File bootstrap dipangkas dan ditambahkan di bawah **Konteks Proyek** agar model
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (hanya pada workspace baru)
- `MEMORY.md` jika ada
- `BOOTSTRAP.md` (hanya pada workspace yang benar-benar baru)
- `MEMORY.md` saat ada
Semua file ini **disuntikkan ke jendela konteks** pada setiap giliran kecuali
gate spesifik file berlaku. `HEARTBEAT.md` dihilangkan pada eksekusi normal saat
Heartbeat dinonaktifkan untuk agen default atau
`agents.defaults.heartbeat.includeSystemPromptSection` bernilai false. Jaga file yang disuntikkan
tetap ringkas — terutama `MEMORY.md`, yang dapat bertambah seiring waktu dan menyebabkan
penggunaan konteks yang sangat tinggi secara tak terduga serta Compaction yang lebih sering.
gate khusus file berlaku. `HEARTBEAT.md` dihilangkan pada proses normal saat
heartbeat dinonaktifkan untuk agen default atau
`agents.defaults.heartbeat.includeSystemPromptSection` bernilai false. Jaga file
yang disuntikkan tetap ringkas — terutama `MEMORY.md`, yang dapat bertambah seiring waktu dan menyebabkan
penggunaan konteks yang sangat tinggi secara tidak terduga serta Compaction yang lebih sering.
Saat sesi berjalan pada harness Codex native, Codex memuat `AGENTS.md`
melalui penemuan dokumen proyeknya sendiri. OpenClaw tetap menyelesaikan file
bootstrap lainnya dan meneruskannya sebagai instruksi konfigurasi Codex, sehingga `SOUL.md`,
`TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, dan
`MEMORY.md` mempertahankan peran konteks workspace yang sama tanpa menduplikasi
`AGENTS.md`.
<Note>
File harian `memory/*.md` **bukan** bagian dari Konteks Proyek bootstrap normal. Pada giliran biasa, file tersebut diakses sesuai kebutuhan melalui alat `memory_search` dan `memory_get`, sehingga tidak dihitung terhadap jendela konteks kecuali model membacanya secara eksplisit. Giliran `/new` dan `/reset` polos adalah pengecualian: runtime dapat menambahkan memori harian terbaru di awal sebagai blok konteks startup sekali pakai untuk giliran pertama tersebut.
File harian `memory/*.md` **bukan** bagian dari Project Context bootstrap normal. Pada giliran biasa, file tersebut diakses sesuai kebutuhan melalui alat `memory_search` dan `memory_get`, sehingga tidak dihitung terhadap jendela konteks kecuali model secara eksplisit membacanya. Giliran `/new` dan `/reset` kosong adalah pengecualian: runtime dapat menambahkan memori harian terbaru di awal sebagai blok konteks startup sekali pakai untuk giliran pertama tersebut.
</Note>
File besar dipotong dengan marker. Ukuran maksimum per file dikendalikan oleh
`agents.defaults.bootstrapMaxChars` (default: 12000). Total konten bootstrap yang disuntikkan
di seluruh file dibatasi oleh `agents.defaults.bootstrapTotalMaxChars`
(default: 60000). File yang hilang menyuntikkan marker singkat file hilang. Saat pemotongan
terjadi, OpenClaw dapat menyuntikkan blok peringatan dalam Konteks Proyek; kendalikan ini dengan
File besar dipotong dengan penanda. Ukuran maksimum per file dikendalikan oleh
`agents.defaults.bootstrapMaxChars` (default: 12000). Total konten bootstrap
yang disuntikkan di seluruh file dibatasi oleh `agents.defaults.bootstrapTotalMaxChars`
(default: 60000). File yang hilang menyuntikkan penanda file hilang singkat. Saat pemotongan
terjadi, OpenClaw dapat menyuntikkan blok peringatan dalam Project Context; kendalikan ini dengan
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
default: `once`).
Sesi sub-agen hanya menyuntikkan `AGENTS.md` dan `TOOLS.md` (file bootstrap lain
difilter keluar untuk menjaga konteks sub-agen tetap kecil).
Hook internal dapat mengintersepsi langkah ini melalui `agent:bootstrap` untuk memutasi atau mengganti
Hook internal dapat mencegat langkah ini melalui `agent:bootstrap` untuk mengubah atau mengganti
file bootstrap yang disuntikkan (misalnya menukar `SOUL.md` dengan persona alternatif).
Jika Anda ingin membuat agen terdengar lebih tidak generik, mulai dengan
Jika Anda ingin membuat agen terdengar kurang generik, mulai dengan
[Panduan Kepribadian SOUL.md](/id/concepts/soul).
Untuk memeriksa seberapa besar kontribusi setiap file yang disuntikkan (mentah vs disuntikkan, pemotongan, plus overhead skema alat), gunakan `/context list` atau `/context detail`. Lihat [Konteks](/id/concepts/context).
## Penanganan waktu
Prompt sistem menyertakan bagian khusus **Tanggal & Waktu Saat Ini** saat
zona waktu pengguna diketahui. Untuk menjaga cache prompt tetap stabil, kini bagian ini hanya menyertakan
Prompt sistem menyertakan bagian khusus **Current Date & Time** saat
zona waktu pengguna diketahui. Agar cache prompt tetap stabil, kini bagian ini hanya menyertakan
**zona waktu** (tanpa jam dinamis atau format waktu).
Gunakan `session_status` saat agen memerlukan waktu saat ini; kartu status
menyertakan baris timestamp. Alat yang sama juga dapat secara opsional menetapkan override model per sesi
Gunakan `session_status` saat agen membutuhkan waktu saat ini; kartu status
menyertakan baris timestamp. Alat yang sama dapat secara opsional menetapkan override model per sesi
(`model=default` menghapusnya).
Konfigurasikan dengan:
@ -207,18 +214,18 @@ Lihat [Tanggal & Waktu](/id/date-time) untuk detail perilaku lengkap.
## Skills
Saat skill yang memenuhi syarat ada, OpenClaw menyuntikkan **daftar skills yang tersedia** yang ringkas
(`formatSkillsForPrompt`) yang menyertakan **jalur file** untuk setiap skill. Prompt
Saat skill yang memenuhi syarat ada, OpenClaw menyuntikkan **daftar skills tersedia**
yang ringkas (`formatSkillsForPrompt`) yang menyertakan **jalur file** untuk setiap skill. Prompt
menginstruksikan model untuk menggunakan `read` guna memuat SKILL.md di lokasi yang tercantum
(workspace, terkelola, atau bundled). Jika tidak ada skill yang memenuhi syarat, bagian
(workspace, terkelola, atau dibundel). Jika tidak ada skill yang memenuhi syarat, bagian
Skills dihilangkan.
Kelayakan mencakup gate metadata skill, pemeriksaan environment/config runtime,
Kelayakan mencakup gate metadata skill, pemeriksaan lingkungan/konfigurasi runtime,
dan allowlist skill agen efektif saat `agents.defaults.skills` atau
`agents.list[].skills` dikonfigurasi.
Skill yang dibundel Plugin memenuhi syarat hanya saat plugin pemiliknya diaktifkan.
Ini memungkinkan plugin alat mengekspos panduan operasi yang lebih dalam tanpa menyematkan semua
Skill yang dibundel Plugin hanya memenuhi syarat saat Plugin pemiliknya diaktifkan.
Ini memungkinkan Plugin alat mengekspos panduan operasi yang lebih mendalam tanpa menyematkan seluruh
panduan tersebut langsung di setiap deskripsi alat.
```
@ -238,22 +245,21 @@ Anggaran daftar skills dimiliki oleh subsistem skills:
- Default global: `skills.limits.maxSkillsPromptChars`
- Override per agen: `agents.list[].skillsLimits.maxSkillsPromptChars`
Kutipan runtime terbatas generik menggunakan permukaan berbeda:
Kutipan runtime berbatas generik menggunakan surface yang berbeda:
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
Pemisahan tersebut menjaga ukuran skills terpisah dari ukuran pembacaan/injeksi runtime seperti
`memory_get`, hasil alat langsung, dan refresh AGENTS.md pasca-Compaction.
Pemisahan itu menjaga ukuran Skills tetap terpisah dari ukuran pembacaan/injeksi runtime seperti `memory_get`, hasil tool langsung, dan penyegaran AGENTS.md pasca-Compaction.
## Dokumentasi
Prompt sistem menyertakan bagian **Dokumentasi**. Saat dokumentasi lokal tersedia, bagian tersebut mengarah ke direktori dokumentasi OpenClaw lokal (`docs/` dalam checkout Git atau dokumentasi paket npm yang dibundel). Jika dokumentasi lokal tidak tersedia, bagian tersebut menggunakan cadangan [https://docs.openclaw.ai](https://docs.openclaw.ai).
Prompt sistem menyertakan bagian **Dokumentasi**. Saat dokumentasi lokal tersedia, bagian ini mengarah ke direktori dokumentasi OpenClaw lokal (`docs/` dalam checkout Git atau dokumentasi paket npm yang dibundel). Jika dokumentasi lokal tidak tersedia, bagian ini kembali ke [https://docs.openclaw.ai](https://docs.openclaw.ai).
Bagian yang sama juga menyertakan lokasi sumber OpenClaw. Checkout Git mengekspos root sumber lokal agar agen dapat memeriksa kode secara langsung. Instalasi paket menyertakan URL sumber GitHub dan memberi tahu agen untuk meninjau sumber di sana kapan pun dokumentasi tidak lengkap atau sudah usang. Prompt tersebut juga mencatat cermin dokumentasi publik, Discord komunitas, dan ClawHub ([https://clawhub.ai](https://clawhub.ai)) untuk penemuan Skills. Prompt tersebut memberi tahu model untuk membaca dokumentasi terlebih dahulu untuk perilaku, perintah, konfigurasi, atau arsitektur OpenClaw, dan untuk menjalankan `openclaw status` sendiri bila memungkinkan (meminta pengguna hanya saat tidak memiliki akses). Khusus untuk konfigurasi, prompt tersebut mengarahkan agen ke tindakan alat `gateway` `config.schema.lookup` untuk dokumentasi dan batasan tingkat bidang yang tepat, lalu ke `docs/gateway/configuration.md` dan `docs/gateway/configuration-reference.md` untuk panduan yang lebih luas.
Bagian yang sama juga menyertakan lokasi sumber OpenClaw. Checkout Git mengekspos root sumber lokal sehingga agen dapat memeriksa kode secara langsung. Instalasi paket menyertakan URL sumber GitHub dan memberi tahu agen untuk meninjau sumber di sana kapan pun dokumentasi tidak lengkap atau usang. Prompt ini juga mencatat mirror dokumentasi publik, Discord komunitas, dan ClawHub ([https://clawhub.ai](https://clawhub.ai)) untuk penemuan Skills. Prompt ini memberi tahu model untuk berkonsultasi dengan dokumentasi terlebih dahulu terkait perilaku, perintah, konfigurasi, atau arsitektur OpenClaw, dan untuk menjalankan `openclaw status` sendiri jika memungkinkan (hanya meminta pengguna saat tidak memiliki akses). Khusus untuk konfigurasi, prompt ini mengarahkan agen ke tindakan tool `gateway` `config.schema.lookup` untuk dokumentasi dan batasan tingkat bidang yang tepat, lalu ke `docs/gateway/configuration.md` dan `docs/gateway/configuration-reference.md` untuk panduan yang lebih luas.
## Terkait
- [Runtime agen](/id/concepts/agent)
- [Ruang kerja agen](/id/concepts/agent-workspace)
- [Workspace agen](/id/concepts/agent-workspace)
- [Mesin konteks](/id/concepts/context-engine)

View File

@ -1,13 +1,13 @@
---
read_when:
- Mengubah transkripsi audio atau penanganan media
summary: Cara audio/catatan suara masuk diunduh, ditranskripsikan, dan disisipkan ke dalam balasan
summary: Cara audio/catatan suara yang masuk diunduh, ditranskripsi, dan disisipkan ke dalam balasan
title: Audio dan catatan suara
x-i18n:
generated_at: "2026-04-30T09:57:37Z"
generated_at: "2026-05-02T23:39:00Z"
model: gpt-5.5
provider: openai
source_hash: 35074d79104f767ee252064462202a8ec21ac26f6db25c39e67f31f6b40edeb7
source_hash: 91cd6951f80c6137061a7d4e82415b0872bc92c6d6ad136273a2e9ad7ec00ac1
source_path: nodes/audio.md
workflow: 16
---
@ -17,36 +17,37 @@ x-i18n:
## Yang berfungsi
- **Pemahaman media (audio)**: Jika pemahaman audio diaktifkan (atau terdeteksi otomatis), OpenClaw:
1. Menemukan lampiran audio pertama (path lokal atau URL) dan mengunduhnya jika diperlukan.
1. Menemukan lampiran audio pertama (path lokal atau URL) dan mengunduhnya jika perlu.
2. Menerapkan `maxBytes` sebelum mengirim ke setiap entri model.
3. Menjalankan entri model pertama yang memenuhi syarat secara berurutan (penyedia atau CLI).
4. Jika gagal atau dilewati (ukuran/timeout), ia mencoba entri berikutnya.
5. Saat berhasil, ia mengganti `Body` dengan blok `[Audio]` dan menetapkan `{{Transcript}}`.
- **Penguraian perintah**: Saat transkripsi berhasil, `CommandBody`/`RawBody` ditetapkan ke transkrip sehingga perintah garis miring tetap berfungsi.
- **Logging verbose**: Dalam `--verbose`, kami mencatat saat transkripsi berjalan dan saat transkripsi mengganti isi body.
3. Menjalankan entri model pertama yang memenuhi syarat secara berurutan (provider atau CLI).
4. Jika gagal atau dilewati (ukuran/timeout), OpenClaw mencoba entri berikutnya.
5. Jika berhasil, OpenClaw mengganti `Body` dengan blok `[Audio]` dan menetapkan `{{Transcript}}`.
- **Penguraian perintah**: Saat transkripsi berhasil, `CommandBody`/`RawBody` ditetapkan ke transkrip sehingga perintah slash tetap berfungsi.
- **Logging verbose**: Dalam `--verbose`, kami mencatat saat transkripsi berjalan dan saat transkripsi mengganti body.
- **Dikte Control UI**: Penyusun Chat dapat mengirim klip mikrofon yang direkam browser ke `chat.transcribeAudio`. RPC Gateway tersebut menulis klip ke file lokal sementara, menjalankan pipeline transkripsi audio yang sama, mengembalikan teks draf ke browser, dan menghapus file sementara. Ini tidak membuat run agen dengan sendirinya.
## Deteksi otomatis (bawaan)
## Deteksi otomatis (default)
Jika Anda **tidak mengonfigurasi model** dan `tools.media.audio.enabled` **tidak** disetel ke `false`,
Jika Anda **tidak mengonfigurasi model** dan `tools.media.audio.enabled` **tidak** diatur ke `false`,
OpenClaw mendeteksi otomatis dalam urutan ini dan berhenti pada opsi pertama yang berfungsi:
1. **Model balasan aktif** saat penyedianya mendukung pemahaman audio.
2. **CLI lokal** (jika terpasang)
1. **Model balasan aktif** saat provider-nya mendukung pemahaman audio.
2. **CLI lokal** (jika terinstal)
- `sherpa-onnx-offline` (memerlukan `SHERPA_ONNX_MODEL_DIR` dengan encoder/decoder/joiner/tokens)
- `whisper-cli` (dari `whisper-cpp`; menggunakan `WHISPER_CPP_MODEL` atau model tiny bawaan)
- `whisper` (CLI Python; mengunduh model secara otomatis)
3. **Gemini CLI** (`gemini`) menggunakan `read_many_files`
4. **Auth penyedia**
3. **CLI Gemini** (`gemini`) menggunakan `read_many_files`
4. **Autentikasi provider**
- Entri `models.providers.*` yang dikonfigurasi dan mendukung audio dicoba terlebih dahulu
- Urutan fallback bawaan: OpenAI → Groq → xAI → Deepgram → Google → SenseAudio → ElevenLabs → Mistral
Untuk menonaktifkan deteksi otomatis, setel `tools.media.audio.enabled: false`.
Untuk menyesuaikan, setel `tools.media.audio.models`.
Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan CLI ada di `PATH` (kami memperluas `~`), atau setel model CLI eksplisit dengan path perintah lengkap.
Untuk menonaktifkan deteksi otomatis, atur `tools.media.audio.enabled: false`.
Untuk menyesuaikan, atur `tools.media.audio.models`.
Catatan: Deteksi biner bersifat upaya terbaik di macOS/Linux/Windows; pastikan CLI ada di `PATH` (kami memperluas `~`), atau atur model CLI eksplisit dengan path perintah lengkap.
## Contoh konfigurasi
### Fallback penyedia + CLI (OpenAI + Whisper CLI)
### Fallback provider + CLI (OpenAI + Whisper CLI)
```json5
{
@ -70,7 +71,7 @@ Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan
}
```
### Khusus penyedia dengan pembatasan scope
### Hanya provider dengan pembatasan cakupan
```json5
{
@ -89,7 +90,7 @@ Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan
}
```
### Khusus penyedia (Deepgram)
### Hanya provider (Deepgram)
```json5
{
@ -104,7 +105,7 @@ Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan
}
```
### Khusus penyedia (Mistral Voxtral)
### Hanya provider (Mistral Voxtral)
```json5
{
@ -119,7 +120,7 @@ Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan
}
```
### Khusus penyedia (SenseAudio)
### Hanya provider (SenseAudio)
```json5
{
@ -134,7 +135,7 @@ Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan
}
```
### Gema transkrip ke chat (ikut serta)
### Gema transkrip ke chat (opt-in)
```json5
{
@ -153,28 +154,28 @@ Catatan: Deteksi binary bersifat upaya terbaik di macOS/Linux/Windows; pastikan
## Catatan & batasan
- Auth penyedia mengikuti urutan auth model standar (profil auth, env vars, `models.providers.*.apiKey`).
- Autentikasi provider mengikuti urutan autentikasi model standar (profil autentikasi, env vars, `models.providers.*.apiKey`).
- Detail penyiapan Groq: [Groq](/id/providers/groq).
- Deepgram mengambil `DEEPGRAM_API_KEY` saat `provider: "deepgram"` digunakan.
- Detail penyiapan Deepgram: [Deepgram (transkripsi audio)](/id/providers/deepgram).
- Detail penyiapan Mistral: [Mistral](/id/providers/mistral).
- SenseAudio mengambil `SENSEAUDIO_API_KEY` saat `provider: "senseaudio"` digunakan.
- Detail penyiapan SenseAudio: [SenseAudio](/id/providers/senseaudio).
- Penyedia audio dapat mengganti `baseUrl`, `headers`, dan `providerOptions` melalui `tools.media.audio`.
- Batas ukuran bawaan adalah 20MB (`tools.media.audio.maxBytes`). Audio yang terlalu besar dilewati untuk model tersebut dan entri berikutnya dicoba.
- File audio tiny/kosong di bawah 1024 byte dilewati sebelum transkripsi penyedia/CLI.
- `maxChars` bawaan untuk audio **tidak disetel** (transkrip lengkap). Setel `tools.media.audio.maxChars` atau `maxChars` per entri untuk memangkas output.
- Default otomatis OpenAI adalah `gpt-4o-mini-transcribe`; setel `model: "gpt-4o-transcribe"` untuk akurasi lebih tinggi.
- Provider audio dapat menimpa `baseUrl`, `headers`, dan `providerOptions` melalui `tools.media.audio`.
- Batas ukuran default adalah 20MB (`tools.media.audio.maxBytes`). Audio yang terlalu besar dilewati untuk model tersebut dan entri berikutnya dicoba.
- File audio tiny/kosong di bawah 1024 byte dilewati sebelum transkripsi provider/CLI.
- `maxChars` default untuk audio **tidak diatur** (transkrip penuh). Atur `tools.media.audio.maxChars` atau `maxChars` per entri untuk memangkas output.
- Default otomatis OpenAI adalah `gpt-4o-mini-transcribe`; atur `model: "gpt-4o-transcribe"` untuk akurasi lebih tinggi.
- Gunakan `tools.media.audio.attachments` untuk memproses beberapa catatan suara (`mode: "all"` + `maxAttachments`).
- Transkrip tersedia untuk templat sebagai `{{Transcript}}`.
- `tools.media.audio.echoTranscript` nonaktif secara bawaan; aktifkan untuk mengirim konfirmasi transkrip kembali ke chat asal sebelum pemrosesan agen.
- `tools.media.audio.echoTranscript` nonaktif secara default; aktifkan untuk mengirim konfirmasi transkrip kembali ke chat asal sebelum pemrosesan agen.
- `tools.media.audio.echoFormat` menyesuaikan teks gema (placeholder: `{transcript}`).
- stdout CLI dibatasi (5MB); jaga output CLI tetap ringkas.
- `args` CLI harus menggunakan `{{MediaPath}}` untuk path file audio lokal. Jalankan `openclaw doctor --fix` untuk memigrasikan placeholder `{input}` yang tidak digunakan lagi dari konfigurasi `audio.transcription.command` lama.
- stdout CLI dibatasi (5MB); jaga agar output CLI tetap ringkas.
- `args` CLI sebaiknya menggunakan `{{MediaPath}}` untuk path file audio lokal. Jalankan `openclaw doctor --fix` untuk memigrasikan placeholder `{input}` yang sudah usang dari konfigurasi `audio.transcription.command` lama.
### Dukungan environment proxy
### Dukungan lingkungan proxy
Transkripsi audio berbasis penyedia menghormati env vars proxy outbound standar:
Transkripsi audio berbasis provider mematuhi env vars proxy outbound standar:
- `HTTPS_PROXY`
- `HTTP_PROXY`
@ -183,11 +184,11 @@ Transkripsi audio berbasis penyedia menghormati env vars proxy outbound standar:
- `http_proxy`
- `all_proxy`
Jika tidak ada env vars proxy yang disetel, egress langsung digunakan. Jika konfigurasi proxy tidak valid, OpenClaw mencatat peringatan dan kembali ke fetch langsung.
Jika tidak ada env vars proxy yang diatur, egress langsung digunakan. Jika konfigurasi proxy salah format, OpenClaw mencatat peringatan dan fallback ke fetch langsung.
## Deteksi mention dalam grup
Saat `requireMention: true` disetel untuk chat grup, OpenClaw sekarang mentranskripsi audio **sebelum** memeriksa mention. Ini memungkinkan catatan suara diproses bahkan saat berisi mention.
Saat `requireMention: true` diatur untuk chat grup, OpenClaw sekarang mentranskripsi audio **sebelum** memeriksa mention. Ini memungkinkan catatan suara diproses bahkan ketika berisi mention.
**Cara kerjanya:**
@ -198,24 +199,24 @@ Saat `requireMention: true` disetel untuk chat grup, OpenClaw sekarang mentransk
**Perilaku fallback:**
- Jika transkripsi gagal selama preflight (timeout, error API, dll.), pesan diproses berdasarkan deteksi mention teks saja.
- Ini memastikan pesan campuran (teks + audio) tidak pernah salah dijatuhkan.
- Jika transkripsi gagal selama preflight (timeout, kesalahan API, dll.), pesan diproses berdasarkan deteksi mention teks saja.
- Ini memastikan bahwa pesan campuran (teks + audio) tidak pernah keliru dibuang.
**Opt-out per grup/topik Telegram:**
- Setel `channels.telegram.groups.<chatId>.disableAudioPreflight: true` untuk melewati pemeriksaan mention transkrip preflight untuk grup tersebut.
- Setel `channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflight` untuk mengganti per topik (`true` untuk melewati, `false` untuk memaksa aktif).
- Default adalah `false` (preflight aktif saat kondisi yang dibatasi mention cocok).
- Atur `channels.telegram.groups.<chatId>.disableAudioPreflight: true` untuk melewati pemeriksaan mention transkrip preflight untuk grup tersebut.
- Atur `channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflight` untuk menimpa per topik (`true` untuk melewati, `false` untuk memaksa aktif).
- Default adalah `false` (preflight diaktifkan saat kondisi yang dibatasi mention cocok).
**Contoh:** Pengguna mengirim catatan suara yang mengatakan "Hey @Claude, what's the weather?" di grup Telegram dengan `requireMention: true`. Catatan suara ditranskripsi, mention terdeteksi, dan agen membalas.
## Hal yang perlu diperhatikan
- Aturan scope menggunakan kecocokan pertama yang menang. `chatType` dinormalisasi menjadi `direct`, `group`, atau `room`.
- Pastikan CLI Anda keluar 0 dan mencetak teks biasa; JSON perlu diproses melalui `jq -r .text`.
- Untuk `parakeet-mlx`, jika Anda meneruskan `--output-dir`, OpenClaw membaca `<output-dir>/<media-basename>.txt` saat `--output-format` adalah `txt` (atau dihilangkan); format output non-`txt` kembali ke penguraian stdout.
- Jaga timeout tetap wajar (`timeoutSeconds`, bawaan 60 dtk) untuk menghindari pemblokiran antrean balasan.
- Transkripsi preflight hanya memproses lampiran audio **pertama** untuk deteksi mention. Audio tambahan diproses selama fase pemahaman media utama.
- Aturan cakupan menggunakan kecocokan pertama yang menang. `chatType` dinormalisasi menjadi `direct`, `group`, atau `room`.
- Pastikan CLI Anda keluar dengan 0 dan mencetak teks biasa; JSON perlu diproses melalui `jq -r .text`.
- Untuk `parakeet-mlx`, jika Anda meneruskan `--output-dir`, OpenClaw membaca `<output-dir>/<media-basename>.txt` saat `--output-format` adalah `txt` (atau dihilangkan); format output non-`txt` fallback ke penguraian stdout.
- Jaga timeout tetap wajar (`timeoutSeconds`, default 60d) untuk menghindari pemblokiran antrean balasan.
- Transkripsi preflight hanya memproses lampiran audio **pertama** untuk deteksi mention. Audio tambahan diproses selama fase utama pemahaman media.
## Terkait

File diff suppressed because it is too large Load Diff

View File

@ -1,37 +1,36 @@
---
read_when:
- Anda ingin menggunakan Arcee AI dengan OpenClaw
- Anda memerlukan env var API key atau pilihan autentikasi CLI
summary: Penyiapan Arcee AI (auth + pemilihan model)
- Anda memerlukan variabel lingkungan kunci API atau pilihan autentikasi CLI
summary: Penyiapan Arcee AI (autentikasi + pemilihan model)
title: Arcee AI
x-i18n:
refreshed_at: '2026-04-28T05:23:26Z'
generated_at: "2026-04-24T09:22:08Z"
model: gpt-5.4
provider: openai
source_hash: 54989e1706901fedc8a0c816ca7ee7f877fa4b973697540dd90cb9182420043f
source_path: providers/arcee.md
workflow: 15
generated_at: "2026-05-02T23:39:05Z"
model: gpt-5.5
provider: openai
source_hash: 622ee5288aec3ae0b45d3f06ba65fd6f972e07d7a7596ae3905d6fbdac0bf737
source_path: providers/arcee.md
workflow: 16
---
[Arcee AI](https://arcee.ai) menyediakan akses ke keluarga model mixture-of-experts Trinity melalui API yang kompatibel dengan OpenAI. Semua model Trinity berlisensi Apache 2.0.
Model Arcee AI dapat diakses langsung melalui platform Arcee atau melalui [OpenRouter](/id/providers/openrouter).
| Properti | Nilai |
| -------- | ------------------------------------------------------------------------------------ |
| Provider | `arcee` |
| Auth | `ARCEEAI_API_KEY` (langsung) atau `OPENROUTER_API_KEY` (melalui OpenRouter) |
| API | Kompatibel OpenAI |
| Base URL | `https://api.arcee.ai/api/v1` (langsung) atau `https://openrouter.ai/api/v1` (OpenRouter) |
| Properti | Nilai |
| -------- | ------------------------------------------------------------------------------------- |
| Penyedia | `arcee` |
| Autentikasi | `ARCEEAI_API_KEY` (langsung) atau `OPENROUTER_API_KEY` (melalui OpenRouter) |
| API | Kompatibel dengan OpenAI |
| URL Dasar | `https://api.arcee.ai/api/v1` (langsung) atau `https://openrouter.ai/api/v1` (OpenRouter) |
## Memulai
<Tabs>
<Tab title="Langsung (platform Arcee)">
<Steps>
<Step title="Dapatkan API key">
Buat API key di [Arcee AI](https://chat.arcee.ai/).
<Step title="Dapatkan kunci API">
Buat kunci API di [Arcee AI](https://chat.arcee.ai/).
</Step>
<Step title="Jalankan onboarding">
```bash
@ -54,8 +53,8 @@ Model Arcee AI dapat diakses langsung melalui platform Arcee atau melalui [OpenR
<Tab title="Melalui OpenRouter">
<Steps>
<Step title="Dapatkan API key">
Buat API key di [OpenRouter](https://openrouter.ai/keys).
<Step title="Dapatkan kunci API">
Buat kunci API di [OpenRouter](https://openrouter.ai/keys).
</Step>
<Step title="Jalankan onboarding">
```bash
@ -73,7 +72,7 @@ Model Arcee AI dapat diakses langsung melalui platform Arcee atau melalui [OpenR
}
```
Ref model yang sama berfungsi untuk penyiapan langsung maupun OpenRouter (misalnya `arcee/trinity-large-thinking`).
Referensi model yang sama berfungsi untuk penyiapan langsung dan OpenRouter (misalnya `arcee/trinity-large-thinking`).
</Step>
</Steps>
@ -104,39 +103,38 @@ Model Arcee AI dapat diakses langsung melalui platform Arcee atau melalui [OpenR
## Katalog bawaan
OpenClaw saat ini menyertakan katalog Arcee bawaan berikut:
OpenClaw saat ini menyertakan katalog Arcee bawaan ini:
| Ref model | Nama | Input | Konteks | Biaya (masuk/keluar per 1M) | Catatan |
| ------------------------------ | ---------------------- | ----- | ------- | --------------------------- | ------------------------------------------ |
| `arcee/trinity-large-thinking` | Trinity Large Thinking | teks | 256K | $0.25 / $0.90 | Model default; reasoning diaktifkan |
| `arcee/trinity-large-preview` | Trinity Large Preview | teks | 128K | $0.25 / $1.00 | Tujuan umum; 400B params, 13B aktif |
| `arcee/trinity-mini` | Trinity Mini 26B | teks | 128K | $0.045 / $0.15 | Cepat dan hemat biaya; function calling |
| Referensi model | Nama | Input | Konteks | Biaya (masuk/keluar per 1 juta) | Catatan |
| ------------------------------ | ---------------------- | ----- | ------- | -------------------- | ------------------------------------------ |
| `arcee/trinity-large-thinking` | Trinity Large Thinking | teks | 256K | $0.25 / $0.90 | Model default; penalaran diaktifkan; tanpa alat |
| `arcee/trinity-large-preview` | Trinity Large Preview | teks | 128K | $0.25 / $1.00 | Serbaguna; 400B parameter, 13B aktif |
| `arcee/trinity-mini` | Trinity Mini 26B | teks | 128K | $0.045 / $0.15 | Cepat dan hemat biaya; pemanggilan fungsi |
<Tip>
Preset onboarding menetapkan `arcee/trinity-large-thinking` sebagai model default.
Preset onboarding menetapkan `arcee/trinity-large-thinking` sebagai model default. Model ini hanya mendukung penalaran/teks dan tidak mendukung penggunaan alat atau pemanggilan fungsi.
</Tip>
## Fitur yang didukung
| Fitur | Didukung |
| --------------------------------------------- | ---------------------------- |
| Streaming | Ya |
| Penggunaan alat / function calling | Ya |
| Output terstruktur (mode JSON dan skema JSON) | Ya |
| Thinking lanjutan | Ya (Trinity Large Thinking) |
| Fitur | Didukung |
| --------------------------------------------- | ------------------------------------------- |
| Streaming | Ya |
| Penggunaan alat / pemanggilan fungsi | Bergantung pada model; bukan Trinity Large Thinking |
| Output terstruktur (mode JSON dan skema JSON) | Ya |
| Pemikiran lanjutan | Ya (Trinity Large Thinking) |
<AccordionGroup>
<Accordion title="Catatan environment">
<Accordion title="Catatan lingkungan">
Jika Gateway berjalan sebagai daemon (launchd/systemd), pastikan `ARCEEAI_API_KEY`
(atau `OPENROUTER_API_KEY`) tersedia untuk proses tersebut (misalnya di
(atau `OPENROUTER_API_KEY`) tersedia untuk proses tersebut (misalnya, di
`~/.openclaw/.env` atau melalui `env.shellEnv`).
</Accordion>
<Accordion title="Perutean OpenRouter">
Saat menggunakan model Arcee melalui OpenRouter, ref model `arcee/*` yang sama tetap berlaku.
OpenClaw menangani perutean secara transparan berdasarkan pilihan auth Anda. Lihat
[dokumen provider OpenRouter](/id/providers/openrouter) untuk detail konfigurasi
khusus OpenRouter.
Saat menggunakan model Arcee melalui OpenRouter, referensi model `arcee/*` yang sama berlaku.
OpenClaw menangani perutean secara transparan berdasarkan pilihan autentikasi Anda. Lihat
[dokumentasi penyedia OpenRouter](/id/providers/openrouter) untuk detail konfigurasi khusus OpenRouter.
</Accordion>
</AccordionGroup>
@ -144,9 +142,9 @@ Preset onboarding menetapkan `arcee/trinity-large-thinking` sebagai model defaul
<CardGroup cols={2}>
<Card title="OpenRouter" href="/id/providers/openrouter" icon="shuffle">
Akses model Arcee dan banyak model lain melalui satu API key.
Akses model Arcee dan banyak model lain melalui satu kunci API.
</Card>
<Card title="Pemilihan model" href="/id/concepts/model-providers" icon="layers">
Memilih provider, ref model, dan perilaku failover.
Memilih penyedia, referensi model, dan perilaku failover.
</Card>
</CardGroup>

View File

@ -2,22 +2,21 @@
read_when:
- Mencari definisi saluran rilis publik
- Menjalankan validasi rilis atau penerimaan paket
- Mencari penamaan versi dan irama rilis
- Mencari penamaan versi dan ritme rilis
summary: Jalur rilis, daftar periksa operator, kotak validasi, penamaan versi, dan kadensi
title: Kebijakan rilis
x-i18n:
generated_at: "2026-05-02T20:59:44Z"
generated_at: "2026-05-02T23:39:20Z"
model: gpt-5.5
provider: openai
source_hash: 493cb8b42f0e15f3bf5f8fb9be7d01fd626f4f16db9ac0a85e6efa747ef12d12
source_hash: ba316d1736eae8edd2fb0a71b9a3da345f8895c3b536e9a1f619718ea12fc851
source_path: reference/RELEASING.md
workflow: 16
---
OpenClaw memiliki empat jalur rilis publik:
OpenClaw memiliki tiga jalur rilis publik:
- stable: rilis bertag yang dipublikasikan ke npm `beta` secara default, atau ke npm `latest` saat diminta secara eksplisit
- alpha: tag prarilis yang dipublikasikan ke npm `alpha`
- stabil: rilis bertag yang dipublikasikan ke npm `beta` secara default, atau ke npm `latest` saat diminta secara eksplisit
- beta: tag prarilis yang dipublikasikan ke npm `beta`
- dev: head bergerak dari `main`
@ -27,261 +26,147 @@ OpenClaw memiliki empat jalur rilis publik:
- Tag Git: `vYYYY.M.D`
- Versi rilis koreksi stabil: `YYYY.M.D-N`
- Tag Git: `vYYYY.M.D-N`
- Versi prarilis alpha: `YYYY.M.D-alpha.N`
- Tag Git: `vYYYY.M.D-alpha.N`
- Versi prarilis beta: `YYYY.M.D-beta.N`
- Tag Git: `vYYYY.M.D-beta.N`
- Jangan isi bulan atau hari dengan nol di depan
- Jangan tambahkan nol di depan bulan atau hari
- `latest` berarti rilis npm stabil yang saat ini dipromosikan
- `alpha` berarti target instalasi alpha saat ini
- `beta` berarti target instalasi beta saat ini
- Rilis stabil dan rilis koreksi stabil dipublikasikan ke npm `beta` secara default; operator rilis dapat menargetkan `latest` secara eksplisit, atau mempromosikan build beta yang telah diperiksa nanti
- Setiap rilis stabil OpenClaw mengirimkan paket npm dan aplikasi macOS bersama-sama;
rilis beta biasanya memvalidasi dan memublikasikan jalur npm/paket terlebih dahulu, dengan
build/tanda tangan/notarisasi aplikasi mac disisihkan untuk stabil kecuali diminta secara eksplisit
build/tanda tangan/notarisasi aplikasi mac dicadangkan untuk stabil kecuali diminta secara eksplisit
## Irama rilis
- Rilis bergerak dengan beta terlebih dahulu
- Stabil mengikuti hanya setelah beta terbaru divalidasi
- Maintainer biasanya memotong rilis dari branch `release/YYYY.M.D` yang dibuat
- Maintainer biasanya membuat rilis dari cabang `release/YYYY.M.D` yang dibuat
dari `main` saat ini, sehingga validasi dan perbaikan rilis tidak memblokir
pengembangan baru di `main`
- Jika tag beta telah didorong atau dipublikasikan dan memerlukan perbaikan, maintainer memotong
- Jika tag beta telah didorong atau dipublikasikan dan membutuhkan perbaikan, maintainer membuat
tag `-beta.N` berikutnya alih-alih menghapus atau membuat ulang tag beta lama
- Prosedur rilis terperinci, persetujuan, kredensial, dan catatan pemulihan
- Prosedur rilis, persetujuan, kredensial, dan catatan pemulihan terperinci
hanya untuk maintainer
## Daftar periksa operator rilis
Daftar periksa ini adalah bentuk publik dari alur rilis. Kredensial privat,
penandatanganan, notarisasi, pemulihan dist-tag, dan detail rollback darurat tetap berada di
buku panduan operasional rilis khusus maintainer.
penandatanganan, notarisasi, pemulihan dist-tag, dan detail rollback darurat tetap berada dalam
runbook rilis khusus maintainer.
1. Mulai dari `main` saat ini: tarik yang terbaru, pastikan commit target telah didorong,
dan pastikan CI `main` saat ini cukup hijau untuk membuat branch darinya.
1. Mulai dari `main` saat ini: tarik yang terbaru, konfirmasi commit target telah didorong,
dan konfirmasi CI `main` saat ini cukup hijau untuk membuat cabang darinya.
2. Tulis ulang bagian teratas `CHANGELOG.md` dari riwayat commit nyata dengan
`/changelog`, jaga entri tetap berorientasi pengguna, commit, dorong, dan rebase/tarik
sekali lagi sebelum membuat branch.
`/changelog`, pertahankan entri yang berorientasi pengguna, commit, dorong, lalu rebase/tarik
sekali lagi sebelum membuat cabang.
3. Tinjau catatan kompatibilitas rilis di
`src/plugins/compat/registry.ts` dan
`src/commands/doctor/shared/deprecation-compat.ts`. Hapus kompatibilitas yang kedaluwarsa
hanya ketika jalur peningkatan tetap tercakup, atau catat mengapa hal itu
sengaja dipertahankan.
4. Buat `release/YYYY.M.D` dari `main` saat ini; jangan lakukan pekerjaan rilis normal
`src/commands/doctor/shared/deprecation-compat.ts`. Hapus kompatibilitas
yang kedaluwarsa hanya saat jalur upgrade tetap tercakup, atau catat mengapa itu
sengaja tetap dibawa.
4. Buat `release/YYYY.M.D` dari `main` saat ini; jangan melakukan pekerjaan rilis normal
langsung di `main`.
5. Naikkan setiap lokasi versi yang diperlukan untuk tag yang dimaksud, jalankan
`pnpm plugins:sync` agar paket Plugin yang dapat dipublikasikan berbagi versi rilis
dan metadata kompatibilitas, lalu jalankan prapemeriksaan deterministik lokal:
dan metadata kompatibilitas, lalu jalankan preflight deterministik lokal:
`pnpm check:test-types`, `pnpm check:architecture`,
`pnpm build && pnpm ui:build`, `pnpm plugins:sync:check`, dan
`pnpm release:check`.
6. Jalankan `OpenClaw NPM Release` dengan `preflight_only=true`. Sebelum tag ada,
SHA branch rilis 40 karakter penuh diizinkan untuk prapemeriksaan khusus validasi.
SHA cabang rilis lengkap 40 karakter diizinkan untuk preflight khusus validasi.
Simpan `preflight_run_id` yang berhasil.
7. Mulai semua pengujian prarilis dengan `Full Release Validation` untuk
branch rilis, tag, atau SHA commit penuh. Ini adalah satu titik masuk manual
cabang rilis, tag, atau SHA commit lengkap. Ini adalah satu-satunya entrypoint manual
untuk empat kotak pengujian rilis besar: Vitest, Docker, QA Lab, dan Package.
8. Jika validasi gagal, perbaiki di branch rilis dan jalankan ulang file, jalur,
job alur kerja, profil paket, penyedia, atau allowlist model gagal terkecil yang
membuktikan perbaikan. Jalankan ulang umbrella penuh hanya ketika permukaan yang berubah membuat
8. Jika validasi gagal, perbaiki di cabang rilis dan jalankan ulang file gagal terkecil,
lane, pekerjaan workflow, profil paket, penyedia, atau allowlist model yang
membuktikan perbaikan. Jalankan ulang umbrella penuh hanya saat permukaan yang berubah membuat
bukti sebelumnya usang.
9. Untuk alpha atau beta, beri tag `vYYYY.M.D-alpha.N` atau `vYYYY.M.D-beta.N`, lalu jalankan `OpenClaw Release Publish` dari
branch `release/YYYY.M.D` yang cocok. Ini memverifikasi `pnpm plugins:sync:check`,
memublikasikan semua paket Plugin yang dapat dipublikasikan ke npm terlebih dahulu, memublikasikan set yang sama
ke ClawHub kedua, lalu mempromosikan artefak prapemeriksaan npm OpenClaw yang disiapkan
dengan dist-tag yang cocok. Setelah publikasi, jalankan penerimaan paket pascapublikasi
terhadap paket `openclaw@YYYY.M.D-alpha.N`, `openclaw@alpha`,
`openclaw@YYYY.M.D-beta.N`, atau `openclaw@beta` yang dipublikasikan. Jika prarilis yang telah didorong atau
dipublikasikan memerlukan perbaikan, potong nomor prarilis cocok berikutnya;
jangan hapus atau tulis ulang prarilis lama.
9. Untuk beta, tag `vYYYY.M.D-beta.N`, lalu jalankan `OpenClaw Release Publish` dari
cabang `release/YYYY.M.D` yang cocok. Itu memverifikasi `pnpm plugins:sync:check`,
memublikasikan semua paket Plugin yang dapat dipublikasikan ke npm terlebih dahulu, memublikasikan set
yang sama ke ClawHub kedua, lalu mempromosikan artefak preflight npm OpenClaw
yang disiapkan dengan dist-tag yang cocok. Setelah publikasi, jalankan penerimaan paket
pascapublikasi terhadap paket `openclaw@YYYY.M.D-beta.N` atau
`openclaw@beta` yang dipublikasikan. Jika prarilis yang telah didorong atau dipublikasikan membutuhkan perbaikan,
buat nomor prarilis cocok berikutnya; jangan hapus atau tulis ulang prarilis lama.
10. Untuk stabil, lanjutkan hanya setelah beta atau kandidat rilis yang telah diperiksa memiliki
bukti validasi yang diperlukan. Publikasi npm stabil juga melalui
`OpenClaw Release Publish`, menggunakan kembali artefak prapemeriksaan yang berhasil melalui
`OpenClaw Release Publish`, menggunakan ulang artefak preflight yang berhasil melalui
`preflight_run_id`; kesiapan rilis macOS stabil juga memerlukan
`.zip`, `.dmg`, `.dSYM.zip` yang telah dipaketkan, dan `appcast.xml` yang diperbarui di `main`.
11. Setelah publikasi, jalankan pemverifikasi npm pascapublikasi, E2E Telegram npm-terpublikasi
mandiri opsional saat Anda memerlukan bukti saluran pascapublikasi,
11. Setelah publikasi, jalankan pemverifikasi pascapublikasi npm, E2E Telegram
published-npm mandiri opsional saat Anda membutuhkan bukti channel pascapublikasi,
promosi dist-tag saat diperlukan, catatan rilis/prarilis GitHub dari
bagian `CHANGELOG.md` cocok yang lengkap, dan langkah-langkah pengumuman rilis.
bagian `CHANGELOG.md` lengkap yang cocok, dan langkah pengumuman rilis.
## Prapemeriksaan rilis
## Preflight rilis
- Jalankan `pnpm check:test-types` sebelum preflight rilis agar TypeScript pengujian tetap
tercakup di luar gate lokal `pnpm check` yang lebih cepat
- Jalankan `pnpm check:architecture` sebelum preflight rilis agar pemeriksaan siklus
impor dan batas arsitektur yang lebih luas hijau di luar gate lokal yang lebih cepat
- Jalankan `pnpm build && pnpm ui:build` sebelum `pnpm release:check` agar artefak
rilis `dist/*` yang diharapkan dan bundel Control UI tersedia untuk langkah
validasi pack
- Jalankan `pnpm plugins:sync` setelah bump versi root dan sebelum tagging. Perintah ini
memperbarui versi paket Plugin yang dapat dipublikasikan, metadata kompatibilitas
peer/API OpenClaw, metadata build, dan stub changelog Plugin agar cocok dengan versi
rilis core. `pnpm plugins:sync:check` adalah guard rilis non-mutating;
workflow publish gagal sebelum mutasi registry apa pun jika langkah ini
terlupa.
- Jalankan workflow manual `Full Release Validation` sebelum persetujuan rilis untuk
memulai semua test box pra-rilis dari satu entrypoint. Workflow ini menerima branch,
tag, atau SHA commit penuh, mendispatch `CI` manual, dan mendispatch
`OpenClaw Release Checks` untuk install smoke, package acceptance, rangkaian
release-path Docker, live/E2E, OpenWebUI, paritas QA Lab, Matrix, dan lane Telegram.
Dengan `release_profile=full` dan `rerun_group=all`, workflow ini juga menjalankan
package Telegram E2E terhadap artefak `release-package-under-test` dari release
checks. Berikan `npm_telegram_package_spec` setelah publish ketika Telegram E2E yang
sama juga harus membuktikan paket npm yang dipublikasikan. Berikan
`package_acceptance_package_spec` setelah publish ketika Package Acceptance harus
menjalankan matriks package/update terhadap paket npm yang sudah dikirim, bukan
artefak yang dibuild dari SHA. Berikan
`evidence_package_spec` ketika laporan evidence privat harus membuktikan bahwa
validasi cocok dengan paket npm yang dipublikasikan tanpa memaksa Telegram E2E.
Contoh:
`gh workflow run full-release-validation.yml --ref main -f ref=release/YYYY.M.D`
- Jalankan workflow manual `Package Acceptance` ketika Anda menginginkan bukti
side-channel untuk kandidat paket sementara pekerjaan rilis berlanjut. Gunakan `source=npm` untuk
`openclaw@alpha`, `openclaw@beta`, `openclaw@latest`, atau versi rilis persis; `source=ref`
untuk mem-pack branch/tag/SHA `package_ref` tepercaya dengan harness
`workflow_ref` saat ini; `source=url` untuk tarball HTTPS dengan SHA-256 yang wajib;
atau `source=artifact` untuk tarball yang diunggah oleh run GitHub Actions lain.
Workflow ini me-resolve kandidat menjadi
`package-under-test`, menggunakan kembali scheduler rilis Docker E2E terhadap
tarball tersebut, dan dapat menjalankan QA Telegram terhadap tarball yang sama dengan
`telegram_mode=mock-openai` atau `telegram_mode=live-frontier`. Ketika
lane Docker yang dipilih menyertakan `published-upgrade-survivor`, artefak paket
adalah kandidat dan `published_upgrade_survivor_baseline` memilih baseline yang
dipublikasikan.
- Jalankan `pnpm check:test-types` sebelum preflight rilis agar TypeScript pengujian tetap tercakup di luar gate lokal `pnpm check` yang lebih cepat
- Jalankan `pnpm check:architecture` sebelum preflight rilis agar pemeriksaan siklus impor dan batas arsitektur yang lebih luas hijau di luar gate lokal yang lebih cepat
- Jalankan `pnpm build && pnpm ui:build` sebelum `pnpm release:check` agar artefak rilis `dist/*` yang diharapkan dan bundle Control UI ada untuk langkah validasi pack
- Jalankan `pnpm plugins:sync` setelah bump versi root dan sebelum tagging. Ini memperbarui versi paket Plugin yang dapat dipublikasikan, metadata kompatibilitas peer/API OpenClaw, metadata build, dan stub changelog Plugin agar cocok dengan versi rilis inti. `pnpm plugins:sync:check` adalah guard rilis yang tidak memutasi; workflow publikasi gagal sebelum mutasi registry apa pun jika langkah ini terlupakan.
- Jalankan workflow manual `Full Release Validation` sebelum persetujuan rilis untuk memulai semua kotak pengujian pra-rilis dari satu entrypoint. Ini menerima branch, tag, atau SHA commit lengkap, mendispatch `CI` manual, dan mendispatch `OpenClaw Release Checks` untuk install smoke, package acceptance, suite jalur rilis Docker, live/E2E, OpenWebUI, paritas QA Lab, Matrix, dan jalur Telegram. Dengan `release_profile=full` dan `rerun_group=all`, ini juga menjalankan paket Telegram E2E terhadap artefak `release-package-under-test` dari pemeriksaan rilis. Berikan `npm_telegram_package_spec` setelah publikasi ketika Telegram E2E yang sama juga harus membuktikan paket npm yang dipublikasikan. Berikan `package_acceptance_package_spec` setelah publikasi ketika Package Acceptance harus menjalankan matriks paket/pembaruan terhadap paket npm yang dikirim, bukan artefak yang dibangun dari SHA. Berikan `evidence_package_spec` ketika laporan bukti privat harus membuktikan bahwa validasi cocok dengan paket npm yang dipublikasikan tanpa memaksa Telegram E2E. Contoh: `gh workflow run full-release-validation.yml --ref main -f ref=release/YYYY.M.D`
- Jalankan workflow manual `Package Acceptance` ketika Anda menginginkan bukti side-channel untuk kandidat paket sementara pekerjaan rilis berlanjut. Gunakan `source=npm` untuk `openclaw@beta`, `openclaw@latest`, atau versi rilis eksak; `source=ref` untuk mem-pack branch/tag/SHA `package_ref` tepercaya dengan harness `workflow_ref` saat ini; `source=url` untuk tarball HTTPS dengan SHA-256 wajib; atau `source=artifact` untuk tarball yang diunggah oleh run GitHub Actions lain. Workflow menyelesaikan kandidat menjadi `package-under-test`, menggunakan ulang scheduler rilis Docker E2E terhadap tarball tersebut, dan dapat menjalankan QA Telegram terhadap tarball yang sama dengan `telegram_mode=mock-openai` atau `telegram_mode=live-frontier`. Ketika jalur Docker yang dipilih menyertakan `published-upgrade-survivor`, artefak paket adalah kandidat dan `published_upgrade_survivor_baseline` memilih baseline yang dipublikasikan.
Contoh: `gh workflow run package-acceptance.yml --ref main -f workflow_ref=main -f source=npm -f package_spec=openclaw@beta -f suite_profile=product -f published_upgrade_survivor_baseline=openclaw@2026.4.26 -f telegram_mode=mock-openai`
Profil umum:
- `smoke`: lane install/channel/agent, jaringan Gateway, dan reload config
- `package`: lane package/update/Plugin native artefak tanpa OpenWebUI atau ClawHub live
- `product`: profil package ditambah channel MCP, pembersihan cron/subagent,
pencarian web OpenAI, dan OpenWebUI
- `full`: chunk release-path Docker dengan OpenWebUI
- `custom`: pilihan `docker_lanes` persis untuk rerun terfokus
- Jalankan workflow manual `CI` secara langsung ketika Anda hanya membutuhkan cakupan CI
normal penuh untuk kandidat rilis. Dispatch CI manual melewati scoping changed
dan memaksa shard Linux Node, shard bundled-plugin, kontrak channel,
kompatibilitas Node 22, `check`, `check-additional`, build smoke,
pemeriksaan docs, Skills Python, Windows, macOS, Android, dan lane i18n Control UI.
- `smoke`: jalur instal/channel/agent, jaringan Gateway, dan reload konfigurasi
- `package`: jalur paket/pembaruan/Plugin native artefak tanpa OpenWebUI atau ClawHub live
- `product`: profil paket ditambah channel MCP, pembersihan cron/subagent, pencarian web OpenAI, dan OpenWebUI
- `full`: chunk jalur rilis Docker dengan OpenWebUI
- `custom`: pilihan `docker_lanes` eksak untuk rerun terfokus
- Jalankan workflow manual `CI` secara langsung ketika Anda hanya membutuhkan cakupan CI normal penuh untuk kandidat rilis. Dispatch CI manual melewati scoping perubahan dan memaksa shard Linux Node, shard Plugin terbundel, kontrak channel, kompatibilitas Node 22, `check`, `check-additional`, build smoke, pemeriksaan docs, Skills Python, Windows, macOS, Android, dan jalur i18n Control UI.
Contoh: `gh workflow run ci.yml --ref release/YYYY.M.D`
- Jalankan `pnpm qa:otel:smoke` saat memvalidasi telemetri rilis. Perintah ini
melatih QA-lab melalui receiver OTLP/HTTP lokal dan memverifikasi nama span trace
yang diekspor, atribut yang dibatasi, serta redaksi konten/identifier tanpa
memerlukan Opik, Langfuse, atau collector eksternal lain.
- Jalankan `pnpm qa:otel:smoke` ketika memvalidasi telemetri rilis. Ini menjalankan QA-lab melalui penerima OTLP/HTTP lokal dan memverifikasi nama span trace yang diekspor, atribut terbatas, serta redaksi konten/identifier tanpa memerlukan Opik, Langfuse, atau kolektor eksternal lain.
- Jalankan `pnpm release:check` sebelum setiap rilis bertag
- Jalankan `OpenClaw Release Publish` untuk urutan publish yang melakukan mutasi setelah
tag tersedia. Dispatch dari `release/YYYY.M.D` (atau `main` saat mem-publish tag
yang dapat dijangkau dari main), berikan tag rilis dan
`preflight_run_id` npm OpenClaw yang sukses, dan pertahankan scope publish Plugin default
`all-publishable` kecuali Anda sengaja menjalankan perbaikan terfokus. Workflow
ini menserialkan publish npm Plugin, publish ClawHub Plugin, dan publish npm OpenClaw
agar paket core tidak dipublikasikan sebelum Plugin eksternalnya.
- Release checks sekarang berjalan dalam workflow manual terpisah:
- Jalankan `OpenClaw Release Publish` untuk urutan publikasi yang memutasi setelah tag ada. Dispatch dari `release/YYYY.M.D` (atau `main` ketika memublikasikan tag yang dapat dijangkau dari main), berikan tag rilis dan `preflight_run_id` npm OpenClaw yang berhasil, dan pertahankan scope publikasi Plugin default `all-publishable` kecuali Anda sengaja menjalankan perbaikan terfokus. Workflow menserialkan publikasi npm Plugin, publikasi ClawHub Plugin, dan publikasi npm OpenClaw agar paket inti tidak dipublikasikan sebelum Plugin eksternalnya.
- Pemeriksaan rilis sekarang berjalan dalam workflow manual terpisah:
`OpenClaw Release Checks`
- `OpenClaw Release Checks` juga menjalankan lane paritas mock QA Lab ditambah profil
Matrix live cepat dan lane QA Telegram sebelum persetujuan rilis. Lane live
menggunakan environment `qa-live-shared`; Telegram juga menggunakan lease kredensial
Convex CI. Jalankan workflow manual `QA-Lab - All Lanes` dengan
`matrix_profile=all` dan `matrix_shards=true` saat Anda menginginkan inventaris
transport Matrix, media, dan E2EE penuh secara paralel.
- Validasi runtime install dan upgrade lintas-OS adalah bagian dari
`OpenClaw Release Checks` publik dan `Full Release Validation`, yang memanggil
workflow reusable
`.github/workflows/openclaw-cross-os-release-checks-reusable.yml` secara langsung
- Pemisahan ini disengaja: pertahankan jalur rilis npm nyata tetap pendek,
deterministik, dan berfokus artefak, sementara pemeriksaan live yang lebih lambat
tetap berada di lane sendiri agar tidak menahan atau memblokir publish
- Release checks yang membawa secret harus didispatch melalui `Full Release
Validation` atau dari ref workflow `main`/release agar logika workflow dan
secret tetap terkendali
- `OpenClaw Release Checks` menerima branch, tag, atau SHA commit penuh selama
commit yang di-resolve dapat dijangkau dari branch OpenClaw atau tag rilis
- Preflight validation-only `OpenClaw NPM Release` juga menerima SHA commit
branch workflow 40 karakter penuh saat ini tanpa memerlukan tag yang sudah dipush
- Jalur SHA tersebut hanya untuk validasi dan tidak dapat dipromosikan menjadi publish nyata
- Dalam mode SHA, workflow mensintesis `v<package.json version>` hanya untuk
pemeriksaan metadata paket; publish nyata tetap memerlukan tag rilis nyata
- Kedua workflow mempertahankan jalur publish dan promosi nyata di runner
GitHub-hosted, sementara jalur validasi non-mutating dapat menggunakan runner
Linux Blacksmith yang lebih besar
- Workflow tersebut menjalankan
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
menggunakan secret workflow `OPENAI_API_KEY` dan `ANTHROPIC_API_KEY`
- Preflight rilis npm tidak lagi menunggu lane release checks terpisah
- Jalankan `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
(atau tag beta/koreksi yang cocok) sebelum persetujuan
- Setelah publish npm, jalankan
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`
(atau versi beta/koreksi yang cocok) untuk memverifikasi jalur install registry
yang dipublikasikan dalam prefix temp baru
- Setelah publish beta, jalankan `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-live`
untuk memverifikasi onboarding paket terinstal, setup Telegram, dan Telegram E2E nyata
terhadap paket npm yang dipublikasikan menggunakan pool kredensial Telegram leased bersama.
One-off maintainer lokal dapat menghilangkan var Convex dan memberikan tiga
kredensial env `OPENCLAW_QA_TELEGRAM_*` secara langsung.
- Maintainer dapat menjalankan pemeriksaan post-publish yang sama dari GitHub Actions melalui
workflow manual `NPM Telegram Beta E2E`. Workflow ini sengaja manual-only dan
tidak berjalan pada setiap merge.
- Otomasi rilis maintainer sekarang menggunakan preflight-lalu-promote:
- publish npm nyata harus lolos `preflight_run_id` npm yang sukses
- publish npm nyata harus didispatch dari branch `main` atau
`release/YYYY.M.D` yang sama dengan run preflight yang sukses
- `OpenClaw Release Checks` juga menjalankan jalur paritas mock QA Lab ditambah profil Matrix live cepat dan jalur QA Telegram sebelum persetujuan rilis. Jalur live menggunakan environment `qa-live-shared`; Telegram juga menggunakan lease kredensial CI Convex. Jalankan workflow manual `QA-Lab - All Lanes` dengan `matrix_profile=all` dan `matrix_shards=true` ketika Anda menginginkan inventaris transport Matrix, media, dan E2EE penuh secara paralel.
- Validasi runtime instal dan upgrade lintas-OS adalah bagian dari `OpenClaw Release Checks` dan `Full Release Validation` publik, yang memanggil workflow reusable `.github/workflows/openclaw-cross-os-release-checks-reusable.yml` secara langsung
- Pemisahan ini disengaja: jaga jalur rilis npm nyata tetap pendek, deterministik, dan berfokus pada artefak, sementara pemeriksaan live yang lebih lambat tetap berada di jalurnya sendiri agar tidak menunda atau memblokir publikasi
- Pemeriksaan rilis yang membawa secret harus didispatch melalui `Full Release Validation` atau dari ref workflow `main`/rilis agar logika workflow dan secret tetap terkendali
- `OpenClaw Release Checks` menerima branch, tag, atau SHA commit lengkap selama commit yang diselesaikan dapat dijangkau dari branch OpenClaw atau tag rilis
- Preflight khusus validasi `OpenClaw NPM Release` juga menerima SHA commit branch-workflow 40 karakter penuh saat ini tanpa memerlukan tag yang sudah dipush
- Jalur SHA tersebut hanya untuk validasi dan tidak dapat dipromosikan menjadi publikasi nyata
- Dalam mode SHA, workflow mensintesis `v<package.json version>` hanya untuk pemeriksaan metadata paket; publikasi nyata tetap memerlukan tag rilis nyata
- Kedua workflow mempertahankan jalur publikasi dan promosi nyata pada runner yang di-host GitHub, sementara jalur validasi non-mutasi dapat menggunakan runner Blacksmith Linux yang lebih besar
- Workflow tersebut menjalankan `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache` menggunakan secret workflow `OPENAI_API_KEY` dan `ANTHROPIC_API_KEY`
- Preflight rilis npm tidak lagi menunggu jalur pemeriksaan rilis terpisah
- Jalankan `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts` (atau tag beta/koreksi yang sesuai) sebelum persetujuan
- Setelah publikasi npm, jalankan `node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D` (atau versi beta/koreksi yang sesuai) untuk memverifikasi jalur instal registry yang dipublikasikan dalam prefix temp baru
- Setelah publikasi beta, jalankan `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-live` untuk memverifikasi onboarding paket terinstal, penyiapan Telegram, dan Telegram E2E nyata terhadap paket npm yang dipublikasikan menggunakan pool kredensial Telegram lease bersama. One-off maintainer lokal dapat menghilangkan var Convex dan meneruskan tiga kredensial env `OPENCLAW_QA_TELEGRAM_*` secara langsung.
- Maintainer dapat menjalankan pemeriksaan pasca-publikasi yang sama dari GitHub Actions melalui workflow manual `NPM Telegram Beta E2E`. Ini sengaja hanya manual dan tidak berjalan pada setiap merge.
- Otomasi rilis maintainer sekarang menggunakan preflight-lalu-promosi:
- publikasi npm nyata harus lulus `preflight_run_id` npm yang berhasil
- publikasi npm nyata harus didispatch dari branch `main` atau `release/YYYY.M.D` yang sama dengan run preflight yang berhasil
- rilis npm stable default ke `beta`
- publish npm stable dapat menargetkan `latest` secara eksplisit melalui input workflow
- mutasi npm dist-tag berbasis token sekarang berada di
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
untuk keamanan, karena `npm dist-tag add` masih membutuhkan `NPM_TOKEN` sementara
repo publik mempertahankan publish OIDC-only
- `macOS Release` publik hanya untuk validasi; ketika tag hanya berada di
branch rilis tetapi workflow didispatch dari `main`, set
`public_release_branch=release/YYYY.M.D`
- publish mac privat nyata harus lolos
`preflight_run_id` dan `validate_run_id` mac privat yang sukses
- jalur publish nyata mempromosikan artefak yang sudah disiapkan, bukan
membuildnya lagi
- Untuk rilis koreksi stable seperti `YYYY.M.D-N`, verifier post-publish
juga memeriksa jalur upgrade temp-prefix yang sama dari `YYYY.M.D` ke `YYYY.M.D-N`
agar koreksi rilis tidak dapat diam-diam meninggalkan install global lama pada
payload stable dasar
- Preflight rilis npm gagal tertutup kecuali tarball menyertakan
`dist/control-ui/index.html` dan payload `dist/control-ui/assets/` yang tidak kosong
agar kita tidak mengirim dashboard browser kosong lagi
- Verifikasi post-publish juga memeriksa bahwa entrypoint Plugin yang dipublikasikan dan
metadata paket ada di layout registry yang terinstal. Rilis yang
mengirim payload runtime Plugin yang hilang menggagalkan verifier postpublish dan
tidak dapat dipromosikan ke `latest`.
- `pnpm test:install:smoke` juga menegakkan anggaran `unpackedSize` npm pack pada
tarball update kandidat, sehingga e2e installer menangkap pack bloat yang tidak disengaja
sebelum jalur publish rilis
- Jika pekerjaan rilis menyentuh perencanaan CI, manifest timing extension, atau
matriks pengujian extension, regenerasi dan tinjau output matriks
`plugin-prerelease-extension-shard` milik planner dari
`.github/workflows/plugin-prerelease.yml` sebelum persetujuan agar catatan rilis tidak
menggambarkan layout CI yang basi
- Kesiapan rilis macOS stable juga mencakup surface updater:
- release GitHub harus berakhir dengan `.zip`, `.dmg`, dan `.dSYM.zip` yang sudah dipaketkan
- `appcast.xml` di `main` harus menunjuk ke zip stable baru setelah publish
- app yang dipaketkan harus mempertahankan bundle id non-debug, URL feed Sparkle
yang tidak kosong, dan `CFBundleVersion` pada atau di atas floor build Sparkle kanonis
untuk versi rilis tersebut
- publikasi npm stable dapat menargetkan `latest` secara eksplisit melalui input workflow
- mutasi dist-tag npm berbasis token sekarang berada di `openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml` untuk keamanan, karena `npm dist-tag add` masih memerlukan `NPM_TOKEN` sementara repo publik mempertahankan publikasi hanya OIDC
- `macOS Release` publik hanya untuk validasi; ketika tag hanya berada di branch rilis tetapi workflow didispatch dari `main`, atur `public_release_branch=release/YYYY.M.D`
- publikasi mac privat nyata harus lulus `preflight_run_id` mac privat dan `validate_run_id` yang berhasil
- jalur publikasi nyata mempromosikan artefak yang sudah disiapkan, bukan membangunnya ulang
- Untuk rilis koreksi stable seperti `YYYY.M.D-N`, verifier pasca-publikasi juga memeriksa jalur upgrade temp-prefix yang sama dari `YYYY.M.D` ke `YYYY.M.D-N` agar koreksi rilis tidak diam-diam meninggalkan instal global lama pada payload stable dasar
- Preflight rilis npm gagal tertutup kecuali tarball menyertakan `dist/control-ui/index.html` dan payload `dist/control-ui/assets/` yang tidak kosong agar kita tidak mengirim dashboard browser kosong lagi
- Verifikasi pasca-publikasi juga memeriksa bahwa entrypoint Plugin yang dipublikasikan dan metadata paket ada dalam layout registry yang terinstal. Rilis yang mengirim payload runtime Plugin yang hilang menggagalkan verifier postpublish dan tidak dapat dipromosikan ke `latest`.
- `pnpm test:install:smoke` juga memberlakukan anggaran `unpackedSize` pack npm pada tarball pembaruan kandidat, sehingga e2e installer menangkap pembengkakan pack tidak disengaja sebelum jalur publikasi rilis
- Jika pekerjaan rilis menyentuh perencanaan CI, manifest timing ekstensi, atau matriks pengujian ekstensi, regenerasi dan tinjau output matriks `plugin-prerelease-extension-shard` milik planner dari `.github/workflows/plugin-prerelease.yml` sebelum persetujuan agar catatan rilis tidak mendeskripsikan layout CI yang basi
- Kesiapan rilis macOS stable juga mencakup permukaan updater:
- GitHub release harus berakhir dengan `.zip`, `.dmg`, dan `.dSYM.zip` yang sudah dipaketkan
- `appcast.xml` pada `main` harus menunjuk ke zip stable baru setelah publikasi
- aplikasi yang dipaketkan harus mempertahankan bundle id non-debug, URL feed Sparkle yang tidak kosong, dan `CFBundleVersion` pada atau di atas batas bawah build Sparkle kanonis untuk versi rilis tersebut
## Kotak pengujian rilis
`Full Release Validation` adalah cara operator memulai semua pengujian pra-rilis dari
satu entrypoint. Untuk bukti commit yang dipin pada branch yang bergerak cepat, gunakan
helper agar setiap workflow turunan berjalan dari branch sementara yang dikunci pada SHA
target:
`Full Release Validation` adalah cara operator memulai semua pengujian pra-rilis dari satu entrypoint. Untuk bukti commit yang dipin pada branch yang bergerak cepat, gunakan helper agar setiap child workflow berjalan dari branch sementara yang dikunci pada SHA target:
```bash
pnpm ci:full-release --sha <full-sha>
```
Helper mendorong `release-ci/<sha>-...`, mendispatch `Full Release Validation`
dari branch tersebut dengan `ref=<sha>`, memverifikasi setiap `headSha` workflow turunan
cocok dengan target, lalu menghapus branch sementara. Ini menghindari pembuktian
run turunan `main` yang lebih baru secara tidak sengaja.
Helper mendorong `release-ci/<sha>-...`, mendispatch `Full Release Validation` dari branch tersebut dengan `ref=<sha>`, memverifikasi setiap child workflow `headSha` cocok dengan target, lalu menghapus branch sementara. Ini menghindari pembuktian run child `main` yang lebih baru secara tidak sengaja.
Untuk validasi branch rilis atau tag, jalankan dari ref workflow `main` tepercaya
dan berikan branch rilis atau tag sebagai `ref`:
Untuk validasi branch atau tag rilis, jalankan dari ref workflow `main` tepercaya dan berikan branch atau tag rilis sebagai `ref`:
```bash
gh workflow run full-release-validation.yml \
@ -293,38 +178,44 @@ gh workflow run full-release-validation.yml \
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N
```
Alur kerja menyelesaikan ref target, menjalankan `CI` manual dengan
Alur kerja menyelesaikan ref target, menjalankan manual `CI` dengan
`target_ref=<release-ref>`, menjalankan `OpenClaw Release Checks`, dan menjalankan
paket mandiri Telegram E2E saat `release_profile=full` dengan
`rerun_group=all` atau saat `npm_telegram_package_spec` ditetapkan. `OpenClaw Release
Checks` lalu menyebar ke install smoke, pemeriksaan rilis lintas-OS, cakupan jalur rilis Docker live/E2E, Package Acceptance dengan QA paket Telegram, paritas QA Lab, Matrix live, dan Telegram live. Sebuah run penuh hanya dapat diterima ketika ringkasan
`Full Release Validation`
paket mandiri Telegram E2E ketika `release_profile=full` dengan
`rerun_group=all` atau ketika `npm_telegram_package_spec` diatur. `OpenClaw Release
Checks` kemudian menyebar ke install smoke, pemeriksaan rilis lintas-OS, cakupan
jalur rilis Docker live/E2E, Package Acceptance dengan QA paket Telegram, paritas
QA Lab, Matrix live, dan Telegram live. Proses penuh hanya dapat diterima ketika
ringkasan `Full Release Validation`
menampilkan `normal_ci` dan `release_checks` sebagai berhasil. Dalam mode full/all,
child `npm_telegram` juga harus berhasil; di luar full/all, ini dilewati
kecuali `npm_telegram_package_spec` yang telah dipublikasikan disediakan. Ringkasan
verifier akhir menyertakan tabel pekerjaan terlambat untuk setiap child run, sehingga manajer rilis dapat melihat jalur kritis saat ini tanpa mengunduh log.
turunan `npm_telegram` juga harus berhasil; di luar full/all, ini dilewati
kecuali `npm_telegram_package_spec` yang sudah dipublikasikan disediakan. Ringkasan
verifikator akhir menyertakan tabel job paling lambat untuk setiap proses turunan,
sehingga manajer rilis dapat melihat jalur kritis saat ini tanpa mengunduh log.
Lihat [Validasi rilis penuh](/id/reference/full-release-validation) untuk
matriks tahap lengkap, nama pekerjaan alur kerja yang tepat, perbedaan profil stabil versus penuh, artefak, dan handle rerun terfokus.
Alur kerja child dijalankan dari ref tepercaya yang menjalankan `Full Release
matriks tahap lengkap, nama job alur kerja yang tepat, perbedaan profil stabil
versus penuh, artefak, dan pegangan rerun terfokus.
Alur kerja turunan dijalankan dari ref tepercaya yang menjalankan `Full Release
Validation`, biasanya `--ref main`, bahkan ketika `ref` target menunjuk ke
cabang atau tag rilis yang lebih lama. Tidak ada input ref alur kerja Full Release Validation terpisah; pilih harness tepercaya dengan memilih ref run alur kerja.
Jangan gunakan `--ref main -f ref=<sha>` untuk bukti commit tepat pada `main` yang bergerak;
SHA commit mentah tidak dapat menjadi ref workflow dispatch, jadi gunakan
`pnpm ci:full-release --sha <sha>` untuk membuat cabang sementara yang disematkan.
branch atau tag rilis yang lebih lama. Tidak ada input ref alur kerja Full Release Validation
terpisah; pilih harness tepercaya dengan memilih ref proses alur kerja.
Jangan gunakan `--ref main -f ref=<sha>` untuk bukti commit persis pada `main`
yang bergerak; SHA commit mentah tidak dapat menjadi ref dispatch alur kerja, jadi gunakan
`pnpm ci:full-release --sha <sha>` untuk membuat branch sementara yang dipin.
Gunakan `release_profile` untuk memilih keluasan live/provider:
Gunakan `release_profile` untuk memilih cakupan live/penyedia:
- `minimum`: jalur OpenAI/core live dan Docker yang paling cepat dan kritis untuk rilis
- `stable`: minimum ditambah cakupan provider/backend stabil untuk persetujuan rilis
- `full`: stable ditambah cakupan luas provider/media bersifat advisori
- `minimum`: jalur live OpenAI/core dan Docker paling cepat yang kritis untuk rilis
- `stable`: minimum ditambah cakupan penyedia/backend stabil untuk persetujuan rilis
- `full`: stable ditambah cakupan penyedia/media advisory yang luas
`OpenClaw Release Checks` menggunakan ref alur kerja tepercaya untuk menyelesaikan ref target
sekali sebagai `release-package-under-test` dan menggunakan kembali artefak itu dalam pemeriksaan Docker jalur rilis dan Package Acceptance. Ini menjaga semua
box yang menghadap paket berada pada byte yang sama dan menghindari build paket berulang.
OpenAI install smoke lintas-OS menggunakan `OPENCLAW_CROSS_OS_OPENAI_MODEL` saat
variabel repo/org ditetapkan, jika tidak `openai/gpt-5.4`, karena lane ini
membuktikan instalasi paket, onboarding, startup gateway, dan satu putaran agen live
bukan membandingkan model default paling lambat. Matriks provider live yang lebih luas
sekali sebagai `release-package-under-test` dan menggunakan kembali artefak itu dalam
pemeriksaan Docker jalur rilis maupun Package Acceptance. Ini menjaga semua
box yang menghadap paket pada byte yang sama dan menghindari build paket berulang.
Install smoke OpenAI lintas-OS menggunakan `OPENCLAW_CROSS_OS_OPENAI_MODEL` ketika
variabel repo/org diatur, jika tidak `openai/gpt-5.4`, karena lane ini
membuktikan instalasi paket, onboarding, startup Gateway, dan satu giliran agen live
alih-alih membenchmark model default paling lambat. Matriks penyedia live yang lebih luas
tetap menjadi tempat untuk cakupan khusus model.
Gunakan varian ini tergantung tahap rilis:
@ -357,38 +248,38 @@ gh workflow run full-release-validation.yml \
-f npm_telegram_provider_mode=mock-openai
```
Jangan gunakan umbrella penuh sebagai rerun pertama setelah perbaikan terfokus. Jika satu box
gagal, gunakan alur kerja child, pekerjaan, lane Docker, profil paket, provider model,
atau lane QA yang gagal untuk bukti berikutnya. Jalankan umbrella penuh lagi hanya ketika
Jangan gunakan payung penuh sebagai rerun pertama setelah perbaikan terfokus. Jika satu box
gagal, gunakan alur kerja turunan yang gagal, job, lane Docker, profil paket, penyedia
model, atau lane QA untuk bukti berikutnya. Jalankan payung penuh lagi hanya ketika
perbaikan mengubah orkestrasi rilis bersama atau membuat bukti semua-box sebelumnya
menjadi usang. Verifier akhir umbrella memeriksa ulang id run alur kerja child
yang tercatat, jadi setelah alur kerja child berhasil dijalankan ulang, jalankan ulang hanya pekerjaan parent
menjadi usang. Verifikator akhir payung memeriksa ulang id proses alur kerja turunan
yang tercatat, jadi setelah alur kerja turunan berhasil dijalankan ulang, jalankan ulang hanya job induk
`Verify full validation` yang gagal.
Untuk pemulihan terbatas, teruskan `rerun_group` ke umbrella. `all` adalah run
kandidat rilis yang sebenarnya, `ci` hanya menjalankan child CI normal, `plugin-prerelease`
hanya menjalankan child plugin khusus rilis, `release-checks` menjalankan setiap box rilis,
Untuk pemulihan berbatas, berikan `rerun_group` ke payung. `all` adalah proses
kandidat rilis yang sebenarnya, `ci` hanya menjalankan turunan CI normal, `plugin-prerelease`
hanya menjalankan turunan Plugin khusus rilis, `release-checks` menjalankan setiap box rilis,
dan grup rilis yang lebih sempit adalah `install-smoke`, `cross-os`,
`live-e2e`, `package`, `qa`, `qa-parity`, `qa-live`, dan `npm-telegram`.
Rerun `npm-telegram` terfokus memerlukan `npm_telegram_package_spec`; run full/all
Rerun `npm-telegram` terfokus memerlukan `npm_telegram_package_spec`; proses full/all
dengan `release_profile=full` menggunakan artefak paket release-checks.
### Vitest
Box Vitest adalah alur kerja child `CI` manual. CI manual sengaja
melewati cakupan changed dan memaksa grafik pengujian normal untuk kandidat rilis:
shard Linux Node, shard plugin bundel, kontrak channel, kompatibilitas Node 22,
`check`, `check-additional`, build smoke, pemeriksaan dokumen, Python
skills, Windows, macOS, Android, dan Control UI i18n.
Box Vitest adalah alur kerja turunan manual `CI`. CI manual sengaja
melewati cakupan perubahan dan memaksa graf pengujian normal untuk kandidat rilis:
shard Linux Node, shard Plugin bawaan, kontrak channel, kompatibilitas Node 22,
`check`, `check-additional`, build smoke, pemeriksaan docs, Skills Python, Windows,
macOS, Android, dan i18n Control UI.
Gunakan box ini untuk menjawab "apakah source tree lulus suite pengujian normal penuh?"
Ini tidak sama dengan validasi produk jalur rilis. Bukti yang perlu disimpan:
- ringkasan `Full Release Validation` yang menampilkan URL run `CI` yang dijalankan
- run `CI` hijau pada SHA target yang tepat
- nama shard yang gagal atau lambat dari pekerjaan CI saat menyelidiki regresi
- artefak timing Vitest seperti `.artifacts/vitest-shard-timings.json` saat
sebuah run membutuhkan analisis performa
- ringkasan `Full Release Validation` yang menampilkan URL proses `CI` yang dijalankan
- proses `CI` hijau pada SHA target yang persis
- nama shard yang gagal atau lambat dari job CI saat menyelidiki regresi
- artefak waktu Vitest seperti `.artifacts/vitest-shard-timings.json` ketika
sebuah proses memerlukan analisis performa
Jalankan CI manual secara langsung hanya ketika rilis membutuhkan CI normal deterministik tetapi
bukan box Docker, QA Lab, live, lintas-OS, atau paket:
@ -404,11 +295,11 @@ Box Docker berada di `OpenClaw Release Checks` melalui
`install-smoke` mode rilis. Ini memvalidasi kandidat rilis melalui lingkungan
Docker terpaket, bukan hanya pengujian tingkat sumber.
Cakupan Docker rilis mencakup:
Cakupan Docker rilis meliputi:
- install smoke penuh dengan slow Bun global install smoke diaktifkan
- persiapan/penggunaan ulang image smoke Dockerfile root berdasarkan SHA target, dengan pekerjaan QR,
root/gateway, dan installer/Bun smoke berjalan sebagai shard install-smoke terpisah
- install smoke penuh dengan smoke install global Bun yang lambat diaktifkan
- persiapan/penggunaan ulang image smoke Dockerfile root berdasarkan SHA target, dengan QR,
root/Gateway, dan job smoke installer/Bun berjalan sebagai shard install-smoke terpisah
- lane E2E repositori
- chunk Docker jalur rilis: `core`, `package-update-openai`,
`package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`,
@ -417,56 +308,56 @@ Cakupan Docker rilis mencakup:
`plugins-runtime-install-c`, `plugins-runtime-install-d`,
`plugins-runtime-install-e`, `plugins-runtime-install-f`,
`plugins-runtime-install-g`, dan `plugins-runtime-install-h`
- cakupan OpenWebUI di dalam chunk `plugins-runtime-services` saat diminta
- lane install/uninstall plugin bundel yang dipisah
- cakupan OpenWebUI di dalam chunk `plugins-runtime-services` ketika diminta
- lane install/uninstall Plugin bawaan yang dipisah
`bundled-plugin-install-uninstall-0` hingga
`bundled-plugin-install-uninstall-23`
- suite provider live/E2E dan cakupan model live Docker saat pemeriksaan rilis
- suite penyedia live/E2E dan cakupan model live Docker ketika release checks
menyertakan suite live
Gunakan artefak Docker sebelum menjalankan ulang. Scheduler jalur rilis mengunggah
Gunakan artefak Docker sebelum rerun. Penjadwal jalur rilis mengunggah
`.artifacts/docker-tests/` dengan log lane, `summary.json`, `failures.json`,
timing fase, JSON rencana scheduler, dan perintah rerun. Untuk pemulihan terfokus,
gunakan `docker_lanes=<lane[,lane]>` pada alur kerja live/E2E reusable alih-alih
waktu fase, JSON rencana penjadwal, dan perintah rerun. Untuk pemulihan terfokus,
gunakan `docker_lanes=<lane[,lane]>` pada alur kerja reusable live/E2E alih-alih
menjalankan ulang semua chunk rilis. Perintah rerun yang dihasilkan menyertakan
`package_artifact_run_id` sebelumnya dan input image Docker yang disiapkan jika tersedia, sehingga
`package_artifact_run_id` sebelumnya dan input image Docker yang disiapkan ketika tersedia, sehingga
lane yang gagal dapat menggunakan kembali tarball dan image GHCR yang sama.
### QA Lab
Box QA Lab juga merupakan bagian dari `OpenClaw Release Checks`. Ini adalah gate rilis
perilaku agen dan tingkat channel, terpisah dari mekanika paket Vitest dan Docker.
perilaku agenik dan tingkat channel, terpisah dari mekanik paket Vitest dan Docker.
Cakupan QA Lab rilis mencakup:
Cakupan QA Lab rilis meliputi:
- lane paritas mock yang membandingkan lane kandidat OpenAI dengan baseline Opus 4.6
menggunakan paket paritas agen
menggunakan paket paritas agenik
- profil QA Matrix live cepat menggunakan lingkungan `qa-live-shared`
- lane QA Telegram live menggunakan lease kredensial CI Convex
- `pnpm qa:otel:smoke` saat telemetri rilis membutuhkan bukti lokal eksplisit
- lane QA Telegram live menggunakan lease kredensial Convex CI
- `pnpm qa:otel:smoke` ketika telemetri rilis memerlukan bukti lokal eksplisit
Gunakan box ini untuk menjawab "apakah rilis berperilaku benar dalam skenario QA dan
alur channel live?" Simpan URL artefak untuk lane paritas, Matrix, dan Telegram
saat menyetujui rilis. Cakupan Matrix penuh tetap tersedia sebagai run QA-Lab shard manual,
bukan lane kritis rilis default.
saat menyetujui rilis. Cakupan Matrix penuh tetap tersedia sebagai proses QA-Lab
sharded manual, bukan lane default yang kritis untuk rilis.
### Package
### Paket
Box Package adalah gate produk yang dapat diinstal. Ini didukung oleh
Box Paket adalah gate produk yang dapat diinstal. Ini didukung oleh
`Package Acceptance` dan resolver
`scripts/resolve-openclaw-package-candidate.mjs`. Resolver menormalkan
kandidat menjadi tarball `package-under-test` yang dikonsumsi oleh Docker E2E, memvalidasi
inventaris paket, mencatat versi paket dan SHA-256, serta menjaga
ref harness alur kerja terpisah dari ref sumber paket.
`scripts/resolve-openclaw-package-candidate.mjs`. Resolver menormalisasi
kandidat menjadi tarball `package-under-test` yang digunakan oleh Docker E2E, memvalidasi
inventaris paket, mencatat versi paket dan SHA-256, serta menjaga ref harness
alur kerja tetap terpisah dari ref sumber paket.
Sumber kandidat yang didukung:
- `source=npm`: `openclaw@beta`, `openclaw@latest`, atau versi rilis OpenClaw
yang tepat
- `source=ref`: pack cabang, tag, atau SHA commit penuh `package_ref` tepercaya
yang persis
- `source=ref`: kemas branch, tag, atau SHA commit penuh `package_ref` tepercaya
dengan harness `workflow_ref` yang dipilih
- `source=url`: unduh `.tgz` HTTPS dengan `package_sha256` yang wajib
- `source=artifact`: gunakan kembali `.tgz` yang diunggah oleh run GitHub Actions lain
- `source=url`: unduh `.tgz` HTTPS dengan `package_sha256` wajib
- `source=artifact`: gunakan kembali `.tgz` yang diunggah oleh proses GitHub Actions lain
`OpenClaw Release Checks` menjalankan Package Acceptance dengan `source=artifact`, artefak
paket rilis yang disiapkan, `suite_profile=custom`,
@ -474,35 +365,34 @@ paket rilis yang disiapkan, `suite_profile=custom`,
`published_upgrade_survivor_baselines=all-since-2026.4.23`,
`published_upgrade_survivor_scenarios=reported-issues`, dan
`telegram_mode=mock-openai`. Package Acceptance menjaga migrasi, pembaruan, pembersihan
dependensi plugin usang, fixture plugin offline, pembaruan plugin, dan QA paket Telegram
dependensi Plugin usang, fixture Plugin offline, pembaruan Plugin, dan QA paket Telegram
terhadap tarball terselesaikan yang sama. Matriks upgrade mencakup setiap baseline stabil yang dipublikasikan npm dari `2026.4.23` hingga `latest`; gunakan
Package Acceptance dengan `source=npm` untuk kandidat yang sudah dikirimkan, atau
Package Acceptance dengan `source=npm` untuk kandidat yang sudah dikirim, atau
`source=ref`/`source=artifact` untuk tarball npm lokal berbasis SHA sebelum
publish. Ini adalah pengganti native GitHub
untuk sebagian besar cakupan paket/pembaruan yang sebelumnya memerlukan
Parallels. Pemeriksaan rilis lintas-OS tetap penting untuk onboarding,
installer, dan perilaku platform khusus OS, tetapi validasi produk paket/pembaruan sebaiknya
memilih Package Acceptance.
Parallels. Pemeriksaan rilis lintas-OS tetap penting untuk onboarding khusus OS,
installer, dan perilaku platform, tetapi validasi produk paket/pembaruan sebaiknya
mengutamakan Package Acceptance.
Checklist kanonis untuk validasi pembaruan dan plugin adalah
[Menguji pembaruan dan plugin](/id/help/testing-updates-plugins). Gunakan ini saat
memutuskan lane lokal, Docker, Package Acceptance, atau release-check mana yang membuktikan
instal/update plugin, pembersihan doctor, atau perubahan migrasi paket yang dipublikasikan.
Checklist kanonis untuk validasi pembaruan dan Plugin adalah
[Menguji pembaruan dan Plugin](/id/help/testing-updates-plugins). Gunakan ini saat
menentukan lane lokal, Docker, Package Acceptance, atau release-check mana yang membuktikan
instalasi/pembaruan Plugin, pembersihan doctor, atau perubahan migrasi paket yang dipublikasikan.
Migrasi pembaruan yang dipublikasikan secara menyeluruh dari setiap paket stabil `2026.4.23+` adalah
alur kerja manual `Update Migration` terpisah, bukan bagian dari Full Release CI.
Kelonggaran package-acceptance lama sengaja dibatasi waktu. Paket hingga
`2026.4.25` dapat menggunakan jalur kompatibilitas untuk celah metadata yang sudah dipublikasikan
ke npm: entri inventaris QA privat yang hilang dari tarball, `gateway install --wrapper`
yang hilang, file patch yang hilang dalam fixture git turunan tarball,
`update.channel` tersimpan yang hilang, lokasi install-record plugin lama,
persistensi install-record marketplace yang hilang, dan migrasi metadata konfigurasi
selama `plugins update`. Paket `2026.4.26` yang dipublikasikan dapat memperingatkan
untuk file stempel metadata build lokal yang sudah dikirimkan. Paket setelahnya
harus memenuhi kontrak paket modern; celah yang sama tersebut menggagalkan validasi
rilis.
yang hilang, file patch yang hilang di fixture git turunan tarball, `update.channel`
persisten yang hilang, lokasi catatan instalasi Plugin lama, persistensi catatan instalasi
marketplace yang hilang, dan migrasi metadata konfigurasi selama `plugins update`. Paket
`2026.4.26` yang dipublikasikan dapat memberi peringatan untuk file cap metadata build lokal
yang sudah dikirim. Paket berikutnya harus memenuhi kontrak paket modern; celah yang sama
menggagalkan validasi rilis.
Gunakan profil Package Acceptance yang lebih luas ketika pertanyaan rilis berkaitan dengan
Gunakan profil Package Acceptance yang lebih luas ketika pertanyaan rilis adalah tentang
paket aktual yang dapat diinstal:
```bash
@ -517,30 +407,32 @@ gh workflow run package-acceptance.yml \
Profil paket umum:
- `smoke`: lane cepat instalasi paket/channel/agen, jaringan gateway, dan muat ulang konfigurasi
- `package`: kontrak paket instalasi/pembaruan/plugin tanpa ClawHub live; ini adalah default release-check
- `product`: `package` ditambah channel MCP, pembersihan cron/subagen, pencarian web OpenAI,
dan OpenWebUI
- `smoke`: lane instalasi paket/channel/agen cepat, jaringan Gateway, dan reload
konfigurasi
- `package`: kontrak instalasi/pembaruan/Plugin paket tanpa ClawHub live; ini adalah default
release-check
- `product`: `package` ditambah channel MCP, pembersihan cron/subagen, pencarian web
OpenAI, dan OpenWebUI
- `full`: chunk jalur rilis Docker dengan OpenWebUI
- `custom`: daftar `docker_lanes` tepat untuk rerun terfokus
- `custom`: daftar `docker_lanes` persis untuk rerun terfokus
Untuk bukti Telegram kandidat paket, aktifkan `telegram_mode=mock-openai` atau
`telegram_mode=live-frontier` pada Package Acceptance. Alur kerja meneruskan tarball
`package-under-test` yang telah diselesaikan ke lane Telegram; alur kerja Telegram
mandiri masih menerima spesifikasi npm yang sudah dipublikasikan untuk pemeriksaan pascapublikasi.
Untuk pembuktian Telegram kandidat paket, aktifkan `telegram_mode=mock-openai` atau
`telegram_mode=live-frontier` pada Package Acceptance. Workflow meneruskan tarball
`package-under-test` yang telah di-resolve ke lane Telegram; workflow Telegram
mandiri tetap menerima spesifikasi npm yang sudah dipublikasikan untuk pemeriksaan pascapublikasi.
## Otomasi publikasi rilis
## Otomatisasi publikasi rilis
`OpenClaw Release Publish` adalah titik masuk publikasi bermutasi yang normal. Ini
mengorkestrasi alur kerja trusted-publisher sesuai urutan yang dibutuhkan rilis:
`OpenClaw Release Publish` adalah entrypoint publikasi bermutasi yang normal. Ini
mengorkestrasi workflow trusted-publisher dalam urutan yang dibutuhkan rilis:
1. Check out tag rilis dan selesaikan SHA commit-nya.
2. Verifikasi bahwa tag dapat dijangkau dari `main` atau `release/*`.
1. Check out tag rilis dan resolve SHA commit-nya.
2. Verifikasi tag dapat dijangkau dari `main` atau `release/*`.
3. Jalankan `pnpm plugins:sync:check`.
4. Dispatch `Plugin NPM Release` dengan `publish_scope=all-publishable` dan
`ref=<release-sha>`.
5. Dispatch `Plugin ClawHub Release` dengan scope dan SHA yang sama.
6. Dispatch `OpenClaw NPM Release` dengan tag rilis, dist-tag npm, dan
5. Dispatch `Plugin ClawHub Release` dengan cakupan dan SHA yang sama.
6. Dispatch `OpenClaw NPM Release` dengan tag rilis, npm dist-tag, dan
`preflight_run_id` yang tersimpan.
Contoh publikasi beta:
@ -553,16 +445,6 @@ gh workflow run openclaw-release-publish.yml \
-f npm_dist_tag=beta
```
Contoh publikasi alfa:
```bash
gh workflow run openclaw-release-publish.yml \
--ref release/YYYY.M.D \
-f tag=vYYYY.M.D-alpha.N \
-f preflight_run_id=<successful-openclaw-npm-preflight-run-id> \
-f npm_dist_tag=alpha
```
Publikasi stabil ke dist-tag beta default:
```bash
@ -583,91 +465,90 @@ gh workflow run openclaw-release-publish.yml \
-f npm_dist_tag=latest
```
Gunakan alur kerja tingkat lebih rendah `Plugin NPM Release` dan `Plugin ClawHub Release`
hanya untuk pekerjaan perbaikan atau publikasi ulang yang terfokus. Untuk perbaikan plugin
terpilih, berikan `plugin_publish_scope=selected` dan `plugins=@openclaw/name` ke
`OpenClaw Release Publish`, atau dispatch alur kerja anak secara langsung ketika paket
Gunakan workflow tingkat lebih rendah `Plugin NPM Release` dan `Plugin ClawHub Release`
hanya untuk pekerjaan perbaikan atau publikasi ulang yang terfokus. Untuk perbaikan Plugin terpilih, teruskan
`plugin_publish_scope=selected` dan `plugins=@openclaw/name` ke
`OpenClaw Release Publish`, atau dispatch workflow anak secara langsung ketika paket
OpenClaw tidak boleh dipublikasikan.
## Input alur kerja NPM
## Input workflow NPM
`OpenClaw NPM Release` menerima input yang dikendalikan operator berikut:
- `tag`: tag rilis wajib seperti `v2026.4.2`, `v2026.4.2-1`, atau
`v2026.4.2-alpha.1` atau `v2026.4.2-beta.1`; ketika `preflight_only=true`, ini juga boleh berupa
SHA commit lengkap 40 karakter saat ini dari cabang alur kerja untuk preflight khusus validasi
- `preflight_only`: `true` hanya untuk validasi/build/paket, `false` untuk
jalur publikasi sebenarnya
- `preflight_run_id`: wajib pada jalur publikasi sebenarnya agar alur kerja memakai ulang
tarball yang sudah disiapkan dari run preflight yang berhasil
- `npm_dist_tag`: tag target npm untuk jalur publikasi; default ke `beta`
`v2026.4.2-beta.1`; ketika `preflight_only=true`, ini juga dapat berupa SHA commit
branch workflow 40 karakter penuh saat ini untuk preflight khusus validasi
- `preflight_only`: `true` hanya untuk validasi/build/paket, `false` untuk jalur
publikasi sebenarnya
- `preflight_run_id`: wajib pada jalur publikasi sebenarnya agar workflow menggunakan kembali
tarball yang disiapkan dari proses preflight yang berhasil
- `npm_dist_tag`: tag target npm untuk jalur publikasi; default-nya `beta`
`OpenClaw Release Publish` menerima input yang dikendalikan operator berikut:
- `tag`: tag rilis wajib; harus sudah ada
- `preflight_run_id`: id run preflight `OpenClaw NPM Release` yang berhasil;
- `preflight_run_id`: id proses preflight `OpenClaw NPM Release` yang berhasil;
wajib ketika `publish_openclaw_npm=true`
- `npm_dist_tag`: tag target npm untuk paket OpenClaw
- `plugin_publish_scope`: default ke `all-publishable`; gunakan `selected` hanya
- `plugin_publish_scope`: default-nya `all-publishable`; gunakan `selected` hanya
untuk pekerjaan perbaikan yang terfokus
- `plugins`: nama paket `@openclaw/*` yang dipisahkan koma ketika
`plugin_publish_scope=selected`
- `publish_openclaw_npm`: default ke `true`; atur `false` hanya ketika menggunakan
alur kerja sebagai orkestrator perbaikan khusus plugin
- `publish_openclaw_npm`: default-nya `true`; atur `false` hanya ketika menggunakan
workflow sebagai orkestrator perbaikan khusus Plugin
`OpenClaw Release Checks` menerima input yang dikendalikan operator berikut:
- `ref`: cabang, tag, atau SHA commit lengkap yang akan divalidasi. Pemeriksaan yang
membawa secret mensyaratkan commit yang diselesaikan dapat dijangkau dari cabang
OpenClaw atau tag rilis.
- `ref`: branch, tag, atau SHA commit penuh yang akan divalidasi. Pemeriksaan yang membawa secret
mengharuskan commit yang di-resolve dapat dijangkau dari branch OpenClaw atau
tag rilis.
Aturan:
- Tag stabil dan koreksi boleh dipublikasikan ke `beta` atau `latest`
- Tag prarilis alfa hanya boleh dipublikasikan ke `alpha`
- Tag stabil dan koreksi dapat dipublikasikan ke `beta` atau `latest`
- Tag prarilis beta hanya boleh dipublikasikan ke `beta`
- Untuk `OpenClaw NPM Release`, input SHA commit lengkap hanya diizinkan ketika
- Untuk `OpenClaw NPM Release`, input SHA commit penuh hanya diizinkan ketika
`preflight_only=true`
- `OpenClaw Release Checks` dan `Full Release Validation` selalu
hanya validasi
- Jalur publikasi sebenarnya harus menggunakan `npm_dist_tag` yang sama dengan yang digunakan saat preflight;
alur kerja memverifikasi metadata tersebut sebelum publikasi berlanjut
hanya untuk validasi
- Jalur publikasi sebenarnya harus menggunakan `npm_dist_tag` yang sama dengan yang digunakan selama preflight;
workflow memverifikasi metadata tersebut sebelum publikasi berlanjut
## Urutan rilis npm stabil
Saat membuat rilis npm stabil:
1. Jalankan `OpenClaw NPM Release` dengan `preflight_only=true`
- Sebelum tag ada, Anda boleh menggunakan SHA commit lengkap saat ini dari cabang alur kerja
untuk dry run khusus validasi atas alur kerja preflight
2. Pilih `npm_dist_tag=beta` untuk alur normal beta terlebih dahulu, atau `latest` hanya
- Sebelum tag ada, Anda dapat menggunakan SHA commit branch workflow penuh saat ini
untuk dry run khusus validasi dari workflow preflight
2. Pilih `npm_dist_tag=beta` untuk alur normal beta-terlebih-dahulu, atau `latest` hanya
ketika Anda sengaja menginginkan publikasi stabil langsung
3. Jalankan `Full Release Validation` pada cabang rilis, tag rilis, atau SHA
commit lengkap ketika Anda menginginkan CI normal plus cakupan live prompt cache, Docker, QA Lab,
Matrix, dan Telegram dari satu alur kerja manual
4. Jika Anda sengaja hanya membutuhkan graf pengujian normal deterministik, jalankan
alur kerja `CI` manual pada ref rilis sebagai gantinya
3. Jalankan `Full Release Validation` pada branch rilis, tag rilis, atau SHA
commit penuh ketika Anda menginginkan CI normal ditambah cakupan live prompt cache, Docker, QA Lab,
Matrix, dan Telegram dari satu workflow manual
4. Jika Anda sengaja hanya membutuhkan graph pengujian normal yang deterministik, jalankan
workflow manual `CI` pada ref rilis sebagai gantinya
5. Simpan `preflight_run_id` yang berhasil
6. Jalankan `OpenClaw Release Publish` dengan `tag` yang sama, `npm_dist_tag` yang sama,
dan `preflight_run_id` yang tersimpan; ini memublikasikan plugin yang dieksternalisasi ke npm
dan `preflight_run_id` yang tersimpan; ini memublikasikan Plugin yang dieksternalisasi ke npm
dan ClawHub sebelum mempromosikan paket npm OpenClaw
7. Jika rilis mendarat di `beta`, gunakan alur kerja privat
7. Jika rilis mendarat di `beta`, gunakan workflow privat
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
untuk mempromosikan versi stabil tersebut dari `beta` ke `latest`
8. Jika rilis sengaja dipublikasikan langsung ke `latest` dan `beta`
harus segera mengikuti build stabil yang sama, gunakan alur kerja privat yang sama
untuk mengarahkan kedua dist-tag ke versi stabil, atau biarkan sinkronisasi self-healing
terjadwalnya memindahkan `beta` nanti
harus segera mengikuti build stabil yang sama, gunakan workflow privat yang sama
untuk mengarahkan kedua dist-tag ke versi stabil, atau biarkan sinkronisasi
self-healing terjadwalnya memindahkan `beta` nanti
Mutasi dist-tag berada di repo privat demi keamanan karena masih
memerlukan `NPM_TOKEN`, sementara repo publik mempertahankan publikasi hanya OIDC.
Itu membuat jalur publikasi langsung dan jalur promosi beta terlebih dahulu sama-sama
Itu membuat jalur publikasi langsung dan jalur promosi beta-terlebih-dahulu sama-sama
terdokumentasi dan terlihat oleh operator.
Jika maintainer harus fallback ke autentikasi npm lokal, jalankan perintah CLI 1Password
(`op`) apa pun hanya di dalam sesi tmux khusus. Jangan panggil `op`
langsung dari shell agen utama; menjaganya di dalam tmux membuat prompt,
(`op`) hanya di dalam sesi tmux khusus. Jangan panggil `op`
langsung dari shell agen utama; menyimpannya di dalam tmux membuat prompt,
peringatan, dan penanganan OTP dapat diamati serta mencegah peringatan host berulang.
## Referensi publik

View File

@ -1,25 +1,25 @@
---
read_when:
- Anda ingin mengoperasikan Gateway dari peramban
- Anda ingin mengoperasikan Gateway dari browser
- Anda menginginkan akses Tailnet tanpa tunnel SSH
sidebarTitle: Control UI
summary: Antarmuka kontrol berbasis browser untuk Gateway (obrolan, node, konfigurasi)
summary: UI kontrol berbasis browser untuk Gateway (obrolan, simpul, konfigurasi)
title: Antarmuka Kontrol
x-i18n:
generated_at: "2026-05-02T21:01:46Z"
generated_at: "2026-05-02T23:39:14Z"
model: gpt-5.5
provider: openai
source_hash: 88959ccf435b31015039bf28c3043023d99f0b953a1489986ab2d0cbd261771c
source_hash: 50bef807915f27406e19f1c6ca7d839a610d79ba79da85d7a78523400cbf9208
source_path: web/control-ui.md
workflow: 16
---
UI Kontrol adalah aplikasi satu halaman kecil berbasis **Vite + Lit** yang disajikan oleh Gateway:
Control UI adalah aplikasi satu halaman kecil berbasis **Vite + Lit** yang disajikan oleh Gateway:
- default: `http://<host>:18789/`
- prefiks opsional: atur `gateway.controlUi.basePath` (misalnya `/openclaw`)
- prefiks opsional: atur `gateway.controlUi.basePath` (mis. `/openclaw`)
Aplikasi ini berbicara **langsung ke WebSocket Gateway** pada port yang sama.
Aplikasi ini berkomunikasi **langsung dengan Gateway WebSocket** pada port yang sama.
## Buka cepat (lokal)
@ -27,22 +27,22 @@ Jika Gateway berjalan di komputer yang sama, buka:
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (atau [http://localhost:18789/](http://localhost:18789/))
Jika halaman gagal dimuat, mulai Gateway terlebih dahulu: `openclaw gateway`.
Jika halaman gagal dimuat, jalankan Gateway terlebih dahulu: `openclaw gateway`.
Auth disediakan selama handshake WebSocket melalui:
Auth diberikan selama handshake WebSocket melalui:
- `connect.params.auth.token`
- `connect.params.auth.password`
- header identitas Tailscale Serve saat `gateway.auth.allowTailscale: true`
- header identitas proxy tepercaya saat `gateway.auth.mode: "trusted-proxy"`
- header identitas trusted-proxy saat `gateway.auth.mode: "trusted-proxy"`
Panel pengaturan dasbor menyimpan token untuk sesi tab browser saat ini dan URL gateway yang dipilih; kata sandi tidak dipertahankan. Onboarding biasanya menghasilkan token gateway untuk auth rahasia bersama pada koneksi pertama, tetapi auth kata sandi juga berfungsi saat `gateway.auth.mode` adalah `"password"`.
## Pemasangan perangkat (koneksi pertama)
## Pairing perangkat (koneksi pertama)
Saat Anda terhubung ke UI Kontrol dari browser atau perangkat baru, Gateway biasanya memerlukan **persetujuan pemasangan satu kali**. Ini adalah langkah keamanan untuk mencegah akses tanpa izin.
Saat Anda terhubung ke Control UI dari browser atau perangkat baru, Gateway biasanya memerlukan **persetujuan pairing satu kali**. Ini adalah langkah keamanan untuk mencegah akses tanpa izin.
**Yang akan Anda lihat:** "terputus (1008): pemasangan diperlukan"
**Yang akan Anda lihat:** "disconnected (1008): pairing required"
<Steps>
<Step title="Cantumkan permintaan tertunda">
@ -57,159 +57,161 @@ Saat Anda terhubung ke UI Kontrol dari browser atau perangkat baru, Gateway bias
</Step>
</Steps>
Jika browser mencoba ulang pemasangan dengan detail auth yang berubah (peran/cakupan/kunci publik), permintaan tertunda sebelumnya digantikan dan `requestId` baru dibuat. Jalankan ulang `openclaw devices list` sebelum persetujuan.
Jika browser mencoba ulang pairing dengan detail auth yang berubah (peran/cakupan/kunci publik), permintaan tertunda sebelumnya akan digantikan dan `requestId` baru dibuat. Jalankan ulang `openclaw devices list` sebelum menyetujui.
Jika browser sudah dipasangkan dan Anda mengubahnya dari akses baca menjadi akses tulis/admin, ini diperlakukan sebagai peningkatan persetujuan, bukan koneksi ulang diam-diam. OpenClaw menjaga persetujuan lama tetap aktif, memblokir koneksi ulang yang lebih luas, dan meminta Anda menyetujui kumpulan cakupan baru secara eksplisit.
Jika browser sudah dipasangkan dan Anda mengubahnya dari akses baca menjadi akses tulis/admin, ini diperlakukan sebagai peningkatan persetujuan, bukan koneksi ulang diam-diam. OpenClaw mempertahankan persetujuan lama tetap aktif, memblokir koneksi ulang yang lebih luas, dan meminta Anda menyetujui kumpulan cakupan baru secara eksplisit.
Setelah disetujui, perangkat akan diingat dan tidak akan memerlukan persetujuan ulang kecuali Anda mencabutnya dengan `openclaw devices revoke --device <id> --role <role>`. Lihat [CLI Perangkat](/id/cli/devices) untuk rotasi dan pencabutan token.
<Note>
- Koneksi browser local loopback langsung (`127.0.0.1` / `localhost`) disetujui otomatis.
- Tailscale Serve dapat melewati perjalanan bolak-balik pemasangan untuk sesi operator UI Kontrol saat `gateway.auth.allowTailscale: true`, identitas Tailscale terverifikasi, dan browser menyajikan identitas perangkatnya.
- Binding Tailnet langsung, koneksi browser LAN, dan profil browser tanpa identitas perangkat tetap memerlukan persetujuan eksplisit.
- Setiap profil browser menghasilkan ID perangkat unik, jadi berganti browser atau menghapus data browser akan memerlukan pemasangan ulang.
- Tailscale Serve dapat melewati perjalanan bolak-balik pairing untuk sesi operator Control UI saat `gateway.auth.allowTailscale: true`, identitas Tailscale terverifikasi, dan browser menampilkan identitas perangkatnya.
- Bind Tailnet langsung, koneksi browser LAN, dan profil browser tanpa identitas perangkat tetap memerlukan persetujuan eksplisit.
- Setiap profil browser menghasilkan ID perangkat unik, jadi mengganti browser atau menghapus data browser akan memerlukan pairing ulang.
</Note>
## Identitas pribadi (lokal browser)
UI Kontrol mendukung identitas pribadi per browser (nama tampilan dan avatar) yang dilampirkan ke pesan keluar untuk atribusi dalam sesi bersama. Identitas ini berada di penyimpanan browser, dicakup ke profil browser saat ini, dan tidak disinkronkan ke perangkat lain atau dipertahankan di sisi server selain metadata kepengarangan transkrip normal pada pesan yang benar-benar Anda kirim. Menghapus data situs atau berganti browser akan mengaturnya kembali menjadi kosong.
Control UI mendukung identitas pribadi per browser (nama tampilan dan avatar) yang dilampirkan ke pesan keluar untuk atribusi dalam sesi bersama. Identitas ini berada di penyimpanan browser, dicakup ke profil browser saat ini, dan tidak disinkronkan ke perangkat lain atau dipertahankan di sisi server selain metadata kepengarangan transkrip normal pada pesan yang benar-benar Anda kirim. Menghapus data situs atau mengganti browser akan meresetnya menjadi kosong.
Pola lokal browser yang sama berlaku untuk override avatar asisten. Avatar asisten yang diunggah melapisi identitas yang di-resolve gateway hanya pada browser lokal dan tidak pernah bolak-balik melalui `config.patch`. Kolom konfigurasi bersama `ui.assistant.avatar` tetap tersedia untuk klien non-UI yang menulis kolom tersebut secara langsung (seperti gateway terskrip atau dasbor khusus).
Pola lokal browser yang sama berlaku untuk override avatar asisten. Avatar asisten yang diunggah menimpa identitas yang diselesaikan gateway hanya pada browser lokal dan tidak pernah melakukan round-trip melalui `config.patch`. Field config bersama `ui.assistant.avatar` tetap tersedia untuk klien non-UI yang menulis field tersebut secara langsung (seperti gateway berskrip atau dasbor kustom).
## Endpoint konfigurasi runtime
## Endpoint config runtime
UI Kontrol mengambil pengaturan runtime-nya dari `/__openclaw/control-ui-config.json`. Endpoint tersebut dijaga oleh auth gateway yang sama seperti permukaan HTTP lainnya: browser yang tidak terautentikasi tidak dapat mengambilnya, dan pengambilan yang berhasil memerlukan token/kata sandi gateway yang sudah valid, identitas Tailscale Serve, atau identitas proxy tepercaya.
Control UI mengambil pengaturan runtimenya dari `/__openclaw/control-ui-config.json`. Endpoint tersebut dijaga oleh auth gateway yang sama seperti bagian HTTP lainnya: browser yang tidak terautentikasi tidak dapat mengambilnya, dan pengambilan yang berhasil memerlukan token/kata sandi gateway yang sudah valid, identitas Tailscale Serve, atau identitas trusted-proxy.
## Dukungan bahasa
UI Kontrol dapat melokalkan dirinya sendiri saat pemuatan pertama berdasarkan locale browser Anda. Untuk menimpanya nanti, buka **Ikhtisar -> Akses Gateway -> Bahasa**. Pemilih locale berada di kartu Akses Gateway, bukan di bawah Tampilan.
Control UI dapat melokalkan dirinya saat pemuatan pertama berdasarkan lokal browser Anda. Untuk mengubahnya nanti, buka **Overview -> Gateway Access -> Language**. Pemilih lokal berada di kartu Gateway Access, bukan di bawah Appearance.
- Locale yang didukung: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
- Terjemahan non-Inggris dimuat secara malas di browser.
- Locale yang dipilih disimpan di penyimpanan browser dan digunakan ulang pada kunjungan mendatang.
- Kunci terjemahan yang hilang kembali ke bahasa Inggris.
- Lokal yang didukung: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
- Terjemahan non-Inggris dimuat secara lazy di browser.
- Lokal yang dipilih disimpan di penyimpanan browser dan digunakan kembali pada kunjungan berikutnya.
- Kunci terjemahan yang hilang fallback ke bahasa Inggris.
Terjemahan dokumen dibuat untuk set locale non-Inggris yang sama, tetapi pemilih bahasa bawaan situs dokumen Mintlify terbatas pada kode locale yang diterima Mintlify. Dokumen Thai (`th`) dan Persian (`fa`) tetap dibuat di repo publikasi; keduanya mungkin belum muncul di pemilih tersebut sampai Mintlify mendukung kode-kode itu.
Terjemahan dokumen dibuat untuk set lokal non-Inggris yang sama, tetapi pemilih bahasa bawaan situs dokumen Mintlify terbatas pada kode lokal yang diterima Mintlify. Dokumen Thai (`th`) dan Persian (`fa`) tetap dibuat di repo publikasi; keduanya mungkin tidak muncul di pemilih tersebut sampai Mintlify mendukung kode-kode itu.
## Tema tampilan
Panel Tampilan mempertahankan tema bawaan Claw, Knot, dan Dash, ditambah satu slot impor tweakcn lokal browser. Untuk mengimpor tema, buka [tema tweakcn](https://tweakcn.com/themes), pilih atau buat tema, klik **Bagikan**, dan tempel tautan tema yang disalin ke Tampilan. Pengimpor juga menerima URL registry `https://tweakcn.com/r/themes/<id>`, URL editor seperti `https://tweakcn.com/editor/theme?theme=amethyst-haze`, path relatif `/themes/<id>`, ID tema mentah, dan nama tema default seperti `amethyst-haze`.
Panel Appearance mempertahankan tema bawaan Claw, Knot, dan Dash, ditambah satu slot impor tweakcn lokal browser. Untuk mengimpor tema, buka [tema tweakcn](https://tweakcn.com/themes), pilih atau buat tema, klik **Share**, lalu tempel tautan tema yang disalin ke Appearance. Pengimpor juga menerima URL registri `https://tweakcn.com/r/themes/<id>`, URL editor seperti `https://tweakcn.com/editor/theme?theme=amethyst-haze`, path relatif `/themes/<id>`, ID tema mentah, dan nama tema default seperti `amethyst-haze`.
Tema yang diimpor hanya disimpan di profil browser saat ini. Tema tersebut tidak ditulis ke konfigurasi gateway dan tidak disinkronkan antarperangkat. Mengganti tema yang diimpor akan memperbarui satu slot lokal; menghapusnya mengalihkan tema aktif kembali ke Claw jika tema yang diimpor sedang dipilih.
Tema yang diimpor hanya disimpan di profil browser saat ini. Tema tidak ditulis ke config gateway dan tidak disinkronkan antarperangkat. Mengganti tema yang diimpor akan memperbarui satu slot lokal; menghapusnya mengalihkan tema aktif kembali ke Claw jika tema yang diimpor sedang dipilih.
## Yang dapat dilakukan (saat ini)
## Yang dapat dilakukannya (saat ini)
<AccordionGroup>
<Accordion title="Chat dan Bicara">
- Chat dengan model melalui Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Bicara melalui sesi realtime browser. OpenAI menggunakan WebRTC langsung, Google Live menggunakan token browser sekali pakai terbatas melalui WebSocket, dan plugin suara realtime khusus backend menggunakan transport relai Gateway. Relai menjaga kredensial provider di Gateway sementara browser melakukan streaming PCM mikrofon melalui RPC `talk.realtime.relay*` dan mengirim panggilan alat `openclaw_agent_consult` kembali melalui `chat.send` untuk model OpenClaw terkonfigurasi yang lebih besar.
- Streaming panggilan alat + kartu output alat langsung di Chat (event agen).
- Dikte ke komposer Chat dengan STT sisi server (`chat.transcribeAudio`). Browser merekam klip mikrofon pendek dan mengirimkannya ke Gateway, yang menjalankan pipeline transkripsi `tools.media.audio` yang dikonfigurasi dan mengembalikan teks draf tanpa mengekspos kredensial penyedia ke browser.
- Bicara melalui sesi realtime browser. OpenAI menggunakan WebRTC langsung, Google Live menggunakan token browser sekali pakai terbatas melalui WebSocket, dan plugin suara realtime khusus backend menggunakan transport relay Gateway. Relay mempertahankan kredensial penyedia di Gateway sementara browser melakukan streaming PCM mikrofon melalui RPC `talk.realtime.relay*` dan mengirim panggilan alat `openclaw_agent_consult` kembali melalui `chat.send` untuk model OpenClaw lebih besar yang dikonfigurasi.
- Streaming panggilan alat + kartu output alat live di Chat (event agen).
</Accordion>
<Accordion title="Channel, instans, sesi, dream">
- Channel: status channel bawaan plus plugin bundled/eksternal, login QR, dan konfigurasi per channel (`channels.status`, `web.login.*`, `config.patch`).
- Channel: status channel bawaan serta channel plugin bundel/eksternal, login QR, dan config per channel (`channels.status`, `web.login.*`, `config.patch`).
- Instans: daftar kehadiran + refresh (`system-presence`).
- Sesi: daftar + override model/thinking/fast/verbose/trace/reasoning per sesi (`sessions.list`, `sessions.patch`).
- Dream: status dreaming, toggle aktifkan/nonaktifkan, dan pembaca Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
- Dream: status dreaming, toggle aktif/nonaktif, dan pembaca Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
</Accordion>
<Accordion title="Cron, Skills, Node, persetujuan exec">
- Pekerjaan Cron: daftar/tambah/edit/jalankan/aktifkan/nonaktifkan + riwayat eksekusi (`cron.*`).
- Skills: status, aktifkan/nonaktifkan, pasang, pembaruan kunci API (`skills.*`).
<Accordion title="Cron, skills, node, persetujuan exec">
- Job Cron: daftar/tambah/edit/jalankan/aktifkan/nonaktifkan + riwayat eksekusi (`cron.*`).
- Skills: status, aktifkan/nonaktifkan, instal, pembaruan kunci API (`skills.*`).
- Node: daftar + kapabilitas (`node.list`).
- Persetujuan exec: edit daftar izinkan gateway atau node + kebijakan tanya untuk `exec host=gateway/node` (`exec.approvals.*`).
- Persetujuan exec: edit allowlist gateway atau node + kebijakan tanya untuk `exec host=gateway/node` (`exec.approvals.*`).
</Accordion>
<Accordion title="Konfigurasi">
<Accordion title="Config">
- Lihat/edit `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
- Terapkan + mulai ulang dengan validasi (`config.apply`) dan bangunkan sesi aktif terakhir.
- Penulisan menyertakan penjaga hash dasar untuk mencegah penimpaan edit serentak.
- Penulisan (`config.set`/`config.apply`/`config.patch`) melakukan preflight resolusi SecretRef aktif untuk ref dalam payload konfigurasi yang dikirimkan; ref aktif yang dikirimkan dan tidak dapat di-resolve ditolak sebelum penulisan.
- Skema + rendering formulir (`config.schema` / `config.schema.lookup`, termasuk `title` / `description` kolom, hint UI yang cocok, ringkasan anak langsung, metadata dokumen pada node objek bertingkat/wildcard/array/komposisi, plus skema plugin + channel jika tersedia); editor JSON mentah hanya tersedia saat snapshot memiliki round-trip mentah yang aman.
- Jika snapshot tidak dapat melakukan round-trip teks mentah dengan aman, UI Kontrol memaksa mode Formulir dan menonaktifkan mode Mentah untuk snapshot tersebut.
- Editor JSON mentah "Reset ke tersimpan" mempertahankan bentuk yang ditulis mentah (pemformatan, komentar, tata letak `$include`) alih-alih merender ulang snapshot yang diratakan, sehingga edit eksternal tetap bertahan setelah reset saat snapshot dapat melakukan round-trip dengan aman.
- Nilai objek SecretRef terstruktur dirender baca-saja dalam input teks formulir untuk mencegah kerusakan objek-ke-string yang tidak disengaja.
- Penulisan menyertakan guard hash dasar untuk mencegah penimpaan edit bersamaan.
- Penulisan (`config.set`/`config.apply`/`config.patch`) melakukan preflight resolusi SecretRef aktif untuk ref dalam payload config yang dikirim; ref terkirim aktif yang tidak terselesaikan ditolak sebelum penulisan.
- Schema + rendering formulir (`config.schema` / `config.schema.lookup`, termasuk field `title` / `description`, hint UI yang cocok, ringkasan child langsung, metadata dokumen pada node objek bertingkat/wildcard/array/komposisi, plus schema plugin + channel saat tersedia); editor Raw JSON hanya tersedia saat snapshot memiliki round-trip mentah yang aman.
- Jika snapshot tidak dapat melakukan round-trip teks mentah dengan aman, Control UI memaksa mode Form dan menonaktifkan mode Raw untuk snapshot tersebut.
- Editor Raw JSON "Reset to saved" mempertahankan bentuk yang ditulis mentah (format, komentar, tata letak `$include`) alih-alih merender ulang snapshot yang diratakan, sehingga edit eksternal tetap bertahan setelah reset saat snapshot dapat melakukan round-trip dengan aman.
- Nilai objek SecretRef terstruktur dirender hanya-baca dalam input teks formulir untuk mencegah kerusakan objek-ke-string yang tidak disengaja.
</Accordion>
<Accordion title="Debug, log, pembaruan">
- Debug: snapshot status/health/model + log event + panggilan RPC manual (`status`, `health`, `models.list`).
- Log: tail langsung log file gateway dengan filter/ekspor (`logs.tail`).
- Pembaruan: jalankan pembaruan paket/git + mulai ulang (`update.run`) dengan laporan mulai ulang, lalu polling `update.status` setelah koneksi ulang untuk memverifikasi versi gateway yang berjalan.
- Log: tail live log file gateway dengan filter/ekspor (`logs.tail`).
- Pembaruan: jalankan pembaruan package/git + mulai ulang (`update.run`) dengan laporan mulai ulang, lalu polling `update.status` setelah koneksi ulang untuk memverifikasi versi gateway yang sedang berjalan.
</Accordion>
<Accordion title="Catatan panel pekerjaan Cron">
- Untuk pekerjaan terisolasi, pengiriman default adalah mengumumkan ringkasan. Anda dapat beralih ke none jika menginginkan eksekusi hanya internal.
- Kolom channel/target muncul saat announce dipilih.
<Accordion title="Catatan panel job Cron">
- Untuk job terisolasi, delivery default adalah mengumumkan ringkasan. Anda dapat mengalihkannya ke none jika menginginkan eksekusi hanya internal.
- Field channel/target muncul saat announce dipilih.
- Mode Webhook menggunakan `delivery.mode = "webhook"` dengan `delivery.to` diatur ke URL webhook HTTP(S) yang valid.
- Untuk pekerjaan sesi utama, mode pengiriman webhook dan none tersedia.
- Kontrol edit lanjutan mencakup hapus-setelah-jalan, hapus override agen, opsi cron exact/stagger, override model/thinking agen, dan toggle pengiriman best-effort.
- Validasi formulir bersifat inline dengan error tingkat kolom; nilai tidak valid menonaktifkan tombol simpan sampai diperbaiki.
- Untuk job sesi utama, mode delivery webhook dan none tersedia.
- Kontrol edit lanjutan mencakup delete-after-run, hapus override agen, opsi cron exact/stagger, override model/thinking agen, dan toggle delivery best-effort.
- Validasi formulir bersifat inline dengan error tingkat field; nilai yang tidak valid menonaktifkan tombol simpan sampai diperbaiki.
- Atur `cron.webhookToken` untuk mengirim token bearer khusus; jika dihilangkan, webhook dikirim tanpa header auth.
- Fallback usang: pekerjaan legacy tersimpan dengan `notify: true` masih dapat menggunakan `cron.webhook` sampai dimigrasikan.
- Fallback usang: job lama yang tersimpan dengan `notify: true` masih dapat menggunakan `cron.webhook` sampai dimigrasikan.
</Accordion>
</AccordionGroup>
## Perilaku chat
## Perilaku Chat
<AccordionGroup>
<Accordion title="Send and history semantics">
- `chat.send` bersifat **non-blocking**: langsung mengirim ack dengan `{ runId, status: "started" }` dan respons dialirkan melalui peristiwa `chat`.
- Unggahan chat menerima gambar serta file non-video. Gambar mempertahankan jalur gambar native; file lain disimpan sebagai media terkelola dan ditampilkan dalam riwayat sebagai tautan lampiran.
- Mengirim ulang dengan `idempotencyKey` yang sama mengembalikan `{ status: "in_flight" }` saat masih berjalan, dan `{ status: "ok" }` setelah selesai.
- Respons `chat.history` dibatasi ukurannya demi keamanan UI. Saat entri transkrip terlalu besar, Gateway dapat memangkas kolom teks yang panjang, menghilangkan blok metadata berat, dan mengganti pesan berukuran terlalu besar dengan placeholder (`[chat.history omitted: message too large]`).
- Gambar assistant/yang dihasilkan dipertahankan sebagai referensi media terkelola dan disajikan kembali melalui URL media Gateway yang terautentikasi, sehingga pemuatan ulang tidak bergantung pada payload gambar base64 mentah yang tetap berada dalam respons riwayat chat.
- `chat.history` juga menghapus tag direktif inline khusus tampilan dari teks assistant yang terlihat (misalnya `[[reply_to_*]]` dan `[[audio_as_voice]]`), payload XML pemanggilan tool teks biasa (termasuk `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, dan blok pemanggilan tool yang terpangkas), serta token kontrol model ASCII/full-width yang bocor, dan menghilangkan entri assistant yang seluruh teks terlihatnya hanya token senyap persis `NO_REPLY` / `no_reply`.
- Selama pengiriman aktif dan refresh riwayat akhir, tampilan chat tetap menampilkan pesan user/assistant optimistis lokal jika `chat.history` sebentar mengembalikan snapshot yang lebih lama; transkrip kanonis menggantikan pesan lokal tersebut setelah riwayat Gateway menyusul.
- `chat.inject` menambahkan catatan assistant ke transkrip sesi dan menyiarkan peristiwa `chat` untuk pembaruan khusus UI (tanpa run agent, tanpa pengiriman channel).
- Picker model dan thinking di header chat langsung menambal sesi aktif melalui `sessions.patch`; keduanya adalah override sesi persisten, bukan opsi kirim sekali giliran.
<Accordion title="Semantik pengiriman dan riwayat">
- `chat.send` bersifat **non-blocking**: langsung mengakui dengan `{ runId, status: "started" }` dan respons mengalir melalui peristiwa `chat`.
- `chat.transcribeAudio` adalah pembantu dikte sekali jalan untuk draf Chat. Ini menerima audio base64 yang direkam browser, menjaga unggahan tetap di bawah batas bingkai WebSocket Gateway, menulis file lokal sementara, menjalankan transkripsi audio pemahaman-media dengan konfigurasi Gateway aktif, mengembalikan `{ text, provider, model }`, dan menghapus file sementara. Ini tidak membuat agent run dan terpisah dari Talk realtime.
- Unggahan Chat menerima gambar serta file non-video. Gambar mempertahankan jalur gambar native; file lain disimpan sebagai media terkelola dan ditampilkan dalam riwayat sebagai tautan lampiran.
- Mengirim ulang dengan `idempotencyKey` yang sama mengembalikan `{ status: "in_flight" }` saat berjalan, dan `{ status: "ok" }` setelah selesai.
- Respons `chat.history` dibatasi ukurannya demi keamanan UI. Ketika entri transkrip terlalu besar, Gateway dapat memotong field teks panjang, menghilangkan blok metadata berat, dan mengganti pesan yang terlalu besar dengan placeholder (`[chat.history omitted: message too large]`).
- Gambar assistant/yang dihasilkan dipersistenkan sebagai referensi media terkelola dan disajikan kembali melalui URL media Gateway terautentikasi, sehingga pemuatan ulang tidak bergantung pada payload gambar base64 mentah yang tetap ada di respons riwayat chat.
- `chat.history` juga menghapus tag direktif inline khusus tampilan dari teks assistant yang terlihat (misalnya `[[reply_to_*]]` dan `[[audio_as_voice]]`), payload XML pemanggilan tool teks polos (termasuk `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, dan blok pemanggilan tool yang terpotong), serta token kontrol model ASCII/lebar-penuh yang bocor, dan menghilangkan entri assistant yang seluruh teks terlihatnya hanya token senyap persis `NO_REPLY` / `no_reply`.
- Selama pengiriman aktif dan penyegaran riwayat akhir, tampilan chat mempertahankan pesan lokal optimistis dari pengguna/assistant tetap terlihat jika `chat.history` sebentar mengembalikan snapshot yang lebih lama; transkrip kanonis menggantikan pesan lokal tersebut setelah riwayat Gateway menyusul.
- `chat.inject` menambahkan catatan assistant ke transkrip sesi dan menyiarkan peristiwa `chat` untuk pembaruan khusus UI (tanpa agent run, tanpa pengiriman channel).
- Pemilih model dan thinking di header chat segera mem-patch sesi aktif melalui `sessions.patch`; keduanya adalah override sesi persisten, bukan opsi pengiriman satu giliran saja.
- Mengetik `/new` di Control UI membuat dan beralih ke sesi dashboard baru yang sama seperti New Chat. Mengetik `/reset` mempertahankan reset eksplisit di tempat milik Gateway untuk sesi saat ini.
- Picker model chat meminta tampilan model yang dikonfigurasi Gateway. Jika `agents.defaults.models` ada, allowlist tersebut mengendalikan picker. Jika tidak, picker menampilkan entri eksplisit `models.providers.*.models` plus penyedia dengan auth yang dapat digunakan. Katalog lengkap tetap tersedia melalui RPC debug `models.list` dengan `view: "all"`.
- Saat laporan penggunaan sesi Gateway baru menunjukkan tekanan konteks yang tinggi, area composer chat menampilkan pemberitahuan konteks dan, pada level Compaction yang direkomendasikan, tombol ringkas yang menjalankan jalur Compaction sesi normal. Snapshot token usang disembunyikan hingga Gateway melaporkan penggunaan baru lagi.
- Pemilih model chat meminta tampilan model yang dikonfigurasi Gateway. Jika `agents.defaults.models` ada, allowlist tersebut menggerakkan pemilih. Jika tidak, pemilih menampilkan entri eksplisit `models.providers.*.models` plus provider dengan auth yang dapat digunakan. Katalog lengkap tetap tersedia melalui RPC debug `models.list` dengan `view: "all"`.
- Ketika laporan penggunaan sesi Gateway baru menunjukkan tekanan konteks yang tinggi, area komposer chat menampilkan pemberitahuan konteks dan, pada level Compaction yang direkomendasikan, tombol ringkas yang menjalankan jalur Compaction sesi normal. Snapshot token usang disembunyikan sampai Gateway kembali melaporkan penggunaan baru.
</Accordion>
<Accordion title="Talk mode (browser realtime)">
Mode bicara menggunakan penyedia suara realtime terdaftar. Konfigurasikan OpenAI dengan `talk.provider: "openai"` plus `talk.providers.openai.apiKey`, atau konfigurasikan Google dengan `talk.provider: "google"` plus `talk.providers.google.apiKey`; konfigurasi penyedia realtime Voice Call masih dapat digunakan ulang sebagai fallback. Browser tidak pernah menerima kunci API penyedia standar. OpenAI menerima secret klien Realtime sementara untuk WebRTC. Google Live menerima token auth Live API terbatas sekali pakai untuk sesi WebSocket browser, dengan instruksi dan deklarasi tool yang dikunci ke dalam token oleh Gateway. Penyedia yang hanya mengekspos bridge realtime backend berjalan melalui transport relay Gateway, sehingga kredensial dan soket vendor tetap berada di sisi server sementara audio browser bergerak melalui RPC Gateway yang terautentikasi. Prompt sesi Realtime dirakit oleh Gateway; `talk.realtime.session` tidak menerima override instruksi yang diberikan pemanggil.
<Accordion title="Mode Talk (realtime browser)">
Mode Talk menggunakan provider suara realtime terdaftar. Konfigurasikan OpenAI dengan `talk.provider: "openai"` plus `talk.providers.openai.apiKey`, atau konfigurasikan Google dengan `talk.provider: "google"` plus `talk.providers.google.apiKey`; konfigurasi provider realtime Voice Call masih dapat digunakan kembali sebagai fallback. Browser tidak pernah menerima kunci API provider standar. OpenAI menerima rahasia klien Realtime sementara untuk WebRTC. Google Live menerima token auth Live API terbatas sekali pakai untuk sesi WebSocket browser, dengan instruksi dan deklarasi tool dikunci ke dalam token oleh Gateway. Provider yang hanya mengekspos bridge realtime backend berjalan melalui transport relay Gateway, sehingga kredensial dan soket vendor tetap di sisi server sementara audio browser bergerak melalui RPC Gateway terautentikasi. Prompt sesi Realtime dirakit oleh Gateway; `talk.realtime.session` tidak menerima override instruksi yang disediakan pemanggil.
Di composer Chat, kontrol Talk adalah tombol gelombang di sebelah tombol dikte mikrofon. Saat Talk dimulai, baris status composer menampilkan `Connecting Talk...`, lalu `Talk live` saat audio tersambung, atau `Asking OpenClaw...` saat pemanggilan tool realtime sedang berkonsultasi dengan model lebih besar yang dikonfigurasi melalui `chat.send`.
Di komposer Chat, kontrol Talk adalah tombol gelombang di sebelah tombol dikte mikrofon. Saat Talk dimulai, baris status komposer menampilkan `Connecting Talk...`, lalu `Talk live` ketika audio tersambung, atau `Asking OpenClaw...` saat pemanggilan tool realtime sedang berkonsultasi dengan model yang lebih besar yang dikonfigurasi melalui `chat.send`.
Smoke live maintainer: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` memverifikasi pertukaran SDP WebRTC browser OpenAI, penyiapan WebSocket browser token terbatas Google Live, dan adaptor browser relay Gateway dengan media mikrofon palsu. Perintah hanya mencetak status penyedia dan tidak mencatat secret.
Smoke live maintainer: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` memverifikasi pertukaran SDP WebRTC browser OpenAI, penyiapan WebSocket browser token-terbatas Google Live, dan adaptor browser relay Gateway dengan media mikrofon palsu. Perintah ini hanya mencetak status provider dan tidak mencatat secret.
</Accordion>
<Accordion title="Stop and abort">
<Accordion title="Hentikan dan batalkan">
- Klik **Stop** (memanggil `chat.abort`).
- Saat run aktif, follow-up normal akan masuk antrean. Klik **Steer** pada pesan yang diantrekan untuk menyuntikkan follow-up tersebut ke giliran yang sedang berjalan.
- Ketik `/stop` (atau frasa abort mandiri seperti `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) untuk membatalkan di luar jalur.
- Saat run aktif, tindak lanjut normal masuk antrean. Klik **Steer** pada pesan yang diantrekan untuk menyuntikkan tindak lanjut tersebut ke giliran yang sedang berjalan.
- Ketik `/stop` (atau frasa pembatalan mandiri seperti `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) untuk membatalkan di luar band.
- `chat.abort` mendukung `{ sessionKey }` (tanpa `runId`) untuk membatalkan semua run aktif untuk sesi tersebut.
</Accordion>
<Accordion title="Abort partial retention">
- Saat run dibatalkan, teks assistant parsial masih dapat ditampilkan di UI.
- Gateway mempertahankan teks assistant parsial yang dibatalkan ke riwayat transkrip saat output buffered ada.
- Entri yang dipertahankan menyertakan metadata abort sehingga konsumen transkrip dapat membedakan parsial abort dari output penyelesaian normal.
<Accordion title="Retensi parsial pembatalan">
- Ketika run dibatalkan, teks assistant parsial masih dapat ditampilkan di UI.
- Gateway mempersistenkan teks assistant parsial yang dibatalkan ke riwayat transkrip ketika output yang dibuffer ada.
- Entri yang dipersistenkan menyertakan metadata pembatalan sehingga konsumen transkrip dapat membedakan parsial pembatalan dari output penyelesaian normal.
</Accordion>
</AccordionGroup>
## Instalasi PWA dan web push
## Instal PWA dan web push
Control UI menyertakan `manifest.webmanifest` dan service worker, sehingga browser modern dapat memasangnya sebagai PWA mandiri. Web Push memungkinkan Gateway membangunkan PWA yang terpasang dengan notifikasi bahkan saat tab atau jendela browser tidak terbuka.
Control UI menyertakan `manifest.webmanifest` dan service worker, sehingga browser modern dapat menginstalnya sebagai PWA mandiri. Web Push memungkinkan Gateway membangunkan PWA terpasang dengan notifikasi bahkan ketika tab atau jendela browser tidak terbuka.
| Permukaan | Fungsinya |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
| `ui/public/manifest.webmanifest` | Manifest PWA. Browser menawarkan "Install app" setelah dapat dijangkau. |
| `ui/public/sw.js` | Service worker yang menangani peristiwa `push` dan klik notifikasi. |
| `push/vapid-keys.json` (di bawah direktori state OpenClaw) | Pasangan kunci VAPID yang dibuat otomatis untuk menandatangani payload Web Push. |
| `push/web-push-subscriptions.json` | Endpoint langganan browser yang dipertahankan. |
| `push/vapid-keys.json` (di bawah direktori state OpenClaw) | Keypair VAPID yang dibuat otomatis untuk menandatangani payload Web Push. |
| `push/web-push-subscriptions.json` | Endpoint langganan browser yang dipersistenkan. |
Override pasangan kunci VAPID melalui env var pada proses Gateway saat Anda ingin menetapkan kunci (untuk deployment multi-host, rotasi secret, atau pengujian):
Override keypair VAPID melalui env var pada proses Gateway saat Anda ingin menetapkan kunci (untuk deployment multi-host, rotasi secret, atau pengujian):
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT` (default ke `mailto:openclaw@localhost`)
Control UI menggunakan metode Gateway yang dibatasi scope ini untuk mendaftarkan dan menguji langganan browser:
Control UI menggunakan metode Gateway yang dibatasi cakupan ini untuk mendaftarkan dan menguji langganan browser:
- `push.web.vapidPublicKey` — mengambil kunci publik VAPID aktif.
- `push.web.subscribe` — mendaftarkan `endpoint` plus `keys.p256dh`/`keys.auth`.
@ -217,21 +219,21 @@ Control UI menggunakan metode Gateway yang dibatasi scope ini untuk mendaftarkan
- `push.web.test` — mengirim notifikasi uji ke langganan pemanggil.
<Note>
Web Push bersifat independen dari jalur relay APNS iOS (lihat [Configuration](/id/gateway/configuration) untuk push berbasis relay) dan metode `push.test` yang ada, yang menargetkan pairing mobile native.
Web Push independen dari jalur relay APNS iOS (lihat [Konfigurasi](/id/gateway/configuration) untuk push berbasis relay) dan metode `push.test` yang sudah ada, yang menargetkan pairing mobile native.
</Note>
## Embed ter-hosting
## Embed yang dihosting
Pesan assistant dapat merender konten web ter-hosting secara inline dengan shortcode `[embed ...]`. Kebijakan sandbox iframe dikendalikan oleh `gateway.controlUi.embedSandbox`:
Pesan assistant dapat merender konten web yang dihosting secara inline dengan shortcode `[embed ...]`. Kebijakan sandbox iframe dikontrol oleh `gateway.controlUi.embedSandbox`:
<Tabs>
<Tab title="strict">
Menonaktifkan eksekusi skrip di dalam embed ter-hosting.
<Tab title="ketat">
Menonaktifkan eksekusi script di dalam embed yang dihosting.
</Tab>
<Tab title="scripts (default)">
Mengizinkan embed interaktif sambil mempertahankan isolasi origin; ini adalah default dan biasanya cukup untuk game/widget browser mandiri.
</Tab>
<Tab title="trusted">
<Tab title="tepercaya">
Menambahkan `allow-same-origin` di atas `allow-scripts` untuk dokumen same-site yang memang membutuhkan privilege lebih kuat.
</Tab>
</Tabs>
@ -249,14 +251,14 @@ Contoh:
```
<Warning>
Gunakan `trusted` hanya saat dokumen tertanam benar-benar membutuhkan perilaku same-origin. Untuk sebagian besar game yang dihasilkan agent dan kanvas interaktif, `scripts` adalah pilihan yang lebih aman.
Gunakan `trusted` hanya ketika dokumen yang di-embed benar-benar membutuhkan perilaku same-origin. Untuk sebagian besar game dan kanvas interaktif yang dibuat agent, `scripts` adalah pilihan yang lebih aman.
</Warning>
URL embed eksternal absolut `http(s)` tetap diblokir secara default. Jika Anda memang ingin `[embed url="https://..."]` memuat halaman pihak ketiga, setel `gateway.controlUi.allowExternalEmbedUrls: true`.
URL embed eksternal absolut `http(s)` tetap diblokir secara default. Jika Anda sengaja ingin `[embed url="https://..."]` memuat halaman pihak ketiga, atur `gateway.controlUi.allowExternalEmbedUrls: true`.
## Lebar pesan chat
Pesan chat berkelompok menggunakan max-width default yang mudah dibaca. Deployment monitor lebar dapat meng-override-nya tanpa menambal CSS bawaan dengan menyetel `gateway.controlUi.chatMessageMaxWidth`:
Pesan chat yang dikelompokkan menggunakan max-width default yang mudah dibaca. Deployment monitor lebar dapat meng-override-nya tanpa menambal CSS bawaan dengan mengatur `gateway.controlUi.chatMessageMaxWidth`:
```json5
{
@ -268,13 +270,13 @@ Pesan chat berkelompok menggunakan max-width default yang mudah dibaca. Deployme
}
```
Nilai divalidasi sebelum mencapai browser. Nilai yang didukung mencakup panjang dan persentase polos seperti `960px` atau `82%`, plus ekspresi lebar terbatas `min(...)`, `max(...)`, `clamp(...)`, `calc(...)`, dan `fit-content(...)`.
Nilai divalidasi sebelum mencapai browser. Nilai yang didukung mencakup panjang polos dan persentase seperti `960px` atau `82%`, plus ekspresi lebar terbatas `min(...)`, `max(...)`, `clamp(...)`, `calc(...)`, dan `fit-content(...)`.
## Akses tailnet (direkomendasikan)
<Tabs>
<Tab title="Integrated Tailscale Serve (preferred)">
Pertahankan Gateway pada loopback dan biarkan Tailscale Serve mem-proxy-nya dengan HTTPS:
<Tab title="Tailscale Serve terintegrasi (disukai)">
Pertahankan Gateway di loopback dan biarkan Tailscale Serve mem-proxy-nya dengan HTTPS:
```bash
openclaw gateway --tailscale serve
@ -282,25 +284,25 @@ Nilai divalidasi sebelum mencapai browser. Nilai yang didukung mencakup panjang
Buka:
- `https://<magicdns>/` (atau `gateway.controlUi.basePath` yang Anda konfigurasi)
- `https://<magicdns>/` (atau `gateway.controlUi.basePath` yang Anda konfigurasikan)
Secara default, permintaan Control UI/WebSocket Serve dapat melakukan autentikasi melalui header identitas Tailscale (`tailscale-user-login`) saat `gateway.auth.allowTailscale` bernilai `true`. OpenClaw memverifikasi identitas dengan me-resolve alamat `x-forwarded-for` menggunakan `tailscale whois` dan mencocokkannya dengan header, serta hanya menerimanya saat permintaan mencapai loopback dengan header `x-forwarded-*` milik Tailscale. Untuk sesi operator Control UI dengan identitas perangkat browser, jalur Serve terverifikasi ini juga melewati perjalanan pulang-pergi pairing perangkat; browser tanpa perangkat dan koneksi peran node tetap mengikuti pemeriksaan perangkat normal. Setel `gateway.auth.allowTailscale: false` jika Anda ingin mewajibkan kredensial shared-secret eksplisit bahkan untuk traffic Serve. Lalu gunakan `gateway.auth.mode: "token"` atau `"password"`.
Secara default, permintaan Control UI/WebSocket Serve dapat berautentikasi melalui header identitas Tailscale (`tailscale-user-login`) saat `gateway.auth.allowTailscale` bernilai `true`. OpenClaw memverifikasi identitas dengan me-resolve alamat `x-forwarded-for` menggunakan `tailscale whois` dan mencocokkannya dengan header, serta hanya menerimanya ketika permintaan mengenai loopback dengan header `x-forwarded-*` milik Tailscale. Untuk sesi operator Control UI dengan identitas perangkat browser, jalur Serve terverifikasi ini juga melewati putaran pairing perangkat; browser tanpa perangkat dan koneksi node-role tetap mengikuti pemeriksaan perangkat normal. Atur `gateway.auth.allowTailscale: false` jika Anda ingin mewajibkan kredensial shared-secret eksplisit bahkan untuk traffic Serve. Lalu gunakan `gateway.auth.mode: "token"` atau `"password"`.
Untuk jalur identitas Serve async tersebut, upaya auth gagal untuk IP klien dan scope auth yang sama diserialkan sebelum penulisan rate-limit. Karena itu, retry buruk yang bersamaan dari browser yang sama dapat menampilkan `retry later` pada permintaan kedua, bukan dua mismatch polos yang berpacu secara paralel.
Untuk jalur identitas Serve asinkron tersebut, upaya auth yang gagal untuk IP klien dan cakupan auth yang sama diserialisasi sebelum penulisan rate-limit. Karena itu, retry buruk secara bersamaan dari browser yang sama dapat menampilkan `retry later` pada permintaan kedua alih-alih dua mismatch polos yang berlomba paralel.
<Warning>
Auth Serve tanpa token mengasumsikan host gateway tepercaya. Jika kode lokal yang tidak tepercaya dapat berjalan pada host tersebut, wajibkan auth token/password.
</Warning>
</Tab>
<Tab title="Bind to tailnet + token">
<Tab title="Bind ke tailnet + token">
```bash
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```
Lalu buka:
- `http://<tailscale-ip>:18789/` (atau `gateway.controlUi.basePath` yang Anda konfigurasi)
- `http://<tailscale-ip>:18789/` (atau `gateway.controlUi.basePath` yang Anda konfigurasikan)
Tempel shared secret yang cocok ke pengaturan UI (dikirim sebagai `connect.params.auth.token` atau `connect.params.auth.password`).
@ -314,16 +316,16 @@ Jika Anda membuka dashboard melalui HTTP polos (`http://<lan-ip>` atau `http://<
Pengecualian terdokumentasi:
- kompatibilitas HTTP tidak aman khusus localhost dengan `gateway.controlUi.allowInsecureAuth=true`
- auth Control UI operator yang berhasil melalui `gateway.auth.mode: "trusted-proxy"`
- autentikasi Control UI operator yang berhasil melalui `gateway.auth.mode: "trusted-proxy"`
- break-glass `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**Perbaikan yang direkomendasikan:** gunakan HTTPS (Tailscale Serve) atau buka UI secara lokal:
- `https://<magicdns>/` (Serve)
- `http://127.0.0.1:18789/` (pada host gateway)
- `http://127.0.0.1:18789/` (di host gateway)
<AccordionGroup>
<Accordion title="Perilaku toggle auth-tidak-aman">
<Accordion title="Perilaku toggle autentikasi tidak aman">
```json5
{
gateway: {
@ -334,14 +336,14 @@ Pengecualian terdokumentasi:
}
```
`allowInsecureAuth` hanyalah toggle kompatibilitas lokal:
`allowInsecureAuth` hanya toggle kompatibilitas lokal:
- Ini memungkinkan sesi Control UI localhost berlanjut tanpa identitas perangkat dalam konteks HTTP yang tidak aman.
- Ini tidak melewati pemeriksaan pairing.
- Ini tidak melonggarkan persyaratan identitas perangkat jarak jauh (non-localhost).
</Accordion>
<Accordion title="Hanya untuk keadaan darurat">
<Accordion title="Hanya break-glass">
```json5
{
gateway: {
@ -358,9 +360,9 @@ Pengecualian terdokumentasi:
</Accordion>
<Accordion title="Catatan trusted-proxy">
- Auth trusted-proxy yang berhasil dapat mengizinkan sesi Control UI **operator** tanpa identitas perangkat.
- Ini **tidak** berlaku untuk sesi Control UI dengan peran node.
- Proksi balik loopback pada host yang sama tetap tidak memenuhi auth trusted-proxy; lihat [Auth trusted proxy](/id/gateway/trusted-proxy-auth).
- Autentikasi trusted-proxy yang berhasil dapat menerima sesi Control UI **operator** tanpa identitas perangkat.
- Ini **tidak** berlaku untuk sesi Control UI berperan node.
- Proxy balik loopback pada host yang sama tetap tidak memenuhi autentikasi trusted-proxy; lihat [Autentikasi proxy tepercaya](/id/gateway/trusted-proxy-auth).
</Accordion>
</AccordionGroup>
@ -369,26 +371,26 @@ Lihat [Tailscale](/id/gateway/tailscale) untuk panduan penyiapan HTTPS.
## Kebijakan keamanan konten
Control UI dikirimkan dengan kebijakan `img-src` yang ketat: hanya aset **same-origin**, URL `data:`, dan URL `blob:` yang dibuat secara lokal yang diizinkan. URL gambar jarak jauh `http(s)` dan relatif-protokol ditolak oleh browser dan tidak melakukan pengambilan jaringan.
Control UI dikirimkan dengan kebijakan `img-src` yang ketat: hanya aset **same-origin**, URL `data:`, dan URL `blob:` yang dihasilkan secara lokal yang diizinkan. URL gambar `http(s)` jarak jauh dan relatif protokol ditolak oleh browser dan tidak memicu pengambilan jaringan.
Artinya dalam praktik:
- Avatar dan gambar yang disajikan di bawah path relatif (misalnya `/avatars/<id>`) tetap dirender, termasuk rute avatar terautentikasi yang diambil UI dan dikonversi menjadi URL `blob:` lokal.
- URL inline `data:image/...` tetap dirender (berguna untuk payload dalam protokol).
- Avatar dan gambar yang disajikan di bawah jalur relatif (misalnya `/avatars/<id>`) tetap dirender, termasuk rute avatar terautentikasi yang diambil UI lalu dikonversi menjadi URL `blob:` lokal.
- URL `data:image/...` inline tetap dirender (berguna untuk payload dalam protokol).
- URL `blob:` lokal yang dibuat oleh Control UI tetap dirender.
- URL avatar jarak jauh yang dipancarkan oleh metadata channel dihapus di helper avatar Control UI dan diganti dengan logo/badge bawaan, sehingga channel yang disusupi atau berbahaya tidak dapat memaksa pengambilan gambar jarak jauh sembarang dari browser operator.
- URL avatar jarak jauh yang dikeluarkan oleh metadata channel dibuang di helper avatar Control UI dan diganti dengan logo/badge bawaan, sehingga channel yang disusupi atau berbahaya tidak dapat memaksa pengambilan gambar jarak jauh sembarang dari browser operator.
Anda tidak perlu mengubah apa pun untuk mendapatkan perilaku ini — ini selalu aktif dan tidak dapat dikonfigurasi.
## Auth rute avatar
## Autentikasi rute avatar
Ketika auth gateway dikonfigurasi, endpoint avatar Control UI memerlukan token gateway yang sama seperti API lainnya:
Ketika autentikasi gateway dikonfigurasi, endpoint avatar Control UI memerlukan token gateway yang sama seperti API lainnya:
- `GET /avatar/<agentId>` mengembalikan gambar avatar hanya kepada pemanggil terautentikasi. `GET /avatar/<agentId>?meta=1` mengembalikan metadata avatar dengan aturan yang sama.
- Permintaan tidak terautentikasi ke salah satu rute ditolak (sesuai dengan rute assistant-media yang bersebelahan). Ini mencegah rute avatar membocorkan identitas agen pada host yang sebaliknya dilindungi.
- Permintaan tidak terautentikasi ke salah satu rute ditolak (selaras dengan rute assistant-media saudaranya). Ini mencegah rute avatar membocorkan identitas agen pada host yang sebaliknya dilindungi.
- Control UI sendiri meneruskan token gateway sebagai header bearer saat mengambil avatar, dan menggunakan URL blob terautentikasi sehingga gambar tetap dirender di dasbor.
Jika Anda menonaktifkan auth gateway (tidak direkomendasikan pada host bersama), rute avatar juga menjadi tidak terautentikasi, selaras dengan gateway lainnya.
Jika Anda menonaktifkan autentikasi gateway (tidak direkomendasikan pada host bersama), rute avatar juga menjadi tidak terautentikasi, sejalan dengan gateway lainnya.
## Membangun UI
@ -398,7 +400,7 @@ Gateway menyajikan file statis dari `dist/control-ui`. Bangun dengan:
pnpm ui:build
```
Basis absolut opsional (ketika Anda menginginkan URL aset tetap):
Base absolut opsional (ketika Anda menginginkan URL aset tetap):
```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
@ -410,11 +412,11 @@ Untuk pengembangan lokal (server dev terpisah):
pnpm ui:dev
```
Lalu arahkan UI ke URL WS Gateway Anda (mis. `ws://127.0.0.1:18789`).
Lalu arahkan UI ke URL WS Gateway Anda (misalnya `ws://127.0.0.1:18789`).
## Debugging/pengujian: server dev + Gateway jarak jauh
Control UI adalah file statis; target WebSocket dapat dikonfigurasi dan dapat berbeda dari origin HTTP. Ini berguna ketika Anda ingin server dev Vite berjalan secara lokal tetapi Gateway berjalan di tempat lain.
Control UI adalah file statis; target WebSocket dapat dikonfigurasi dan dapat berbeda dari origin HTTP. Ini berguna ketika Anda ingin server dev Vite berjalan lokal tetapi Gateway berjalan di tempat lain.
<Steps>
<Step title="Mulai server dev UI">
@ -427,7 +429,7 @@ Control UI adalah file statis; target WebSocket dapat dikonfigurasi dan dapat be
http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789
```
Auth satu kali opsional (jika diperlukan):
Autentikasi satu kali opsional (jika diperlukan):
```text
http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
@ -439,14 +441,14 @@ Control UI adalah file statis; target WebSocket dapat dikonfigurasi dan dapat be
<AccordionGroup>
<Accordion title="Catatan">
- `gatewayUrl` disimpan di localStorage setelah dimuat dan dihapus dari URL.
- Jika Anda meneruskan endpoint `ws://` atau `wss://` penuh melalui `gatewayUrl`, encode URL nilai `gatewayUrl` agar browser mengurai string kueri dengan benar.
- `token` sebaiknya diteruskan melalui fragmen URL (`#token=...`) bila memungkinkan. Fragmen tidak dikirim ke server, sehingga menghindari kebocoran log permintaan dan Referer. Param kueri lama `?token=` masih diimpor satu kali untuk kompatibilitas, tetapi hanya sebagai fallback, dan langsung dihapus setelah bootstrap.
- Jika Anda meneruskan endpoint `ws://` atau `wss://` lengkap melalui `gatewayUrl`, encode URL nilai `gatewayUrl` agar browser mengurai string kueri dengan benar.
- `token` sebaiknya diteruskan melalui fragmen URL (`#token=...`) bila memungkinkan. Fragmen tidak dikirim ke server, sehingga menghindari kebocoran log permintaan dan Referer. Parameter kueri legacy `?token=` masih diimpor sekali untuk kompatibilitas, tetapi hanya sebagai fallback, dan langsung dihapus setelah bootstrap.
- `password` hanya disimpan di memori.
- Ketika `gatewayUrl` disetel, UI tidak fallback ke kredensial konfigurasi atau lingkungan. Berikan `token` (atau `password`) secara eksplisit. Kredensial eksplisit yang hilang adalah kesalahan.
- Gunakan `wss://` ketika Gateway berada di belakang TLS (Tailscale Serve, proksi HTTPS, dll.).
- Ketika `gatewayUrl` ditetapkan, UI tidak melakukan fallback ke kredensial konfigurasi atau lingkungan. Berikan `token` (atau `password`) secara eksplisit. Kredensial eksplisit yang hilang adalah error.
- Gunakan `wss://` ketika Gateway berada di belakang TLS (Tailscale Serve, proxy HTTPS, dll.).
- `gatewayUrl` hanya diterima di jendela tingkat atas (tidak disematkan) untuk mencegah clickjacking.
- Deployment Control UI non-loopback harus menetapkan `gateway.controlUi.allowedOrigins` secara eksplisit (origin penuh). Ini mencakup penyiapan dev jarak jauh.
- Startup Gateway dapat menyemai origin lokal seperti `http://localhost:<port>` dan `http://127.0.0.1:<port>` dari bind dan port runtime efektif, tetapi origin browser jarak jauh tetap memerlukan entri eksplisit.
- Deployment Control UI non-loopback harus menetapkan `gateway.controlUi.allowedOrigins` secara eksplisit (origin lengkap). Ini termasuk setup dev jarak jauh.
- Startup Gateway dapat menanam origin lokal seperti `http://localhost:<port>` dan `http://127.0.0.1:<port>` dari bind dan port runtime efektif, tetapi origin browser jarak jauh tetap membutuhkan entri eksplisit.
- Jangan gunakan `gateway.controlUi.allowedOrigins: ["*"]` kecuali untuk pengujian lokal yang dikontrol ketat. Itu berarti mengizinkan origin browser apa pun, bukan "cocokkan host apa pun yang saya gunakan."
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` mengaktifkan mode fallback origin header Host, tetapi ini adalah mode keamanan yang berbahaya.

View File

@ -1,13 +1,13 @@
---
read_when:
- Menelusuri kesalahan atau mengonfigurasi akses WebChat
summary: Host statis WebChat loopback dan penggunaan WS Gateway untuk UI obrolan
title: Obrolan Web
- Men-debug atau mengonfigurasi akses WebChat
summary: Host statis WebChat loopback dan penggunaan WS Gateway untuk antarmuka obrolan
title: Chat Web
x-i18n:
generated_at: "2026-05-02T09:35:56Z"
generated_at: "2026-05-02T23:39:09Z"
model: gpt-5.5
provider: openai
source_hash: fe6d3cb30ed18d651b0d0ca8fd188b47c5f1d186410ee340deb79315f194ed8d
source_hash: ad3a09c8962e3a6dda83716d319df7ba27e18105cee50721278b5cba0a85c52f
source_path: web/webchat.md
workflow: 16
---
@ -17,52 +17,53 @@ Status: UI chat SwiftUI macOS/iOS berkomunikasi langsung dengan Gateway WebSocke
## Apa ini
- UI chat native untuk gateway (tanpa browser tertanam dan tanpa server statis lokal).
- Menggunakan sesi dan aturan perutean yang sama seperti channel lain.
- Menggunakan sesi dan aturan perutean yang sama seperti kanal lain.
- Perutean deterministik: balasan selalu kembali ke WebChat.
## Mulai cepat
1. Jalankan gateway.
1. Mulai gateway.
2. Buka UI WebChat (aplikasi macOS/iOS) atau tab chat Control UI.
3. Pastikan jalur auth gateway yang valid telah dikonfigurasi (shared-secret secara default,
3. Pastikan jalur autentikasi gateway yang valid telah dikonfigurasi (shared-secret secara default,
bahkan pada loopback).
## Cara kerjanya (perilaku)
- UI terhubung ke Gateway WebSocket dan menggunakan `chat.history`, `chat.send`, dan `chat.inject`.
- `chat.history` dibatasi untuk stabilitas: Gateway dapat memotong kolom teks panjang, menghilangkan metadata berat, dan mengganti entri yang terlalu besar dengan `[chat.history omitted: message too large]`.
- `chat.history` mengikuti cabang transkrip aktif untuk file sesi append-only modern, sehingga cabang penulisan ulang yang ditinggalkan dan salinan prompt yang tergantikan tidak dirender di WebChat.
- Control UI mengingat Gateway `sessionId` pendukung yang dikembalikan oleh `chat.history` dan menyertakannya pada panggilan lanjutan `chat.send`, sehingga koneksi ulang dan penyegaran halaman melanjutkan percakapan tersimpan yang sama kecuali pengguna memulai atau mereset sesi.
- Control UI menggabungkan submit dalam proses yang duplikat untuk sesi, pesan, dan lampiran yang sama sebelum membuat id run `chat.send` baru; Gateway tetap melakukan dedupe pada permintaan berulang yang memakai kembali kunci idempotensi yang sama.
- UI terhubung ke Gateway WebSocket dan menggunakan `chat.history`, `chat.send`, `chat.inject`, dan `chat.transcribeAudio`.
- `chat.history` dibatasi demi stabilitas: Gateway dapat memotong kolom teks panjang, menghilangkan metadata berat, dan mengganti entri yang terlalu besar dengan `[chat.history omitted: message too large]`.
- `chat.history` mengikuti cabang transkrip aktif untuk file sesi append-only modern, sehingga cabang penulisan ulang yang ditinggalkan dan salinan prompt yang sudah digantikan tidak dirender di WebChat.
- Control UI mengingat Gateway `sessionId` dasar yang dikembalikan oleh `chat.history` dan menyertakannya pada panggilan lanjutan `chat.send`, sehingga koneksi ulang dan penyegaran halaman melanjutkan percakapan tersimpan yang sama kecuali pengguna memulai atau mereset sesi.
- Control UI menggabungkan submit in-flight duplikat untuk sesi, pesan, dan lampiran yang sama sebelum menghasilkan id run `chat.send` baru; Gateway tetap melakukan dedupe pada permintaan berulang yang menggunakan ulang kunci idempotensi yang sama.
- `chat.history` juga dinormalisasi untuk tampilan: konteks OpenClaw khusus runtime,
pembungkus envelope masuk, tag directive pengiriman inline
seperti `[[reply_to_*]]` dan `[[audio_as_voice]]`, payload XML tool-call teks biasa
pembungkus envelope masuk, tag arahan pengiriman inline
seperti `[[reply_to_*]]` dan `[[audio_as_voice]]`, payload XML panggilan alat teks biasa
(termasuk `<tool_call>...</tool_call>`,
`<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`,
`<function_calls>...</function_calls>`, dan blok tool-call yang terpotong), serta
`<function_calls>...</function_calls>`, dan blok panggilan alat yang terpotong), serta
token kontrol model ASCII/full-width yang bocor dihapus dari teks yang terlihat,
dan entri assistant yang seluruh teks terlihatnya hanya token senyap persis
dan entri asisten yang seluruh teks terlihatnya hanya token senyap persis
`NO_REPLY` / `no_reply` dihilangkan.
- Payload balasan bertanda reasoning (`isReasoning: true`) dikecualikan dari konten assistant WebChat, teks replay transkrip, dan blok konten audio, sehingga payload khusus berpikir tidak muncul sebagai pesan assistant yang terlihat atau audio yang dapat diputar.
- `chat.inject` menambahkan catatan assistant langsung ke transkrip dan menyiarkannya ke UI (tanpa run agent).
- Run yang dibatalkan dapat tetap menampilkan output assistant parsial di UI.
- Gateway menyimpan teks assistant parsial yang dibatalkan ke dalam riwayat transkrip saat output buffer tersedia, dan menandai entri tersebut dengan metadata pembatalan.
- Payload balasan yang ditandai sebagai penalaran (`isReasoning: true`) dikecualikan dari konten asisten WebChat, teks pemutaran ulang transkrip, dan blok konten audio, sehingga payload khusus pemikiran tidak muncul sebagai pesan asisten yang terlihat atau audio yang dapat diputar.
- `chat.transcribeAudio` menjalankan dikte sisi server di composer chat Control UI. Browser merekam audio mikrofon, mengirimkannya sebagai base64 ke Gateway, dan Gateway menjalankan pipeline `tools.media.audio` yang dikonfigurasi. Transkrip yang dikembalikan disisipkan ke draf; tidak ada run agen yang dimulai sampai pengguna mengirimkannya.
- `chat.inject` menambahkan catatan asisten langsung ke transkrip dan menyiarkannya ke UI (tanpa run agen).
- Run yang dibatalkan dapat tetap menampilkan output asisten parsial di UI.
- Gateway mempertahankan teks asisten parsial yang dibatalkan ke dalam riwayat transkrip saat output buffered ada, dan menandai entri tersebut dengan metadata pembatalan.
- Riwayat selalu diambil dari gateway (tanpa pemantauan file lokal).
- Jika gateway tidak dapat dijangkau, WebChat bersifat hanya-baca.
- Jika gateway tidak dapat dijangkau, WebChat bersifat baca-saja.
## Panel alat agent Control UI
## Panel alat agen Control UI
- Panel Tools Control UI `/agents` memiliki dua tampilan terpisah:
- **Tersedia Saat Ini** menggunakan `tools.effective(sessionKey=...)` dan menampilkan apa yang benar-benar dapat digunakan sesi saat ini pada runtime, termasuk alat milik core, plugin, dan channel.
- **Tersedia Saat Ini** menggunakan `tools.effective(sessionKey=...)` dan menampilkan apa yang benar-benar dapat digunakan sesi saat ini pada runtime, termasuk alat inti, plugin, dan milik kanal.
- **Konfigurasi Alat** menggunakan `tools.catalog` dan tetap berfokus pada profil, override, dan semantik katalog.
- Ketersediaan runtime bersifat tercakup per sesi. Mengganti sesi pada agent yang sama dapat mengubah daftar
- Ketersediaan runtime bersifat tercakup per sesi. Beralih sesi pada agen yang sama dapat mengubah daftar
**Tersedia Saat Ini**.
- Editor konfigurasi tidak menyiratkan ketersediaan runtime; akses efektif tetap mengikuti presedensi kebijakan
(`allow`/`deny`, override per-agent dan provider/channel).
- Editor konfigurasi tidak menyiratkan ketersediaan runtime; akses efektif tetap mengikuti prioritas kebijakan
(`allow`/`deny`, override per agen dan provider/kanal).
## Penggunaan jarak jauh
- Mode jarak jauh menyalurkan Gateway WebSocket melalui SSH/Tailscale.
- Mode jarak jauh membuat tunnel untuk gateway WebSocket melalui SSH/Tailscale.
- Anda tidak perlu menjalankan server WebChat terpisah.
## Referensi konfigurasi (WebChat)
@ -71,20 +72,20 @@ Konfigurasi lengkap: [Konfigurasi](/id/gateway/configuration)
Opsi WebChat:
- `gateway.webchat.chatHistoryMaxChars`: jumlah karakter maksimum untuk kolom teks dalam respons `chat.history`. Saat entri transkrip melebihi batas ini, Gateway memotong kolom teks panjang dan dapat mengganti pesan yang terlalu besar dengan placeholder. `maxChars` per-permintaan juga dapat dikirim oleh klien untuk menimpa default ini bagi satu panggilan `chat.history`.
- `gateway.webchat.chatHistoryMaxChars`: jumlah karakter maksimum untuk kolom teks dalam respons `chat.history`. Ketika entri transkrip melebihi batas ini, Gateway memotong kolom teks panjang dan dapat mengganti pesan yang terlalu besar dengan placeholder. `maxChars` per permintaan juga dapat dikirim oleh klien untuk menimpa default ini untuk satu panggilan `chat.history`.
Opsi global terkait:
- `gateway.port`, `gateway.bind`: host/port WebSocket.
- `gateway.auth.mode`, `gateway.auth.token`, `gateway.auth.password`:
auth WebSocket shared-secret.
- `gateway.auth.allowTailscale`: tab chat browser Control UI dapat menggunakan header identitas Tailscale
autentikasi WebSocket shared-secret.
- `gateway.auth.allowTailscale`: tab chat Control UI browser dapat menggunakan header identitas Tailscale
Serve saat diaktifkan.
- `gateway.auth.mode: "trusted-proxy"`: auth reverse-proxy untuk klien browser di belakang sumber proxy **non-loopback** yang sadar identitas (lihat [Auth Proxy Tepercaya](/id/gateway/trusted-proxy-auth)).
- `gateway.auth.mode: "trusted-proxy"`: autentikasi reverse-proxy untuk klien browser di belakang sumber proxy **non-loopback** yang sadar identitas (lihat [Autentikasi Proxy Tepercaya](/id/gateway/trusted-proxy-auth)).
- `gateway.remote.url`, `gateway.remote.token`, `gateway.remote.password`: target gateway jarak jauh.
- `session.*`: penyimpanan sesi dan default kunci utama.
## Terkait
- [Control UI](/id/web/control-ui)
- [Dasbor](/id/web/dashboard)
- [Dashboard](/id/web/dashboard)