From effa7d377154799e7ee9fdac23e49c87f87df762 Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Thu, 23 Apr 2026 14:59:22 +0000 Subject: [PATCH] chore(i18n): refresh id translations --- docs/id/channels/matrix-push-rules.md | 157 +++++ docs/id/channels/matrix.md | 719 +++++++------------- docs/id/ci.md | 105 +-- docs/id/gateway/authentication.md | 137 ++-- docs/id/gateway/cli-backends.md | 210 +++--- docs/id/help/testing.md | 934 +++++++++++++------------- 6 files changed, 1090 insertions(+), 1172 deletions(-) create mode 100644 docs/id/channels/matrix-push-rules.md diff --git a/docs/id/channels/matrix-push-rules.md b/docs/id/channels/matrix-push-rules.md new file mode 100644 index 000000000..3788d6446 --- /dev/null +++ b/docs/id/channels/matrix-push-rules.md @@ -0,0 +1,157 @@ +--- +read_when: + - Menyiapkan streaming senyap Matrix untuk Synapse atau Tuwunel yang di-host sendiri + - Pengguna menginginkan notifikasi hanya pada blok yang selesai, bukan pada setiap edit pratinjau +summary: Aturan push Matrix per penerima untuk edit pratinjau final yang senyap +title: Aturan push Matrix untuk pratinjau senyap +x-i18n: + generated_at: "2026-04-23T14:55:28Z" + model: gpt-5.4 + provider: openai + source_hash: dbfdf2552ca352858d4e8d03a2a0f5f3b420d33b01063c111c0335c0229f0534 + source_path: channels/matrix-push-rules.md + workflow: 15 +--- + +# Aturan push Matrix untuk pratinjau senyap + +Saat `channels.matrix.streaming` bernilai `"quiet"`, OpenClaw mengedit satu event pratinjau di tempat dan menandai edit yang telah difinalkan dengan flag konten kustom. Klien Matrix hanya memberi notifikasi pada edit final jika aturan push per pengguna cocok dengan flag tersebut. Halaman ini ditujukan untuk operator yang meng-host Matrix sendiri dan ingin memasang aturan itu untuk setiap akun penerima. + +Jika Anda hanya menginginkan perilaku notifikasi Matrix bawaan, gunakan `streaming: "partial"` atau biarkan streaming nonaktif. Lihat [penyiapan channel Matrix](/id/channels/matrix#streaming-previews). + +## Prasyarat + +- pengguna penerima = orang yang harus menerima notifikasi +- pengguna bot = akun Matrix OpenClaw yang mengirim balasan +- gunakan access token pengguna penerima untuk panggilan API di bawah ini +- cocokkan `sender` dalam aturan push dengan MXID lengkap pengguna bot +- akun penerima harus sudah memiliki pusher yang berfungsi — aturan pratinjau senyap hanya berfungsi jika pengiriman push Matrix normal dalam keadaan sehat + +## Langkah-langkah + + + + +```json5 +{ + channels: { + matrix: { + streaming: "quiet", + }, + }, +} +``` + + + + + Gunakan ulang token sesi klien yang sudah ada jika memungkinkan. Untuk membuat yang baru: + +```bash +curl -sS -X POST \ + "https://matrix.example.org/_matrix/client/v3/login" \ + -H "Content-Type: application/json" \ + --data '{ + "type": "m.login.password", + "identifier": { "type": "m.id.user", "user": "@alice:example.org" }, + "password": "REDACTED" + }' +``` + + + + + +```bash +curl -sS \ + -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ + "https://matrix.example.org/_matrix/client/v3/pushers" +``` + +Jika tidak ada pusher yang dikembalikan, perbaiki pengiriman push Matrix normal untuk akun ini sebelum melanjutkan. + + + + + OpenClaw menandai edit pratinjau finalized yang hanya berisi teks dengan `content["com.openclaw.finalized_preview"] = true`. Pasang aturan yang cocok dengan penanda tersebut serta MXID bot sebagai sender: + +```bash +curl -sS -X PUT \ + "https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname" \ + -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + --data '{ + "conditions": [ + { "kind": "event_match", "key": "type", "pattern": "m.room.message" }, + { + "kind": "event_property_is", + "key": "content.m\\.relates_to.rel_type", + "value": "m.replace" + }, + { + "kind": "event_property_is", + "key": "content.com\\.openclaw\\.finalized_preview", + "value": true + }, + { "kind": "event_match", "key": "sender", "pattern": "@bot:example.org" } + ], + "actions": [ + "notify", + { "set_tweak": "sound", "value": "default" }, + { "set_tweak": "highlight", "value": false } + ] + }' +``` + + Ganti sebelum menjalankan: + + - `https://matrix.example.org`: URL dasar homeserver Anda + - `$USER_ACCESS_TOKEN`: access token pengguna penerima + - `openclaw-finalized-preview-botname`: ID aturan yang unik per bot per penerima (pola: `openclaw-finalized-preview-`) + - `@bot:example.org`: MXID bot OpenClaw Anda, bukan milik penerima + + + + + +```bash +curl -sS \ + -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ + "https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname" +``` + +Lalu uji balasan yang di-streaming. Dalam mode senyap, room menampilkan pratinjau draf senyap dan memberi notifikasi satu kali saat blok atau giliran selesai. + + + + +Untuk menghapus aturan nanti, lakukan `DELETE` pada URL aturan yang sama dengan token penerima. + +## Catatan multi-bot + +Aturan push dikunci oleh `ruleId`: menjalankan ulang `PUT` terhadap ID yang sama akan memperbarui satu aturan. Untuk beberapa bot OpenClaw yang memberi notifikasi kepada penerima yang sama, buat satu aturan per bot dengan kecocokan sender yang berbeda. + +Aturan `override` baru yang ditentukan pengguna disisipkan sebelum aturan penekanan bawaan, jadi tidak diperlukan parameter pengurutan tambahan. Aturan ini hanya memengaruhi edit pratinjau hanya-teks yang bisa difinalkan di tempat; fallback media dan fallback pratinjau kedaluwarsa menggunakan pengiriman Matrix normal. + +## Catatan homeserver + + + + Tidak diperlukan perubahan `homeserver.yaml` khusus. Jika notifikasi Matrix normal sudah sampai ke pengguna ini, token penerima + panggilan `pushrules` di atas adalah langkah penyiapan utama. + + Jika Anda menjalankan Synapse di belakang reverse proxy atau workers, pastikan `/_matrix/client/.../pushrules/` diteruskan ke Synapse dengan benar. Pengiriman push ditangani oleh proses utama atau `synapse.app.pusher` / worker pusher yang dikonfigurasi — pastikan semuanya sehat. + + + + + Alurnya sama seperti Synapse; tidak diperlukan konfigurasi khusus Tuwunel untuk penanda pratinjau finalized. + + Jika notifikasi menghilang saat pengguna aktif di perangkat lain, periksa apakah `suppress_push_when_active` diaktifkan. Tuwunel menambahkan opsi ini di 1.4.2 (September 2025) dan opsi ini dapat dengan sengaja menekan push ke perangkat lain saat satu perangkat aktif. + + + + +## Terkait + +- [Penyiapan channel Matrix](/id/channels/matrix) +- [Konsep streaming](/id/concepts/streaming) diff --git a/docs/id/channels/matrix.md b/docs/id/channels/matrix.md index b75c4a802..075ad1f34 100644 --- a/docs/id/channels/matrix.md +++ b/docs/id/channels/matrix.md @@ -2,29 +2,27 @@ read_when: - Menyiapkan Matrix di OpenClaw - Mengonfigurasi E2EE dan verifikasi Matrix -summary: Status dukungan, penyiapan, dan contoh konfigurasi Matrix +summary: Status dukungan Matrix, penyiapan, dan contoh konfigurasi title: Matrix x-i18n: - generated_at: "2026-04-23T09:16:32Z" + generated_at: "2026-04-23T14:55:29Z" model: gpt-5.4 provider: openai - source_hash: 14873e9d65994138d26ad0bc1bf9bc6e00bea17f9306d592c757503d363de71a + source_hash: 2e9d4d656b47aca2dacb00e591378cb26631afc5b634074bc26e21741b418b47 source_path: channels/matrix.md workflow: 15 --- # Matrix -Matrix adalah Plugin saluran bawaan untuk OpenClaw. +Matrix adalah plugin channel bawaan untuk OpenClaw. Plugin ini menggunakan `matrix-js-sdk` resmi dan mendukung DM, room, thread, media, reaksi, polling, lokasi, dan E2EE. ## Plugin bawaan -Matrix dikirim sebagai Plugin bawaan dalam rilis OpenClaw saat ini, sehingga build -terpaket normal tidak memerlukan instalasi terpisah. +Matrix disertakan sebagai plugin bawaan dalam rilis OpenClaw saat ini, sehingga build paket normal tidak memerlukan instalasi terpisah. -Jika Anda menggunakan build lama atau instalasi kustom yang tidak menyertakan Matrix, instal -secara manual: +Jika Anda menggunakan build yang lebih lama atau instalasi kustom yang tidak menyertakan Matrix, instal secara manual: Instal dari npm: @@ -38,12 +36,12 @@ Instal dari checkout lokal: openclaw plugins install ./path/to/local/matrix-plugin ``` -Lihat [Plugins](/id/tools/plugin) untuk perilaku Plugin dan aturan instalasi. +Lihat [Plugins](/id/tools/plugin) untuk perilaku plugin dan aturan instalasi. ## Penyiapan -1. Pastikan Plugin Matrix tersedia. - - Rilis OpenClaw terpaket saat ini sudah membundel Plugin ini. +1. Pastikan plugin Matrix tersedia. + - Rilis OpenClaw dalam paket saat ini sudah menyertakannya. - Instalasi lama/kustom dapat menambahkannya secara manual dengan perintah di atas. 2. Buat akun Matrix di homeserver Anda. 3. Konfigurasikan `channels.matrix` dengan salah satu dari: @@ -51,7 +49,7 @@ Lihat [Plugins](/id/tools/plugin) untuk perilaku Plugin dan aturan instalasi. - `homeserver` + `userId` + `password`. 4. Mulai ulang Gateway. 5. Mulai DM dengan bot atau undang bot ke room. - - Undangan Matrix baru hanya berfungsi saat `channels.matrix.autoJoin` mengizinkannya. + - Undangan Matrix baru hanya berfungsi jika `channels.matrix.autoJoin` mengizinkannya. Jalur penyiapan interaktif: @@ -63,25 +61,25 @@ openclaw configure --section channels Wizard Matrix meminta: - URL homeserver -- metode auth: access token atau password -- ID pengguna (hanya auth password) +- metode autentikasi: access token atau kata sandi +- ID pengguna (hanya autentikasi kata sandi) - nama perangkat opsional -- apakah akan mengaktifkan E2EE +- apakah E2EE akan diaktifkan - apakah akan mengonfigurasi akses room dan auto-join undangan Perilaku utama wizard: -- Jika env vars auth Matrix sudah ada dan akun tersebut belum memiliki auth yang disimpan di config, wizard menawarkan pintasan env untuk mempertahankan auth di env vars. -- Nama akun dinormalisasi menjadi ID akun. Misalnya, `Ops Bot` menjadi `ops-bot`. -- Entri allowlist DM menerima `@user:server` secara langsung; display name hanya berfungsi saat pencarian direktori live menemukan satu kecocokan persis. -- Entri allowlist room menerima ID room dan alias secara langsung. Utamakan `!room:server` atau `#alias:server`; nama yang tidak ter-resolve diabaikan saat runtime oleh resolusi allowlist. +- Jika variabel lingkungan autentikasi Matrix sudah ada dan akun tersebut belum memiliki autentikasi yang disimpan di config, wizard menawarkan pintasan env agar autentikasi tetap berada di variabel lingkungan. +- Nama akun dinormalisasi ke ID akun. Misalnya, `Ops Bot` menjadi `ops-bot`. +- Entri allowlist DM menerima `@user:server` secara langsung; nama tampilan hanya berfungsi jika pencarian direktori live menemukan satu kecocokan yang tepat. +- Entri allowlist room menerima ID room dan alias secara langsung. Sebaiknya gunakan `!room:server` atau `#alias:server`; nama yang tidak terselesaikan diabaikan saat runtime oleh resolusi allowlist. - Dalam mode allowlist auto-join undangan, gunakan hanya target undangan yang stabil: `!roomId:server`, `#alias:server`, atau `*`. Nama room biasa ditolak. -- Untuk me-resolve nama room sebelum menyimpan, gunakan `openclaw channels resolve --channel matrix "Project Room"`. +- Untuk menyelesaikan nama room sebelum menyimpan, gunakan `openclaw channels resolve --channel matrix "Project Room"`. -`channels.matrix.autoJoin` default-nya adalah `off`. +`channels.matrix.autoJoin` secara default bernilai `off`. -Jika Anda membiarkannya tidak disetel, bot tidak akan bergabung ke room yang diundang atau undangan gaya DM baru, sehingga bot tidak akan muncul di grup baru atau DM yang diundang kecuali Anda bergabung secara manual terlebih dahulu. +Jika Anda membiarkannya tidak disetel, bot tidak akan bergabung ke room yang mengundangnya atau undangan gaya DM baru, sehingga bot tidak akan muncul di grup baru atau DM undangan kecuali Anda bergabung secara manual terlebih dahulu. Setel `autoJoin: "allowlist"` bersama `autoJoinAllowlist` untuk membatasi undangan mana yang diterima, atau setel `autoJoin: "always"` jika Anda ingin bot bergabung ke setiap undangan. @@ -133,7 +131,7 @@ Penyiapan minimal berbasis token: } ``` -Penyiapan berbasis password (token di-cache setelah login): +Penyiapan berbasis kata sandi (token di-cache setelah login): ```json5 { @@ -151,9 +149,9 @@ Penyiapan berbasis password (token di-cache setelah login): Matrix menyimpan kredensial cache di `~/.openclaw/credentials/matrix/`. Akun default menggunakan `credentials.json`; akun bernama menggunakan `credentials-.json`. -Saat kredensial cache ada di sana, OpenClaw menganggap Matrix telah dikonfigurasi untuk penyiapan, doctor, dan penemuan status saluran meskipun auth saat ini tidak disetel langsung di config. +Saat kredensial cache ada di sana, OpenClaw menganggap Matrix telah dikonfigurasi untuk penyiapan, doctor, dan penemuan status channel meskipun autentikasi saat ini tidak disetel langsung di config. -Padanan env var (digunakan saat kunci config tidak disetel): +Padanan variabel lingkungan (digunakan saat kunci config tidak disetel): - `MATRIX_HOMESERVER` - `MATRIX_ACCESS_TOKEN` @@ -162,7 +160,7 @@ Padanan env var (digunakan saat kunci config tidak disetel): - `MATRIX_DEVICE_ID` - `MATRIX_DEVICE_NAME` -Untuk akun non-default, gunakan env vars dengan cakupan akun: +Untuk akun non-default, gunakan variabel lingkungan dengan cakupan akun: - `MATRIX__HOMESERVER` - `MATRIX__ACCESS_TOKEN` @@ -176,21 +174,21 @@ Contoh untuk akun `ops`: - `MATRIX_OPS_HOMESERVER` - `MATRIX_OPS_ACCESS_TOKEN` -Untuk ID akun ternormalisasi `ops-bot`, gunakan: +Untuk ID akun yang dinormalisasi `ops-bot`, gunakan: - `MATRIX_OPS_X2D_BOT_HOMESERVER` - `MATRIX_OPS_X2D_BOT_ACCESS_TOKEN` -Matrix melakukan escape pada tanda baca dalam ID akun agar env vars bercakupan tetap bebas tabrakan. -Contohnya, `-` menjadi `_X2D_`, sehingga `ops-prod` dipetakan ke `MATRIX_OPS_X2D_PROD_*`. +Matrix meng-escape tanda baca dalam ID akun agar variabel lingkungan berscope tetap bebas benturan. +Misalnya, `-` menjadi `_X2D_`, sehingga `ops-prod` dipetakan ke `MATRIX_OPS_X2D_PROD_*`. -Wizard interaktif hanya menawarkan pintasan env-var saat env vars auth tersebut sudah ada dan akun yang dipilih belum memiliki auth Matrix yang disimpan di config. +Wizard interaktif hanya menawarkan pintasan env-var ketika variabel lingkungan autentikasi tersebut sudah ada dan akun yang dipilih belum memiliki autentikasi Matrix yang disimpan di config. -`MATRIX_HOMESERVER` tidak dapat disetel dari workspace `.env`; lihat [Berkas `.env` workspace](/id/gateway/security). +`MATRIX_HOMESERVER` tidak dapat disetel dari workspace `.env`; lihat [File `.env` workspace](/id/gateway/security). ## Contoh konfigurasi -Ini adalah konfigurasi dasar praktis dengan pairing DM, allowlist room, dan E2EE diaktifkan: +Ini adalah config dasar yang praktis dengan pairing DM, allowlist room, dan E2EE diaktifkan: ```json5 { @@ -225,17 +223,13 @@ Ini adalah konfigurasi dasar praktis dengan pairing DM, allowlist room, dan E2EE } ``` -`autoJoin` berlaku untuk semua undangan Matrix, termasuk undangan gaya DM. OpenClaw tidak dapat -mengklasifikasikan room yang diundang secara andal sebagai DM atau grup pada saat undangan, sehingga semua undangan melewati `autoJoin` -terlebih dahulu. `dm.policy` berlaku setelah bot bergabung dan room diklasifikasikan sebagai DM. +`autoJoin` berlaku untuk semua undangan Matrix, termasuk undangan bergaya DM. OpenClaw tidak dapat secara andal mengklasifikasikan room yang diundang sebagai DM atau grup pada saat undangan, sehingga semua undangan terlebih dahulu melewati `autoJoin`. `dm.policy` berlaku setelah bot bergabung dan room diklasifikasikan sebagai DM. ## Pratinjau streaming Streaming balasan Matrix bersifat opt-in. -Setel `channels.matrix.streaming` ke `"partial"` saat Anda ingin OpenClaw mengirim satu balasan pratinjau live, -mengedit pratinjau itu di tempat saat model menghasilkan teks, lalu memfinalkannya saat -balasan selesai: +Setel `channels.matrix.streaming` ke `"partial"` saat Anda ingin OpenClaw mengirim satu balasan pratinjau live, mengedit pratinjau tersebut di tempat saat model sedang menghasilkan teks, lalu memfinalkannya saat balasan selesai: ```json5 { @@ -247,186 +241,32 @@ balasan selesai: } ``` -- `streaming: "off"` adalah default. OpenClaw menunggu balasan final dan mengirimkannya sekali. -- `streaming: "partial"` membuat satu pesan pratinjau yang dapat diedit untuk blok assistant saat ini menggunakan pesan teks Matrix normal. Ini mempertahankan perilaku notifikasi pratinjau-dulu legacy Matrix, sehingga klien standar dapat memberi notifikasi pada teks pratinjau pertama yang di-stream alih-alih pada blok yang sudah selesai. -- `streaming: "quiet"` membuat satu pemberitahuan pratinjau senyap yang dapat diedit untuk blok assistant saat ini. Gunakan ini hanya jika Anda juga mengonfigurasi aturan push penerima untuk edit pratinjau yang sudah difinalkan. -- `blockStreaming: true` mengaktifkan pesan progres Matrix terpisah. Dengan streaming pratinjau diaktifkan, Matrix mempertahankan draf live untuk blok saat ini dan menjaga blok yang selesai sebagai pesan terpisah. -- Saat streaming pratinjau aktif dan `blockStreaming` nonaktif, Matrix mengedit draf live di tempat dan memfinalkan event yang sama saat blok atau giliran selesai. -- Jika pratinjau tidak lagi muat dalam satu event Matrix, OpenClaw menghentikan streaming pratinjau dan fallback ke pengiriman final normal. -- Balasan media tetap mengirim lampiran secara normal. Jika pratinjau usang tidak lagi bisa digunakan ulang dengan aman, OpenClaw meredaksinya sebelum mengirim balasan media final. -- Edit pratinjau memerlukan panggilan API Matrix tambahan. Biarkan streaming nonaktif jika Anda menginginkan perilaku rate-limit yang paling konservatif. +- `streaming: "off"` adalah default. OpenClaw menunggu balasan akhir dan mengirimkannya satu kali. +- `streaming: "partial"` membuat satu pesan pratinjau yang dapat diedit untuk blok asisten saat ini menggunakan pesan teks Matrix normal. Ini mempertahankan perilaku notifikasi lama Matrix yang mengutamakan pratinjau, sehingga klien bawaan dapat memberi notifikasi pada teks pratinjau streaming pertama alih-alih blok yang sudah selesai. +- `streaming: "quiet"` membuat satu notifikasi pratinjau senyap yang dapat diedit untuk blok asisten saat ini. Gunakan ini hanya jika Anda juga mengonfigurasi push rule penerima untuk edit pratinjau yang telah difinalkan. +- `blockStreaming: true` mengaktifkan pesan progres Matrix terpisah. Dengan pratinjau streaming diaktifkan, Matrix mempertahankan draf live untuk blok saat ini dan menyimpan blok yang sudah selesai sebagai pesan terpisah. +- Saat pratinjau streaming aktif dan `blockStreaming` nonaktif, Matrix mengedit draf live di tempat dan memfinalkan event yang sama saat blok atau giliran selesai. +- Jika pratinjau tidak lagi muat dalam satu event Matrix, OpenClaw menghentikan pratinjau streaming dan kembali ke pengiriman akhir normal. +- Balasan media tetap mengirim lampiran secara normal. Jika pratinjau usang tidak lagi bisa digunakan ulang dengan aman, OpenClaw akan me-redact-nya sebelum mengirim balasan media akhir. +- Edit pratinjau menimbulkan panggilan API Matrix tambahan. Biarkan streaming nonaktif jika Anda menginginkan perilaku rate-limit yang paling konservatif. `blockStreaming` tidak mengaktifkan pratinjau draf dengan sendirinya. -Gunakan `streaming: "partial"` atau `streaming: "quiet"` untuk edit pratinjau; lalu tambahkan `blockStreaming: true` hanya jika Anda juga ingin blok assistant yang sudah selesai tetap terlihat sebagai pesan progres terpisah. +Gunakan `streaming: "partial"` atau `streaming: "quiet"` untuk edit pratinjau; lalu tambahkan `blockStreaming: true` hanya jika Anda juga ingin blok asisten yang telah selesai tetap terlihat sebagai pesan progres terpisah. -Jika Anda memerlukan notifikasi Matrix standar tanpa aturan push kustom, gunakan `streaming: "partial"` untuk perilaku pratinjau-dulu atau biarkan `streaming` nonaktif untuk pengiriman final saja. Dengan `streaming: "off"`: +Jika Anda memerlukan notifikasi Matrix bawaan tanpa push rule kustom, gunakan `streaming: "partial"` untuk perilaku yang mengutamakan pratinjau atau biarkan `streaming` nonaktif untuk pengiriman final saja. Dengan `streaming: "off"`: -- `blockStreaming: true` mengirim setiap blok yang selesai sebagai pesan Matrix normal yang memicu notifikasi. -- `blockStreaming: false` hanya mengirim balasan final yang sudah selesai sebagai pesan Matrix normal yang memicu notifikasi. +- `blockStreaming: true` mengirim setiap blok yang sudah selesai sebagai pesan Matrix normal yang memicu notifikasi. +- `blockStreaming: false` hanya mengirim balasan akhir yang sudah lengkap sebagai pesan Matrix normal yang memicu notifikasi. -### Aturan push self-hosted untuk pratinjau senyap yang sudah difinalkan +### Push rule self-hosted untuk pratinjau final yang senyap -Jika Anda menjalankan infrastruktur Matrix sendiri dan ingin pratinjau senyap memberi notifikasi hanya saat blok atau -balasan final selesai, setel `streaming: "quiet"` dan tambahkan aturan push per pengguna untuk edit pratinjau yang sudah difinalkan. - -Biasanya ini adalah penyiapan pengguna penerima, bukan perubahan config global homeserver: - -Peta singkat sebelum memulai: - -- pengguna penerima = orang yang harus menerima notifikasi -- pengguna bot = akun Matrix OpenClaw yang mengirim balasan -- gunakan access token pengguna penerima untuk panggilan API di bawah -- cocokkan `sender` dalam aturan push dengan MXID lengkap pengguna bot - -1. Konfigurasikan OpenClaw untuk menggunakan pratinjau senyap: - -```json5 -{ - channels: { - matrix: { - streaming: "quiet", - }, - }, -} -``` - -2. Pastikan akun penerima sudah menerima notifikasi push Matrix normal. Aturan - pratinjau senyap hanya berfungsi jika pengguna tersebut sudah memiliki pusher/perangkat yang berfungsi. - -3. Dapatkan access token pengguna penerima. - - Gunakan token pengguna penerima, bukan token bot. - - Menggunakan ulang token sesi klien yang ada biasanya paling mudah. - - Jika Anda perlu membuat token baru, Anda dapat login melalui API Client-Server Matrix standar: - -```bash -curl -sS -X POST \ - "https://matrix.example.org/_matrix/client/v3/login" \ - -H "Content-Type: application/json" \ - --data '{ - "type": "m.login.password", - "identifier": { - "type": "m.id.user", - "user": "@alice:example.org" - }, - "password": "REDACTED" - }' -``` - -4. Verifikasi bahwa akun penerima sudah memiliki pusher: - -```bash -curl -sS \ - -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ - "https://matrix.example.org/_matrix/client/v3/pushers" -``` - -Jika ini tidak mengembalikan pusher/perangkat aktif, perbaiki dulu notifikasi Matrix normal sebelum menambahkan -aturan OpenClaw di bawah. - -OpenClaw menandai edit pratinjau final teks-saja dengan: - -```json -{ - "com.openclaw.finalized_preview": true -} -``` - -5. Buat aturan push override untuk setiap akun penerima yang harus menerima notifikasi ini: - -```bash -curl -sS -X PUT \ - "https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname" \ - -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ - -H "Content-Type: application/json" \ - --data '{ - "conditions": [ - { "kind": "event_match", "key": "type", "pattern": "m.room.message" }, - { - "kind": "event_property_is", - "key": "content.m\\.relates_to.rel_type", - "value": "m.replace" - }, - { - "kind": "event_property_is", - "key": "content.com\\.openclaw\\.finalized_preview", - "value": true - }, - { "kind": "event_match", "key": "sender", "pattern": "@bot:example.org" } - ], - "actions": [ - "notify", - { "set_tweak": "sound", "value": "default" }, - { "set_tweak": "highlight", "value": false } - ] - }' -``` - -Ganti nilai-nilai ini sebelum Anda menjalankan perintah: - -- `https://matrix.example.org`: URL dasar homeserver Anda -- `$USER_ACCESS_TOKEN`: access token pengguna penerima -- `openclaw-finalized-preview-botname`: ID aturan yang unik untuk bot ini bagi pengguna penerima ini -- `@bot:example.org`: MXID bot Matrix OpenClaw Anda, bukan MXID pengguna penerima - -Penting untuk penyiapan multi-bot: - -- Aturan push dikunci oleh `ruleId`. Menjalankan ulang `PUT` terhadap ID aturan yang sama akan memperbarui aturan itu. -- Jika satu pengguna penerima harus memberi notifikasi untuk beberapa akun bot Matrix OpenClaw, buat satu aturan per bot dengan ID aturan unik untuk setiap kecocokan pengirim. -- Pola sederhana adalah `openclaw-finalized-preview-`, seperti `openclaw-finalized-preview-ops` atau `openclaw-finalized-preview-support`. - -Aturan dievaluasi terhadap pengirim event: - -- autentikasi dengan token pengguna penerima -- cocokkan `sender` dengan MXID bot OpenClaw - -6. Verifikasi bahwa aturan tersebut ada: - -```bash -curl -sS \ - -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ - "https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname" -``` - -7. Uji balasan yang di-stream. Dalam mode quiet, room harus menampilkan pratinjau draf senyap dan - edit final di tempat harus memberi notifikasi setelah blok atau giliran selesai. - -Jika Anda perlu menghapus aturan nanti, hapus ID aturan yang sama dengan token pengguna penerima: - -```bash -curl -sS -X DELETE \ - -H "Authorization: Bearer $USER_ACCESS_TOKEN" \ - "https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname" -``` - -Catatan: - -- Buat aturan dengan access token pengguna penerima, bukan token bot. -- Aturan `override` baru yang ditentukan pengguna disisipkan di depan aturan penekanan default, jadi tidak diperlukan parameter urutan tambahan. -- Ini hanya memengaruhi edit pratinjau teks-saja yang dapat difinalkan dengan aman oleh OpenClaw di tempat. Fallback media dan fallback pratinjau usang tetap menggunakan pengiriman Matrix normal. -- Jika `GET /_matrix/client/v3/pushers` tidak menampilkan pusher, pengguna tersebut belum memiliki pengiriman push Matrix yang berfungsi untuk akun/perangkat ini. - -#### Synapse - -Untuk Synapse, penyiapan di atas biasanya sudah cukup dengan sendirinya: - -- Tidak diperlukan perubahan `homeserver.yaml` khusus untuk notifikasi pratinjau OpenClaw final. -- Jika deployment Synapse Anda sudah mengirim notifikasi push Matrix normal, token pengguna + panggilan `pushrules` di atas adalah langkah penyiapan utama. -- Jika Anda menjalankan Synapse di belakang reverse proxy atau worker, pastikan `/_matrix/client/.../pushrules/` mencapai Synapse dengan benar. -- Jika Anda menjalankan worker Synapse, pastikan pusher sehat. Pengiriman push ditangani oleh proses utama atau `synapse.app.pusher` / worker pusher yang dikonfigurasi. - -#### Tuwunel - -Untuk Tuwunel, gunakan alur penyiapan dan panggilan API push-rule yang sama seperti yang ditunjukkan di atas: - -- Tidak diperlukan config khusus Tuwunel untuk penanda pratinjau final itu sendiri. -- Jika notifikasi Matrix normal sudah berfungsi untuk pengguna tersebut, token pengguna + panggilan `pushrules` di atas adalah langkah penyiapan utama. -- Jika notifikasi tampak hilang saat pengguna aktif di perangkat lain, periksa apakah `suppress_push_when_active` diaktifkan. Tuwunel menambahkan opsi ini di Tuwunel 1.4.2 pada 12 September 2025, dan opsi ini dapat secara sengaja menekan push ke perangkat lain saat satu perangkat aktif. +Streaming senyap (`streaming: "quiet"`) hanya memberi notifikasi kepada penerima setelah sebuah blok atau giliran difinalkan — push rule per pengguna harus cocok dengan penanda pratinjau yang sudah difinalkan. Lihat [Push rule Matrix untuk pratinjau senyap](/id/channels/matrix-push-rules) untuk penyiapan lengkapnya (token penerima, pemeriksaan pusher, instalasi rule, catatan per homeserver). ## Room bot-ke-bot Secara default, pesan Matrix dari akun Matrix OpenClaw lain yang telah dikonfigurasi diabaikan. -Gunakan `allowBots` jika Anda memang ingin lalu lintas Matrix antar-agent: +Gunakan `allowBots` saat Anda memang menginginkan lalu lintas Matrix antargen: ```json5 { @@ -443,17 +283,17 @@ Gunakan `allowBots` jika Anda memang ingin lalu lintas Matrix antar-agent: } ``` -- `allowBots: true` menerima pesan dari akun bot Matrix lain yang telah dikonfigurasi di room dan DM yang diizinkan. +- `allowBots: true` menerima pesan dari akun bot Matrix terkonfigurasi lainnya di room dan DM yang diizinkan. - `allowBots: "mentions"` menerima pesan tersebut hanya saat pesan itu secara terlihat menyebut bot ini di room. DM tetap diizinkan. -- `groups..allowBots` menimpa pengaturan level akun untuk satu room. -- OpenClaw tetap mengabaikan pesan dari ID pengguna Matrix yang sama untuk menghindari loop balasan ke diri sendiri. -- Matrix tidak mengekspos flag bot native di sini; OpenClaw memperlakukan "ditulis bot" sebagai "dikirim oleh akun Matrix lain yang telah dikonfigurasi pada Gateway OpenClaw ini". +- `groups..allowBots` menimpa pengaturan tingkat akun untuk satu room. +- OpenClaw tetap mengabaikan pesan dari ID pengguna Matrix yang sama untuk menghindari loop balasan diri. +- Matrix tidak mengekspos flag bot native di sini; OpenClaw menganggap "ditulis bot" sebagai "dikirim oleh akun Matrix terkonfigurasi lain pada Gateway OpenClaw ini". Gunakan allowlist room yang ketat dan persyaratan mention saat mengaktifkan lalu lintas bot-ke-bot di room bersama. ## Enkripsi dan verifikasi -Di room terenkripsi (E2EE), event gambar keluar menggunakan `thumbnail_file` sehingga pratinjau gambar dienkripsi bersama lampiran penuh. Room tidak terenkripsi tetap menggunakan `thumbnail_url` biasa. Tidak diperlukan konfigurasi — Plugin mendeteksi status E2EE secara otomatis. +Di room terenkripsi (E2EE), event gambar keluar menggunakan `thumbnail_file` sehingga pratinjau gambar dienkripsi bersama lampiran penuh. Room yang tidak terenkripsi tetap menggunakan `thumbnail_url` biasa. Tidak diperlukan konfigurasi — plugin mendeteksi status E2EE secara otomatis. Aktifkan enkripsi: @@ -471,90 +311,20 @@ Aktifkan enkripsi: } ``` -Periksa status verifikasi: +Perintah verifikasi (semuanya menerima `--verbose` untuk diagnostik dan `--json` untuk output yang dapat dibaca mesin): -```bash -openclaw matrix verify status -``` +| Perintah | Tujuan | +| -------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `openclaw matrix verify status` | Memeriksa status cross-signing dan verifikasi perangkat | +| `openclaw matrix verify status --include-recovery-key --json` | Menyertakan recovery key yang tersimpan | +| `openclaw matrix verify bootstrap` | Mem-bootstrap cross-signing dan verifikasi (lihat di bawah) | +| `openclaw matrix verify bootstrap --force-reset-cross-signing` | Membuang identitas cross-signing saat ini dan membuat yang baru | +| `openclaw matrix verify device ""` | Memverifikasi perangkat ini dengan recovery key | +| `openclaw matrix verify backup status` | Memeriksa kesehatan backup room-key | +| `openclaw matrix verify backup restore` | Memulihkan room key dari backup server | +| `openclaw matrix verify backup reset --yes` | Menghapus backup saat ini dan membuat baseline baru (dapat membuat ulang secret storage) | -Status verbose (diagnostik lengkap): - -```bash -openclaw matrix verify status --verbose -``` - -Sertakan recovery key yang tersimpan dalam output yang dapat dibaca mesin: - -```bash -openclaw matrix verify status --include-recovery-key --json -``` - -Bootstrap state cross-signing dan verifikasi: - -```bash -openclaw matrix verify bootstrap -``` - -Diagnostik bootstrap verbose: - -```bash -openclaw matrix verify bootstrap --verbose -``` - -Paksa reset identitas cross-signing baru sebelum bootstrap: - -```bash -openclaw matrix verify bootstrap --force-reset-cross-signing -``` - -Verifikasi perangkat ini dengan recovery key: - -```bash -openclaw matrix verify device "" -``` - -Detail verifikasi perangkat verbose: - -```bash -openclaw matrix verify device "" --verbose -``` - -Periksa kesehatan backup room-key: - -```bash -openclaw matrix verify backup status -``` - -Diagnostik kesehatan backup verbose: - -```bash -openclaw matrix verify backup status --verbose -``` - -Pulihkan room key dari backup server: - -```bash -openclaw matrix verify backup restore -``` - -Diagnostik pemulihan verbose: - -```bash -openclaw matrix verify backup restore --verbose -``` - -Hapus backup server saat ini dan buat baseline backup baru. Jika backup key yang tersimpan -tidak dapat dimuat dengan bersih, reset ini juga dapat membuat ulang secret storage agar -cold start di masa mendatang dapat memuat backup key yang baru: - -```bash -openclaw matrix verify backup reset --yes -``` - -Semua perintah `verify` ringkas secara default (termasuk logging SDK internal yang senyap) dan hanya menampilkan diagnostik detail dengan `--verbose`. -Gunakan `--json` untuk output lengkap yang dapat dibaca mesin saat membuat skrip. - -Dalam penyiapan multi-akun, perintah CLI Matrix menggunakan akun default Matrix implisit kecuali Anda memberikan `--account `. +Dalam penyiapan multi-akun, perintah CLI Matrix menggunakan akun default Matrix implisit kecuali Anda meneruskan `--account `. Jika Anda mengonfigurasi beberapa akun bernama, setel `channels.matrix.defaultAccount` terlebih dahulu atau operasi CLI implisit tersebut akan berhenti dan meminta Anda memilih akun secara eksplisit. Gunakan `--account` kapan pun Anda ingin operasi verifikasi atau perangkat menargetkan akun bernama secara eksplisit: @@ -564,43 +334,34 @@ openclaw matrix verify backup restore --account assistant openclaw matrix devices list --account assistant ``` -Saat enkripsi dinonaktifkan atau tidak tersedia untuk akun bernama, peringatan Matrix dan error verifikasi menunjuk ke kunci config akun tersebut, misalnya `channels.matrix.accounts.assistant.encryption`. +Saat enkripsi dinonaktifkan atau tidak tersedia untuk akun bernama, peringatan Matrix dan kesalahan verifikasi mengarah ke kunci config akun tersebut, misalnya `channels.matrix.accounts.assistant.encryption`. -### Arti "terverifikasi" + + + OpenClaw menganggap perangkat sebagai verified hanya ketika identitas cross-signing Anda sendiri menandatanganinya. `verify status --verbose` mengekspos tiga sinyal kepercayaan: -OpenClaw memperlakukan perangkat Matrix ini sebagai terverifikasi hanya saat perangkat tersebut diverifikasi oleh identitas cross-signing Anda sendiri. -Dalam praktiknya, `openclaw matrix verify status --verbose` mengekspos tiga sinyal kepercayaan: + - `Locally trusted`: hanya dipercaya oleh klien ini + - `Cross-signing verified`: SDK melaporkan verifikasi melalui cross-signing + - `Signed by owner`: ditandatangani oleh kunci self-signing Anda sendiri -- `Locally trusted`: perangkat ini dipercaya hanya oleh klien saat ini -- `Cross-signing verified`: SDK melaporkan perangkat sebagai terverifikasi melalui cross-signing -- `Signed by owner`: perangkat ditandatangani oleh self-signing key Anda sendiri + `Verified by owner` menjadi `yes` hanya ketika cross-signing atau owner-signing ada. Kepercayaan lokal saja tidak cukup. -`Verified by owner` menjadi `yes` hanya ketika verifikasi cross-signing atau penandatanganan oleh pemilik ada. -Kepercayaan lokal saja tidak cukup bagi OpenClaw untuk memperlakukan perangkat ini sebagai sepenuhnya terverifikasi. + -### Apa yang dilakukan bootstrap + + `verify bootstrap` adalah perintah perbaikan dan penyiapan untuk akun terenkripsi. Secara berurutan, perintah ini: -`openclaw matrix verify bootstrap` adalah perintah perbaikan dan penyiapan untuk akun Matrix terenkripsi. -Perintah ini melakukan semua hal berikut secara berurutan: + - mem-bootstrap secret storage, dengan menggunakan kembali recovery key yang ada bila memungkinkan + - mem-bootstrap cross-signing dan mengunggah kunci cross-signing publik yang belum ada + - menandai dan me-cross-sign perangkat saat ini + - membuat backup room-key sisi server jika belum ada -- melakukan bootstrap secret storage, menggunakan ulang recovery key yang ada jika memungkinkan -- melakukan bootstrap cross-signing dan mengunggah public cross-signing key yang belum ada -- mencoba menandai dan menandatangani silang perangkat saat ini -- membuat backup room-key sisi server baru jika belum ada + Jika homeserver memerlukan UIA untuk mengunggah kunci cross-signing, OpenClaw mencoba tanpa autentikasi terlebih dahulu, lalu `m.login.dummy`, lalu `m.login.password` (memerlukan `channels.matrix.password`). Gunakan `--force-reset-cross-signing` hanya saat dengan sengaja membuang identitas saat ini. -Jika homeserver memerlukan auth interaktif untuk mengunggah cross-signing key, OpenClaw mencoba unggahan tanpa auth terlebih dahulu, lalu dengan `m.login.dummy`, lalu dengan `m.login.password` ketika `channels.matrix.password` dikonfigurasi. + -Gunakan `--force-reset-cross-signing` hanya ketika Anda memang ingin membuang identitas cross-signing saat ini dan membuat yang baru. - -Jika Anda memang ingin membuang backup room-key saat ini dan memulai -baseline backup baru untuk pesan di masa mendatang, gunakan `openclaw matrix verify backup reset --yes`. -Lakukan ini hanya jika Anda menerima bahwa riwayat terenkripsi lama yang tidak dapat dipulihkan akan tetap -tidak tersedia dan bahwa OpenClaw dapat membuat ulang secret storage jika rahasia backup saat ini -tidak dapat dimuat dengan aman. - -### Baseline backup baru - -Jika Anda ingin menjaga pesan terenkripsi di masa mendatang tetap berfungsi dan menerima kehilangan riwayat lama yang tidak dapat dipulihkan, jalankan perintah-perintah ini secara berurutan: + + Jika Anda ingin mempertahankan agar pesan terenkripsi di masa mendatang tetap berfungsi dan menerima hilangnya riwayat lama yang tidak dapat dipulihkan: ```bash openclaw matrix verify backup reset --yes @@ -608,72 +369,45 @@ openclaw matrix verify backup status --verbose openclaw matrix verify status ``` -Tambahkan `--account ` ke setiap perintah jika Anda ingin secara eksplisit menargetkan akun Matrix bernama. + Tambahkan `--account ` untuk menargetkan akun bernama. Ini juga dapat membuat ulang secret storage jika secret backup saat ini tidak dapat dimuat dengan aman. -### Perilaku saat startup + -Saat `encryption: true`, Matrix secara default mengatur `startupVerification` ke `"if-unverified"`. -Saat startup, jika perangkat ini masih belum diverifikasi, Matrix akan meminta verifikasi mandiri di klien Matrix lain, -melewati permintaan duplikat saat satu permintaan sudah tertunda, dan menerapkan cooldown lokal sebelum mencoba lagi setelah restart. -Percobaan permintaan yang gagal secara default mencoba ulang lebih cepat daripada pembuatan permintaan yang berhasil. -Setel `startupVerification: "off"` untuk menonaktifkan permintaan startup otomatis, atau sesuaikan `startupVerificationCooldownHours` -jika Anda menginginkan jendela percobaan ulang yang lebih pendek atau lebih panjang. + + Dengan `encryption: true`, `startupVerification` secara default bernilai `"if-unverified"`. Saat startup, perangkat yang belum diverifikasi meminta verifikasi mandiri di klien Matrix lain, melewati duplikasi dan menerapkan cooldown. Sesuaikan dengan `startupVerificationCooldownHours` atau nonaktifkan dengan `startupVerification: "off"`. -Startup juga secara otomatis melakukan langkah bootstrap crypto konservatif. -Langkah itu mencoba menggunakan ulang secret storage dan identitas cross-signing saat ini terlebih dahulu, dan menghindari reset cross-signing kecuali Anda menjalankan alur perbaikan bootstrap eksplisit. + Saat startup juga dijalankan pass bootstrap crypto yang konservatif yang menggunakan kembali secret storage saat ini dan identitas cross-signing. Jika status bootstrap rusak, OpenClaw mencoba perbaikan yang dijaga bahkan tanpa `channels.matrix.password`; jika homeserver memerlukan UIA kata sandi, startup mencatat peringatan dan tetap non-fatal. Perangkat yang sudah ditandatangani pemilik tetap dipertahankan. -Jika saat startup state bootstrap yang rusak masih ditemukan, OpenClaw dapat mencoba jalur perbaikan terjaga bahkan ketika `channels.matrix.password` tidak dikonfigurasi. -Jika homeserver memerlukan UIA berbasis password untuk perbaikan itu, OpenClaw mencatat peringatan dan menjaga startup tetap non-fatal alih-alih membatalkan bot. -Jika perangkat saat ini sudah ditandatangani oleh pemilik, OpenClaw mempertahankan identitas itu alih-alih meresetnya secara otomatis. + Lihat [Migrasi Matrix](/id/install/migrating-matrix) untuk alur upgrade lengkap. -Lihat [migrasi Matrix](/id/install/migrating-matrix) untuk alur upgrade lengkap, batasan, perintah pemulihan, dan pesan migrasi umum. + -### Pemberitahuan verifikasi + + Matrix memposting notifikasi siklus hidup verifikasi ke room DM verifikasi ketat sebagai pesan `m.notice`: permintaan, siap (dengan panduan "Verify by emoji"), mulai/selesai, dan detail SAS (emoji/desimal) bila tersedia. -Matrix memposting pemberitahuan siklus hidup verifikasi langsung ke room DM verifikasi ketat sebagai pesan `m.notice`. -Itu mencakup: + Permintaan masuk dari klien Matrix lain dilacak dan diterima secara otomatis. Untuk verifikasi mandiri, OpenClaw memulai alur SAS secara otomatis dan mengonfirmasi sisinya sendiri setelah verifikasi emoji tersedia — Anda tetap perlu membandingkan dan mengonfirmasi "They match" di klien Matrix Anda. -- pemberitahuan permintaan verifikasi -- pemberitahuan verifikasi siap (dengan panduan eksplisit "Verify by emoji") -- pemberitahuan mulai dan selesai verifikasi -- detail SAS (emoji dan desimal) saat tersedia + Notifikasi sistem verifikasi tidak diteruskan ke pipeline chat agen. -Permintaan verifikasi masuk dari klien Matrix lain dilacak dan diterima otomatis oleh OpenClaw. -Untuk alur verifikasi mandiri, OpenClaw juga memulai alur SAS secara otomatis saat verifikasi emoji tersedia dan mengonfirmasi sisinya sendiri. -Untuk permintaan verifikasi dari pengguna/perangkat Matrix lain, OpenClaw menerima permintaan secara otomatis lalu menunggu alur SAS berjalan normal. -Anda tetap perlu membandingkan emoji atau SAS desimal di klien Matrix Anda dan mengonfirmasi "They match" di sana untuk menyelesaikan verifikasi. + -OpenClaw tidak secara membabi buta menerima otomatis alur duplikat yang dimulai sendiri. Startup melewati pembuatan permintaan baru saat permintaan verifikasi mandiri sudah tertunda. - -Pemberitahuan protokol/sistem verifikasi tidak diteruskan ke pipeline obrolan agent, sehingga tidak menghasilkan `NO_REPLY`. - -### Kebersihan perangkat - -Perangkat Matrix lama yang dikelola OpenClaw dapat menumpuk di akun dan membuat trust room terenkripsi lebih sulit dipahami. -Buat daftarnya dengan: + + Perangkat lama yang dikelola OpenClaw dapat menumpuk. Daftar dan pangkas: ```bash openclaw matrix devices list -``` - -Hapus perangkat lama yang dikelola OpenClaw dengan: - -```bash openclaw matrix devices prune-stale ``` -### Penyimpanan crypto + -Matrix E2EE menggunakan jalur crypto Rust `matrix-js-sdk` resmi di Node, dengan `fake-indexeddb` sebagai shim IndexedDB. State crypto dipersistenkan ke file snapshot (`crypto-idb-snapshot.json`) dan dipulihkan saat startup. File snapshot adalah state runtime sensitif yang disimpan dengan izin file yang ketat. + + Matrix E2EE menggunakan jalur crypto Rust `matrix-js-sdk` resmi dengan `fake-indexeddb` sebagai shim IndexedDB. Status crypto dipertahankan ke `crypto-idb-snapshot.json` (izin file ketat). -State runtime terenkripsi berada di bawah root per-akun, per-hash token pengguna di -`~/.openclaw/matrix/accounts//__//`. -Direktori itu berisi sync store (`bot-storage.json`), crypto store (`crypto/`), -file recovery key (`recovery-key.json`), snapshot IndexedDB (`crypto-idb-snapshot.json`), -binding thread (`thread-bindings.json`), dan state verifikasi startup (`startup-verification.json`). -Saat token berubah tetapi identitas akun tetap sama, OpenClaw menggunakan kembali root terbaik yang ada -untuk tuple akun/homeserver/pengguna tersebut agar state sync sebelumnya, state crypto, binding thread, -dan state verifikasi startup tetap terlihat. + Status runtime terenkripsi berada di bawah `~/.openclaw/matrix/accounts//__//` dan mencakup sync store, crypto store, recovery key, snapshot IDB, binding thread, dan status verifikasi startup. Saat token berubah tetapi identitas akun tetap sama, OpenClaw menggunakan kembali root terbaik yang ada agar status sebelumnya tetap terlihat. + + + ## Manajemen profil @@ -684,49 +418,49 @@ openclaw matrix profile set --name "OpenClaw Assistant" openclaw matrix profile set --avatar-url https://cdn.example.org/avatar.png ``` -Tambahkan `--account ` jika Anda ingin secara eksplisit menargetkan akun Matrix bernama. +Tambahkan `--account ` saat Anda ingin secara eksplisit menargetkan akun Matrix bernama. -Matrix menerima URL avatar `mxc://` secara langsung. Saat Anda memberikan URL avatar `http://` atau `https://`, OpenClaw akan mengunggahnya ke Matrix terlebih dahulu lalu menyimpan kembali URL `mxc://` hasil resolve ke `channels.matrix.avatarUrl` (atau override akun yang dipilih). +Matrix menerima URL avatar `mxc://` secara langsung. Saat Anda meneruskan URL avatar `http://` atau `https://`, OpenClaw akan mengunggahnya ke Matrix terlebih dahulu dan menyimpan kembali URL `mxc://` yang telah diselesaikan ke `channels.matrix.avatarUrl` (atau override akun yang dipilih). ## Thread Matrix mendukung thread Matrix native untuk balasan otomatis maupun pengiriman message-tool. -- `dm.sessionScope: "per-user"` (default) menjaga perutean DM Matrix tetap berbasis pengirim, sehingga beberapa room DM dapat berbagi satu sesi saat semuanya ter-resolve ke peer yang sama. -- `dm.sessionScope: "per-room"` mengisolasi setiap room DM Matrix ke kunci sesinya sendiri sambil tetap menggunakan auth DM normal dan pemeriksaan allowlist. -- Binding percakapan Matrix eksplisit tetap lebih diutamakan daripada `dm.sessionScope`, sehingga room dan thread yang terikat tetap menggunakan sesi target yang dipilih. -- `threadReplies: "off"` menjaga balasan tetap level atas dan menjaga pesan ber-thread masuk tetap pada sesi induk. -- `threadReplies: "inbound"` membalas di dalam thread hanya jika pesan masuk memang sudah berada di thread itu. -- `threadReplies: "always"` menjaga balasan room tetap di thread yang berakar pada pesan pemicu dan merutekan percakapan itu melalui sesi bercakupan thread yang cocok sejak pesan pemicu pertama. -- `dm.threadReplies` menimpa pengaturan level atas khusus untuk DM. Misalnya, Anda dapat menjaga thread room tetap terisolasi sambil mempertahankan DM tetap datar. -- Pesan ber-thread masuk menyertakan pesan root thread sebagai konteks agent tambahan. -- Pengiriman message-tool otomatis mewarisi thread Matrix saat ini ketika targetnya adalah room yang sama, atau target pengguna DM yang sama, kecuali `threadId` eksplisit diberikan. -- Penggunaan ulang target pengguna DM dalam sesi yang sama hanya aktif ketika metadata sesi saat ini membuktikan peer DM yang sama pada akun Matrix yang sama; jika tidak, OpenClaw fallback ke perutean normal bercakupan pengguna. -- Saat OpenClaw melihat room DM Matrix bertabrakan dengan room DM lain pada sesi DM Matrix bersama yang sama, OpenClaw memposting `m.notice` satu kali di room itu dengan escape hatch `/focus` saat binding thread diaktifkan dan hint `dm.sessionScope`. +- `dm.sessionScope: "per-user"` (default) menjaga routing DM Matrix tetap berscope pengirim, sehingga beberapa room DM dapat berbagi satu sesi saat semuanya mengarah ke rekan yang sama. +- `dm.sessionScope: "per-room"` mengisolasi setiap room DM Matrix ke kunci sesinya sendiri sambil tetap menggunakan autentikasi DM normal dan pemeriksaan allowlist. +- Binding percakapan Matrix eksplisit tetap lebih diutamakan daripada `dm.sessionScope`, sehingga room dan thread yang sudah dibind tetap menggunakan sesi target yang dipilih. +- `threadReplies: "off"` menjaga balasan tetap di tingkat atas dan mempertahankan pesan berulir masuk pada sesi induk. +- `threadReplies: "inbound"` membalas di dalam thread hanya jika pesan masuk memang sudah berada di thread tersebut. +- `threadReplies: "always"` menjaga balasan room tetap di thread yang berakar pada pesan pemicu dan merutekan percakapan tersebut melalui sesi berscope thread yang cocok dari pesan pemicu pertama. +- `dm.threadReplies` menimpa pengaturan tingkat atas hanya untuk DM. Misalnya, Anda dapat menjaga thread room tetap terisolasi sambil menjaga DM tetap datar. +- Pesan berulir masuk menyertakan pesan akar thread sebagai konteks agen tambahan. +- Pengiriman message-tool secara otomatis mewarisi thread Matrix saat ini ketika targetnya adalah room yang sama, atau target pengguna DM yang sama, kecuali `threadId` eksplisit diberikan. +- Penggunaan ulang target pengguna DM dengan sesi yang sama hanya aktif ketika metadata sesi saat ini membuktikan rekan DM yang sama pada akun Matrix yang sama; jika tidak, OpenClaw kembali ke routing normal berscope pengguna. +- Saat OpenClaw melihat room DM Matrix bertabrakan dengan room DM lain pada sesi DM Matrix bersama yang sama, OpenClaw memposting `m.notice` satu kali di room tersebut dengan jalur keluar `/focus` saat binding thread diaktifkan dan petunjuk `dm.sessionScope`. - Binding thread runtime didukung untuk Matrix. `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, dan `/acp spawn` yang terikat thread berfungsi di room dan DM Matrix. -- `/focus` level atas untuk room/DM Matrix membuat thread Matrix baru dan mengikatnya ke sesi target saat `threadBindings.spawnSubagentSessions=true`. -- Menjalankan `/focus` atau `/acp spawn --thread here` di dalam thread Matrix yang sudah ada akan mengikat thread saat ini. +- `/focus` tingkat atas pada room/DM Matrix membuat thread Matrix baru dan membind-nya ke sesi target saat `threadBindings.spawnSubagentSessions=true`. +- Menjalankan `/focus` atau `/acp spawn --thread here` di dalam thread Matrix yang sudah ada akan membind thread saat ini tersebut. ## Binding percakapan ACP -Room Matrix, DM, dan thread Matrix yang sudah ada dapat diubah menjadi workspace ACP persisten tanpa mengubah permukaan obrolan. +Room, DM, dan thread Matrix yang sudah ada dapat diubah menjadi workspace ACP yang persisten tanpa mengubah permukaan chat. Alur operator cepat: -- Jalankan `/acp spawn codex --bind here` di dalam DM Matrix, room, atau thread yang sudah ada yang ingin tetap Anda gunakan. -- Di DM atau room Matrix level atas, DM/room saat ini tetap menjadi permukaan obrolan dan pesan selanjutnya dirutekan ke sesi ACP yang di-spawn. -- Di dalam thread Matrix yang sudah ada, `--bind here` mengikat thread saat ini di tempat. +- Jalankan `/acp spawn codex --bind here` di dalam DM Matrix, room, atau thread yang sudah ada yang ingin terus Anda gunakan. +- Di DM atau room Matrix tingkat atas, DM/room saat ini tetap menjadi permukaan chat dan pesan berikutnya dirutekan ke sesi ACP yang di-spawn. +- Di dalam thread Matrix yang sudah ada, `--bind here` membind thread saat ini di tempat. - `/new` dan `/reset` mereset sesi ACP terikat yang sama di tempat. - `/acp close` menutup sesi ACP dan menghapus binding. Catatan: - `--bind here` tidak membuat child thread Matrix. -- `threadBindings.spawnAcpSessions` hanya diperlukan untuk `/acp spawn --thread auto|here`, saat OpenClaw perlu membuat atau mengikat child thread Matrix. +- `threadBindings.spawnAcpSessions` hanya diperlukan untuk `/acp spawn --thread auto|here`, saat OpenClaw perlu membuat atau membind child thread Matrix. -### Konfigurasi binding thread +### Config binding thread -Matrix mewarisi default global dari `session.threadBindings`, dan juga mendukung override per saluran: +Matrix mewarisi default global dari `session.threadBindings`, dan juga mendukung override per-channel: - `threadBindings.enabled` - `threadBindings.idleHours` @@ -734,35 +468,35 @@ Matrix mewarisi default global dari `session.threadBindings`, dan juga mendukung - `threadBindings.spawnSubagentSessions` - `threadBindings.spawnAcpSessions` -Flag spawn yang terikat thread Matrix bersifat opt-in: +Flag spawn terikat thread Matrix bersifat opt-in: -- Setel `threadBindings.spawnSubagentSessions: true` untuk mengizinkan `/focus` level atas membuat dan mengikat thread Matrix baru. -- Setel `threadBindings.spawnAcpSessions: true` untuk mengizinkan `/acp spawn --thread auto|here` mengikat sesi ACP ke thread Matrix. +- Setel `threadBindings.spawnSubagentSessions: true` untuk mengizinkan `/focus` tingkat atas membuat dan membind thread Matrix baru. +- Setel `threadBindings.spawnAcpSessions: true` untuk mengizinkan `/acp spawn --thread auto|here` membind sesi ACP ke thread Matrix. ## Reaksi -Matrix mendukung tindakan reaksi keluar, notifikasi reaksi masuk, dan reaksi ack masuk. +Matrix mendukung aksi reaksi keluar, notifikasi reaksi masuk, dan reaksi ack masuk. -- Tooling reaksi keluar dipagari oleh `channels["matrix"].actions.reactions`. +- Tooling reaksi keluar dikendalikan oleh `channels["matrix"].actions.reactions`. - `react` menambahkan reaksi ke event Matrix tertentu. - `reactions` mencantumkan ringkasan reaksi saat ini untuk event Matrix tertentu. - `emoji=""` menghapus reaksi milik akun bot sendiri pada event tersebut. - `remove: true` hanya menghapus reaksi emoji yang ditentukan dari akun bot. -Cakupan reaksi ack di-resolve dalam urutan standar OpenClaw: +Cakupan reaksi ack diselesaikan dalam urutan standar OpenClaw: - `channels["matrix"].accounts..ackReaction` - `channels["matrix"].ackReaction` - `messages.ackReaction` -- fallback emoji identitas agent +- fallback emoji identitas agen -Cakupan reaksi ack di-resolve dalam urutan ini: +Cakupan reaksi ack diselesaikan dalam urutan ini: - `channels["matrix"].accounts..ackReactionScope` - `channels["matrix"].ackReactionScope` - `messages.ackReactionScope` -Mode notifikasi reaksi di-resolve dalam urutan ini: +Mode notifikasi reaksi diselesaikan dalam urutan ini: - `channels["matrix"].accounts..reactionNotifications` - `channels["matrix"].reactionNotifications` @@ -770,28 +504,28 @@ Mode notifikasi reaksi di-resolve dalam urutan ini: Perilaku: -- `reactionNotifications: "own"` meneruskan event `m.reaction` yang ditambahkan ketika event itu menargetkan pesan Matrix yang ditulis bot. +- `reactionNotifications: "own"` meneruskan event `m.reaction` yang ditambahkan saat menargetkan pesan Matrix yang ditulis bot. - `reactionNotifications: "off"` menonaktifkan event sistem reaksi. -- Penghapusan reaksi tidak disintesis menjadi event sistem karena Matrix menampilkan hal tersebut sebagai redaksi, bukan sebagai penghapusan `m.reaction` yang berdiri sendiri. +- Penghapusan reaksi tidak disintesis menjadi event sistem karena Matrix menampilkan itu sebagai redaksi, bukan sebagai penghapusan `m.reaction` mandiri. ## Konteks riwayat -- `channels.matrix.historyLimit` mengontrol berapa banyak pesan room terbaru yang disertakan sebagai `InboundHistory` saat pesan room Matrix memicu agent. Fallback ke `messages.groupChat.historyLimit`; jika keduanya tidak disetel, default efektifnya adalah `0`. Setel `0` untuk menonaktifkan. +- `channels.matrix.historyLimit` mengontrol berapa banyak pesan room terbaru yang disertakan sebagai `InboundHistory` saat pesan room Matrix memicu agen. Fallback ke `messages.groupChat.historyLimit`; jika keduanya tidak disetel, default efektifnya adalah `0`. Setel `0` untuk menonaktifkan. - Riwayat room Matrix hanya untuk room. DM tetap menggunakan riwayat sesi normal. -- Riwayat room Matrix bersifat pending-only: OpenClaw membuffer pesan room yang belum memicu balasan, lalu mengambil snapshot jendela itu saat mention atau pemicu lain masuk. -- Pesan pemicu saat ini tidak disertakan dalam `InboundHistory`; pesan itu tetap berada di body masuk utama untuk giliran tersebut. -- Retry untuk event Matrix yang sama menggunakan kembali snapshot riwayat asli alih-alih bergeser maju ke pesan room yang lebih baru. +- Riwayat room Matrix hanya untuk yang tertunda: OpenClaw membuffer pesan room yang belum memicu balasan, lalu mengambil snapshot jendela tersebut saat mention atau pemicu lain datang. +- Pesan pemicu saat ini tidak disertakan dalam `InboundHistory`; pesan itu tetap berada di body inbound utama untuk giliran tersebut. +- Percobaan ulang pada event Matrix yang sama menggunakan kembali snapshot riwayat asli alih-alih bergeser maju ke pesan room yang lebih baru. ## Visibilitas konteks -Matrix mendukung kontrol `contextVisibility` bersama untuk konteks room tambahan seperti teks balasan yang diambil, root thread, dan riwayat pending. +Matrix mendukung kontrol `contextVisibility` bersama untuk konteks room tambahan seperti teks balasan yang diambil, akar thread, dan riwayat tertunda. - `contextVisibility: "all"` adalah default. Konteks tambahan dipertahankan sebagaimana diterima. - `contextVisibility: "allowlist"` memfilter konteks tambahan ke pengirim yang diizinkan oleh pemeriksaan allowlist room/pengguna yang aktif. - `contextVisibility: "allowlist_quote"` berperilaku seperti `allowlist`, tetapi tetap mempertahankan satu balasan kutipan eksplisit. -Pengaturan ini memengaruhi visibilitas konteks tambahan, bukan apakah pesan masuk itu sendiri dapat memicu balasan. -Otorisasi pemicu tetap berasal dari `groupPolicy`, `groups`, `groupAllowFrom`, dan pengaturan kebijakan DM. +Pengaturan ini memengaruhi visibilitas konteks tambahan, bukan apakah pesan inbound itu sendiri dapat memicu balasan. +Otorisasi pemicu tetap berasal dari pengaturan `groupPolicy`, `groups`, `groupAllowFrom`, dan kebijakan DM. ## Kebijakan DM dan room @@ -816,7 +550,7 @@ Otorisasi pemicu tetap berasal dari `groupPolicy`, `groups`, `groupAllowFrom`, d } ``` -Lihat [Grup](/id/channels/groups) untuk perilaku mention-gating dan allowlist. +Lihat [Groups](/id/channels/groups) untuk perilaku gating mention dan allowlist. Contoh pairing untuk DM Matrix: @@ -825,13 +559,13 @@ openclaw pairing list matrix openclaw pairing approve matrix ``` -Jika pengguna Matrix yang belum disetujui terus mengirimi Anda pesan sebelum persetujuan, OpenClaw menggunakan kembali kode pairing tertunda yang sama dan dapat mengirim balasan pengingat lagi setelah cooldown singkat alih-alih membuat kode baru. +Jika pengguna Matrix yang belum disetujui terus mengirimi Anda pesan sebelum persetujuan, OpenClaw menggunakan kembali kode pairing tertunda yang sama dan dapat mengirim balasan pengingat lagi setelah cooldown singkat alih-alih mencetak kode baru. Lihat [Pairing](/id/channels/pairing) untuk alur pairing DM bersama dan tata letak penyimpanan. -## Perbaikan room direct +## Perbaikan direct room -Jika state direct-message tidak sinkron, OpenClaw dapat berakhir dengan pemetaan `m.direct` usang yang menunjuk ke room solo lama, bukan DM yang live. Periksa pemetaan saat ini untuk peer dengan: +Jika status direct-message tidak sinkron, OpenClaw dapat berakhir dengan pemetaan `m.direct` usang yang menunjuk ke room solo lama alih-alih DM live. Periksa pemetaan saat ini untuk peer dengan: ```bash openclaw matrix direct inspect --user-id @alice:example.org @@ -846,15 +580,14 @@ openclaw matrix direct repair --user-id @alice:example.org Alur perbaikan: - mengutamakan DM 1:1 ketat yang sudah dipetakan di `m.direct` -- fallback ke DM 1:1 ketat mana pun yang saat ini sudah diikuti dengan pengguna tersebut -- membuat room direct baru dan menulis ulang `m.direct` jika tidak ada DM sehat +- fallback ke DM 1:1 ketat mana pun yang saat ini sudah joined dengan pengguna tersebut +- membuat direct room baru dan menulis ulang `m.direct` jika tidak ada DM sehat -Alur perbaikan tidak menghapus room lama secara otomatis. Alur ini hanya memilih DM yang sehat dan memperbarui pemetaan agar pengiriman Matrix baru, pemberitahuan verifikasi, dan alur direct-message lainnya kembali menargetkan room yang benar. +Alur perbaikan tidak otomatis menghapus room lama. Alur ini hanya memilih DM yang sehat dan memperbarui pemetaan agar pengiriman Matrix baru, notifikasi verifikasi, dan alur direct-message lainnya kembali menargetkan room yang benar. ## Persetujuan exec -Matrix dapat bertindak sebagai klien persetujuan native untuk akun Matrix. Tombol -perutean DM/saluran native tetap berada di bawah config persetujuan exec: +Matrix dapat bertindak sebagai klien persetujuan native untuk akun Matrix. Pengaturan routing DM/channel native tetap berada di bawah config persetujuan exec: - `channels.matrix.execApprovals.enabled` - `channels.matrix.execApprovals.approvers` (opsional; fallback ke `channels.matrix.dm.allowFrom`) @@ -862,42 +595,42 @@ perutean DM/saluran native tetap berada di bawah config persetujuan exec: - `channels.matrix.execApprovals.agentFilter` - `channels.matrix.execApprovals.sessionFilter` -Pemberi persetujuan harus berupa ID pengguna Matrix seperti `@owner:example.org`. Matrix otomatis mengaktifkan persetujuan native saat `enabled` tidak disetel atau `"auto"` dan setidaknya satu pemberi persetujuan dapat di-resolve. Persetujuan exec menggunakan `execApprovals.approvers` terlebih dahulu dan dapat fallback ke `channels.matrix.dm.allowFrom`. Persetujuan Plugin mengotorisasi melalui `channels.matrix.dm.allowFrom`. Setel `enabled: false` untuk menonaktifkan Matrix secara eksplisit sebagai klien persetujuan native. Jika tidak, permintaan persetujuan fallback ke rute persetujuan lain yang dikonfigurasi atau ke kebijakan fallback persetujuan. +Approver harus berupa ID pengguna Matrix seperti `@owner:example.org`. Matrix otomatis mengaktifkan persetujuan native saat `enabled` tidak disetel atau bernilai `"auto"` dan setidaknya satu approver dapat diselesaikan. Persetujuan exec menggunakan `execApprovals.approvers` terlebih dahulu dan dapat fallback ke `channels.matrix.dm.allowFrom`. Persetujuan plugin mengotorisasi melalui `channels.matrix.dm.allowFrom`. Setel `enabled: false` untuk menonaktifkan Matrix sebagai klien persetujuan native secara eksplisit. Jika tidak, permintaan persetujuan akan fallback ke rute persetujuan lain yang dikonfigurasi atau kebijakan fallback persetujuan. -Perutean native Matrix mendukung kedua jenis persetujuan: +Routing native Matrix mendukung kedua jenis persetujuan: -- `channels.matrix.execApprovals.*` mengontrol mode fanout DM/saluran native untuk prompt persetujuan Matrix. -- Persetujuan exec menggunakan kumpulan pemberi persetujuan exec dari `execApprovals.approvers` atau `channels.matrix.dm.allowFrom`. -- Persetujuan Plugin menggunakan allowlist DM Matrix dari `channels.matrix.dm.allowFrom`. -- Pintasan reaksi Matrix dan pembaruan pesan berlaku untuk persetujuan exec maupun Plugin. +- `channels.matrix.execApprovals.*` mengontrol mode fanout DM/channel native untuk prompt persetujuan Matrix. +- Persetujuan exec menggunakan set approver exec dari `execApprovals.approvers` atau `channels.matrix.dm.allowFrom`. +- Persetujuan plugin menggunakan allowlist DM Matrix dari `channels.matrix.dm.allowFrom`. +- Pintasan reaksi Matrix dan pembaruan pesan berlaku untuk persetujuan exec maupun plugin. Aturan pengiriman: -- `target: "dm"` mengirim prompt persetujuan ke DM pemberi persetujuan +- `target: "dm"` mengirim prompt persetujuan ke DM approver - `target: "channel"` mengirim prompt kembali ke room atau DM Matrix asal -- `target: "both"` mengirim ke DM pemberi persetujuan dan room atau DM Matrix asal +- `target: "both"` mengirim ke DM approver dan room atau DM Matrix asal Prompt persetujuan Matrix menanam pintasan reaksi pada pesan persetujuan utama: - `✅` = izinkan sekali - `❌` = tolak -- `♾️` = selalu izinkan saat keputusan itu diizinkan oleh kebijakan exec efektif +- `♾️` = selalu izinkan bila keputusan tersebut diizinkan oleh kebijakan exec yang efektif -Pemberi persetujuan dapat bereaksi pada pesan itu atau menggunakan slash command fallback: `/approve allow-once`, `/approve allow-always`, atau `/approve deny`. +Approver dapat bereaksi pada pesan tersebut atau menggunakan perintah slash fallback: `/approve allow-once`, `/approve allow-always`, atau `/approve deny`. -Hanya pemberi persetujuan yang berhasil di-resolve yang dapat menyetujui atau menolak. Untuk persetujuan exec, pengiriman saluran menyertakan teks perintah, jadi aktifkan `channel` atau `both` hanya di room tepercaya. +Hanya approver yang dapat diselesaikan yang bisa menyetujui atau menolak. Untuk persetujuan exec, pengiriman channel menyertakan teks perintah, jadi aktifkan `channel` atau `both` hanya di room tepercaya. -Override per-akun: +Override per akun: - `channels.matrix.accounts..execApprovals` Dokumentasi terkait: [Persetujuan exec](/id/tools/exec-approvals) -## Slash command +## Perintah slash -Slash command Matrix (misalnya `/new`, `/reset`, `/model`) berfungsi langsung di DM. Di room, OpenClaw juga mengenali slash command yang diawali dengan mention Matrix bot itu sendiri, sehingga `@bot:server /new` memicu jalur perintah tanpa memerlukan regex mention kustom. Ini menjaga bot tetap responsif terhadap kiriman gaya room `@mention /command` yang dikeluarkan oleh Element dan klien serupa ketika pengguna melakukan tab-complete pada bot sebelum mengetik perintah. +Perintah slash Matrix (misalnya `/new`, `/reset`, `/model`) bekerja langsung di DM. Di room, OpenClaw juga mengenali perintah slash yang diawali dengan mention Matrix bot itu sendiri, sehingga `@bot:server /new` memicu jalur perintah tanpa memerlukan regex mention kustom. Ini membuat bot tetap responsif terhadap kiriman bergaya room `@mention /command` yang dipancarkan oleh Element dan klien serupa saat pengguna melengkapi tab bot sebelum mengetik perintah. -Aturan otorisasi tetap berlaku: pengirim perintah harus memenuhi kebijakan allowlist/pemilik DM atau room seperti halnya pesan biasa. +Aturan otorisasi tetap berlaku: pengirim perintah harus memenuhi kebijakan allowlist/owner DM atau room seperti halnya pesan biasa. ## Multi-akun @@ -929,22 +662,22 @@ Aturan otorisasi tetap berlaku: pengirim perintah harus memenuhi kebijakan allow } ``` -Nilai `channels.matrix` level atas bertindak sebagai default untuk akun bernama kecuali sebuah akun menimpanya. -Anda dapat membatasi entri room turunan ke satu akun Matrix dengan `groups..account`. -Entri tanpa `account` tetap dibagikan di semua akun Matrix, dan entri dengan `account: "default"` tetap berfungsi ketika akun default dikonfigurasi langsung pada `channels.matrix.*` level atas. -Default auth bersama parsial tidak dengan sendirinya membuat akun default implisit yang terpisah. OpenClaw hanya mensintesis akun `default` level atas ketika default tersebut memiliki auth baru (`homeserver` plus `accessToken`, atau `homeserver` plus `userId` dan `password`); akun bernama tetap dapat ditemukan dari `homeserver` plus `userId` ketika kredensial cache memenuhi auth nanti. -Jika Matrix sudah memiliki tepat satu akun bernama, atau `defaultAccount` menunjuk ke kunci akun bernama yang ada, promosi perbaikan/penyiapan dari akun tunggal ke multi-akun akan mempertahankan akun itu alih-alih membuat entri `accounts.default` baru. Hanya kunci auth/bootstrap Matrix yang dipindahkan ke akun yang dipromosikan itu; kunci kebijakan pengiriman bersama tetap berada di level atas. -Setel `defaultAccount` saat Anda ingin OpenClaw memilih satu akun Matrix bernama untuk perutean implisit, probing, dan operasi CLI. -Jika beberapa akun Matrix dikonfigurasi dan salah satu ID akun adalah `default`, OpenClaw menggunakan akun itu secara implisit bahkan ketika `defaultAccount` tidak disetel. -Jika Anda mengonfigurasi beberapa akun bernama, setel `defaultAccount` atau berikan `--account ` untuk perintah CLI yang bergantung pada pemilihan akun implisit. -Berikan `--account ` ke `openclaw matrix verify ...` dan `openclaw matrix devices ...` saat Anda ingin menimpa pemilihan implisit itu untuk satu perintah. +Nilai `channels.matrix` tingkat atas bertindak sebagai default untuk akun bernama kecuali suatu akun menimpanya. +Anda dapat memberi scope entri room turunan ke satu akun Matrix dengan `groups..account`. +Entri tanpa `account` tetap dibagikan di semua akun Matrix, dan entri dengan `account: "default"` tetap berfungsi saat akun default dikonfigurasi langsung pada `channels.matrix.*` tingkat atas. +Default autentikasi bersama parsial tidak dengan sendirinya membuat akun default implisit terpisah. OpenClaw hanya mensintesis akun `default` tingkat atas saat default tersebut memiliki autentikasi baru (`homeserver` plus `accessToken`, atau `homeserver` plus `userId` dan `password`); akun bernama masih dapat tetap dapat ditemukan dari `homeserver` plus `userId` ketika kredensial cache nantinya memenuhi autentikasi. +Jika Matrix sudah memiliki tepat satu akun bernama, atau `defaultAccount` menunjuk ke kunci akun bernama yang ada, promosi perbaikan/penyiapan dari akun tunggal ke multi-akun mempertahankan akun tersebut alih-alih membuat entri `accounts.default` baru. Hanya kunci autentikasi/bootstrap Matrix yang dipindahkan ke akun yang dipromosikan itu; kunci kebijakan pengiriman bersama tetap di tingkat atas. +Setel `defaultAccount` saat Anda ingin OpenClaw mengutamakan satu akun Matrix bernama untuk routing implisit, probing, dan operasi CLI. +Jika beberapa akun Matrix dikonfigurasi dan salah satu ID akun adalah `default`, OpenClaw menggunakan akun tersebut secara implisit bahkan saat `defaultAccount` tidak disetel. +Jika Anda mengonfigurasi beberapa akun bernama, setel `defaultAccount` atau teruskan `--account ` untuk perintah CLI yang mengandalkan pemilihan akun implisit. +Teruskan `--account ` ke `openclaw matrix verify ...` dan `openclaw matrix devices ...` saat Anda ingin menimpa pemilihan implisit tersebut untuk satu perintah. Lihat [Referensi konfigurasi](/id/gateway/configuration-reference#multi-account-all-channels) untuk pola multi-akun bersama. ## Homeserver privat/LAN Secara default, OpenClaw memblokir homeserver Matrix privat/internal untuk perlindungan SSRF kecuali Anda -secara eksplisit memilih ikut serta per akun. +secara eksplisit melakukan opt-in per akun. Jika homeserver Anda berjalan di localhost, IP LAN/Tailscale, atau hostname internal, aktifkan `network.dangerouslyAllowPrivateNetwork` untuk akun Matrix tersebut: @@ -973,12 +706,12 @@ openclaw matrix account add \ --access-token syt_ops_xxx ``` -Opt-in ini hanya mengizinkan target privat/internal tepercaya. Homeserver plaintext publik seperti -`http://matrix.example.org:8008` tetap diblokir. Gunakan `https://` bila memungkinkan. +Opt-in ini hanya mengizinkan target privat/internal tepercaya. Homeserver cleartext publik seperti +`http://matrix.example.org:8008` tetap diblokir. Sebaiknya gunakan `https://` bila memungkinkan. -## Mem-proxy lalu lintas Matrix +## Proxy traffic Matrix -Jika deployment Matrix Anda memerlukan proxy HTTP(S) keluar eksplisit, setel `channels.matrix.proxy`: +Jika deployment Matrix Anda memerlukan proxy HTTP(S) keluar yang eksplisit, setel `channels.matrix.proxy`: ```json5 { @@ -992,12 +725,12 @@ Jika deployment Matrix Anda memerlukan proxy HTTP(S) keluar eksplisit, setel `ch } ``` -Akun bernama dapat menimpa default level atas dengan `channels.matrix.accounts..proxy`. -OpenClaw menggunakan pengaturan proxy yang sama untuk lalu lintas runtime Matrix dan probe status akun. +Akun bernama dapat menimpa default tingkat atas dengan `channels.matrix.accounts..proxy`. +OpenClaw menggunakan pengaturan proxy yang sama untuk traffic Matrix runtime dan probe status akun. ## Resolusi target -Matrix menerima bentuk target berikut di mana pun OpenClaw meminta target room atau pengguna: +Matrix menerima bentuk target ini di mana pun OpenClaw meminta target room atau pengguna: - Pengguna: `@user:server`, `user:@user:server`, atau `matrix:user:@user:server` - Room: `!room:server`, `room:!room:server`, atau `matrix:room:!room:server` @@ -1005,73 +738,73 @@ Matrix menerima bentuk target berikut di mana pun OpenClaw meminta target room a Pencarian direktori live menggunakan akun Matrix yang sedang login: -- Pencarian pengguna meng-query direktori pengguna Matrix pada homeserver tersebut. -- Pencarian room menerima ID room dan alias eksplisit secara langsung, lalu fallback ke pencarian nama room yang diikuti untuk akun itu. -- Pencarian nama joined-room bersifat best-effort. Jika nama room tidak dapat di-resolve menjadi ID atau alias, nama itu diabaikan oleh resolusi allowlist saat runtime. +- Pencarian pengguna mengueri direktori pengguna Matrix di homeserver tersebut. +- Pencarian room menerima ID room dan alias eksplisit secara langsung, lalu fallback ke pencarian nama room yang sudah joined untuk akun tersebut. +- Pencarian nama room yang sudah joined bersifat best-effort. Jika nama room tidak dapat diselesaikan ke ID atau alias, nama tersebut diabaikan oleh resolusi allowlist runtime. ## Referensi konfigurasi -- `enabled`: mengaktifkan atau menonaktifkan saluran. +- `enabled`: mengaktifkan atau menonaktifkan channel. - `name`: label opsional untuk akun. - `defaultAccount`: ID akun yang diutamakan saat beberapa akun Matrix dikonfigurasi. - `homeserver`: URL homeserver, misalnya `https://matrix.example.org`. -- `network.dangerouslyAllowPrivateNetwork`: izinkan akun Matrix ini terhubung ke homeserver privat/internal. Aktifkan ini saat homeserver ter-resolve ke `localhost`, IP LAN/Tailscale, atau host internal seperti `matrix-synapse`. -- `proxy`: URL proxy HTTP(S) opsional untuk lalu lintas Matrix. Akun bernama dapat menimpa default level atas dengan `proxy` milik mereka sendiri. +- `network.dangerouslyAllowPrivateNetwork`: mengizinkan akun Matrix ini terhubung ke homeserver privat/internal. Aktifkan ini ketika homeserver mengarah ke `localhost`, IP LAN/Tailscale, atau host internal seperti `matrix-synapse`. +- `proxy`: URL proxy HTTP(S) opsional untuk traffic Matrix. Akun bernama dapat menimpa default tingkat atas dengan `proxy` miliknya sendiri. - `userId`: ID pengguna Matrix lengkap, misalnya `@bot:example.org`. -- `accessToken`: access token untuk auth berbasis token. Nilai plaintext dan nilai SecretRef didukung untuk `channels.matrix.accessToken` dan `channels.matrix.accounts..accessToken` di seluruh provider env/file/exec. Lihat [Secrets Management](/id/gateway/secrets). -- `password`: password untuk login berbasis password. Nilai plaintext dan nilai SecretRef didukung. +- `accessToken`: access token untuk autentikasi berbasis token. Nilai plaintext dan nilai SecretRef didukung untuk `channels.matrix.accessToken` dan `channels.matrix.accounts..accessToken` di seluruh provider env/file/exec. Lihat [Secrets Management](/id/gateway/secrets). +- `password`: kata sandi untuk login berbasis kata sandi. Nilai plaintext dan nilai SecretRef didukung. - `deviceId`: ID perangkat Matrix eksplisit. -- `deviceName`: nama tampilan perangkat untuk login password. -- `avatarUrl`: URL avatar diri yang disimpan untuk sinkronisasi profil dan pembaruan `profile set`. -- `initialSyncLimit`: jumlah maksimum event yang diambil selama sync startup. -- `encryption`: aktifkan E2EE. +- `deviceName`: nama tampilan perangkat untuk login kata sandi. +- `avatarUrl`: URL avatar mandiri yang disimpan untuk sinkronisasi profil dan pembaruan `profile set`. +- `initialSyncLimit`: jumlah maksimum event yang diambil selama sinkronisasi startup. +- `encryption`: mengaktifkan E2EE. - `allowlistOnly`: saat `true`, meningkatkan kebijakan room `open` menjadi `allowlist`, dan memaksa semua kebijakan DM aktif kecuali `disabled` (termasuk `pairing` dan `open`) menjadi `allowlist`. Tidak memengaruhi kebijakan `disabled`. -- `allowBots`: izinkan pesan dari akun Matrix OpenClaw lain yang telah dikonfigurasi (`true` atau `"mentions"`). +- `allowBots`: mengizinkan pesan dari akun Matrix OpenClaw terkonfigurasi lainnya (`true` atau `"mentions"`). - `groupPolicy`: `open`, `allowlist`, atau `disabled`. - `contextVisibility`: mode visibilitas konteks room tambahan (`all`, `allowlist`, `allowlist_quote`). -- `groupAllowFrom`: allowlist ID pengguna untuk lalu lintas room. ID pengguna Matrix lengkap paling aman; kecocokan direktori persis di-resolve saat startup dan saat allowlist berubah ketika monitor berjalan. Nama yang tidak ter-resolve diabaikan. +- `groupAllowFrom`: allowlist ID pengguna untuk traffic room. ID pengguna Matrix lengkap paling aman; kecocokan direktori yang tepat diselesaikan saat startup dan saat allowlist berubah ketika monitor sedang berjalan. Nama yang tidak terselesaikan diabaikan. - `historyLimit`: jumlah maksimum pesan room yang disertakan sebagai konteks riwayat grup. Fallback ke `messages.groupChat.historyLimit`; jika keduanya tidak disetel, default efektifnya adalah `0`. Setel `0` untuk menonaktifkan. - `replyToMode`: `off`, `first`, `all`, atau `batched`. -- `markdown`: konfigurasi rendering Markdown opsional untuk teks Matrix keluar. -- `streaming`: `off` (default), `"partial"`, `"quiet"`, `true`, atau `false`. `"partial"` dan `true` mengaktifkan pembaruan draf pratinjau-dulu dengan pesan teks Matrix normal. `"quiet"` menggunakan pemberitahuan pratinjau tanpa notifikasi untuk penyiapan push-rule self-hosted. `false` setara dengan `"off"`. -- `blockStreaming`: `true` mengaktifkan pesan progres terpisah untuk blok assistant yang telah selesai saat streaming pratinjau draf aktif. +- `markdown`: config rendering Markdown opsional untuk teks Matrix keluar. +- `streaming`: `off` (default), `"partial"`, `"quiet"`, `true`, atau `false`. `"partial"` dan `true` mengaktifkan pembaruan draf yang mengutamakan pratinjau dengan pesan teks Matrix normal. `"quiet"` menggunakan notifikasi pratinjau tanpa notifikasi untuk penyiapan push rule self-hosted. `false` setara dengan `"off"`. +- `blockStreaming`: `true` mengaktifkan pesan progres terpisah untuk blok asisten yang telah selesai saat streaming pratinjau draf aktif. - `threadReplies`: `off`, `inbound`, atau `always`. -- `threadBindings`: override per saluran untuk perutean dan siklus hidup sesi yang terikat thread. +- `threadBindings`: override per-channel untuk routing dan siklus hidup sesi yang terikat thread. - `startupVerification`: mode permintaan verifikasi mandiri otomatis saat startup (`if-unverified`, `off`). - `startupVerificationCooldownHours`: cooldown sebelum mencoba lagi permintaan verifikasi startup otomatis. - `textChunkLimit`: ukuran chunk pesan keluar dalam karakter (berlaku saat `chunkMode` adalah `length`). -- `chunkMode`: `length` membagi pesan berdasarkan jumlah karakter; `newline` membagi pada batas baris. -- `responsePrefix`: string opsional yang diawali pada semua balasan keluar untuk saluran ini. -- `ackReaction`: override reaksi ack opsional untuk saluran/akun ini. +- `chunkMode`: `length` memisahkan pesan berdasarkan jumlah karakter; `newline` memisahkan pada batas baris. +- `responsePrefix`: string opsional yang ditambahkan di depan semua balasan keluar untuk channel ini. +- `ackReaction`: override reaksi ack opsional untuk channel/akun ini. - `ackReactionScope`: override cakupan reaksi ack opsional (`group-mentions`, `group-all`, `direct`, `all`, `none`, `off`). - `reactionNotifications`: mode notifikasi reaksi masuk (`own`, `off`). - `mediaMaxMb`: batas ukuran media dalam MB untuk pengiriman keluar dan pemrosesan media masuk. -- `autoJoin`: kebijakan auto-join undangan (`always`, `allowlist`, `off`). Default: `off`. Berlaku untuk semua undangan Matrix, termasuk undangan gaya DM. -- `autoJoinAllowlist`: room/alias yang diizinkan saat `autoJoin` adalah `allowlist`. Entri alias di-resolve menjadi ID room selama penanganan undangan; OpenClaw tidak memercayai state alias yang diklaim oleh room yang diundang. +- `autoJoin`: kebijakan auto-join undangan (`always`, `allowlist`, `off`). Default: `off`. Berlaku untuk semua undangan Matrix, termasuk undangan bergaya DM. +- `autoJoinAllowlist`: room/alias yang diizinkan saat `autoJoin` adalah `allowlist`. Entri alias diselesaikan ke ID room selama penanganan undangan; OpenClaw tidak mempercayai status alias yang diklaim oleh room yang mengundang. - `dm`: blok kebijakan DM (`enabled`, `policy`, `allowFrom`, `sessionScope`, `threadReplies`). -- `dm.policy`: mengontrol akses DM setelah OpenClaw bergabung ke room dan mengklasifikasikannya sebagai DM. Ini tidak mengubah apakah sebuah undangan di-auto-join. -- `dm.allowFrom`: allowlist ID pengguna untuk lalu lintas DM. ID pengguna Matrix lengkap paling aman; kecocokan direktori persis di-resolve saat startup dan saat allowlist berubah ketika monitor berjalan. Nama yang tidak ter-resolve diabaikan. +- `dm.policy`: mengontrol akses DM setelah OpenClaw bergabung ke room dan mengklasifikasikannya sebagai DM. Ini tidak mengubah apakah undangan di-auto-join. +- `dm.allowFrom`: allowlist ID pengguna untuk traffic DM. ID pengguna Matrix lengkap paling aman; kecocokan direktori yang tepat diselesaikan saat startup dan saat allowlist berubah ketika monitor sedang berjalan. Nama yang tidak terselesaikan diabaikan. - `dm.sessionScope`: `per-user` (default) atau `per-room`. Gunakan `per-room` saat Anda ingin setiap room DM Matrix mempertahankan konteks terpisah meskipun peer-nya sama. -- `dm.threadReplies`: override kebijakan thread khusus DM (`off`, `inbound`, `always`). Ini menimpa pengaturan `threadReplies` level atas untuk penempatan balasan maupun isolasi sesi di DM. +- `dm.threadReplies`: override kebijakan thread khusus DM (`off`, `inbound`, `always`). Ini menimpa pengaturan `threadReplies` tingkat atas untuk penempatan balasan maupun isolasi sesi di DM. - `execApprovals`: pengiriman persetujuan exec native Matrix (`enabled`, `approvers`, `target`, `agentFilter`, `sessionFilter`). -- `execApprovals.approvers`: ID pengguna Matrix yang diizinkan menyetujui permintaan exec. Opsional saat `dm.allowFrom` sudah mengidentifikasi para pemberi persetujuan. +- `execApprovals.approvers`: ID pengguna Matrix yang diizinkan menyetujui permintaan exec. Opsional jika `dm.allowFrom` sudah mengidentifikasi para approver. - `execApprovals.target`: `dm | channel | both` (default: `dm`). -- `accounts`: override bernama per akun. Nilai `channels.matrix` level atas bertindak sebagai default untuk entri ini. -- `groups`: peta kebijakan per room. Utamakan ID room atau alias; nama room yang tidak ter-resolve diabaikan saat runtime. Identitas sesi/grup menggunakan ID room stabil setelah resolusi. +- `accounts`: override bernama per akun. Nilai `channels.matrix` tingkat atas bertindak sebagai default untuk entri ini. +- `groups`: peta kebijakan per-room. Sebaiknya gunakan ID room atau alias; nama room yang tidak terselesaikan diabaikan saat runtime. Identitas sesi/grup menggunakan ID room stabil setelah resolusi. - `groups..account`: membatasi satu entri room turunan ke akun Matrix tertentu dalam penyiapan multi-akun. -- `groups..allowBots`: override level room untuk pengirim bot yang telah dikonfigurasi (`true` atau `"mentions"`). -- `groups..users`: allowlist pengirim per room. -- `groups..tools`: override izinkan/tolak tool per room. -- `groups..autoReply`: override mention-gating level room. `true` menonaktifkan persyaratan mention untuk room itu; `false` memaksanya aktif kembali. -- `groups..skills`: filter skill level room opsional. -- `groups..systemPrompt`: cuplikan system prompt level room opsional. -- `rooms`: alias legacy untuk `groups`. -- `actions`: gating tool per tindakan (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`). +- `groups..allowBots`: override tingkat room untuk pengirim bot terkonfigurasi (`true` atau `"mentions"`). +- `groups..users`: allowlist pengirim per-room. +- `groups..tools`: override izinkan/tolak tool per-room. +- `groups..autoReply`: override gating mention tingkat room. `true` menonaktifkan persyaratan mention untuk room tersebut; `false` memaksanya aktif kembali. +- `groups..skills`: filter skill tingkat room opsional. +- `groups..systemPrompt`: cuplikan system prompt tingkat room opsional. +- `rooms`: alias lama untuk `groups`. +- `actions`: gating tool per aksi (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`). ## Terkait -- [Ikhtisar Saluran](/id/channels) — semua saluran yang didukung -- [Pairing](/id/channels/pairing) — auth DM dan alur pairing -- [Grup](/id/channels/groups) — perilaku obrolan grup dan mention gating -- [Perutean Saluran](/id/channels/channel-routing) — perutean sesi untuk pesan -- [Keamanan](/id/gateway/security) — model akses dan hardening +- [Ikhtisar Channels](/id/channels) — semua channel yang didukung +- [Pairing](/id/channels/pairing) — autentikasi DM dan alur pairing +- [Groups](/id/channels/groups) — perilaku chat grup dan gating mention +- [Channel Routing](/id/channels/channel-routing) — routing sesi untuk pesan +- [Security](/id/gateway/security) — model akses dan hardening diff --git a/docs/id/ci.md b/docs/id/ci.md index 810de6762..2d042632d 100644 --- a/docs/id/ci.md +++ b/docs/id/ci.md @@ -1,107 +1,108 @@ --- read_when: - - Anda perlu memahami mengapa sebuah pekerjaan CI dijalankan atau tidak dijalankan + - Anda perlu memahami mengapa sebuah pekerjaan CI berjalan atau tidak berjalan - Anda sedang men-debug pemeriksaan GitHub Actions yang gagal -summary: Graf pekerjaan CI, gerbang cakupan, dan padanan perintah lokal +summary: Grafik pekerjaan CI, gerbang cakupan, dan padanan perintah lokal title: Pipeline CI x-i18n: - generated_at: "2026-04-23T13:58:13Z" + generated_at: "2026-04-23T14:55:27Z" model: gpt-5.4 provider: openai - source_hash: c5a8ea0d8e428826169b0e6aced1caeb993106fe79904002125ace86b48cae1f + source_hash: e9a03440ae28a15167fc08d9c66bb1fd719ddfa1517aaecb119c80f2ad826c0d source_path: ci.md workflow: 15 --- # Pipeline CI -CI berjalan pada setiap push ke `main` dan setiap pull request. CI menggunakan pembatasan cakupan cerdas untuk melewati pekerjaan yang mahal saat hanya area yang tidak terkait yang berubah. +CI berjalan pada setiap push ke `main` dan setiap pull request. CI menggunakan cakupan cerdas untuk melewati pekerjaan mahal ketika hanya area yang tidak terkait yang berubah. -QA Lab memiliki lane CI khusus di luar workflow utama yang dibatasi cakupan secara cerdas. Workflow +QA Lab memiliki lane CI khusus di luar workflow utama dengan cakupan cerdas. Workflow `Parity gate` berjalan pada perubahan PR yang cocok dan manual dispatch; workflow ini -membangun runtime QA privat dan membandingkan paket agentic mock GPT-5.4 dan Opus 4.6. +membangun runtime QA privat dan membandingkan paket agentic tiruan GPT-5.4 dan Opus 4.6. Workflow `QA-Lab - All Lanes` berjalan setiap malam di `main` dan pada -manual dispatch; workflow ini menyebarkan parity gate mock, lane Matrix live, dan lane +manual dispatch; workflow ini menyebarkan mock parity gate, lane Matrix live, dan lane Telegram live sebagai pekerjaan paralel. Pekerjaan live menggunakan environment `qa-live-shared`, dan lane Telegram menggunakan lease Convex. `OpenClaw Release Checks` juga menjalankan lane QA Lab yang sama sebelum persetujuan rilis. ## Ringkasan Pekerjaan -| Pekerjaan | Tujuan | Kapan dijalankan | +| Job | Tujuan | Kapan dijalankan | | -------------------------------- | -------------------------------------------------------------------------------------------- | ----------------------------------- | -| `preflight` | Mendeteksi perubahan docs-only, cakupan 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 bebas dependensi terhadap advisory npm | Selalu pada push dan PR non-draft | -| `security-fast` | Agregat wajib untuk pekerjaan keamanan cepat | Selalu pada push dan PR non-draft | -| `build-artifacts` | Membangun `dist/`, Control UI, pemeriksaan built-artifact, dan artifact downstream yang dapat digunakan ulang | Perubahan yang relevan dengan Node | +| `preflight` | Mendeteksi perubahan khusus docs, cakupan yang berubah, ekstensi yang berubah, dan membangun manifes CI | Selalu pada push dan PR non-draf | +| `security-scm-fast` | Deteksi private key dan audit workflow melalui `zizmor` | Selalu pada push dan PR non-draf | +| `security-dependency-audit` | Audit lockfile produksi tanpa dependensi terhadap advisory npm | Selalu pada push dan PR non-draf | +| `security-fast` | Agregat wajib untuk pekerjaan keamanan cepat | Selalu pada push dan PR non-draf | +| `build-artifacts` | Membangun `dist/`, UI Control, pemeriksaan built-artifact, dan artifact downstream yang dapat digunakan ulang | Perubahan yang relevan dengan Node | | `checks-fast-core` | Lane korektness Linux cepat seperti pemeriksaan bundled/plugin-contract/protocol | Perubahan yang relevan dengan Node | | `checks-fast-contracts-channels` | Pemeriksaan kontrak channel yang di-shard dengan hasil pemeriksaan agregat yang stabil | Perubahan yang relevan dengan Node | -| `checks-node-extensions` | Shard pengujian bundled-plugin penuh di seluruh suite extension | Perubahan yang relevan dengan Node | +| `checks-node-extensions` | Shard pengujian bundled-plugin penuh di seluruh suite ekstensi | Perubahan yang relevan dengan Node | | `checks-node-core-test` | Shard pengujian Node inti, tidak termasuk lane channel, bundled, contract, dan extension | Perubahan yang relevan dengan Node | -| `extension-fast` | Pengujian terfokus hanya untuk bundled plugin yang berubah | Pull request dengan perubahan extension | -| `check` | Padanan gerbang lokal utama yang di-shard: tipe prod, lint, guard, tipe test, dan smoke ketat | Perubahan yang relevan dengan Node | -| `check-additional` | Guard arsitektur, boundary, permukaan extension, package-boundary, dan shard gateway-watch | Perubahan yang relevan dengan Node | -| `build-smoke` | Pengujian smoke CLI hasil build dan smoke memori startup | Perubahan yang relevan dengan Node | -| `checks` | Verifier untuk pengujian channel built-artifact ditambah kompatibilitas Node 22 khusus push | Perubahan yang relevan dengan Node | -| `check-docs` | Pemeriksaan format docs, lint, dan tautan rusak | Docs berubah | -| `skills-python` | Ruff + pytest untuk Skills berbasis Python | Perubahan yang relevan dengan Python skill | +| `extension-fast` | Pengujian terfokus hanya untuk plugin bundled yang berubah | Pull request dengan perubahan ekstensi | +| `check` | Padanan gerbang lokal utama yang di-shard: tipe prod, lint, guard, tipe pengujian, dan smoke ketat | Perubahan yang relevan dengan Node | +| `check-additional` | Guard arsitektur, boundary, extension-surface, package-boundary, dan shard gateway-watch | Perubahan yang relevan dengan Node | +| `build-smoke` | Pengujian smoke CLI yang sudah dibangun dan smoke memori startup | Perubahan yang relevan dengan Node | +| `checks` | Verifikator untuk pengujian channel built-artifact ditambah kompatibilitas Node 22 khusus push | Perubahan yang relevan dengan Node | +| `check-docs` | Pemeriksaan pemformatan docs, lint, dan tautan rusak | Docs berubah | +| `skills-python` | Ruff + pytest untuk Skills berbasis Python | Perubahan yang relevan dengan Skills Python | | `checks-windows` | Lane pengujian khusus Windows | Perubahan yang relevan dengan Windows | | `macos-node` | Lane pengujian TypeScript macOS menggunakan built artifact bersama | Perubahan yang relevan dengan macOS | | `macos-swift` | Lint, build, dan pengujian Swift untuk aplikasi macOS | Perubahan yang relevan dengan macOS | | `android` | Pengujian unit Android untuk kedua flavor ditambah satu build APK debug | Perubahan yang relevan dengan Android | -## Urutan Gagal Cepat +## Urutan Gagal-Cepat Pekerjaan diurutkan agar pemeriksaan murah gagal sebelum pekerjaan mahal berjalan: -1. `preflight` memutuskan lane mana yang ada. Logika `docs-scope` dan `changed-scope` adalah step di dalam pekerjaan ini, bukan pekerjaan terpisah. +1. `preflight` menentukan lane mana saja yang ada. Logika `docs-scope` dan `changed-scope` adalah langkah di dalam pekerjaan ini, bukan pekerjaan terpisah. 2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs`, dan `skills-python` gagal cepat tanpa menunggu pekerjaan artifact dan matriks platform yang lebih berat. 3. `build-artifacts` berjalan tumpang tindih dengan lane Linux cepat agar konsumen downstream dapat mulai segera setelah build bersama siap. -4. Setelah itu, lane platform dan runtime yang lebih berat menyebar: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast` khusus PR, `checks`, `checks-windows`, `macos-node`, `macos-swift`, dan `android`. +4. Setelah itu lane platform dan runtime yang lebih berat menyebar: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast` khusus PR, `checks`, `checks-windows`, `macos-node`, `macos-swift`, dan `android`. -Logika cakupan berada di `scripts/ci-changed-scope.mjs` dan dicakup oleh pengujian unit di `src/scripts/ci-changed-scope.test.ts`. -Edit workflow CI memvalidasi grafik CI Node beserta workflow linting, tetapi tidak memaksa build native Windows, Android, atau macOS dengan sendirinya; lane platform tersebut tetap dibatasi pada perubahan source platform. -Pemeriksaan Node Windows dibatasi pada wrapper proses/path khusus Windows, helper runner npm/pnpm/UI, konfigurasi package manager, dan permukaan workflow CI yang mengeksekusi lane tersebut; perubahan source, plugin, install-smoke, dan test-only yang tidak terkait tetap berada di lane Node Linux agar tidak memesan worker Windows 16-vCPU untuk cakupan yang sudah diuji oleh shard pengujian normal. -Workflow `install-smoke` yang terpisah menggunakan kembali skrip cakupan yang sama melalui pekerjaan `preflight` miliknya sendiri. Workflow ini menghitung `run_install_smoke` dari sinyal changed-smoke yang lebih sempit, sehingga smoke Docker/install berjalan untuk perubahan install, packaging, yang relevan dengan container, perubahan produksi bundled extension, dan permukaan inti plugin/channel/gateway/Plugin SDK yang dijalankan oleh pekerjaan smoke Docker. Edit test-only dan docs-only tidak memesan worker Docker. Smoke paket QR memaksa layer Docker `pnpm install` untuk dijalankan ulang sambil mempertahankan cache BuildKit pnpm store, sehingga tetap menguji instalasi tanpa mengunduh ulang dependensi pada setiap run. E2E gateway-network menggunakan kembali image runtime yang dibangun sebelumnya dalam pekerjaan, sehingga menambahkan cakupan WebSocket antarkontainer nyata tanpa menambahkan build Docker lain. `test:docker:all` lokal melakukan prebuild satu image live-test bersama dan satu image built-app bersama `scripts/e2e/Dockerfile`, lalu menjalankan lane smoke live/E2E secara paralel dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`; sesuaikan konkurensi default 4 dengan `OPENCLAW_DOCKER_ALL_PARALLELISM`. Agregat lokal berhenti menjadwalkan lane gabungan baru setelah kegagalan pertama secara default, dan tiap lane memiliki timeout 120 menit yang dapat dioverride dengan `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Lane yang sensitif terhadap startup atau provider berjalan secara eksklusif setelah pool paralel. Workflow live/E2E reusable mencerminkan pola image bersama dengan membangun dan mendorong satu image Docker E2E GHCR bertag SHA sebelum matriks Docker, lalu menjalankan matriks dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. Workflow live/E2E terjadwal menjalankan suite Docker jalur-rilis penuh setiap hari. Pengujian Docker QR dan installer mempertahankan Dockerfile mereka sendiri yang berfokus pada instalasi. Pekerjaan `docker-e2e-fast` terpisah menjalankan profil Docker bundled-plugin yang dibatasi di bawah timeout perintah 120 detik: perbaikan dependensi setup-entry ditambah isolasi kegagalan bundled-loader sintetis. Matriks pembaruan/channel bundled penuh tetap manual/full-suite karena menjalankan pass update npm nyata dan doctor repair berulang. +Logika cakupan berada di `scripts/ci-changed-scope.mjs` dan dicakup oleh unit test di `src/scripts/ci-changed-scope.test.ts`. +Edit workflow CI memvalidasi grafik CI Node plus workflow linting, tetapi tidak dengan sendirinya memaksa build native Windows, Android, atau macOS; lane platform tersebut tetap dibatasi pada perubahan sumber platform. +Pemeriksaan Node Windows dibatasi pada 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 test yang tidak terkait tetap berada di lane Linux Node agar tidak memesan worker Windows 16-vCPU untuk cakupan yang sudah diuji oleh shard test normal. +Workflow `install-smoke` yang terpisah menggunakan ulang skrip cakupan yang sama melalui pekerjaan `preflight` miliknya sendiri. Workflow ini menghitung `run_install_smoke` dari sinyal changed-smoke yang lebih sempit, sehingga smoke Docker/install berjalan untuk perubahan yang relevan dengan instalasi, packaging, container, perubahan produksi bundled extension, dan permukaan inti plugin/channel/Gateway/Plugin SDK yang diuji oleh pekerjaan smoke Docker. Edit khusus test dan docs tidak memesan worker Docker. Smoke paket QR-nya memaksa layer Docker `pnpm install` untuk dijalankan ulang sambil mempertahankan cache BuildKit pnpm store, sehingga tetap menguji instalasi tanpa mengunduh ulang dependensi pada setiap run. E2E gateway-network-nya menggunakan ulang image runtime yang dibangun sebelumnya di dalam pekerjaan, sehingga menambah cakupan WebSocket container-ke-container nyata tanpa menambah build Docker lain. Agregat lokal `test:docker:all` melakukan prebuild satu image live-test bersama dan satu image built-app `scripts/e2e/Dockerfile` bersama, lalu menjalankan lane smoke live/E2E secara paralel dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`; sesuaikan konkurensi bawaan 4 dengan `OPENCLAW_DOCKER_ALL_PARALLELISM`. Agregat lokal secara bawaan berhenti menjadwalkan lane pool baru setelah kegagalan pertama, dan setiap lane memiliki timeout 120 menit yang dapat dioverride dengan `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Lane yang sensitif terhadap startup atau provider berjalan secara eksklusif setelah pool paralel. Workflow live/E2E yang dapat digunakan ulang mencerminkan pola shared-image dengan membangun dan mendorong satu image Docker E2E GHCR bertag SHA sebelum matriks Docker, lalu menjalankan matriks dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. Workflow live/E2E terjadwal menjalankan suite Docker jalur rilis penuh setiap hari. Pengujian Docker QR dan installer mempertahankan Dockerfile fokus-instalasi mereka sendiri. Pekerjaan `docker-e2e-fast` yang terpisah menjalankan profil Docker bundled-plugin yang dibatasi dengan command timeout 120 detik: perbaikan dependensi setup-entry ditambah isolasi kegagalan bundled-loader sintetis. Matriks update/channel bundled penuh tetap manual/full-suite karena melakukan pass update npm nyata dan perbaikan doctor berulang. -Logika changed-lane lokal berada di `scripts/changed-lanes.mjs` dan dieksekusi oleh `scripts/check-changed.mjs`. Gerbang lokal ini lebih ketat terhadap boundary arsitektur daripada cakupan platform CI yang lebih luas: perubahan produksi inti menjalankan typecheck prod inti ditambah pengujian inti, perubahan test-only inti hanya menjalankan typecheck/pengujian test inti, perubahan produksi extension menjalankan typecheck prod extension ditambah pengujian extension, dan perubahan test-only extension hanya menjalankan typecheck/pengujian test extension. Perubahan pada Plugin SDK publik atau plugin-contract diperluas ke validasi extension karena extension bergantung pada kontrak inti tersebut. Version bump yang hanya mengubah metadata rilis menjalankan pemeriksaan versi/konfigurasi/dependensi root yang terarah. Perubahan root/konfigurasi yang tidak dikenal gagal aman ke semua lane. +Logika changed-lane lokal berada di `scripts/changed-lanes.mjs` dan dijalankan oleh `scripts/check-changed.mjs`. Gerbang lokal itu lebih ketat terhadap boundary arsitektur dibanding cakupan platform CI yang luas: perubahan produksi inti menjalankan typecheck prod inti ditambah pengujian inti, perubahan khusus test inti hanya menjalankan typecheck/pengujian test inti, perubahan produksi ekstensi menjalankan typecheck prod ekstensi ditambah pengujian ekstensi, dan perubahan khusus test ekstensi hanya menjalankan typecheck/pengujian test ekstensi. Perubahan Plugin SDK publik atau plugin-contract diperluas ke validasi ekstensi karena ekstensi bergantung pada kontrak inti tersebut. Kenaikan versi khusus metadata rilis menjalankan pemeriksaan terarah untuk versi/konfigurasi/dependensi root. Perubahan root/konfigurasi yang tidak diketahui gagal-aman ke semua lane. -Pada push, matriks `checks` menambahkan lane `compat-node22` yang khusus push. Pada pull request, lane tersebut dilewati dan matriks tetap berfokus pada lane pengujian/channel normal. +Pada push, matriks `checks` menambahkan lane `compat-node22` khusus push. Pada pull request, lane itu dilewati dan matriks tetap berfokus pada lane test/channel normal. -Keluarga pengujian Node yang paling lambat dibagi atau diseimbangkan agar setiap pekerjaan tetap kecil: kontrak channel membagi cakupan registry dan inti menjadi total enam shard berbobot, pengujian bundled plugin diseimbangkan di enam worker extension, auto-reply berjalan sebagai tiga worker seimbang alih-alih enam worker kecil, dan konfigurasi gateway/plugin agentic disebar ke pekerjaan Node agentic source-only yang sudah ada alih-alih menunggu built artifact. Pengujian plugin browser luas, QA, media, dan miscellaneous menggunakan konfigurasi Vitest khusus mereka alih-alih plugin catch-all bersama. Lane agents yang luas menggunakan penjadwal file-paralel Vitest bersama karena didominasi import/penjadwalan alih-alih dimiliki satu file pengujian lambat. `runtime-config` berjalan dengan shard infra core-runtime agar shard runtime bersama tidak memegang ekor terlama. `check-additional` menjaga pekerjaan compile/canary package-boundary tetap bersama dan memisahkan arsitektur topologi runtime dari cakupan gateway watch; shard boundary guard menjalankan guard kecil independennya secara serentak di dalam satu pekerjaan. Gateway watch, pengujian channel, dan shard core support-boundary berjalan serentak di dalam `build-artifacts` setelah `dist/` dan `dist-runtime/` sudah dibangun, mempertahankan nama pemeriksaan lama mereka sebagai pekerjaan verifier ringan sambil menghindari dua worker Blacksmith tambahan dan antrean konsumen artifact kedua. -CI Android menjalankan `testPlayDebugUnitTest` dan `testThirdPartyDebugUnitTest`, lalu membangun APK debug Play. Flavor pihak ketiga tidak memiliki source set atau manifest terpisah; lane pengujian unitnya tetap mengompilasi flavor tersebut dengan flag BuildConfig SMS/call-log, sambil menghindari pekerjaan packaging APK debug duplikat pada setiap push yang relevan dengan Android. -`extension-fast` khusus PR karena push run sudah mengeksekusi shard bundled plugin penuh. Ini menjaga umpan balik changed-plugin untuk review tanpa memesan worker Blacksmith tambahan di `main` untuk cakupan yang sudah ada di `checks-node-extensions`. +Keluarga pengujian Node yang paling lambat dipisah atau diseimbangkan agar setiap pekerjaan tetap kecil tanpa memesan runner secara berlebihan: kontrak channel berjalan sebagai tiga shard berbobot, pengujian bundled plugin diseimbangkan di enam worker ekstensi, lane unit inti kecil dipasangkan, auto-reply berjalan sebagai tiga worker seimbang alih-alih enam worker kecil, dan konfigurasi agentic gateway/plugin disebarkan ke pekerjaan agentic Node khusus source yang sudah ada alih-alih menunggu built artifact. Pengujian browser luas, QA, media, dan plugin lain-lain menggunakan konfigurasi Vitest khusus mereka alih-alih catch-all plugin bersama. Lane agents yang luas menggunakan scheduler paralel-berkas Vitest bersama karena didominasi import/penjadwalan, bukan dimiliki oleh satu file test lambat. `runtime-config` berjalan bersama shard infra core-runtime agar shard runtime bersama tidak menanggung ekor. `check-additional` menjaga pekerjaan compile/canary package-boundary tetap bersama dan memisahkan arsitektur topologi runtime dari cakupan gateway watch; shard boundary guard menjalankan guard independen kecilnya secara bersamaan di dalam satu pekerjaan. Gateway watch, pengujian channel, dan shard boundary dukungan inti berjalan bersamaan di dalam `build-artifacts` setelah `dist/` dan `dist-runtime/` sudah dibangun, mempertahankan nama pemeriksaan lama mereka sebagai pekerjaan verifikator ringan sambil menghindari dua worker Blacksmith tambahan dan antrean konsumen artifact kedua. +Android CI menjalankan `testPlayDebugUnitTest` dan `testThirdPartyDebugUnitTest`, lalu membangun APK debug Play. Flavor third-party tidak memiliki source set atau manifes terpisah; lane unit-test-nya tetap mengompilasi flavor tersebut dengan flag BuildConfig SMS/call-log, sambil menghindari pekerjaan packaging APK debug duplikat pada setiap push yang relevan dengan Android. +`extension-fast` khusus PR karena run push sudah menjalankan shard plugin bundled penuh. Ini mempertahankan umpan balik changed-plugin untuk review tanpa memesan worker Blacksmith tambahan di `main` untuk cakupan yang sudah ada di `checks-node-extensions`. -GitHub dapat menandai pekerjaan yang disupersede sebagai `cancelled` saat push yang lebih baru masuk pada PR atau ref `main` yang sama. Perlakukan itu sebagai noise CI kecuali run terbaru untuk ref yang sama juga gagal. Pemeriksaan agregat shard menggunakan `!cancelled() && always()` sehingga tetap melaporkan kegagalan shard normal tetapi tidak mengantre setelah seluruh workflow sudah disupersede. -Kunci konkurensi CI diberi versi (`CI-v7-*`) sehingga zombie sisi GitHub dalam grup antrean lama tidak dapat memblokir run main yang lebih baru tanpa batas. +GitHub dapat menandai pekerjaan yang digantikan sebagai `cancelled` ketika push yang lebih baru masuk pada PR atau ref `main` yang sama. Anggap itu sebagai noise CI kecuali run terbaru untuk ref yang sama juga gagal. Pemeriksaan shard agregat menggunakan `!cancelled() && always()` agar tetap melaporkan kegagalan shard normal tetapi tidak antre setelah seluruh workflow sudah digantikan. +Kunci konkurensi CI diberi versi (`CI-v7-*`) agar zombie sisi GitHub dalam grup antrean lama tidak dapat memblokir run `main` yang lebih baru tanpa batas waktu. ## Runner -| Runner | Pekerjaan | -| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ubuntu-24.04` | `preflight`, pekerjaan dan agregat keamanan cepat (`security-scm-fast`, `security-dependency-audit`, `security-fast`), pemeriksaan protocol/contract/bundled cepat, pemeriksaan kontrak channel yang di-shard, shard `check` kecuali lint, shard dan agregat `check-additional`, verifier agregat pengujian Node, pemeriksaan docs, Skills Python, workflow-sanity, labeler, auto-response; preflight install-smoke juga menggunakan Ubuntu yang di-host GitHub agar matriks Blacksmith dapat mengantre lebih awal | -| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard pengujian Node Linux, shard pengujian bundled plugin, `android` | -| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, yang tetap cukup sensitif terhadap CPU sehingga 8 vCPU justru lebih mahal daripada penghematannya; build Docker install-smoke, di mana waktu antre 32-vCPU lebih mahal daripada penghematannya | -| `blacksmith-16vcpu-windows-2025` | `checks-windows` | -| `blacksmith-6vcpu-macos-latest` | `macos-node` pada `openclaw/openclaw`; fork menggunakan fallback ke `macos-latest` | -| `blacksmith-12vcpu-macos-latest` | `macos-swift` pada `openclaw/openclaw`; fork menggunakan fallback ke `macos-latest` | +| Runner | Pekerjaan | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ubuntu-24.04` | `preflight`, pekerjaan keamanan cepat dan agregat (`security-scm-fast`, `security-dependency-audit`, `security-fast`), pemeriksaan protocol/contract/bundled cepat, pemeriksaan kontrak channel yang di-shard, shard `check` kecuali lint, shard dan agregat `check-additional`, verifikator agregat pengujian Node, pemeriksaan docs, Skills Python, workflow-sanity, labeler, auto-response; preflight install-smoke juga menggunakan Ubuntu yang di-host GitHub agar matriks Blacksmith dapat mengantre lebih awal | +| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard pengujian Linux Node, shard pengujian bundled plugin, `android` | +| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, yang tetap cukup sensitif terhadap CPU sehingga 8 vCPU justru lebih mahal daripada penghematannya; build Docker install-smoke, di mana waktu antre 32-vCPU lebih mahal 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 ```bash -pnpm changed:lanes # periksa classifier changed-lane lokal untuk origin/main...HEAD -pnpm check:changed # gerbang lokal cerdas: typecheck/lint/pengujian yang berubah menurut lane boundary -pnpm check # gerbang lokal cepat: tsgo produksi + lint yang di-shard + guard cepat paralel +pnpm changed:lanes # inspect the local changed-lane classifier for origin/main...HEAD +pnpm check:changed # smart local gate: changed typecheck/lint/tests by boundary lane +pnpm check # fast local gate: production tsgo + sharded lint + parallel fast guards pnpm check:test-types -pnpm check:timed # gerbang yang sama dengan timing per tahap +pnpm check:timed # same gate with per-stage timings pnpm build:strict-smoke pnpm check:architecture pnpm test:gateway:watch-regression -pnpm test # pengujian vitest +pnpm test # vitest tests pnpm test:channels pnpm test:contracts:channels -pnpm check:docs # format docs + lint + tautan rusak -pnpm build # build dist saat lane CI artifact/build-smoke relevan -node scripts/ci-run-timings.mjs # ringkas wall time, queue time, dan pekerjaan paling lambat +pnpm check:docs # docs format + lint + broken links +pnpm build # build dist when CI artifact/build-smoke lanes matter +node scripts/ci-run-timings.mjs # summarize wall time, queue time, and slowest jobs +node scripts/ci-run-timings.mjs --recent 10 # compare recent successful main CI runs ``` diff --git a/docs/id/gateway/authentication.md b/docs/id/gateway/authentication.md index 6a657e691..977ac1516 100644 --- a/docs/id/gateway/authentication.md +++ b/docs/id/gateway/authentication.md @@ -2,13 +2,13 @@ read_when: - Men-debug autentikasi model atau kedaluwarsa OAuth - Mendokumentasikan autentikasi atau penyimpanan kredensial -summary: 'Autentikasi model: OAuth, API key, penggunaan ulang Claude CLI, dan setup-token Anthropic' +summary: 'Autentikasi model: OAuth, kunci API, penggunaan ulang Claude CLI, dan token penyiapan Anthropic' title: Autentikasi x-i18n: - generated_at: "2026-04-07T09:13:46Z" + generated_at: "2026-04-23T14:55:27Z" model: gpt-5.4 provider: openai - source_hash: 9db0ad9eccd7e3e3ca328adaad260bc4288a8ccdbe2dc0c24d9fd049b7ab9231 + source_hash: 37a7c20872b915d1d079f0578c933e43cbdb97eca1c60d8c4e6e5137ca83f8b2 source_path: gateway/authentication.md workflow: 15 --- @@ -16,35 +16,30 @@ x-i18n: # Autentikasi (Penyedia Model) -Halaman ini membahas autentikasi **penyedia model** (API key, OAuth, penggunaan ulang Claude CLI, dan setup-token Anthropic). Untuk autentikasi **koneksi gateway** (token, password, trusted-proxy), lihat [Configuration](/id/gateway/configuration) dan [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth). +Halaman ini membahas autentikasi **penyedia model** (kunci API, OAuth, penggunaan ulang Claude CLI, dan token penyiapan Anthropic). Untuk autentikasi **koneksi Gateway** (token, kata sandi, trusted-proxy), lihat [Konfigurasi](/id/gateway/configuration) dan [Autentikasi Trusted Proxy](/id/gateway/trusted-proxy-auth). -OpenClaw mendukung OAuth dan API key untuk penyedia model. Untuk host gateway -yang selalu aktif, API key biasanya merupakan opsi yang paling dapat diprediksi. Alur -langganan/OAuth juga didukung ketika sesuai dengan model akun penyedia Anda. +OpenClaw mendukung OAuth dan kunci API untuk penyedia model. Untuk host Gateway yang selalu aktif, kunci API biasanya merupakan opsi yang paling mudah diprediksi. Alur langganan/OAuth juga didukung saat sesuai dengan model akun penyedia Anda. -Lihat [/concepts/oauth](/id/concepts/oauth) untuk alur OAuth lengkap dan tata letak -penyimpanan. -Untuk autentikasi berbasis SecretRef (penyedia `env`/`file`/`exec`), lihat [Secrets Management](/id/gateway/secrets). +Lihat [/concepts/oauth](/id/concepts/oauth) untuk alur OAuth lengkap dan tata letak penyimpanan. +Untuk autentikasi berbasis SecretRef (`env`/`file`/`exec` providers), lihat [Manajemen Rahasia](/id/gateway/secrets). Untuk aturan kelayakan kredensial/kode alasan yang digunakan oleh `models status --probe`, lihat -[Auth Credential Semantics](/id/auth-credential-semantics). +[Semantik Kredensial Auth](/id/auth-credential-semantics). -## Penyiapan yang direkomendasikan (API key, penyedia apa pun) +## Penyiapan yang direkomendasikan (kunci API, penyedia apa pun) -Jika Anda menjalankan gateway berumur panjang, mulai dengan API key untuk -penyedia pilihan Anda. -Khusus untuk Anthropic, autentikasi API key tetap merupakan penyiapan server yang paling dapat diprediksi, -tetapi OpenClaw juga mendukung penggunaan ulang login Claude CLI lokal. +Jika Anda menjalankan Gateway jangka panjang, mulai dengan kunci API untuk penyedia yang Anda pilih. +Khusus untuk Anthropic, autentikasi kunci API tetap merupakan penyiapan server yang paling mudah diprediksi, tetapi OpenClaw juga mendukung penggunaan ulang login Claude CLI lokal. -1. Buat API key di konsol penyedia Anda. -2. Letakkan API key itu di **host gateway** (mesin yang menjalankan `openclaw gateway`). +1. Buat kunci API di konsol penyedia Anda. +2. Letakkan kunci tersebut di **host Gateway** (mesin yang menjalankan `openclaw gateway`). ```bash export _API_KEY="..." openclaw models status ``` -3. Jika Gateway berjalan di bawah systemd/launchd, sebaiknya letakkan key di +3. Jika Gateway berjalan di bawah systemd/launchd, sebaiknya letakkan kunci di `~/.openclaw/.env` agar daemon dapat membacanya: ```bash @@ -53,30 +48,42 @@ cat >> ~/.openclaw/.env <<'EOF' EOF ``` -Lalu restart daemon (atau restart proses Gateway Anda) dan periksa kembali: +Lalu mulai ulang daemon (atau mulai ulang proses Gateway Anda) dan periksa kembali: ```bash openclaw models status openclaw doctor ``` -Jika Anda lebih memilih untuk tidak mengelola env vars sendiri, onboarding dapat menyimpan -API key untuk digunakan daemon: `openclaw onboard`. +Jika Anda lebih memilih untuk tidak mengelola variabel env sendiri, onboarding dapat menyimpan +kunci API untuk digunakan daemon: `openclaw onboard`. -Lihat [Help](/id/help) untuk detail tentang pewarisan env (`env.shellEnv`, +Lihat [Bantuan](/id/help) untuk detail tentang pewarisan env (`env.shellEnv`, `~/.openclaw/.env`, systemd/launchd). ## Anthropic: kompatibilitas Claude CLI dan token -Autentikasi setup-token Anthropic masih tersedia di OpenClaw sebagai jalur token -yang didukung. Staf Anthropic sejak itu memberi tahu kami bahwa penggunaan Claude CLI bergaya OpenClaw -diizinkan kembali, sehingga OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai -sesuatu yang disetujui untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. Saat -penggunaan ulang Claude CLI tersedia pada host, itu sekarang menjadi jalur yang lebih disukai. +Autentikasi token penyiapan Anthropic masih tersedia di OpenClaw sebagai jalur token yang didukung. Staf Anthropic sejak itu memberi tahu kami bahwa penggunaan Claude CLI bergaya OpenClaw diizinkan lagi, sehingga OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai penggunaan yang disetujui untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. Saat penggunaan ulang Claude CLI tersedia di host, itu kini menjadi jalur yang diutamakan. -Untuk host gateway berumur panjang, API key Anthropic tetap merupakan penyiapan -yang paling dapat diprediksi. Jika Anda ingin menggunakan ulang login Claude yang sudah ada di host yang sama, -gunakan jalur Anthropic Claude CLI di onboarding/configure. +Untuk host Gateway jangka panjang, kunci API Anthropic tetap merupakan penyiapan yang paling mudah diprediksi. Jika Anda ingin menggunakan ulang login Claude yang sudah ada di host yang sama, gunakan jalur Anthropic Claude CLI di onboarding/configure. + +Penyiapan host yang direkomendasikan untuk penggunaan ulang Claude CLI: + +```bash +# Jalankan di host Gateway +claude auth login +claude auth status --text +openclaw models auth login --provider anthropic --method cli --set-default +``` + +Ini adalah penyiapan dua langkah: + +1. Login-kan Claude Code itu sendiri ke Anthropic di host Gateway. +2. Beri tahu OpenClaw untuk mengalihkan pemilihan model Anthropic ke backend `claude-cli` + lokal dan menyimpan profil auth OpenClaw yang sesuai. + +Jika `claude` tidak ada di `PATH`, instal Claude Code terlebih dahulu atau atur +`agents.defaults.cliBackends.claude-cli.command` ke path biner yang sebenarnya. Entri token manual (penyedia apa pun; menulis `auth-profiles.json` + memperbarui config): @@ -86,17 +93,17 @@ openclaw models auth paste-token --provider openrouter Referensi profil auth juga didukung untuk kredensial statis: -- kredensial `api_key` dapat menggunakan `keyRef: { source, provider, id }` -- kredensial `token` dapat menggunakan `tokenRef: { source, provider, id }` -- profil mode OAuth tidak mendukung kredensial SecretRef; jika `auth.profiles..mode` disetel ke `"oauth"`, input `keyRef`/`tokenRef` berbasis SecretRef untuk profil tersebut akan ditolak. +- Kredensial `api_key` dapat menggunakan `keyRef: { source, provider, id }` +- Kredensial `token` dapat menggunakan `tokenRef: { source, provider, id }` +- Profil mode OAuth tidak mendukung kredensial SecretRef; jika `auth.profiles..mode` diatur ke `"oauth"`, input `keyRef`/`tokenRef` berbasis SecretRef untuk profil tersebut akan ditolak. -Pemeriksaan ramah otomatisasi (exit `1` saat kedaluwarsa/tidak ada, `2` saat akan kedaluwarsa): +Pemeriksaan yang ramah otomasi (keluar dengan `1` saat kedaluwarsa/tidak ada, `2` saat akan kedaluwarsa): ```bash openclaw models status --check ``` -Probe auth live: +Probe auth langsung: ```bash openclaw models status --probe @@ -105,63 +112,63 @@ openclaw models status --probe Catatan: - Baris probe dapat berasal dari profil auth, kredensial env, atau `models.json`. -- Jika `auth.order.` eksplisit menghilangkan profil yang disimpan, probe melaporkan +- Jika `auth.order.` yang eksplisit menghilangkan profil tersimpan, probe melaporkan `excluded_by_auth_order` untuk profil tersebut alih-alih mencobanya. -- Jika auth ada tetapi OpenClaw tidak dapat menyelesaikan kandidat model yang dapat diprobe untuk +- Jika auth ada tetapi OpenClaw tidak dapat menemukan kandidat model yang bisa diprobe untuk penyedia tersebut, probe melaporkan `status: no_model`. -- Cooldown rate limit dapat dicakup per model. Profil yang sedang cooldown untuk satu +- Cooldown rate-limit dapat bersifat spesifik per model. Profil yang sedang cooldown untuk satu model masih dapat digunakan untuk model saudara pada penyedia yang sama. -Skrip ops opsional (systemd/Termux) didokumentasikan di sini: -[Auth monitoring scripts](/id/help/scripts#auth-monitoring-scripts) +Script operasi opsional (systemd/Termux) didokumentasikan di sini: +[Script pemantauan auth](/id/help/scripts#auth-monitoring-scripts) ## Catatan Anthropic -Backend Anthropic `claude-cli` didukung kembali. +Backend Anthropic `claude-cli` didukung lagi. -- Staf Anthropic memberi tahu kami bahwa jalur integrasi OpenClaw ini diizinkan kembali. -- Karena itu, OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai - sesuatu yang disetujui untuk proses berbasis Anthropic kecuali Anthropic menerbitkan kebijakan baru. -- API key Anthropic tetap menjadi pilihan yang paling dapat diprediksi untuk host gateway - berumur panjang dan kontrol penagihan sisi server yang eksplisit. +- Staf Anthropic memberi tahu kami bahwa jalur integrasi OpenClaw ini diizinkan lagi. +- Oleh karena itu, OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai penggunaan yang disetujui + untuk proses berbasis Anthropic kecuali Anthropic menerbitkan kebijakan baru. +- Kunci API Anthropic tetap menjadi pilihan yang paling mudah diprediksi untuk host Gateway + jangka panjang dan kontrol penagihan sisi server yang eksplisit. -## Memeriksa status autentikasi model +## Memeriksa status auth model ```bash openclaw models status openclaw doctor ``` -## Perilaku rotasi API key (gateway) +## Perilaku rotasi kunci API (Gateway) -Beberapa penyedia mendukung percobaan ulang permintaan dengan key alternatif saat panggilan API -mencapai rate limit penyedia. +Beberapa penyedia mendukung percobaan ulang permintaan dengan kunci alternatif saat panggilan API +mencapai batas rate-limit penyedia. - Urutan prioritas: - - `OPENCLAW_LIVE__KEY` (override tunggal) + - `OPENCLAW_LIVE__KEY` (satu override) - `_API_KEYS` - `_API_KEY` - `_API_KEY_*` - Penyedia Google juga menyertakan `GOOGLE_API_KEY` sebagai fallback tambahan. -- Daftar key yang sama dideduplikasi sebelum digunakan. -- OpenClaw mencoba ulang dengan key berikutnya hanya untuk error rate limit (misalnya +- Daftar kunci yang sama dihapus duplikasinya sebelum digunakan. +- OpenClaw mencoba ulang dengan kunci berikutnya hanya untuk kesalahan rate-limit (misalnya `429`, `rate_limit`, `quota`, `resource exhausted`, `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, atau `workers_ai ... quota limit exceeded`). -- Error non-rate-limit tidak dicoba ulang dengan key alternatif. -- Jika semua key gagal, error akhir dari percobaan terakhir akan dikembalikan. +- Kesalahan non-rate-limit tidak dicoba ulang dengan kunci alternatif. +- Jika semua kunci gagal, kesalahan akhir dari percobaan terakhir akan dikembalikan. -## Mengontrol kredensial mana yang digunakan +## Mengontrol kredensial yang digunakan ### Per sesi (perintah chat) -Gunakan `/model @` untuk menetapkan kredensial penyedia tertentu bagi sesi saat ini (contoh id profil: `anthropic:default`, `anthropic:work`). +Gunakan `/model @` untuk menyematkan kredensial penyedia tertentu untuk sesi saat ini (contoh id profil: `anthropic:default`, `anthropic:work`). -Gunakan `/model` (atau `/model list`) untuk pemilih ringkas; gunakan `/model status` untuk tampilan penuh (kandidat + profil auth berikutnya, serta detail endpoint penyedia jika dikonfigurasi). +Gunakan `/model` (atau `/model list`) untuk pemilih ringkas; gunakan `/model status` untuk tampilan penuh (kandidat + profil auth berikutnya, serta detail endpoint penyedia saat dikonfigurasi). ### Per agen (override CLI) -Setel override urutan profil auth eksplisit untuk agen (disimpan di `auth-state.json` agen tersebut): +Atur override urutan profil auth yang eksplisit untuk sebuah agen (disimpan dalam `auth-state.json` agen tersebut): ```bash openclaw models auth order get --provider anthropic @@ -172,15 +179,15 @@ openclaw models auth order clear --provider anthropic Gunakan `--agent ` untuk menargetkan agen tertentu; hilangkan untuk menggunakan agen default yang dikonfigurasi. Saat Anda men-debug masalah urutan, `openclaw models status --probe` menampilkan profil tersimpan yang dihilangkan sebagai `excluded_by_auth_order` alih-alih melewatinya secara diam-diam. -Saat Anda men-debug masalah cooldown, ingat bahwa cooldown rate limit dapat terikat +Saat Anda men-debug masalah cooldown, ingat bahwa cooldown rate-limit dapat terikat pada satu id model, bukan seluruh profil penyedia. ## Pemecahan masalah -### "No credentials found" +### "Tidak ada kredensial ditemukan" -Jika profil Anthropic tidak ada, konfigurasikan API key Anthropic di -**host gateway** atau siapkan jalur setup-token Anthropic, lalu periksa kembali: +Jika profil Anthropic tidak ada, konfigurasikan kunci API Anthropic pada +**host Gateway** atau siapkan jalur token penyiapan Anthropic, lalu periksa kembali: ```bash openclaw models status @@ -190,4 +197,4 @@ openclaw models status Jalankan `openclaw models status` untuk mengonfirmasi profil mana yang akan kedaluwarsa. Jika profil token Anthropic tidak ada atau sudah kedaluwarsa, segarkan penyiapan tersebut melalui -setup-token atau migrasikan ke API key Anthropic. +token penyiapan atau migrasikan ke kunci API Anthropic. diff --git a/docs/id/gateway/cli-backends.md b/docs/id/gateway/cli-backends.md index 5dc9b2623..fef0ef250 100644 --- a/docs/id/gateway/cli-backends.md +++ b/docs/id/gateway/cli-backends.md @@ -1,38 +1,38 @@ --- read_when: - - Anda ingin fallback yang andal saat provider API gagal - - Anda sedang menjalankan Codex CLI atau CLI AI lokal lainnya dan ingin menggunakannya kembali + - Anda menginginkan fallback yang andal saat penyedia API gagal + - Anda menjalankan Codex CLI atau CLI AI lokal lainnya dan ingin menggunakannya kembali - Anda ingin memahami bridge loopback MCP untuk akses alat backend CLI summary: 'Backend CLI: fallback CLI AI lokal dengan bridge alat MCP opsional' title: Backend CLI x-i18n: - generated_at: "2026-04-23T09:20:54Z" + generated_at: "2026-04-23T14:55:28Z" model: gpt-5.4 provider: openai - source_hash: 475923b36e4580d3e4e57014ff2e6b89e9eb52c11b0a0ab1fc8241655b07836e + source_hash: ff7458d18b8a5b716930579241177917fd3edffcf7f6e211c7d570cf76519316 source_path: gateway/cli-backends.md workflow: 15 --- # Backend CLI (runtime fallback) -OpenClaw dapat menjalankan **CLI AI lokal** sebagai **fallback hanya-teks** saat provider API sedang down, -terkena rate limit, atau sementara bermasalah. Pendekatan ini sengaja konservatif: +OpenClaw dapat menjalankan **CLI AI lokal** sebagai **fallback khusus teks** saat penyedia API sedang down, +terkena rate limit, atau sementara berperilaku tidak semestinya. Ini sengaja dibuat konservatif: -- **Alat OpenClaw tidak diinjeksi secara langsung**, tetapi backend dengan `bundleMcp: true` - dapat menerima alat gateway melalui bridge loopback MCP. +- **Alat OpenClaw tidak disuntikkan secara langsung**, tetapi backend dengan `bundleMcp: true` + dapat menerima alat gateway melalui bridge MCP loopback. - **Streaming JSONL** untuk CLI yang mendukungnya. -- **Sesi didukung** (jadi giliran tindak lanjut tetap koheren). +- **Sesi didukung** (agar giliran lanjutan tetap koheren). - **Gambar dapat diteruskan** jika CLI menerima path gambar. -Ini dirancang sebagai **jaring pengaman** alih-alih jalur utama. Gunakan ini saat Anda -menginginkan respons teks “selalu berfungsi” tanpa bergantung pada API eksternal. +Ini dirancang sebagai **jaring pengaman** alih-alih jalur utama. Gunakan ini ketika Anda +menginginkan respons teks yang “selalu berfungsi” tanpa bergantung pada API eksternal. Jika Anda menginginkan runtime harness penuh dengan kontrol sesi ACP, tugas latar belakang, -binding thread/percakapan, dan sesi coding eksternal persisten, gunakan -[ACP Agents](/id/tools/acp-agents). Backend CLI bukan ACP. +pengikatan thread/percakapan, dan sesi coding eksternal persisten, gunakan +[ACP Agents](/id/tools/acp-agents) sebagai gantinya. Backend CLI bukan ACP. -## Memulai cepat yang ramah pemula +## Mulai cepat yang ramah pemula Anda dapat menggunakan Codex CLI **tanpa konfigurasi apa pun** (plugin OpenAI bawaan mendaftarkan backend default): @@ -42,7 +42,7 @@ openclaw agent --message "hi" --model codex-cli/gpt-5.4 ``` Jika gateway Anda berjalan di bawah launchd/systemd dan PATH minimal, tambahkan hanya -path perintahnya: +path command: ```json5 { @@ -58,10 +58,10 @@ path perintahnya: } ``` -Itu saja. Tidak perlu key, tidak perlu konfigurasi auth tambahan selain yang dimiliki CLI itu sendiri. +Itu saja. Tidak perlu key, tidak perlu konfigurasi auth tambahan selain yang dibutuhkan CLI itu sendiri. -Jika Anda menggunakan backend CLI bawaan sebagai **provider pesan utama** pada -host gateway, OpenClaw sekarang otomatis memuat plugin bawaan pemiliknya saat config Anda +Jika Anda menggunakan backend CLI bawaan sebagai **penyedia pesan utama** pada host +gateway, OpenClaw sekarang akan memuat otomatis plugin bawaan yang memilikinya ketika konfigurasi Anda secara eksplisit merujuk backend tersebut dalam ref model atau di bawah `agents.defaults.cliBackends`. @@ -89,10 +89,10 @@ Tambahkan backend CLI ke daftar fallback Anda agar hanya berjalan saat model uta Catatan: - Jika Anda menggunakan `agents.defaults.models` (allowlist), Anda juga harus menyertakan model backend CLI di sana. -- Jika provider utama gagal (auth, rate limit, timeout), OpenClaw akan +- Jika penyedia utama gagal (auth, rate limit, timeout), OpenClaw akan mencoba backend CLI berikutnya. -## Ringkasan konfigurasi +## Ikhtisar konfigurasi Semua backend CLI berada di bawah: @@ -100,8 +100,8 @@ Semua backend CLI berada di bawah: agents.defaults.cliBackends ``` -Setiap entri dikunci oleh **id provider** (misalnya `codex-cli`, `my-cli`). -Id provider menjadi sisi kiri ref model Anda: +Setiap entri dikunci dengan **id provider** (misalnya `codex-cli`, `my-cli`). +Id provider menjadi sisi kiri dari ref model Anda: ``` / @@ -131,7 +131,7 @@ Id provider menjadi sisi kiri ref model Anda: sessionMode: "existing", sessionIdFields: ["session_id", "conversation_id"], systemPromptArg: "--system", - // CLI gaya Codex dapat menunjuk ke file prompt sebagai gantinya: + // CLI bergaya Codex dapat menunjuk ke file prompt sebagai gantinya: // systemPromptFileConfigArg: "-c", // systemPromptFileConfigKey: "model_instructions_file", systemPromptWhen: "first", @@ -148,95 +148,107 @@ Id provider menjadi sisi kiri ref model Anda: ## Cara kerjanya 1. **Memilih backend** berdasarkan prefiks provider (`codex-cli/...`). -2. **Membangun system prompt** menggunakan prompt + konteks workspace OpenClaw yang sama. +2. **Membangun system prompt** menggunakan prompt OpenClaw + konteks workspace yang sama. 3. **Menjalankan CLI** dengan id sesi (jika didukung) agar riwayat tetap konsisten. Backend `claude-cli` bawaan menjaga proses stdio Claude tetap hidup per - sesi OpenClaw dan mengirim giliran tindak lanjut melalui stdin stream-json. + sesi OpenClaw dan mengirim giliran lanjutan melalui stdin stream-json. 4. **Mengurai output** (JSON atau teks biasa) dan mengembalikan teks akhir. -5. **Mempertahankan id sesi** per backend, sehingga tindak lanjut menggunakan kembali sesi CLI yang sama. +5. **Menyimpan id sesi** per backend, agar giliran lanjutan menggunakan ulang sesi CLI yang sama. -Backend `claude-cli` Anthropic bawaan kembali didukung. Staf Anthropic -memberi tahu kami bahwa penggunaan Claude CLI gaya OpenClaw diizinkan lagi, sehingga OpenClaw memperlakukan -penggunaan `claude -p` sebagai yang disahkan untuk integrasi ini kecuali Anthropic menerbitkan +Backend `claude-cli` Anthropic bawaan kini didukung lagi. Staf Anthropic +memberi tahu kami bahwa penggunaan Claude CLI ala OpenClaw kembali diizinkan, jadi OpenClaw memperlakukan +penggunaan `claude -p` sebagai hal yang disetujui untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. Backend `codex-cli` OpenAI bawaan meneruskan system prompt OpenClaw melalui -override config `model_instructions_file` milik Codex (`-c -model_instructions_file="..."`). Codex tidak mengekspos flag -`--append-system-prompt` gaya Claude, jadi OpenClaw menulis prompt rakitan ke +override konfigurasi `model_instructions_file` milik Codex (`-c +model_instructions_file="..."`). Codex tidak menyediakan flag +`--append-system-prompt` ala Claude, jadi OpenClaw menulis prompt yang telah dirangkai ke file sementara untuk setiap sesi Codex CLI baru. Backend `claude-cli` Anthropic bawaan menerima snapshot Skills OpenClaw -dengan dua cara: katalog Skills OpenClaw ringkas di appended system prompt, dan +dengan dua cara: katalog Skills OpenClaw ringkas dalam system prompt yang ditambahkan, dan Plugin Claude Code sementara yang diteruskan dengan `--plugin-dir`. Plugin tersebut hanya berisi -Skills yang memenuhi syarat untuk agen/sesi itu, sehingga resolver skill native Claude Code melihat himpunan terfilter yang sama yang sebaliknya akan diiklankan OpenClaw di -prompt. Override env/API key skill tetap diterapkan oleh OpenClaw ke -lingkungan proses anak untuk run tersebut. +Skills yang memenuhi syarat untuk agent/sesi itu, sehingga resolver skill native Claude Code melihat +set terfilter yang sama yang sebaliknya akan diiklankan OpenClaw dalam +prompt. Override env/API key skill tetap diterapkan oleh OpenClaw ke environment proses anak untuk eksekusi tersebut. + +Sebelum OpenClaw dapat menggunakan backend `claude-cli` bawaan, Claude Code sendiri +harus sudah login di host yang sama: + +```bash +claude auth login +claude auth status --text +openclaw models auth login --provider anthropic --method cli --set-default +``` + +Gunakan `agents.defaults.cliBackends.claude-cli.command` hanya ketika biner `claude` +belum ada di `PATH`. ## Sesi -- Jika CLI mendukung sesi, setel `sessionArg` (misalnya `--session-id`) atau +- Jika CLI mendukung sesi, set `sessionArg` (misalnya `--session-id`) atau `sessionArgs` (placeholder `{sessionId}`) saat ID perlu disisipkan ke beberapa flag. -- Jika CLI menggunakan **subperintah resume** dengan flag yang berbeda, setel - `resumeArgs` (menggantikan `args` saat melanjutkan) dan opsional +- Jika CLI menggunakan **subcommand resume** dengan flag yang berbeda, set + `resumeArgs` (menggantikan `args` saat melanjutkan) dan secara opsional `resumeOutput` (untuk resume non-JSON). - `sessionMode`: - `always`: selalu kirim id sesi (UUID baru jika belum ada yang tersimpan). - - `existing`: hanya kirim id sesi jika sebelumnya sudah tersimpan. + - `existing`: kirim id sesi hanya jika sebelumnya ada yang tersimpan. - `none`: jangan pernah kirim id sesi. - `claude-cli` default ke `liveSession: "claude-stdio"`, `output: "jsonl"`, - dan `input: "stdin"` sehingga giliran tindak lanjut menggunakan kembali proses Claude live saat - proses tersebut aktif. Warm stdio sekarang menjadi default, termasuk untuk config kustom - yang menghilangkan field transport. Jika Gateway direstart atau proses idle - keluar, OpenClaw melanjutkan dari id sesi Claude yang tersimpan. Id sesi yang tersimpan diverifikasi terhadap transkrip proyek yang ada dan dapat dibaca sebelum - resume, sehingga binding fantom dihapus dengan `reason=transcript-missing` + dan `input: "stdin"` sehingga giliran lanjutan menggunakan ulang proses Claude aktif selagi + masih aktif. stdio hangat sekarang menjadi default, termasuk untuk konfigurasi kustom + yang menghilangkan field transport. Jika Gateway dimulai ulang atau proses idle + berhenti, OpenClaw melanjutkan dari id sesi Claude yang tersimpan. Id sesi yang tersimpan + diverifikasi terhadap transkrip project yang ada dan dapat dibaca sebelum + resume, sehingga pengikatan phantom dibersihkan dengan `reason=transcript-missing` alih-alih diam-diam memulai sesi Claude CLI baru di bawah `--resume`. - Sesi CLI yang tersimpan adalah kontinuitas milik provider. Reset sesi harian implisit - tidak memutusnya; `/reset` dan kebijakan `session.reset` eksplisit tetap - memutuskannya. + tidak memutuskannya; `/reset` dan kebijakan `session.reset` eksplisit tetap memutuskannya. Catatan serialisasi: -- `serialize: true` menjaga run pada jalur yang sama tetap terurut. -- Sebagian besar CLI melakukan serialisasi pada satu jalur provider. -- OpenClaw membuang penggunaan ulang sesi CLI yang tersimpan saat identitas auth terpilih berubah, - termasuk perubahan id profil auth, API key statis, token statis, atau identitas akun OAuth - saat CLI mengekspos salah satunya. Rotasi token akses dan refresh OAuth tidak - memutus sesi CLI yang tersimpan. Jika CLI tidak mengekspos id akun OAuth yang stabil, - OpenClaw membiarkan CLI tersebut menegakkan izin resume. +- `serialize: true` menjaga eksekusi di lane yang sama tetap berurutan. +- Sebagian besar CLI menserialkan pada satu lane provider. +- OpenClaw menghentikan penggunaan ulang sesi CLI yang tersimpan saat identitas auth yang dipilih berubah, + termasuk jika id profil auth berubah, API key statis, token statis, atau identitas akun OAuth saat CLI mengeksposnya. Rotasi + access token dan refresh token OAuth tidak memutus sesi CLI yang tersimpan. Jika sebuah CLI tidak mengekspos + id akun OAuth yang stabil, OpenClaw membiarkan CLI tersebut menegakkan izin resume. ## Gambar (pass-through) -Jika CLI Anda menerima path gambar, setel `imageArg`: +Jika CLI Anda menerima path gambar, set `imageArg`: ```json5 imageArg: "--image", imageMode: "repeat" ``` -OpenClaw akan menulis gambar base64 ke file sementara. Jika `imageArg` disetel, path tersebut -diteruskan sebagai argumen CLI. Jika `imageArg` tidak ada, OpenClaw menambahkan -path file ke prompt (injeksi path), yang cukup untuk CLI yang memuat -file lokal secara otomatis dari path biasa. +OpenClaw akan menulis gambar base64 ke file sementara. Jika `imageArg` diatur, path tersebut +diteruskan sebagai arg CLI. Jika `imageArg` tidak ada, OpenClaw menambahkan +path file ke prompt (injeksi path), yang cukup untuk CLI yang otomatis +memuat file lokal dari path biasa. ## Input / output - `output: "json"` (default) mencoba mengurai JSON dan mengekstrak teks + id sesi. - Untuk output JSON Gemini CLI, OpenClaw membaca teks balasan dari `response` dan - penggunaan dari `stats` saat `usage` tidak ada atau kosong. -- `output: "jsonl"` mengurai stream JSONL (misalnya Codex CLI `--json`) dan mengekstrak pesan agen akhir plus pengenal sesi jika ada. + usage dari `stats` saat `usage` tidak ada atau kosong. +- `output: "jsonl"` mengurai stream JSONL (misalnya Codex CLI `--json`) dan mengekstrak pesan agent akhir beserta pengidentifikasi sesi + saat ada. - `output: "text"` memperlakukan stdout sebagai respons akhir. Mode input: -- `input: "arg"` (default) meneruskan prompt sebagai argumen CLI terakhir. +- `input: "arg"` (default) meneruskan prompt sebagai arg CLI terakhir. - `input: "stdin"` mengirim prompt melalui stdin. -- Jika prompt sangat panjang dan `maxPromptArgChars` disetel, stdin digunakan. +- Jika prompt sangat panjang dan `maxPromptArgChars` diatur, stdin digunakan. -## Default (dimiliki plugin) +## Default (milik plugin) Plugin OpenAI bawaan juga mendaftarkan default untuk `codex-cli`: @@ -260,28 +272,28 @@ Plugin Google bawaan juga mendaftarkan default untuk `google-gemini-cli`: - `sessionMode: "existing"` - `sessionIdFields: ["session_id", "sessionId"]` -Prasyarat: Gemini CLI lokal harus terinstal dan tersedia sebagai +Prasyarat: Gemini CLI lokal harus terpasang dan tersedia sebagai `gemini` di `PATH` (`brew install gemini-cli` atau `npm install -g @google/gemini-cli`). Catatan JSON Gemini CLI: - Teks balasan dibaca dari field JSON `response`. -- Penggunaan fallback ke `stats` saat `usage` tidak ada atau kosong. +- Usage menggunakan fallback ke `stats` saat `usage` tidak ada atau kosong. - `stats.cached` dinormalisasi menjadi OpenClaw `cacheRead`. - Jika `stats.input` tidak ada, OpenClaw menurunkan token input dari `stats.input_tokens - stats.cached`. -Lakukan override hanya jika diperlukan (umumnya: path `command` absolut). +Override hanya jika diperlukan (umum: path `command` absolut). -## Default yang dimiliki plugin +## Default milik plugin -Default backend CLI sekarang menjadi bagian dari surface plugin: +Default backend CLI sekarang menjadi bagian dari permukaan plugin: - Plugin mendaftarkannya dengan `api.registerCliBackend(...)`. -- Backend `id` menjadi prefiks provider dalam ref model. -- Config pengguna di `agents.defaults.cliBackends.` tetap menimpa default plugin. -- Pembersihan config khusus backend tetap dimiliki plugin melalui hook +- `id` backend menjadi prefiks provider dalam ref model. +- Konfigurasi pengguna di `agents.defaults.cliBackends.` tetap menimpa default plugin. +- Pembersihan konfigurasi khusus backend tetap dimiliki plugin melalui hook `normalizeConfig` opsional. Plugin yang memerlukan shim kompatibilitas prompt/pesan kecil dapat mendeklarasikan @@ -302,52 +314,52 @@ api.registerTextTransforms({ }); ``` -`input` menulis ulang system prompt dan prompt pengguna yang diteruskan ke CLI. `output` -menulis ulang delta asisten yang di-stream dan teks akhir yang telah diurai sebelum OpenClaw menangani -penanda kontrolnya sendiri dan pengiriman channel. +`input` menulis ulang system prompt dan user prompt yang diteruskan ke CLI. `output` +menulis ulang delta assistant yang di-streaming dan teks akhir yang telah diurai sebelum OpenClaw menangani +marker kontrolnya sendiri dan pengiriman channel. -Untuk CLI yang memancarkan JSONL yang kompatibel dengan stream-json Claude Code, setel -`jsonlDialect: "claude-stream-json"` pada config backend tersebut. +Untuk CLI yang mengeluarkan JSONL kompatibel stream-json Claude Code, set +`jsonlDialect: "claude-stream-json"` pada konfigurasi backend tersebut. -## Overlay bundle MCP +## Overlay MCP bundel -Backend CLI **tidak** menerima pemanggilan alat OpenClaw secara langsung, tetapi sebuah backend dapat -ikut serta dalam overlay config MCP yang dihasilkan dengan `bundleMcp: true`. +Backend CLI **tidak** menerima panggilan alat OpenClaw secara langsung, tetapi sebuah backend dapat +ikut serta dalam overlay konfigurasi MCP yang dihasilkan dengan `bundleMcp: true`. Perilaku bawaan saat ini: -- `claude-cli`: file config MCP ketat yang dihasilkan -- `codex-cli`: override config inline untuk `mcp_servers` +- `claude-cli`: file konfigurasi MCP ketat yang dihasilkan +- `codex-cli`: override konfigurasi inline untuk `mcp_servers` - `google-gemini-cli`: file pengaturan sistem Gemini yang dihasilkan Saat bundle MCP diaktifkan, OpenClaw: -- meluncurkan server MCP HTTP loopback yang mengekspos alat gateway ke proses CLI -- mengautentikasi bridge dengan token per-sesi (`OPENCLAW_MCP_TOKEN`) -- membatasi akses alat ke konteks sesi, akun, dan channel saat ini +- memunculkan server MCP HTTP loopback yang mengekspos alat gateway ke proses CLI +- mengautentikasi bridge dengan token per sesi (`OPENCLAW_MCP_TOKEN`) +- membatasi akses alat ke sesi, akun, dan konteks channel saat ini - memuat server bundle-MCP yang diaktifkan untuk workspace saat ini -- menggabungkannya dengan bentuk config/pengaturan MCP backend yang sudah ada -- menulis ulang config peluncuran menggunakan mode integrasi milik backend dari extension pemilik +- menggabungkannya dengan bentuk konfigurasi/pengaturan MCP backend yang sudah ada +- menulis ulang konfigurasi peluncuran menggunakan mode integrasi milik backend dari extension pemiliknya -Jika tidak ada server MCP yang diaktifkan, OpenClaw tetap menginjeksi config ketat saat sebuah -backend ikut serta dalam bundle MCP agar run latar belakang tetap terisolasi. +Jika tidak ada server MCP yang diaktifkan, OpenClaw tetap menyuntikkan konfigurasi ketat saat sebuah +backend ikut serta dalam bundle MCP agar eksekusi latar belakang tetap terisolasi. -## Batasan +## Keterbatasan -- **Tidak ada pemanggilan alat OpenClaw langsung.** OpenClaw tidak menginjeksi pemanggilan alat ke +- **Tidak ada panggilan alat OpenClaw langsung.** OpenClaw tidak menyuntikkan panggilan alat ke protokol backend CLI. Backend hanya melihat alat gateway saat mereka ikut serta dalam `bundleMcp: true`. -- **Streaming bersifat khusus backend.** Beberapa backend men-stream JSONL; yang lain membuffer - sampai keluar. -- **Output terstruktur** bergantung pada format JSON CLI. -- **Sesi Codex CLI** melanjutkan melalui output teks (tanpa JSONL), yang kurang - terstruktur dibanding run awal `--json`. Sesi OpenClaw tetap berfungsi +- **Streaming bersifat spesifik per backend.** Beberapa backend melakukan streaming JSONL; yang lain menahan buffer + hingga proses selesai. +- **Output terstruktur** bergantung pada format JSON milik CLI. +- **Sesi Codex CLI** dilanjutkan melalui output teks (tanpa JSONL), yang kurang + terstruktur dibandingkan eksekusi awal `--json`. Sesi OpenClaw tetap berfungsi normal. ## Pemecahan masalah -- **CLI tidak ditemukan**: setel `command` ke path lengkap. +- **CLI tidak ditemukan**: set `command` ke path lengkap. - **Nama model salah**: gunakan `modelAliases` untuk memetakan `provider/model` → model CLI. -- **Tidak ada kontinuitas sesi**: pastikan `sessionArg` disetel dan `sessionMode` bukan +- **Tidak ada kontinuitas sesi**: pastikan `sessionArg` diatur dan `sessionMode` bukan `none` (Codex CLI saat ini tidak dapat melanjutkan dengan output JSON). -- **Gambar diabaikan**: setel `imageArg` (dan verifikasi bahwa CLI mendukung path file). +- **Gambar diabaikan**: set `imageArg` (dan pastikan CLI mendukung path file). diff --git a/docs/id/help/testing.md b/docs/id/help/testing.md index 26ffbd383..9defe6ef6 100644 --- a/docs/id/help/testing.md +++ b/docs/id/help/testing.md @@ -2,27 +2,27 @@ read_when: - Menjalankan pengujian secara lokal atau di CI - Menambahkan regresi untuk bug model/provider - - Men-debug perilaku Gateway + agent + - Men-debug perilaku Gateway + agen summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan cakupan tiap pengujian' title: Pengujian x-i18n: - generated_at: "2026-04-23T09:22:30Z" + generated_at: "2026-04-23T14:55:28Z" model: gpt-5.4 provider: openai - source_hash: fe0e9bdea78cba7e512358d2e4d428da04a2071188e74af2d5419d2c85eafe15 + source_hash: fbec4996699577321116c94f60c01d205d7594ed41aca27c821f1c3d65a7dca3 source_path: help/testing.md workflow: 15 --- # Pengujian -OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sejumlah kecil runner Docker. +OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sekumpulan kecil runner Docker. -Doc ini adalah panduan “bagaimana kami menguji”: +Dokumen ini adalah panduan “cara kami menguji”: -- Apa yang dicakup setiap suite (dan apa yang sengaja _tidak_ dicakup) -- Perintah mana yang dijalankan untuk alur kerja umum (lokal, pre-push, debugging) -- Bagaimana live test menemukan kredensial dan memilih model/provider +- Apa yang dicakup setiap suite (dan apa yang memang _tidak_ dicakup) +- Perintah mana yang dijalankan untuk alur kerja umum (lokal, sebelum push, debugging) +- Cara pengujian live menemukan kredensial dan memilih model/provider - Cara menambahkan regresi untuk masalah model/provider di dunia nyata ## Mulai cepat @@ -30,134 +30,139 @@ Doc ini adalah panduan “bagaimana kami menguji”: Sebagian besar hari: - Gate penuh (diharapkan sebelum push): `pnpm build && pnpm check && pnpm check:test-types && pnpm test` -- Menjalankan suite penuh lokal yang lebih cepat pada mesin yang lapang: `pnpm test:max` +- Menjalankan suite penuh lokal yang lebih cepat pada mesin yang lega: `pnpm test:max` - Loop watch Vitest langsung: `pnpm test:watch` - Penargetan file langsung sekarang juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- Sebaiknya mulai dengan eksekusi terarah terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. +- Utamakan menjalankan target yang spesifik terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. - Situs QA berbasis Docker: `pnpm qa:lab:up` - Lane QA berbasis Linux VM: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` -Saat Anda menyentuh test atau ingin keyakinan tambahan: +Saat Anda menyentuh pengujian atau ingin keyakinan tambahan: -- Gate coverage: `pnpm test:coverage` +- Gate cakupan: `pnpm test:coverage` - Suite E2E: `pnpm test:e2e` Saat men-debug provider/model nyata (memerlukan kredensial nyata): -- Suite live (probe model + tool/image Gateway): `pnpm test:live` +- Suite live (model + probe alat/gambar Gateway): `pnpm test:live` - Targetkan satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` - Sapuan model live Docker: `pnpm test:docker:live-models` + - Setiap model yang dipilih sekarang menjalankan satu giliran teks plus probe kecil bergaya baca-file. + Model yang metadata-nya mengiklankan input `image` juga menjalankan satu giliran gambar kecil. + Nonaktifkan probe tambahan dengan `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` atau + `OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` saat mengisolasi kegagalan provider. - Cakupan CI: `OpenClaw Scheduled Live And E2E Checks` harian dan - `OpenClaw Release Checks` manual sama-sama memanggil workflow live/E2E yang dapat digunakan ulang dengan + `OpenClaw Release Checks` manual sama-sama memanggil alur kerja live/E2E yang dapat digunakan ulang dengan `include_live_suites: true`, yang mencakup job matriks model live Docker terpisah yang di-shard berdasarkan provider. - - Untuk rerun CI yang terfokus, dispatch `OpenClaw Live And E2E Checks (Reusable)` + - Untuk menjalankan ulang CI yang terfokus, dispatch `OpenClaw Live And E2E Checks (Reusable)` dengan `include_live_suites: true` dan `live_models_only: true`. - - Tambahkan secret provider sinyal tinggi baru ke `scripts/ci-hydrate-live-auth.sh` + - Tambahkan secret provider sinyal-tinggi baru ke `scripts/ci-hydrate-live-auth.sh` serta `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` dan pemanggil terjadwal/rilisnya. -- Smoke biaya Moonshot/Kimi: dengan `MOONSHOT_API_KEY` terpasang, jalankan +- Smoke biaya Moonshot/Kimi: dengan `MOONSHOT_API_KEY` disetel, jalankan `openclaw models list --provider moonshot --json`, lalu jalankan `openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json` - secara terisolasi terhadap `moonshot/kimi-k2.6`. Verifikasi bahwa JSON melaporkan Moonshot/K2.6 dan - transkrip assistant menyimpan `usage.cost` yang dinormalisasi. + yang terisolasi terhadap `moonshot/kimi-k2.6`. Verifikasi bahwa JSON melaporkan Moonshot/K2.6 dan + transkrip asisten menyimpan `usage.cost` yang dinormalisasi. -Tip: saat Anda hanya memerlukan satu kasus gagal, sebaiknya persempit live test melalui env var allowlist yang dijelaskan di bawah. +Tip: saat Anda hanya membutuhkan satu kasus yang gagal, utamakan mempersempit pengujian live melalui variabel env allowlist yang dijelaskan di bawah. ## Runner khusus QA -Perintah-perintah ini berada di samping suite pengujian utama saat Anda memerlukan realisme qa-lab: +Perintah-perintah ini berada di samping suite pengujian utama saat Anda membutuhkan realisme qa-lab: -CI menjalankan QA Lab dalam workflow khusus. `Parity gate` berjalan pada PR yang cocok dan -dari dispatch manual dengan mock provider. `QA-Lab - All Lanes` berjalan setiap malam pada -`main` dan dari dispatch manual dengan gate paritas mock, lane Matrix live, dan +CI menjalankan QA Lab di alur kerja khusus. `Parity gate` berjalan pada PR yang cocok dan +dari dispatch manual dengan provider tiruan. `QA-Lab - All Lanes` berjalan setiap malam di +`main` dan dari dispatch manual dengan parity gate tiruan, lane Matrix live, dan lane Telegram live yang dikelola Convex sebagai job paralel. `OpenClaw Release Checks` menjalankan lane yang sama sebelum persetujuan rilis. - `pnpm openclaw qa suite` - - Menjalankan skenario QA yang didukung repo langsung pada host. - - Menjalankan beberapa skenario terpilih secara paralel secara default dengan worker - Gateway yang terisolasi. `qa-channel` default ke konkurensi 4 (dibatasi oleh + - Menjalankan skenario QA berbasis repo langsung di host. + - Menjalankan beberapa skenario yang dipilih secara paralel secara default dengan worker + Gateway terisolasi. `qa-channel` secara default menggunakan konkurensi 4 (dibatasi oleh jumlah skenario yang dipilih). Gunakan `--concurrency ` untuk menyetel jumlah worker, atau `--concurrency 1` untuk lane serial lama. - - Keluar non-zero saat ada skenario yang gagal. Gunakan `--allow-failures` saat - Anda menginginkan artefak tanpa exit code gagal. + - Keluar dengan status non-zero jika ada skenario yang gagal. Gunakan `--allow-failures` saat Anda + menginginkan artefak tanpa exit code yang gagal. - Mendukung mode provider `live-frontier`, `mock-openai`, dan `aimock`. `aimock` memulai server provider lokal berbasis AIMock untuk cakupan eksperimental - fixture dan protocol-mock tanpa menggantikan lane `mock-openai` yang sadar skenario. + fixture dan tiruan protokol tanpa menggantikan lane `mock-openai` yang sadar skenario. - `pnpm openclaw qa suite --runner multipass` - Menjalankan suite QA yang sama di dalam Linux VM Multipass sekali pakai. - - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` pada host. - - Menggunakan ulang flag pemilihan provider/model yang sama seperti `qa suite`. - - Eksekusi live meneruskan input auth QA yang didukung dan praktis untuk guest: - kunci provider berbasis env, path config provider live QA, dan `CODEX_HOME` - bila ada. - - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis balik melalui + - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` di host. + - Menggunakan kembali flag pemilihan provider/model yang sama seperti `qa suite`. + - Menjalankan live meneruskan input auth QA yang didukung dan praktis untuk guest: + key provider berbasis env, path konfigurasi provider live QA, dan `CODEX_HOME` + saat ada. + - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis kembali melalui workspace yang di-mount. - - Menulis laporan + ringkasan QA normal beserta log Multipass di bawah + - Menulis laporan + ringkasan QA normal serta log Multipass di bawah `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - Memulai situs QA berbasis Docker untuk pekerjaan QA bergaya operator. - `pnpm test:docker:npm-onboard-channel-agent` - - Membangun tarball npm dari checkout saat ini, menginstalnya secara global di + - Membangun npm tarball dari checkout saat ini, memasangnya secara global di Docker, menjalankan onboarding non-interaktif OpenAI API key, mengonfigurasi Telegram - secara default, memverifikasi bahwa pengaktifan plugin menginstal dependensi runtime sesuai kebutuhan, - menjalankan doctor, dan menjalankan satu giliran agent lokal terhadap endpoint OpenAI yang dimock. - - Gunakan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` untuk menjalankan lane instalasi terpaket yang sama - dengan Discord. + secara default, memverifikasi bahwa mengaktifkan plugin memasang dependensi runtime sesuai + permintaan, menjalankan doctor, dan menjalankan satu giliran agen lokal terhadap endpoint OpenAI tiruan. + - Gunakan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` untuk menjalankan lane + instalasi-terkemas yang sama dengan Discord. - `pnpm test:docker:bundled-channel-deps` - - Memaketkan dan menginstal build OpenClaw saat ini di Docker, memulai Gateway - dengan OpenAI terkonfigurasi, lalu mengaktifkan channel/plugin bawaan melalui edit - config. - - Memverifikasi bahwa penemuan setup membiarkan dependensi runtime plugin yang belum dikonfigurasi - tetap tidak ada, eksekusi Gateway atau doctor pertama yang dikonfigurasi menginstal dependensi runtime - setiap plugin bawaan sesuai kebutuhan, dan restart kedua tidak menginstal ulang dependensi - yang sudah diaktifkan. - - Juga menginstal baseline npm lama yang diketahui, mengaktifkan Telegram sebelum menjalankan - `openclaw update --tag `, dan memverifikasi bahwa doctor pasca-pembaruan - kandidat memperbaiki dependensi runtime channel bawaan tanpa perbaikan postinstall - dari sisi harness. + - Mem-packing dan memasang build OpenClaw saat ini di Docker, memulai Gateway + dengan OpenAI yang dikonfigurasi, lalu mengaktifkan channel/plugin bawaan melalui + edit konfigurasi. + - Memverifikasi bahwa discovery setup membiarkan dependensi runtime plugin yang belum dikonfigurasi + tetap tidak ada, bahwa Gateway pertama yang terkonfigurasi atau proses doctor memasang + dependensi runtime tiap plugin bawaan sesuai permintaan, dan bahwa restart kedua tidak + memasang ulang dependensi yang sudah diaktifkan. + - Juga memasang baseline npm lama yang sudah diketahui, mengaktifkan Telegram sebelum menjalankan + `openclaw update --tag `, dan memverifikasi bahwa + doctor pasca-pembaruan kandidat memperbaiki dependensi runtime channel bawaan tanpa + perbaikan postinstall di sisi harness. - `pnpm openclaw qa aimock` - - Hanya memulai server provider AIMock lokal untuk smoke testing protokol langsung. + - Hanya memulai server provider AIMock lokal untuk pengujian smoke protokol langsung. - `pnpm openclaw qa matrix` - - Menjalankan lane QA Matrix live terhadap homeserver Tuwunel sekali pakai berbasis Docker. - - Host QA ini saat ini hanya untuk repo/dev. Instalasi OpenClaw terpaket tidak menyertakan + - Menjalankan lane QA live Matrix terhadap homeserver Tuwunel sekali pakai berbasis Docker. + - Host QA ini saat ini hanya untuk repo/dev. Instalasi OpenClaw terkemas tidak menyertakan `qa-lab`, sehingga tidak mengekspos `openclaw qa`. - - Checkout repo memuat runner bawaan secara langsung; tidak diperlukan langkah instal plugin terpisah. - - Memprovisikan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) plus satu room privat, lalu memulai child Gateway QA dengan plugin Matrix nyata sebagai transport SUT. + - Checkout repo memuat runner bawaan secara langsung; tidak diperlukan langkah pemasangan plugin + terpisah. + - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) serta satu room privat, lalu memulai child gateway QA dengan plugin Matrix nyata sebagai transport SUT. - Secara default menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1`. Override dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` saat Anda perlu menguji image lain. - - Matrix tidak mengekspos flag sumber kredensial bersama karena lane tersebut memprovisikan pengguna sekali pakai secara lokal. - - Menulis laporan QA Matrix, ringkasan, artefak event-teramati, dan log gabungan stdout/stderr di bawah `.artifacts/qa-e2e/...`. + - Matrix tidak mengekspos flag sumber kredensial bersama karena lane ini menyediakan pengguna sekali pakai secara lokal. + - Menulis laporan QA Matrix, ringkasan, artefak observed-events, dan log output gabungan stdout/stderr di bawah `.artifacts/qa-e2e/...`. - `pnpm openclaw qa telegram` - - Menjalankan lane QA Telegram live terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. - - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa string ID chat Telegram numerik. - - Mendukung `--credential-source convex` untuk kredensial bersama yang dipool. Gunakan mode env secara default, atau atur `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk ikut serta dalam lease terpool. - - Keluar non-zero saat ada skenario yang gagal. Gunakan `--allow-failures` saat Anda - menginginkan artefak tanpa exit code gagal. + - Menjalankan lane QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. + - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa ID chat Telegram numerik. + - Mendukung `--credential-source convex` untuk kredensial bersama terpool. Gunakan mode env secara default, atau setel `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk ikut serta dalam lease terpool. + - Keluar dengan status non-zero jika ada skenario yang gagal. Gunakan `--allow-failures` saat Anda + menginginkan artefak tanpa exit code yang gagal. - Memerlukan dua bot berbeda dalam grup privat yang sama, dengan bot SUT mengekspos username Telegram. - Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. - - Menulis laporan QA Telegram, ringkasan, dan artefak pesan-teramati di bawah `.artifacts/qa-e2e/...`. Skenario yang membalas menyertakan RTT dari request kirim driver hingga balasan SUT yang teramati. + - Menulis laporan QA Telegram, ringkasan, dan artefak observed-messages di bawah `.artifacts/qa-e2e/...`. Skenario balasan mencakup RTT dari permintaan kirim driver hingga balasan SUT yang teramati. -Lane transport live berbagi satu kontrak standar agar transport baru tidak mengalami drift: +Lane transport live berbagi satu kontrak standar sehingga transport baru tidak mengalami drift: -`qa-channel` tetap merupakan suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live. +`qa-channel` tetap menjadi suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live. -| Lane | Canary | Pembatasan mention | Blok allowlist | Balasan top-level | Lanjutkan setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaction | Perintah help | -| -------- | ------ | ------------------ | -------------- | ----------------- | ------------------------- | -------------------- | -------------- | ------------------ | ------------- | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| Lane | Canary | Pembatasan mention | Blok allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah bantuan | +| -------- | ------ | ------------------ | -------------- | -------------------- | ---------------------- | -------------------- | -------------- | ---------------- | ---------------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | ### Kredensial Telegram bersama melalui Convex (v1) Saat `--credential-source convex` (atau `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) diaktifkan untuk -`openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool berbasis Convex, melakukan Heartbeat -pada lease tersebut selama lane berjalan, dan melepaskan lease saat shutdown. +`openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool berbasis Convex, mengirim Heartbeat +untuk lease tersebut selama lane berjalan, dan melepaskan lease saat shutdown. Scaffold proyek Convex referensi: - `qa/convex-credential-broker/` -Env vars yang diperlukan: +Variabel env yang wajib: - `OPENCLAW_QA_CONVEX_SITE_URL` (misalnya `https://your-deployment.convex.site`) - Satu secret untuk peran yang dipilih: @@ -165,22 +170,22 @@ Env vars yang diperlukan: - `OPENCLAW_QA_CONVEX_SECRET_CI` untuk `ci` - Pemilihan peran kredensial: - CLI: `--credential-role maintainer|ci` - - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default ke `ci` di CI, `maintainer` jika tidak) + - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default `ci` di CI, selain itu `maintainer`) -Env vars opsional: +Variabel env opsional: - `OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS` (default `1200000`) - `OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (default `30000`) - `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (default `90000`) - `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (default `15000`) - `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (default `/qa-credentials/v1`) -- `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (ID penelusuran opsional) -- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex `http://` loopback untuk pengembangan lokal saja. +- `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (ID pelacakan opsional) +- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex loopback `http://` hanya untuk pengembangan lokal. `OPENCLAW_QA_CONVEX_SITE_URL` sebaiknya menggunakan `https://` dalam operasi normal. -Perintah admin maintainer (pool add/remove/list) memerlukan -`OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` secara khusus. +Perintah admin maintainer (tambah/hapus/daftar pool) secara khusus memerlukan +`OPENCLAW_QA_CONVEX_SECRET_MAINTAINER`. Helper CLI untuk maintainer: @@ -190,29 +195,29 @@ pnpm openclaw qa credentials list --kind telegram pnpm openclaw qa credentials remove --credential-id ``` -Gunakan `--json` untuk output yang dapat dibaca mesin dalam script dan utilitas CI. +Gunakan `--json` untuk output yang dapat dibaca mesin dalam skrip dan utilitas CI. Kontrak endpoint default (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): - `POST /acquire` - - Request: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` + - Permintaan: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` - Berhasil: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` - Habis/dapat dicoba ulang: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` - `POST /heartbeat` - - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` + - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) - `POST /release` - - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken }` + - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken }` - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) -- `POST /admin/add` (hanya secret maintainer) - - Request: `{ kind, actorId, payload, note?, status? }` +- `POST /admin/add` (khusus secret maintainer) + - Permintaan: `{ kind, actorId, payload, note?, status? }` - Berhasil: `{ status: "ok", credential }` -- `POST /admin/remove` (hanya secret maintainer) - - Request: `{ credentialId, actorId }` +- `POST /admin/remove` (khusus secret maintainer) + - Permintaan: `{ credentialId, actorId }` - Berhasil: `{ status: "ok", changed, credential }` - - Pengaman lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` -- `POST /admin/list` (hanya secret maintainer) - - Request: `{ kind?, status?, includePayload?, limit? }` + - Penjagaan lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` +- `POST /admin/list` (khusus secret maintainer) + - Permintaan: `{ kind?, status?, includePayload?, limit? }` - Berhasil: `{ status: "ok", credentials, count }` Bentuk payload untuk jenis Telegram: @@ -223,13 +228,13 @@ Bentuk payload untuk jenis Telegram: ### Menambahkan channel ke QA -Menambahkan channel ke sistem QA Markdown memerlukan tepat dua hal: +Menambahkan channel ke sistem QA markdown memerlukan tepat dua hal: -1. Adaptor transport untuk channel tersebut. +1. Adapter transport untuk channel tersebut. 2. Paket skenario yang menguji kontrak channel. -Jangan menambahkan root perintah QA top-level baru ketika host `qa-lab` bersama dapat -memiliki alurnya. +Jangan menambahkan root perintah QA tingkat atas baru ketika host bersama `qa-lab` dapat +menangani alurnya. `qa-lab` memiliki mekanisme host bersama: @@ -246,32 +251,32 @@ Plugin runner memiliki kontrak transport: - bagaimana `openclaw qa ` dipasang di bawah root `qa` bersama - bagaimana Gateway dikonfigurasi untuk transport tersebut - bagaimana kesiapan diperiksa -- bagaimana event masuk disuntikkan +- bagaimana event masuk diinjeksi - bagaimana pesan keluar diamati - bagaimana transkrip dan status transport yang dinormalisasi diekspos -- bagaimana aksi yang didukung transport dieksekusi +- bagaimana tindakan berbasis transport dijalankan - bagaimana reset atau cleanup khusus transport ditangani Batas adopsi minimum untuk channel baru adalah: -1. Tetap jadikan `qa-lab` sebagai pemilik root `qa` bersama. +1. Pertahankan `qa-lab` sebagai pemilik root `qa` bersama. 2. Implementasikan runner transport pada seam host `qa-lab` bersama. -3. Pertahankan mekanisme khusus transport di dalam plugin runner atau harness channel. +3. Simpan mekanisme khusus transport di dalam plugin runner atau harness channel. 4. Pasang runner sebagai `openclaw qa ` alih-alih mendaftarkan root perintah pesaing. Plugin runner harus mendeklarasikan `qaRunners` di `openclaw.plugin.json` dan mengekspor array `qaRunnerCliRegistrations` yang cocok dari `runtime-api.ts`. - Jaga `runtime-api.ts` tetap ringan; eksekusi CLI dan runner lazy harus tetap berada di balik entrypoint terpisah. -5. Tulis atau adaptasikan skenario Markdown di bawah direktori bertema `qa/scenarios/`. + Jaga `runtime-api.ts` tetap ringan; CLI lazy dan eksekusi runner harus tetap berada di balik entrypoint terpisah. +5. Tulis atau adaptasi skenario markdown di bawah direktori bertema `qa/scenarios/`. 6. Gunakan helper skenario generik untuk skenario baru. 7. Pertahankan alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja. Aturan keputusan bersifat ketat: -- Jika perilaku dapat diekspresikan sekali di `qa-lab`, tempatkan di `qa-lab`. -- Jika perilaku bergantung pada satu transport channel, pertahankan di plugin runner atau harness plugin tersebut. -- Jika skenario memerlukan kapabilitas baru yang dapat digunakan lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. -- Jika perilaku hanya bermakna untuk satu transport, pertahankan skenario tersebut khusus transport dan buat itu eksplisit dalam kontrak skenario. +- Jika perilaku dapat diekspresikan satu kali di `qa-lab`, letakkan di `qa-lab`. +- Jika perilaku bergantung pada satu transport channel, simpan di plugin runner atau harness plugin tersebut. +- Jika sebuah skenario memerlukan kemampuan baru yang dapat digunakan oleh lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. +- Jika suatu perilaku hanya bermakna untuk satu transport, pertahankan skenario tetap khusus transport dan nyatakan itu secara eksplisit dalam kontrak skenario. -Nama helper generik yang disukai untuk skenario baru adalah: +Nama helper generik yang diutamakan untuk skenario baru adalah: - `waitForTransportReady` - `waitForChannelReady` @@ -294,80 +299,80 @@ Alias kompatibilitas tetap tersedia untuk skenario yang ada, termasuk: - `formatConversationTranscript` - `resetBus` -Pekerjaan channel baru sebaiknya menggunakan nama helper generik. -Alias kompatibilitas ada untuk menghindari migrasi flag day, bukan sebagai model untuk +Pekerjaan channel baru harus menggunakan nama helper generik. +Alias kompatibilitas ada untuk menghindari migrasi serentak, bukan sebagai model untuk penulisan skenario baru. ## Suite pengujian (apa yang berjalan di mana) -Anggap suite sebagai “realisme yang meningkat” (dan ketidakstabilan/biaya yang meningkat): +Anggap suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang meningkat): ### Unit / integrasi (default) - Perintah: `pnpm test` -- Config: eksekusi tanpa target menggunakan set shard `vitest.full-*.config.ts` dan dapat memperluas shard multi-project menjadi config per-project untuk penjadwalan paralel -- File: inventaris core/unit di bawah `src/**/*.test.ts`, `packages/**/*.test.ts`, `test/**/*.test.ts`, dan test node `ui` yang masuk allowlist yang dicakup oleh `vitest.unit.config.ts` +- Konfigurasi: menjalankan tanpa target menggunakan set shard `vitest.full-*.config.ts` dan dapat memperluas shard multi-proyek menjadi konfigurasi per proyek untuk penjadwalan paralel +- File: inventaris core/unit di bawah `src/**/*.test.ts`, `packages/**/*.test.ts`, `test/**/*.test.ts`, dan pengujian node `ui` yang di-whitelist yang dicakup oleh `vitest.unit.config.ts` - Cakupan: - - Unit test murni - - In-process integration test (auth Gateway, routing, tooling, parsing, config) + - Pengujian unit murni + - Pengujian integrasi in-process (auth Gateway, routing, tooling, parsing, config) - Regresi deterministik untuk bug yang diketahui - Ekspektasi: - Berjalan di CI - Tidak memerlukan key nyata - Harus cepat dan stabil -- Catatan project: - - `pnpm test` tanpa target sekarang menjalankan dua belas config shard lebih kecil (`core-unit-fast`, `core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native raksasa. Ini mengurangi RSS puncak pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension menghambat suite yang tidak terkait. - - `pnpm test --watch` tetap menggunakan graph project root native `vitest.config.ts`, karena loop watch multi-shard tidak praktis. - - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane yang di-scope terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` menghindari biaya startup project root penuh. - - `pnpm test:changed` memperluas path git yang berubah ke lane scoped yang sama ketika diff hanya menyentuh file source/test yang dapat dirutekan; edit config/setup tetap fallback ke rerun root-project yang luas. - - `pnpm check:changed` adalah smart local gate normal untuk pekerjaan sempit. Perintah ini mengklasifikasikan diff ke core, core tests, extensions, extension tests, apps, docs, metadata rilis, dan tooling, lalu menjalankan lane typecheck/lint/test yang cocok. Perubahan Plugin SDK publik dan kontrak plugin menyertakan validasi extension karena extension bergantung pada kontrak inti tersebut. Version bump yang hanya menyentuh metadata rilis menjalankan pemeriksaan versi/config/dependensi root yang terarah alih-alih suite penuh, dengan guard yang menolak perubahan package di luar field versi top-level. - - Unit test yang ringan impor dari agent, command, plugin, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file yang stateful/berat runtime tetap berada di lane yang ada. - - File source helper `plugin-sdk` dan `commands` terpilih juga memetakan eksekusi mode changed ke test sibling eksplisit di lane ringan tersebut, sehingga edit helper menghindari rerun suite berat penuh untuk direktori tersebut. - - `auto-reply` sekarang memiliki tiga bucket khusus: helper inti top-level, integration test `reply.*` top-level, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness reply terberat agar tidak masuk ke test status/chunk/token yang murah. -- Catatan runner tertanam: - - Saat Anda mengubah input penemuan message-tool atau konteks runtime Compaction, - pertahankan kedua tingkat cakupan. - - Tambahkan regresi helper terfokus untuk batas routing/normalisasi murni. - - Juga pertahankan suite integrasi runner tertanam tetap sehat: +- Catatan proyek: + - `pnpm test` tanpa target sekarang menjalankan dua belas konfigurasi shard yang lebih kecil (`core-unit-fast`, `core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native raksasa. Ini memangkas RSS puncak pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension membuat suite lain kelaparan. + - `pnpm test --watch` tetap menggunakan graf proyek root native `vitest.config.ts`, karena loop watch multi-shard tidak praktis. + - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane yang discakup terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` menghindari biaya startup penuh root project. + - `pnpm test:changed` memperluas path git yang berubah ke lane tercakup yang sama saat diff hanya menyentuh file source/test yang dapat dirutekan; edit config/setup tetap fallback ke rerun root-project yang luas. + - `pnpm check:changed` adalah gate lokal cerdas yang normal untuk pekerjaan sempit. Ini mengklasifikasikan diff ke core, pengujian core, extensions, pengujian extension, aplikasi, docs, metadata rilis, dan tooling, lalu menjalankan lane typecheck/lint/test yang cocok. Perubahan Plugin SDK publik dan kontrak plugin mencakup validasi extension karena extension bergantung pada kontrak core tersebut. Kenaikan versi metadata rilis saja menjalankan pemeriksaan versi/config/dependensi-root yang ditargetkan alih-alih suite penuh, dengan penjagaan yang menolak perubahan package di luar field versi tingkat atas. + - Pengujian unit ringan impor dari agen, perintah, plugin, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file stateful/berat runtime tetap di lane yang ada. + - File source helper `plugin-sdk` dan `commands` tertentu juga memetakan menjalankan mode changed ke pengujian sibling eksplisit di lane ringan tersebut, sehingga edit helper menghindari rerun suite berat penuh untuk direktori itu. + - `auto-reply` kini memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness reply terberat agar tidak membebani pengujian status/chunk/token yang murah. +- Catatan embedded runner: + - Saat Anda mengubah input discovery message-tool atau konteks runtime Compaction, + pertahankan kedua level cakupan. + - Tambahkan regresi helper yang terfokus untuk batas routing/normalisasi murni. + - Juga pertahankan suite integrasi embedded runner tetap sehat: `src/agents/pi-embedded-runner/compact.hooks.test.ts`, `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`, dan `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - Suite tersebut memverifikasi bahwa ID yang di-scope dan perilaku Compaction tetap mengalir - melalui jalur `run.ts` / `compact.ts` yang nyata; test khusus helper bukanlah - pengganti yang memadai untuk jalur integrasi tersebut. + - Suite tersebut memverifikasi bahwa ID yang discakup dan perilaku Compaction tetap mengalir + melalui path nyata `run.ts` / `compact.ts`; pengujian helper saja bukan + pengganti yang memadai untuk path integrasi tersebut. - Catatan pool: - - Config Vitest dasar sekarang default ke `threads`. - - Config Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh config root projects, e2e, dan live. - - Lane UI root mempertahankan setup dan optimizer `jsdom`, tetapi sekarang juga berjalan pada runner non-isolated bersama. - - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari config Vitest bersama. - - Launcher bersama `scripts/run-vitest.mjs` sekarang juga menambahkan `--no-maglev` untuk child process Node Vitest secara default guna mengurangi churn kompilasi V8 selama eksekusi lokal besar. Atur `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan terhadap perilaku V8 bawaan. + - Konfigurasi dasar Vitest sekarang default ke `threads`. + - Konfigurasi Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-terisolasi di seluruh proyek root, konfigurasi e2e, dan live. + - Lane UI root mempertahankan setup dan optimizer `jsdom`, tetapi sekarang juga berjalan pada runner non-terisolasi bersama. + - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari konfigurasi Vitest bersama. + - Launcher bersama `scripts/run-vitest.mjs` sekarang juga menambahkan `--no-maglev` untuk proses Node child Vitest secara default guna mengurangi churn kompilasi V8 selama menjalankan lokal besar. Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan dengan perilaku V8 bawaan. - Catatan iterasi lokal cepat: - - `pnpm changed:lanes` menampilkan lane arsitektural mana yang dipicu oleh sebuah diff. - - Hook pre-commit menjalankan `pnpm check:changed --staged` setelah formatting/linting staged, sehingga commit core-only tidak menanggung biaya test extension kecuali menyentuh kontrak publik yang berhadapan dengan extension. Commit yang hanya menyentuh metadata rilis tetap berada di lane versi/config/dependensi root yang terarah. - - Jika set perubahan staged yang tepat sudah divalidasi dengan gate yang setara atau lebih kuat, gunakan `scripts/committer --fast "" ` untuk melewati hanya rerun hook changed-scope. Format/lint staged tetap berjalan. Sebutkan gate yang telah diselesaikan dalam handoff Anda. Ini juga dapat diterima setelah kegagalan hook flaky yang terisolasi dijalankan ulang dan lolos dengan bukti yang di-scope. - - `pnpm test:changed` merutekan melalui lane scoped saat path yang berubah terpetakan dengan bersih ke suite yang lebih kecil. - - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku routing yang sama, hanya dengan batas worker yang lebih tinggi. - - Auto-scaling worker lokal sengaja lebih konservatif sekarang dan juga mundur saat load average host sudah tinggi, sehingga beberapa eksekusi Vitest bersamaan tidak terlalu merusak secara default. - - Config Vitest dasar menandai file projects/config sebagai `forceRerunTriggers` sehingga rerun mode changed tetap benar saat wiring test berubah. - - Config menjaga `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; atur `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. + - `pnpm changed:lanes` menampilkan lane arsitektur mana yang dipicu oleh suatu diff. + - Hook pre-commit menjalankan `pnpm check:changed --staged` setelah formatting/linting staged, sehingga commit core-only tidak membayar biaya pengujian extension kecuali menyentuh kontrak publik yang berhadapan dengan extension. Commit metadata rilis saja tetap berada di lane versi/config/dependensi-root yang ditargetkan. + - Jika kumpulan perubahan staged yang sama persis sudah divalidasi dengan gate yang setara atau lebih kuat, gunakan `scripts/committer --fast "" ` untuk hanya melewati rerun hook changed-scope. Format/lint staged tetap berjalan. Sebutkan gate yang telah selesai dalam handoff Anda. Ini juga dapat diterima setelah kegagalan hook flaky terisolasi dijalankan ulang dan lolos dengan bukti tercakup. + - `pnpm test:changed` merutekan melalui lane tercakup saat path yang berubah terpetakan dengan bersih ke suite yang lebih kecil. + - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku perutean yang sama, hanya dengan batas worker yang lebih tinggi. + - Penskalaan otomatis worker lokal sekarang sengaja lebih konservatif dan juga mengurangi laju ketika load average host sudah tinggi, sehingga beberapa menjalankan Vitest serentak secara default menimbulkan dampak yang lebih kecil. + - Konfigurasi dasar Vitest menandai file proyek/konfigurasi sebagai `forceRerunTriggers` agar rerun mode changed tetap benar ketika wiring pengujian berubah. + - Konfigurasi mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda ingin satu lokasi cache eksplisit untuk profiling langsung. - Catatan debug performa: - - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest beserta output rincian impor. - - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke file yang berubah sejak `origin/main`. -- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan dengan jalur root-project native untuk diff yang sudah di-commit tersebut dan mencetak wall time plus max RSS macOS. -- `pnpm test:perf:changed:bench -- --worktree` mem-benchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan config Vitest root. + - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest plus output rincian impor. + - `pnpm test:perf:imports:changed` mencakup tampilan profiling yang sama ke file yang berubah sejak `origin/main`. +- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan dengan path root-project native untuk diff yang di-commit itu dan mencetak wall time plus RSS maksimum macOS. +- `pnpm test:perf:changed:bench -- --worktree` membenchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi root Vitest. - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk overhead startup dan transform Vitest/Vite. - `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk suite unit dengan paralelisme file dinonaktifkan. ### Stabilitas (Gateway) - Perintah: `pnpm test:stability:gateway` -- Config: `vitest.gateway.config.ts`, dipaksa ke satu worker +- Konfigurasi: `vitest.gateway.config.ts`, dipaksa ke satu worker - Cakupan: - - Memulai Gateway local loopback nyata dengan diagnostik diaktifkan secara default - - Menggerakkan churn pesan Gateway sintetis, memori, dan payload besar melalui jalur event diagnostik - - Mengkueri `diagnostics.stability` melalui RPC WS Gateway + - Memulai Gateway loopback nyata dengan diagnostik diaktifkan secara default + - Menjalankan churn pesan gateway sintetis, memori, dan payload besar melalui path event diagnostik + - Mengueri `diagnostics.stability` melalui WS RPC Gateway - Mencakup helper persistensi bundle stabilitas diagnostik - - Memastikan recorder tetap bounded, sampel RSS sintetis tetap di bawah anggaran tekanan, dan kedalaman antrean per sesi turun kembali ke nol + - Menegaskan recorder tetap dibatasi, sampel RSS sintetis tetap berada di bawah anggaran tekanan, dan kedalaman antrean per sesi terkuras kembali ke nol - Ekspektasi: - Aman untuk CI dan tanpa key - Lane sempit untuk tindak lanjut regresi stabilitas, bukan pengganti suite Gateway penuh @@ -375,79 +380,79 @@ Anggap suite sebagai “realisme yang meningkat” (dan ketidakstabilan/biaya ya ### E2E (smoke Gateway) - Perintah: `pnpm test:e2e` -- Config: `vitest.e2e.config.ts` -- File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts`, dan test E2E plugin bawaan di bawah `extensions/` +- Konfigurasi: `vitest.e2e.config.ts` +- File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts`, dan pengujian E2E plugin bawaan di bawah `extensions/` - Default runtime: - - Menggunakan Vitest `threads` dengan `isolate: false`, sama seperti bagian repo lainnya. + - Menggunakan Vitest `threads` dengan `isolate: false`, sesuai dengan bagian repo lainnya. - Menggunakan worker adaptif (CI: hingga 2, lokal: 1 secara default). - - Berjalan dalam mode silent secara default untuk mengurangi overhead I/O konsol. + - Berjalan dalam mode senyap secara default untuk mengurangi overhead I/O konsol. - Override yang berguna: - `OPENCLAW_E2E_WORKERS=` untuk memaksa jumlah worker (dibatasi hingga 16). - `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali output konsol verbose. - Cakupan: - Perilaku end-to-end Gateway multi-instance - - Surface WebSocket/HTTP, pairing Node, dan jaringan yang lebih berat + - Permukaan WebSocket/HTTP, pairing Node, dan jaringan yang lebih berat - Ekspektasi: - - Berjalan di CI (saat diaktifkan di pipeline) + - Berjalan di CI (saat diaktifkan dalam pipeline) - Tidak memerlukan key nyata - - Lebih banyak bagian bergerak dibanding unit test (bisa lebih lambat) + - Lebih banyak komponen bergerak daripada pengujian unit (bisa lebih lambat) ### E2E: smoke backend OpenShell - Perintah: `pnpm test:e2e:openshell` - File: `extensions/openshell/src/backend.e2e.test.ts` - Cakupan: - - Memulai Gateway OpenShell terisolasi pada host melalui Docker + - Memulai Gateway OpenShell terisolasi di host melalui Docker - Membuat sandbox dari Dockerfile lokal sementara - - Menguji backend OpenShell OpenClaw melalui `sandbox ssh-config` + eksekusi SSH nyata + - Menguji backend OpenShell milik OpenClaw melalui `sandbox ssh-config` + eksekusi SSH nyata - Memverifikasi perilaku filesystem remote-canonical melalui bridge fs sandbox - Ekspektasi: - - Hanya opt-in; bukan bagian dari eksekusi default `pnpm test:e2e` - - Memerlukan CLI `openshell` lokal plus daemon Docker yang berfungsi - - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan Gateway dan sandbox pengujian + - Hanya opt-in; bukan bagian dari menjalankan default `pnpm test:e2e` + - Memerlukan CLI `openshell` lokal serta daemon Docker yang berfungsi + - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan Gateway pengujian dan sandbox - Override yang berguna: - - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan test saat menjalankan suite e2e yang lebih luas secara manual - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke binary CLI non-default atau script wrapper + - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manual + - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI non-default atau skrip wrapper ### Live (provider nyata + model nyata) - Perintah: `pnpm test:live` -- Config: `vitest.live.config.ts` -- File: `src/**/*.live.test.ts`, `test/**/*.live.test.ts`, dan test live plugin bawaan di bawah `extensions/` -- Default: **aktif** oleh `pnpm test:live` (mengatur `OPENCLAW_LIVE_TEST=1`) +- Konfigurasi: `vitest.live.config.ts` +- File: `src/**/*.live.test.ts`, `test/**/*.live.test.ts`, dan pengujian live plugin bawaan di bawah `extensions/` +- Default: **diaktifkan** oleh `pnpm test:live` (menetapkan `OPENCLAW_LIVE_TEST=1`) - Cakupan: - “Apakah provider/model ini benar-benar berfungsi _hari ini_ dengan kredensial nyata?” - - Menangkap perubahan format provider, keanehan pemanggilan tool, masalah auth, dan perilaku rate limit + - Menangkap perubahan format provider, keanehan pemanggilan alat, masalah auth, dan perilaku rate limit - Ekspektasi: - - Memang tidak stabil untuk CI secara desain (jaringan nyata, kebijakan provider nyata, kuota, outage) - - Memakan biaya / menggunakan rate limit - - Sebaiknya jalankan subset yang dipersempit, bukan “semuanya” -- Eksekusi live memuat `~/.profile` untuk mengambil API key yang belum ada. -- Secara default, eksekusi live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home test sementara agar fixture unit tidak dapat mengubah `~/.openclaw` asli Anda. -- Atur `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang sengaja perlu live test menggunakan direktori home asli Anda. -- `pnpm test:live` sekarang default ke mode yang lebih senyap: mempertahankan output progres `[live] ...`, tetapi menekan pemberitahuan `~/.profile` tambahan dan membisukan log bootstrap Gateway/keramaian Bonjour. Atur `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali. -- Rotasi API key (khusus provider): atur `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; test akan mencoba ulang pada respons rate limit. + - Secara desain tidak stabil untuk CI (jaringan nyata, kebijakan provider nyata, kuota, outage) + - Menghabiskan biaya / menggunakan rate limit + - Lebih baik menjalankan subset yang dipersempit daripada “semuanya” +- Menjalankan live mengambil sumber dari `~/.profile` untuk mengambil API key yang hilang. +- Secara default, menjalankan live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara agar fixture unit tidak dapat memutasi `~/.openclaw` nyata Anda. +- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang ingin pengujian live menggunakan direktori home nyata Anda. +- `pnpm test:live` sekarang default ke mode yang lebih senyap: tetap menampilkan output progres `[live] ...`, tetapi menekan notifikasi `~/.profile` tambahan dan membisukan log bootstrap Gateway/chatter Bonjour. Setel `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali. +- Rotasi API key (khusus provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian mencoba ulang pada respons rate limit. - Output progres/Heartbeat: - - Suite live sekarang mengeluarkan baris progres ke stderr sehingga panggilan provider yang panjang terlihat tetap aktif bahkan saat tangkapan konsol Vitest senyap. - - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/Gateway mengalir segera selama eksekusi live. - - Setel Heartbeat model langsung dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. - - Setel Heartbeat Gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - Suite live sekarang mengirim baris progres ke stderr sehingga panggilan provider yang panjang terlihat aktif bahkan saat penangkapan konsol Vitest senyap. + - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest agar baris progres provider/Gateway mengalir segera selama menjalankan live. + - Atur Heartbeat model langsung dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. + - Atur Heartbeat Gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. ## Suite mana yang harus saya jalankan? Gunakan tabel keputusan ini: -- Mengedit logika/test: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda banyak mengubah) +- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda banyak mengubah) - Menyentuh jaringan Gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` -- Men-debug “bot saya down” / kegagalan khusus provider / pemanggilan tool: jalankan `pnpm test:live` yang dipersempit +- Men-debug “bot saya down” / kegagalan khusus provider / pemanggilan alat: jalankan `pnpm test:live` yang dipersempit ## Live: sapuan kapabilitas Node Android -- Test: `src/gateway/android-node.capabilities.live.test.ts` -- Script: `pnpm android:test:integration` -- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh Node Android yang terhubung dan memastikan perilaku kontrak perintah. +- Pengujian: `src/gateway/android-node.capabilities.live.test.ts` +- Skrip: `pnpm android:test:integration` +- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh Node Android yang terhubung dan menegaskan perilaku kontrak perintah. - Cakupan: - - Setup manual/prasyarat (suite ini tidak menginstal/menjalankan/memasangkan aplikasi). + - Setup manual/prasyarat (suite ini tidak memasang/menjalankan/memasangkan aplikasi). - Validasi `node.invoke` Gateway per perintah untuk Node Android yang dipilih. - Pra-setup yang diperlukan: - Aplikasi Android sudah terhubung + dipasangkan ke Gateway. @@ -456,73 +461,73 @@ Gunakan tabel keputusan ini: - Override target opsional: - `OPENCLAW_ANDROID_NODE_ID` atau `OPENCLAW_ANDROID_NODE_NAME`. - `OPENCLAW_ANDROID_GATEWAY_URL` / `OPENCLAW_ANDROID_GATEWAY_TOKEN` / `OPENCLAW_ANDROID_GATEWAY_PASSWORD`. -- Detail setup Android lengkap: [Android App](/id/platforms/android) +- Detail setup Android lengkap: [Aplikasi Android](/id/platforms/android) -## Live: smoke model (key profil) +## Live: model smoke (key profil) -Live test dibagi menjadi dua layer agar kita dapat mengisolasi kegagalan: +Pengujian live dibagi menjadi dua lapisan agar kita dapat mengisolasi kegagalan: - “Model langsung” memberi tahu kita apakah provider/model dapat menjawab sama sekali dengan key yang diberikan. -- “Smoke Gateway” memberi tahu kita apakah pipeline Gateway+agent penuh berfungsi untuk model tersebut (sesi, riwayat, tools, kebijakan sandbox, dll.). +- “Smoke Gateway” memberi tahu kita apakah pipeline penuh gateway+agen berfungsi untuk model itu (sesi, riwayat, alat, kebijakan sandbox, dll.). -### Layer 1: penyelesaian model langsung (tanpa Gateway) +### Lapisan 1: penyelesaian model langsung (tanpa Gateway) -- Test: `src/agents/models.profiles.live.test.ts` +- Pengujian: `src/agents/models.profiles.live.test.ts` - Tujuan: - - Menginventarisasi model yang ditemukan - - Menggunakan `getApiKeyForModel` untuk memilih model yang kredensialnya Anda miliki - - Menjalankan penyelesaian kecil per model (dan regresi terarah bila diperlukan) + - Mencacah model yang ditemukan + - Menggunakan `getApiKeyForModel` untuk memilih model yang Anda miliki kredensialnya + - Menjalankan satu completion kecil per model (dan regresi tertarget bila diperlukan) - Cara mengaktifkan: - - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest langsung) -- Atur `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite akan skip agar `pnpm test:live` tetap fokus pada smoke Gateway + - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) +- Setel `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini dilewati untuk menjaga `pnpm test:live` tetap fokus pada smoke Gateway - Cara memilih model: - `OPENCLAW_LIVE_MODELS=modern` untuk menjalankan allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_MODELS=all` adalah alias untuk allowlist modern - atau `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist dipisahkan koma) - - Sapuan modern/all default ke batas sinyal tinggi yang dikurasi; atur `OPENCLAW_LIVE_MAX_MODELS=0` untuk sapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Sapuan modern/all secara default memakai batas kurasi sinyal-tinggi; setel `OPENCLAW_LIVE_MAX_MODELS=0` untuk sapuan modern lengkap atau angka positif untuk batas yang lebih kecil. - Cara memilih provider: - `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist dipisahkan koma) -- Dari mana key berasal: +- Asal key: - Secara default: profile store dan fallback env - - Atur `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa **hanya profile store** + - Setel `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa **profile store** saja - Mengapa ini ada: - - Memisahkan “API provider rusak / key tidak valid” dari “pipeline agent Gateway rusak” - - Menampung regresi kecil dan terisolasi (contoh: OpenAI Responses/Codex Responses reasoning replay + alur tool-call) + - Memisahkan “API provider rusak / key tidak valid” dari “pipeline agen Gateway rusak” + - Menampung regresi kecil yang terisolasi (contoh: replay reasoning OpenAI Responses/Codex Responses + alur tool-call) -### Layer 2: smoke Gateway + agent dev (apa yang sebenarnya dilakukan "@openclaw") +### Lapisan 2: smoke Gateway + agen dev (apa yang sebenarnya dilakukan `@openclaw`) -- Test: `src/gateway/gateway-models.profiles.live.test.ts` +- Pengujian: `src/gateway/gateway-models.profiles.live.test.ts` - Tujuan: - - Menjalankan Gateway in-process - - Membuat/menambal sesi `agent:dev:*` (override model per eksekusi) - - Mengiterasi model-dengan-key dan memastikan: - - respons “bermakna” (tanpa tools) - - pemanggilan tool nyata berfungsi (probe read) - - probe tool tambahan opsional (probe exec+read) - - jalur regresi OpenAI (hanya tool-call → tindak lanjut) tetap berfungsi -- Detail probe (agar Anda dapat menjelaskan kegagalan dengan cepat): - - Probe `read`: test menulis file nonce di workspace dan meminta agent `read` file itu lalu mengembalikan nonce. - - Probe `exec+read`: test meminta agent `exec` untuk menulis nonce ke file sementara, lalu `read` kembali. - - Probe gambar: test melampirkan PNG hasil generate (kucing + kode acak) dan mengharapkan model mengembalikan `cat `. + - Menyalakan Gateway in-process + - Membuat/menambal sesi `agent:dev:*` (override model per menjalankan) + - Mengiterasi model-dengan-key dan menegaskan: + - respons “bermakna” (tanpa alat) + - satu pemanggilan alat nyata berfungsi (probe baca) + - probe alat tambahan opsional (probe exec+baca) + - path regresi OpenAI (hanya tool-call → tindak lanjut) tetap berfungsi +- Detail probe (agar Anda bisa menjelaskan kegagalan dengan cepat): + - Probe `read`: pengujian menulis file nonce di workspace lalu meminta agen untuk `read` file itu dan menggemakan nonce kembali. + - Probe `exec+read`: pengujian meminta agen untuk menulis nonce ke file sementara dengan `exec`, lalu `read` kembali. + - Probe image: pengujian melampirkan PNG yang dihasilkan (kucing + kode acak) dan mengharapkan model mengembalikan `cat `. - Referensi implementasi: `src/gateway/gateway-models.profiles.live.test.ts` dan `src/gateway/live-image-probe.ts`. - Cara mengaktifkan: - - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest langsung) + - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - Cara memilih model: - Default: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_GATEWAY_MODELS=all` adalah alias untuk allowlist modern - - Atau atur `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit - - Sapuan Gateway modern/all default ke batas sinyal tinggi yang dikurasi; atur `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. -- Cara memilih provider (hindari “OpenRouter semuanya”): + - Atau setel `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit + - Sapuan Gateway modern/all secara default memakai batas kurasi sinyal-tinggi; setel `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sapuan modern lengkap atau angka positif untuk batas yang lebih kecil. +- Cara memilih provider (hindari “semua OpenRouter”): - `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"` (allowlist dipisahkan koma) -- Probe tool + gambar selalu aktif pada live test ini: - - probe `read` + probe `exec+read` (stress tool) - - probe gambar berjalan saat model mengiklankan dukungan input gambar +- Probe alat + image selalu aktif dalam pengujian live ini: + - probe `read` + probe `exec+read` (stress alat) + - probe image berjalan saat model mengiklankan dukungan input image - Alur (tingkat tinggi): - - Test menghasilkan PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) - - Mengirimkannya melalui `agent` `attachments: [{ mimeType: "image/png", content: "" }]` - - Gateway mem-parse lampiran menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) - - Agent tertanam meneruskan pesan pengguna multimodal ke model - - Asersi: balasan berisi `cat` + kode tersebut (toleransi OCR: kesalahan kecil diperbolehkan) + - Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) + - Mengirimnya melalui `agent` `attachments: [{ mimeType: "image/png", content: "" }]` + - Gateway mengurai lampiran menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) + - Agen embedded meneruskan pesan pengguna multimodal ke model + - Penegasan: balasan berisi `cat` + kode tersebut (toleransi OCR: kesalahan kecil diperbolehkan) Tip: untuk melihat apa yang dapat Anda uji di mesin Anda (dan ID `provider/model` yang tepat), jalankan: @@ -531,26 +536,26 @@ openclaw models list openclaw models list --json ``` -## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lain) +## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lainnya) -- Test: `src/gateway/gateway-cli-backend.live.test.ts` -- Tujuan: memvalidasi pipeline Gateway + agent menggunakan backend CLI lokal, tanpa menyentuh config default Anda. -- Default smoke khusus backend berada bersama definisi `cli-backend.ts` milik extension yang memilikinya. +- Pengujian: `src/gateway/gateway-cli-backend.live.test.ts` +- Tujuan: memvalidasi pipeline Gateway + agen menggunakan backend CLI lokal, tanpa menyentuh config default Anda. +- Default smoke khusus backend berada pada definisi `cli-backend.ts` milik extension pemiliknya. - Aktifkan: - - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest langsung) + - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - `OPENCLAW_LIVE_CLI_BACKEND=1` - Default: - Provider/model default: `claude-cli/claude-sonnet-4-6` - - Perilaku command/args/gambar berasal dari metadata plugin backend CLI yang memilikinya. + - Perilaku command/args/image berasal dari metadata plugin backend CLI pemiliknya. - Override (opsional): - `OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"` - `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"` - `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'` - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran gambar nyata (path disuntikkan ke prompt). - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path file gambar sebagai argumen CLI alih-alih injeksi prompt. - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol bagaimana argumen gambar diteruskan saat `IMAGE_ARG` disetel. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran image nyata (path diinjeksi ke prompt). + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path file image sebagai argumen CLI alih-alih injeksi prompt. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol cara argumen image diteruskan saat `IMAGE_ARG` disetel. - `OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1` untuk mengirim giliran kedua dan memvalidasi alur resume. - - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas sesi yang sama default Claude Sonnet -> Opus (atur ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). + - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kesinambungan sesi yang sama Claude Sonnet -> Opus secara default (setel ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). Contoh: @@ -566,7 +571,7 @@ Resep Docker: pnpm test:docker:live-cli-backend ``` -Resep Docker single-provider: +Resep Docker penyedia tunggal: ```bash pnpm test:docker:live-cli-backend:claude @@ -578,27 +583,27 @@ pnpm test:docker:live-cli-backend:gemini Catatan: - Runner Docker berada di `scripts/test-live-cli-backend-docker.sh`. -- Runner ini menjalankan smoke backend CLI live di dalam image Docker repo sebagai pengguna non-root `node`. -- Runner ini me-resolve metadata smoke CLI dari extension yang memilikinya, lalu menginstal package CLI Linux yang cocok (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`). -- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth langganan portabel Claude Code melalui salah satu dari `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Perintah ini pertama-tama membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran backend CLI Gateway tanpa mempertahankan env API key Anthropic. Lane langganan ini menonaktifkan probe Claude MCP/tool dan gambar secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas paket langganan normal. -- Smoke backend CLI live sekarang menguji alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi gambar, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI Gateway. -- Smoke default Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi bahwa sesi yang dilanjutkan masih mengingat catatan sebelumnya. +- Ini menjalankan smoke CLI-backend live di dalam image Docker repo sebagai pengguna non-root `node`. +- Ini menyelesaikan metadata smoke CLI dari extension pemilik, lalu memasang package CLI Linux yang cocok (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`). +- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth langganan Claude Code portabel melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Ini pertama-tama membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env Anthropic API key. Lane langganan ini menonaktifkan probe Claude MCP/tool dan image secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas normal paket langganan. +- Smoke CLI-backend live sekarang menguji alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan alat MCP `cron` yang diverifikasi melalui CLI Gateway. +- Smoke default Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi bahwa sesi yang di-resume masih mengingat catatan sebelumnya. ## Live: smoke bind ACP (`/acp spawn ... --bind here`) -- Test: `src/gateway/gateway-acp-bind.live.test.ts` -- Tujuan: memvalidasi alur bind percakapan ACP nyata dengan agent ACP live: +- Pengujian: `src/gateway/gateway-acp-bind.live.test.ts` +- Tujuan: memvalidasi alur bind percakapan ACP nyata dengan agen ACP live: - kirim `/acp spawn --bind here` - - bind percakapan channel pesan sintetis di tempat + - bind percakapan message-channel sintetis di tempat - kirim tindak lanjut normal pada percakapan yang sama - - verifikasi bahwa tindak lanjut tersebut masuk ke transkrip sesi ACP yang terikat + - verifikasi bahwa tindak lanjut tersebut masuk ke transkrip sesi ACP yang telah di-bind - Aktifkan: - `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts` - `OPENCLAW_LIVE_ACP_BIND=1` - Default: - - Agent ACP di Docker: `claude,codex,gemini` - - Agent ACP untuk `pnpm test:live ...` langsung: `claude` - - Channel sintetis: konteks percakapan bergaya Slack DM + - Agen ACP di Docker: `claude,codex,gemini` + - Agen ACP untuk `pnpm test:live ...` langsung: `claude` + - Channel sintetis: konteks percakapan bergaya DM Slack - Backend ACP: `acpx` - Override: - `OPENCLAW_LIVE_ACP_BIND_AGENT=claude` @@ -608,8 +613,8 @@ Catatan: - `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@'` - `OPENCLAW_LIVE_ACP_BIND_CODEX_MODEL=gpt-5.4` - Catatan: - - Lane ini menggunakan surface `chat.send` Gateway dengan field originating-route sintetis khusus admin sehingga test dapat melampirkan konteks channel pesan tanpa berpura-pura mengirimkannya secara eksternal. - - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak diatur, test menggunakan registry agent bawaan plugin `acpx` tertanam untuk agent harness ACP yang dipilih. + - Lane ini menggunakan permukaan Gateway `chat.send` dengan field originating-route sintetis khusus admin sehingga pengujian dapat melampirkan konteks message-channel tanpa berpura-pura mengirim secara eksternal. + - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak disetel, pengujian menggunakan registry agen bawaan dari plugin embedded `acpx` untuk agen harness ACP yang dipilih. Contoh: @@ -625,7 +630,7 @@ Resep Docker: pnpm test:docker:live-acp-bind ``` -Resep Docker agent tunggal: +Resep Docker agen tunggal: ```bash pnpm test:docker:live-acp-bind:claude @@ -636,34 +641,34 @@ pnpm test:docker:live-acp-bind:gemini Catatan Docker: - Runner Docker berada di `scripts/test-live-acp-bind-docker.sh`. -- Secara default, runner ini menjalankan smoke bind ACP terhadap semua agent CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. +- Secara default, ini menjalankan smoke bind ACP terhadap semua agen CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. - Gunakan `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude`, `OPENCLAW_LIVE_ACP_BIND_AGENTS=codex`, atau `OPENCLAW_LIVE_ACP_BIND_AGENTS=gemini` untuk mempersempit matriks. -- Runner ini memuat `~/.profile`, men-stage materi auth CLI yang cocok ke dalam container, menginstal `acpx` ke prefix npm writable, lalu menginstal CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. -- Di dalam Docker, runner mengatur `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` sehingga acpx mempertahankan env var provider dari profile yang dimuat agar tetap tersedia bagi harness CLI child. +- Ini mengambil sumber dari `~/.profile`, menyiapkan materi auth CLI yang cocok ke dalam container, memasang `acpx` ke prefix npm writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. +- Di dalam Docker, runner menetapkan `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx menjaga env provider dari profil yang telah di-source tetap tersedia untuk CLI harness anak. ## Live: smoke harness app-server Codex -- Tujuan: memvalidasi harness Codex milik plugin melalui method `agent` - Gateway normal: +- Tujuan: memvalidasi harness Codex milik plugin melalui metode + `agent` Gateway normal: - memuat plugin `codex` bawaan - memilih `OPENCLAW_AGENT_RUNTIME=codex` - - mengirim giliran agent Gateway pertama ke `codex/gpt-5.4` + - mengirim giliran agen Gateway pertama ke `codex/gpt-5.4` - mengirim giliran kedua ke sesi OpenClaw yang sama dan memverifikasi thread app-server - dapat dilanjutkan - - menjalankan `/codex status` dan `/codex models` melalui jalur perintah Gateway + dapat di-resume + - menjalankan `/codex status` dan `/codex models` melalui path perintah Gateway yang sama - - secara opsional menjalankan dua probe shell escalated yang ditinjau Guardian: satu perintah + - secara opsional menjalankan dua probe shell tereskalasi yang ditinjau Guardian: satu perintah jinak yang seharusnya disetujui dan satu unggahan secret palsu yang seharusnya - ditolak sehingga agent bertanya kembali -- Test: `src/gateway/gateway-codex-harness.live.test.ts` + ditolak sehingga agen meminta kembali +- Pengujian: `src/gateway/gateway-codex-harness.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_CODEX_HARNESS=1` - Model default: `codex/gpt-5.4` -- Probe gambar opsional: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` +- Probe image opsional: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` - Probe MCP/tool opsional: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` - Probe Guardian opsional: `OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=1` -- Smoke ini mengatur `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex - yang rusak tidak dapat lolos dengan diam-diam fallback ke Pi. -- Auth: `OPENAI_API_KEY` dari shell/profile, ditambah salinan opsional +- Smoke ini menetapkan `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex yang rusak + tidak bisa lolos dengan diam-diam fallback ke PI. +- Auth: `OPENAI_API_KEY` dari shell/profil, ditambah salinan opsional `~/.codex/auth.json` dan `~/.codex/config.toml` Resep lokal: @@ -688,26 +693,29 @@ pnpm test:docker:live-codex-harness Catatan Docker: - Runner Docker berada di `scripts/test-live-codex-harness-docker.sh`. -- Runner ini memuat `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file auth CLI Codex bila ada, menginstal `@openai/codex` ke prefix npm writable yang di-mount, men-stage source tree, lalu hanya menjalankan live test harness Codex. -- Docker mengaktifkan probe gambar, MCP/tool, dan Guardian secara default. Atur +- Ini mengambil sumber `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file auth CLI Codex + bila ada, memasang `@openai/codex` ke prefix npm writable yang di-mount, + menyiapkan source tree, lalu hanya menjalankan pengujian live Codex-harness. +- Docker mengaktifkan probe image, MCP/tool, dan Guardian secara default. Setel `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0` atau `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` atau - `OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0` saat Anda memerlukan eksekusi debug yang lebih sempit. -- Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, sama dengan config live - test sehingga fallback `openai-codex/*` atau Pi tidak dapat menyembunyikan regresi + `OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0` saat Anda memerlukan + menjalankan debug yang lebih sempit. +- Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, sama seperti konfigurasi pengujian + live sehingga fallback `openai-codex/*` atau PI tidak dapat menyembunyikan regresi harness Codex. ### Resep live yang direkomendasikan -Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling tidak flaky: +Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling sedikit flaky: -- Model tunggal, langsung (tanpa Gateway): +- Satu model, langsung (tanpa Gateway): - `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts` -- Model tunggal, smoke Gateway: +- Satu model, smoke Gateway: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -- Pemanggilan tool di beberapa provider: +- Pemanggilan alat di beberapa provider: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` - Fokus Google (Gemini API key + Antigravity): @@ -717,19 +725,19 @@ Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling tidak flaky: Catatan: - `google/...` menggunakan Gemini API (API key). -- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agent bergaya Cloud Code Assist). +- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agen bergaya Cloud Code Assist). - `google-gemini-cli/...` menggunakan Gemini CLI lokal di mesin Anda (auth terpisah + keanehan tooling). - Gemini API vs Gemini CLI: - - API: OpenClaw memanggil Gemini API ter-host milik Google melalui HTTP (auth API key / profil); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”. - - CLI: OpenClaw menjalankan binary `gemini` lokal; ia memiliki auth sendiri dan dapat berperilaku berbeda (streaming/dukungan tool/perbedaan versi). + - API: OpenClaw memanggil Gemini API hosted milik Google melalui HTTP (auth API key / profil); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”. + - CLI: OpenClaw menjalankan biner `gemini` lokal; ini memiliki auth sendiri dan dapat berperilaku berbeda (streaming/dukungan alat/ketidaksesuaian versi). -## Live: matriks model (cakupan yang kami uji) +## Live: matriks model (apa yang kami cakup) -Tidak ada “daftar model CI” tetap (live bersifat opt-in), tetapi berikut adalah model **yang direkomendasikan** untuk dicakup secara rutin pada mesin dev dengan key. +Tidak ada “daftar model CI” yang tetap (live bersifat opt-in), tetapi ini adalah model-model **yang direkomendasikan** untuk dicakup secara rutin pada mesin dev dengan key. -### Set smoke modern (pemanggilan tool + gambar) +### Set smoke modern (pemanggilan alat + image) -Ini adalah eksekusi “model umum” yang kami harapkan tetap berfungsi: +Ini adalah menjalankan “model umum” yang kami harapkan tetap berfungsi: - OpenAI (non-Codex): `openai/gpt-5.4` (opsional: `openai/gpt-5.4-mini`) - OpenAI Codex: `openai-codex/gpt-5.4` @@ -739,10 +747,10 @@ Ini adalah eksekusi “model umum” yang kami harapkan tetap berfungsi: - Z.AI (GLM): `zai/glm-4.7` - MiniMax: `minimax/MiniMax-M2.7` -Jalankan smoke Gateway dengan tools + gambar: +Jalankan smoke Gateway dengan alat + image: `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -### Baseline: pemanggilan tool (Read + Exec opsional) +### Baseline: pemanggilan alat (Read + Exec opsional) Pilih setidaknya satu per keluarga provider: @@ -755,73 +763,73 @@ Pilih setidaknya satu per keluarga provider: Cakupan tambahan opsional (bagus untuk dimiliki): - xAI: `xai/grok-4` (atau versi terbaru yang tersedia) -- Mistral: `mistral/`… (pilih satu model yang mampu `tools` yang Anda aktifkan) -- Cerebras: `cerebras/`… (jika Anda memiliki akses) -- LM Studio: `lmstudio/`… (lokal; pemanggilan tool bergantung pada mode API) +- Mistral: `mistral/`… (pilih satu model yang mampu `tools` dan telah Anda aktifkan) +- Cerebras: `cerebras/`… (jika Anda punya akses) +- LM Studio: `lmstudio/`… (lokal; pemanggilan alat bergantung pada mode API) -### Vision: pengiriman gambar (lampiran → pesan multimodal) +### Vision: kirim image (lampiran → pesan multimodal) -Sertakan setidaknya satu model yang mampu gambar dalam `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mampu vision, dll.) untuk menguji probe gambar. +Sertakan setidaknya satu model yang mampu image di `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dll.) untuk menguji probe image. -### Aggregator / gateway alternatif +### Agregator / Gateway alternatif Jika Anda mengaktifkan key, kami juga mendukung pengujian melalui: - OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mampu tool+image) - OpenCode: `opencode/...` untuk Zen dan `opencode-go/...` untuk Go (auth melalui `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) -Provider lain yang dapat Anda sertakan dalam matriks live (jika Anda memiliki kredensial/config): +Provider lain yang dapat Anda sertakan dalam matriks live (jika Anda punya kredensial/config): - Bawaan: `openai`, `openai-codex`, `anthropic`, `google`, `google-vertex`, `google-antigravity`, `google-gemini-cli`, `zai`, `openrouter`, `opencode`, `opencode-go`, `xai`, `groq`, `cerebras`, `mistral`, `github-copilot` -- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), plus proxy kompatibel OpenAI/Anthropic apa pun (LM Studio, vLLM, LiteLLM, dll.) +- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), serta proxy yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.) -Tip: jangan mencoba meng-hardcode “semua model” dalam docs. Daftar yang otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + key apa pun yang tersedia. +Tip: jangan mencoba meng-hardcode “semua model” dalam docs. Daftar otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` pada mesin Anda + key apa pun yang tersedia. ## Kredensial (jangan pernah commit) -Live test menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktisnya: +Pengujian live menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktis: -- Jika CLI berfungsi, live test seharusnya menemukan key yang sama. -- Jika live test mengatakan “tidak ada kredensial”, debug dengan cara yang sama seperti Anda men-debug `openclaw models list` / pemilihan model. +- Jika CLI berfungsi, pengujian live seharusnya menemukan key yang sama. +- Jika pengujian live mengatakan “no creds”, debug dengan cara yang sama seperti Anda men-debug `openclaw models list` / pemilihan model. -- Profil auth per-agent: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud “profile keys” dalam live test) +- Profil auth per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud “key profil” dalam pengujian live) - Config: `~/.openclaw/openclaw.json` (atau `OPENCLAW_CONFIG_PATH`) -- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live staged saat ada, tetapi bukan profile-key store utama) -- Eksekusi live lokal menyalin config aktif, file `auth-profiles.json` per-agent, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home test sementara secara default; home live staged melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap menjauh dari workspace host asli Anda. +- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live yang disiapkan saat ada, tetapi bukan penyimpanan utama key profil) +- Menjalankan live lokal menyalin config aktif, file `auth-profiles.json` per agen, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara secara default; home live yang disiapkan melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap tidak menyentuh workspace host nyata Anda. -Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile`), jalankan test lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (mereka dapat me-mount `~/.profile` ke dalam container). +Jika Anda ingin bergantung pada key env (misalnya diekspor di `~/.profile` Anda), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (runner tersebut dapat me-mount `~/.profile` ke dalam container). ## Live Deepgram (transkripsi audio) -- Test: `extensions/deepgram/audio.live.test.ts` +- Pengujian: `extensions/deepgram/audio.live.test.ts` - Aktifkan: `DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live extensions/deepgram/audio.live.test.ts` -## Live rencana coding BytePlus +## Live BytePlus coding plan -- Test: `extensions/byteplus/live.test.ts` +- Pengujian: `extensions/byteplus/live.test.ts` - Aktifkan: `BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live extensions/byteplus/live.test.ts` - Override model opsional: `BYTEPLUS_CODING_MODEL=ark-code-latest` -## Live media workflow ComfyUI +## Live media alur kerja ComfyUI -- Test: `extensions/comfy/comfy.live.test.ts` +- Pengujian: `extensions/comfy/comfy.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts` - Cakupan: - - Menguji jalur image, video, dan `music_generate` comfy bawaan - - Melewati setiap kapabilitas kecuali `models.providers.comfy.` dikonfigurasi - - Berguna setelah mengubah pengiriman workflow comfy, polling, unduhan, atau registrasi plugin + - Menguji path image, video, dan `music_generate` comfy bawaan + - Melewati tiap kapabilitas kecuali `models.providers.comfy.` dikonfigurasi + - Berguna setelah mengubah pengajuan alur kerja comfy, polling, unduhan, atau registrasi plugin -## Live pembuatan gambar +## Live pembuatan image -- Test: `test/image-generation.runtime.live.test.ts` +- Pengujian: `test/image-generation.runtime.live.test.ts` - Perintah: `pnpm test:live test/image-generation.runtime.live.test.ts` - Harness: `pnpm test:live:media image` - Cakupan: - - Menginventarisasi setiap plugin provider pembuatan gambar yang terdaftar - - Memuat env var provider yang hilang dari login shell Anda (`~/.profile`) sebelum probing - - Menggunakan API key live/env lebih dahulu daripada auth profile yang disimpan secara default, sehingga key test stale di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profile/model yang dapat digunakan - - Menjalankan varian stock pembuatan gambar melalui kapabilitas runtime bersama: + - Mencacah setiap plugin provider pembuatan image yang terdaftar + - Memuat variabel env provider yang hilang dari shell login Anda (`~/.profile`) sebelum melakukan probe + - Secara default menggunakan API key live/env lebih dahulu daripada profil auth yang tersimpan, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider tanpa auth/profil/model yang dapat digunakan + - Menjalankan varian pembuatan image bawaan melalui kapabilitas runtime bersama: - `google:flash-generate` - `google:pro-generate` - `google:pro-edit` @@ -838,21 +846,21 @@ Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile`), jalank - `OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-2,google/gemini-3.1-flash-image-preview,xai/grok-imagine-image"` - `OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit,xai:default-generate,xai:default-edit"` - Perilaku auth opsional: - - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override yang hanya berbasis env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile store dan mengabaikan override yang hanya berasal dari env ## Live pembuatan musik -- Test: `extensions/music-generation-providers.live.test.ts` +- Pengujian: `extensions/music-generation-providers.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts` - Harness: `pnpm test:live:media music` - Cakupan: - - Menguji jalur provider pembuatan musik bawaan bersama + - Menguji path provider pembuatan musik bawaan bersama - Saat ini mencakup Google dan MiniMax - - Memuat env var provider dari login shell Anda (`~/.profile`) sebelum probing - - Menggunakan API key live/env lebih dahulu daripada auth profile yang disimpan secara default, sehingga key test stale di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profile/model yang dapat digunakan + - Memuat variabel env provider dari shell login Anda (`~/.profile`) sebelum melakukan probe + - Secara default menggunakan API key live/env lebih dahulu daripada profil auth yang tersimpan, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider tanpa auth/profil/model yang dapat digunakan - Menjalankan kedua mode runtime yang dideklarasikan bila tersedia: - - `generate` dengan input hanya prompt + - `generate` dengan input prompt saja - `edit` saat provider mendeklarasikan `capabilities.edit.enabled` - Cakupan lane bersama saat ini: - `google`: `generate`, `edit` @@ -862,51 +870,51 @@ Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile`), jalank - `OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"` - `OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"` - Perilaku auth opsional: - - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override yang hanya berbasis env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile store dan mengabaikan override yang hanya berasal dari env ## Live pembuatan video -- Test: `extensions/video-generation-providers.live.test.ts` +- Pengujian: `extensions/video-generation-providers.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts` - Harness: `pnpm test:live:media video` - Cakupan: - - Menguji jalur provider pembuatan video bawaan bersama - - Default ke jalur smoke yang aman untuk rilis: provider non-FAL, satu request text-to-video per provider, prompt lobster satu detik, dan batas operasi per provider dari `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` secara default) - - Melewati FAL secara default karena latensi antrean sisi provider dapat mendominasi waktu rilis; berikan `--video-providers fal` atau `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"` untuk menjalankannya secara eksplisit - - Memuat env var provider dari login shell Anda (`~/.profile`) sebelum probing - - Menggunakan API key live/env lebih dahulu daripada auth profile yang disimpan secara default, sehingga key test stale di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profile/model yang dapat digunakan - - Hanya menjalankan `generate` secara default - - Atur `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` untuk juga menjalankan mode transform yang dideklarasikan bila tersedia: - - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model terpilih menerima input gambar lokal berbasis buffer dalam sapuan bersama - - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model terpilih menerima input video lokal berbasis buffer dalam sapuan bersama + - Menguji path provider pembuatan video bawaan bersama + - Secara default menggunakan path smoke yang aman untuk rilis: provider non-FAL, satu permintaan text-to-video per provider, prompt lobster satu detik, dan batas operasi per provider dari `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` secara default) + - Melewati FAL secara default karena latensi antrean di sisi provider dapat mendominasi waktu rilis; berikan `--video-providers fal` atau `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"` untuk menjalankannya secara eksplisit + - Memuat variabel env provider dari shell login Anda (`~/.profile`) sebelum melakukan probe + - Secara default menggunakan API key live/env lebih dahulu daripada profil auth yang tersimpan, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider tanpa auth/profil/model yang dapat digunakan + - Secara default hanya menjalankan `generate` + - Setel `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` untuk juga menjalankan mode transform yang dideklarasikan bila tersedia: + - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input image lokal berbasis buffer dalam sapuan bersama + - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam sapuan bersama - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: - - `vydra` karena `veo3` bawaan hanya teks dan `kling` bawaan memerlukan URL gambar remote + - `vydra` karena `veo3` bawaan hanya teks dan `kling` bawaan memerlukan URL image remote - Cakupan Vydra khusus provider: - `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts` - - file tersebut menjalankan `veo3` text-to-video ditambah lane `kling` yang secara default menggunakan fixture URL gambar remote + - file tersebut menjalankan `veo3` text-to-video plus lane `kling` yang secara default menggunakan fixture URL image remote - Cakupan live `videoToVideo` saat ini: - - hanya `runway` saat model yang dipilih adalah `runway/gen4_aleph` + - `runway` hanya saat model yang dipilih adalah `runway/gen4_aleph` - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: - - `alibaba`, `qwen`, `xai` karena jalur tersebut saat ini memerlukan URL referensi remote `http(s)` / MP4 - - `google` karena lane Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan jalur itu tidak diterima dalam sapuan bersama - - `openai` karena lane bersama saat ini tidak memiliki jaminan akses inpaint/remix video khusus org + - `alibaba`, `qwen`, `xai` karena path tersebut saat ini memerlukan URL referensi remote `http(s)` / MP4 + - `google` karena lane Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan path tersebut tidak diterima dalam sapuan bersama + - `openai` karena lane bersama saat ini tidak memiliki jaminan akses video inpaint/remix khusus org - Penyempitan opsional: - `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="google,openai,runway"` - `OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"` - `OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""` untuk menyertakan setiap provider dalam sapuan default, termasuk FAL - - `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000` untuk mengurangi batas operasi tiap provider demi eksekusi smoke yang agresif + - `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000` untuk mengurangi batas operasi tiap provider demi menjalankan smoke yang agresif - Perilaku auth opsional: - - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override yang hanya berbasis env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile store dan mengabaikan override yang hanya berasal dari env -## Harness live media +## Harness media live - Perintah: `pnpm test:live:media` - Tujuan: - - Menjalankan suite live gambar, musik, dan video bersama melalui satu entrypoint native repo - - Memuat otomatis env var provider yang hilang dari `~/.profile` - - Mempersempit otomatis setiap suite ke provider yang saat ini memiliki auth yang dapat digunakan secara default - - Menggunakan ulang `scripts/test-live.mjs`, sehingga perilaku Heartbeat dan mode senyap tetap konsisten + - Menjalankan suite live image, musik, dan video bersama melalui satu entrypoint native repo + - Memuat otomatis variabel env provider yang hilang dari `~/.profile` + - Secara default otomatis mempersempit tiap suite ke provider yang saat ini memiliki auth yang dapat digunakan + - Menggunakan kembali `scripts/test-live.mjs`, sehingga perilaku Heartbeat dan mode senyap tetap konsisten - Contoh: - `pnpm test:live:media` - `pnpm test:live:media image video --providers openai,google,minimax` @@ -917,152 +925,152 @@ Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile`), jalank Runner Docker ini terbagi menjadi dua kelompok: -- Runner model live: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config dan workspace lokal Anda (serta memuat `~/.profile` jika di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. -- Runner Docker live secara default menggunakan batas smoke yang lebih kecil agar sapuan Docker penuh tetap praktis: - `test:docker:live-models` default ke `OPENCLAW_LIVE_MAX_MODELS=12`, dan - `test:docker:live-gateway` default ke `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, +- Runner model live: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config lokal dan workspace Anda (serta mengambil sumber `~/.profile` bila di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. +- Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar sapuan Docker penuh tetap praktis: + `test:docker:live-models` secara default menggunakan `OPENCLAW_LIVE_MAX_MODELS=12`, dan + `test:docker:live-gateway` secara default menggunakan `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`, `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`, dan - `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override env var tersebut saat Anda - memang ingin pemindaian menyeluruh yang lebih besar. -- `test:docker:all` membangun image Docker live sekali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane Docker live. Perintah ini juga membangun satu image `scripts/e2e/Dockerfile` bersama melalui `test:docker:e2e-build` dan menggunakannya kembali untuk runner smoke container E2E yang menguji aplikasi hasil build. -- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:gateway-network`, `test:docker:mcp-channels`, `test:docker:pi-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, dan `test:docker:config-reload` mem-boot satu atau lebih container nyata dan memverifikasi jalur integrasi tingkat tinggi. + `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override variabel env tersebut saat Anda + secara eksplisit menginginkan pemindaian lengkap yang lebih besar. +- `test:docker:all` membangun image Docker live sekali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane Docker live. Ini juga membangun satu image bersama `scripts/e2e/Dockerfile` melalui `test:docker:e2e-build` dan menggunakannya kembali untuk runner smoke container E2E yang menguji aplikasi hasil build. +- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:gateway-network`, `test:docker:mcp-channels`, `test:docker:pi-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, dan `test:docker:config-reload` menyalakan satu atau lebih container nyata dan memverifikasi path integrasi tingkat lebih tinggi. -Runner Docker model live juga hanya melakukan bind-mount pada home auth CLI yang dibutuhkan (atau semua yang didukung saat eksekusi tidak dipersempit), lalu menyalinnya ke home container sebelum eksekusi sehingga OAuth CLI eksternal dapat me-refresh token tanpa mengubah auth store host: +Runner Docker model live juga hanya melakukan bind-mount home auth CLI yang diperlukan (atau semuanya yang didukung bila menjalankan tidak dipersempit), lalu menyalinnya ke home container sebelum menjalankan sehingga OAuth CLI eksternal dapat menyegarkan token tanpa memutasi penyimpanan auth host: -- Model langsung: `pnpm test:docker:live-models` (script: `scripts/test-live-models-docker.sh`) -- Smoke bind ACP: `pnpm test:docker:live-acp-bind` (script: `scripts/test-live-acp-bind-docker.sh`) -- Smoke backend CLI: `pnpm test:docker:live-cli-backend` (script: `scripts/test-live-cli-backend-docker.sh`) -- Smoke harness app-server Codex: `pnpm test:docker:live-codex-harness` (script: `scripts/test-live-codex-harness-docker.sh`) -- Gateway + agent dev: `pnpm test:docker:live-gateway` (script: `scripts/test-live-gateway-models-docker.sh`) -- Smoke live Open WebUI: `pnpm test:docker:openwebui` (script: `scripts/e2e/openwebui-docker.sh`) -- Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (script: `scripts/e2e/onboard-docker.sh`) -- Smoke onboarding/channel/agent tarball Npm: `pnpm test:docker:npm-onboard-channel-agent` menginstal tarball OpenClaw yang dipaketkan secara global di Docker, mengonfigurasi OpenAI melalui onboarding env-ref plus Telegram secara default, memverifikasi bahwa mengaktifkan plugin menginstal dependensi runtime-nya sesuai kebutuhan, menjalankan doctor, dan menjalankan satu giliran agent OpenAI yang dimock. Gunakan ulang tarball prabuild dengan `OPENCLAW_NPM_ONBOARD_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, lewati rebuild host dengan `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, atau ganti channel dengan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. -- Jaringan Gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (script: `scripts/e2e/gateway-network-docker.sh`) -- Regresi reasoning minimal OpenAI Responses `web_search`: `pnpm test:docker:openai-web-search-minimal` (script: `scripts/e2e/openai-web-search-minimal-docker.sh`) menjalankan server OpenAI yang dimock melalui Gateway, memverifikasi `web_search` menaikkan `reasoning.effort` dari `minimal` ke `low`, lalu memaksa schema provider menolak dan memeriksa bahwa detail mentah muncul di log Gateway. -- Bridge channel MCP (Gateway yang sudah di-seed + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (script: `scripts/e2e/mcp-channels-docker.sh`) -- Tool bundle MCP Pi (server stdio MCP nyata + smoke allow/deny profil Pi tertanam): `pnpm test:docker:pi-bundle-mcp-tools` (script: `scripts/e2e/pi-bundle-mcp-tools-docker.sh`) -- Cleanup MCP Cron/subagent (Gateway nyata + teardown child stdio MCP setelah cron terisolasi dan eksekusi subagent one-shot): `pnpm test:docker:cron-mcp-cleanup` (script: `scripts/e2e/cron-mcp-cleanup-docker.sh`) -- Plugins (smoke install + alias `/plugin` + semantik restart bundel Claude): `pnpm test:docker:plugins` (script: `scripts/e2e/plugins-docker.sh`) -- Smoke update plugin tidak berubah: `pnpm test:docker:plugin-update` (script: `scripts/e2e/plugin-update-unchanged-docker.sh`) -- Smoke metadata reload config: `pnpm test:docker:config-reload` (script: `scripts/e2e/config-reload-source-docker.sh`) -- Dependensi runtime plugin bawaan: `pnpm test:docker:bundled-channel-deps` secara default membangun image runner Docker kecil, membangun dan memaketkan OpenClaw sekali pada host, lalu me-mount tarball tersebut ke setiap skenario instalasi Linux. Gunakan ulang image dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`, lewati rebuild host setelah build lokal baru dengan `OPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0`, atau arahkan ke tarball yang sudah ada dengan `OPENCLAW_BUNDLED_CHANNEL_PACKAGE_TGZ=/path/to/openclaw-*.tgz`. -- Persempit dependensi runtime plugin bawaan saat iterasi dengan menonaktifkan skenario yang tidak terkait, misalnya: +- Model langsung: `pnpm test:docker:live-models` (skrip: `scripts/test-live-models-docker.sh`) +- Smoke bind ACP: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`) +- Smoke backend CLI: `pnpm test:docker:live-cli-backend` (skrip: `scripts/test-live-cli-backend-docker.sh`) +- Smoke harness app-server Codex: `pnpm test:docker:live-codex-harness` (skrip: `scripts/test-live-codex-harness-docker.sh`) +- Gateway + agen dev: `pnpm test:docker:live-gateway` (skrip: `scripts/test-live-gateway-models-docker.sh`) +- Smoke live Open WebUI: `pnpm test:docker:openwebui` (skrip: `scripts/e2e/openwebui-docker.sh`) +- Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (skrip: `scripts/e2e/onboard-docker.sh`) +- Smoke onboarding/channel/agen npm tarball: `pnpm test:docker:npm-onboard-channel-agent` memasang tarball OpenClaw yang sudah dipack secara global di Docker, mengonfigurasi OpenAI melalui onboarding env-ref plus Telegram secara default, memverifikasi bahwa mengaktifkan plugin memasang dependensi runtime-nya sesuai permintaan, menjalankan doctor, dan menjalankan satu giliran agen OpenAI tiruan. Gunakan kembali tarball yang sudah dibangun dengan `OPENCLAW_NPM_ONBOARD_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, lewati rebuild host dengan `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, atau ganti channel dengan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. +- Jaringan Gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) +- Regresi reasoning minimal OpenAI Responses web_search: `pnpm test:docker:openai-web-search-minimal` (skrip: `scripts/e2e/openai-web-search-minimal-docker.sh`) menjalankan server OpenAI tiruan melalui Gateway, memverifikasi `web_search` menaikkan `reasoning.effort` dari `minimal` ke `low`, lalu memaksa penolakan skema provider dan memeriksa detail mentah muncul di log Gateway. +- Bridge channel MCP (Gateway yang diseed + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) +- Tool MCP bundel Pi (server MCP stdio nyata + smoke allow/deny profil Pi embedded): `pnpm test:docker:pi-bundle-mcp-tools` (skrip: `scripts/e2e/pi-bundle-mcp-tools-docker.sh`) +- Cleanup MCP Cron/subagen (Gateway nyata + teardown child MCP stdio setelah cron terisolasi dan menjalankan subagen sekali pakai): `pnpm test:docker:cron-mcp-cleanup` (skrip: `scripts/e2e/cron-mcp-cleanup-docker.sh`) +- Plugin (smoke instalasi + alias `/plugin` + semantik restart bundel Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) +- Smoke plugin update unchanged: `pnpm test:docker:plugin-update` (skrip: `scripts/e2e/plugin-update-unchanged-docker.sh`) +- Smoke metadata config reload: `pnpm test:docker:config-reload` (skrip: `scripts/e2e/config-reload-source-docker.sh`) +- Dependensi runtime plugin bawaan: `pnpm test:docker:bundled-channel-deps` secara default membangun image runner Docker kecil, membangun dan mem-pack OpenClaw sekali di host, lalu me-mount tarball tersebut ke setiap skenario instalasi Linux. Gunakan kembali image dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`, lewati rebuild host setelah build lokal baru dengan `OPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0`, atau arahkan ke tarball yang sudah ada dengan `OPENCLAW_BUNDLED_CHANNEL_PACKAGE_TGZ=/path/to/openclaw-*.tgz`. +- Persempit dependensi runtime plugin bawaan saat beriterasi dengan menonaktifkan skenario yang tidak terkait, misalnya: `OPENCLAW_BUNDLED_CHANNEL_SCENARIOS=0 OPENCLAW_BUNDLED_CHANNEL_UPDATE_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_ROOT_OWNED_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_SETUP_ENTRY_SCENARIO=0 pnpm test:docker:bundled-channel-deps`. -Untuk membangun lebih dulu dan menggunakan ulang image built-app bersama secara manual: +Untuk membangun lebih dulu dan menggunakan ulang image aplikasi hasil build bersama secara manual: ```bash OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e:local pnpm test:docker:e2e-build OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels ``` -Override image khusus suite seperti `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` tetap menang saat diatur. Saat `OPENCLAW_SKIP_DOCKER_BUILD=1` menunjuk ke image bersama remote, script akan menariknya jika belum ada secara lokal. Test Docker QR dan installer tetap mempertahankan Dockerfile mereka sendiri karena mereka memvalidasi perilaku package/installasi, bukan runtime built-app bersama. +Override image khusus suite seperti `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` tetap diprioritaskan saat disetel. Ketika `OPENCLAW_SKIP_DOCKER_BUILD=1` menunjuk ke image bersama remote, skrip akan menariknya jika image itu belum ada secara lokal. Pengujian Docker QR dan installer tetap menggunakan Dockerfile mereka sendiri karena memvalidasi perilaku package/instalasi, bukan runtime aplikasi hasil build bersama. -Runner Docker model live juga melakukan bind-mount checkout saat ini sebagai read-only dan -men-stage-nya ke workdir sementara di dalam container. Ini menjaga image runtime -tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang tepat. -Langkah staging melewati cache lokal besar dan output build aplikasi seperti +Runner Docker model live juga me-mount checkout saat ini sebagai read-only dan +menyiapkannya ke workdir sementara di dalam container. Ini menjaga image runtime +tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang persis. +Langkah staging ini melewati cache lokal besar dan output build aplikasi seperti `.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, serta direktori output `.build` lokal aplikasi atau -Gradle sehingga eksekusi live Docker tidak menghabiskan waktu ber menit-menit menyalin +Gradle sehingga menjalankan live Docker tidak menghabiskan beberapa menit untuk menyalin artefak yang spesifik mesin. -Mereka juga mengatur `OPENCLAW_SKIP_CHANNELS=1` sehingga probe live Gateway tidak memulai +Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` sehingga probe live Gateway tidak memulai worker channel Telegram/Discord/dll. nyata di dalam container. `test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan juga `OPENCLAW_LIVE_GATEWAY_*` saat Anda perlu mempersempit atau mengecualikan cakupan live Gateway dari lane Docker tersebut. -`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ia memulai -container Gateway OpenClaw dengan endpoint HTTP kompatibel OpenAI diaktifkan, -memulai container Open WebUI yang dipin terhadap Gateway tersebut, sign in melalui +`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ini memulai +container Gateway OpenClaw dengan endpoint HTTP yang kompatibel OpenAI diaktifkan, +memulai container Open WebUI yang dipin terhadap Gateway tersebut, masuk melalui Open WebUI, memverifikasi `/api/models` mengekspos `openclaw/default`, lalu mengirim -request chat nyata melalui proxy `/api/chat/completions` milik Open WebUI. -Eksekusi pertama dapat terasa jauh lebih lambat karena Docker mungkin perlu menarik image -Open WebUI dan Open WebUI mungkin perlu menyelesaikan cold-start setup-nya sendiri. +permintaan chat nyata melalui proxy `/api/chat/completions` milik Open WebUI. +Menjalankan pertama bisa terasa lebih lambat karena Docker mungkin perlu menarik +image Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start-nya sendiri. Lane ini mengharapkan key model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` -(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam eksekusi yang didockerisasi. -Eksekusi yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": +(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam menjalankan yang didockerisasi. +Menjalankan yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": "openclaw/default", ... }`. `test:docker:mcp-channels` sengaja deterministik dan tidak memerlukan akun -Telegram, Discord, atau iMessage nyata. Ia mem-boot container -Gateway yang sudah di-seed, memulai container kedua yang menjalankan `openclaw mcp serve`, lalu -memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, -perilaku antrean event live, routing pengiriman keluar, serta notifikasi channel + -izin bergaya Claude melalui bridge stdio MCP yang nyata. Pemeriksaan notifikasi -menginspeksi frame stdio MCP mentah secara langsung sehingga smoke memvalidasi apa yang -sebenarnya dipancarkan bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. -`test:docker:pi-bundle-mcp-tools` bersifat deterministik dan tidak memerlukan -key model live. Ia membangun image Docker repo, memulai server probe stdio MCP nyata -di dalam container, mematerialisasikan server itu melalui runtime bundle MCP Pi -tertanam, mengeksekusi tool, lalu memverifikasi bahwa `coding` dan `messaging` mempertahankan +Telegram, Discord, atau iMessage nyata. Ini menyalakan container Gateway +yang telah diseed, memulai container kedua yang menjalankan `openclaw mcp serve`, lalu +memverifikasi discovery percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, +perilaku antrean event live, perutean pengiriman keluar, dan notifikasi channel + +izin bergaya Claude melalui bridge MCP stdio nyata. Pemeriksaan notifikasi +menginspeksi frame MCP stdio mentah secara langsung sehingga smoke ini memvalidasi apa yang +sebenarnya dikeluarkan bridge, bukan hanya apa yang kebetulan ditampilkan oleh SDK klien tertentu. +`test:docker:pi-bundle-mcp-tools` bersifat deterministik dan tidak memerlukan key model +live. Ini membangun image Docker repo, memulai server probe MCP stdio nyata +di dalam container, mematerialisasikan server tersebut melalui runtime MCP bundel Pi +embedded, mengeksekusi tool, lalu memverifikasi `coding` dan `messaging` tetap mempertahankan tool `bundle-mcp` sementara `minimal` dan `tools.deny: ["bundle-mcp"]` memfilternya. -`test:docker:cron-mcp-cleanup` bersifat deterministik dan tidak memerlukan key model live. -Ia memulai Gateway yang sudah di-seed dengan server probe stdio MCP nyata, menjalankan -satu giliran Cron terisolasi dan satu giliran child one-shot `/subagents spawn`, lalu memverifikasi -proses child MCP keluar setelah setiap eksekusi. +`test:docker:cron-mcp-cleanup` bersifat deterministik dan tidak memerlukan key model +live. Ini memulai Gateway yang telah diseed dengan server probe MCP stdio nyata, menjalankan +satu giliran cron terisolasi dan satu giliran anak `/subagents spawn` sekali pakai, lalu memverifikasi +proses anak MCP keluar setelah tiap menjalankan. Smoke thread plain-language ACP manual (bukan CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- Pertahankan script ini untuk alur kerja regresi/debug. Script ini mungkin dibutuhkan lagi untuk validasi routing thread ACP, jadi jangan dihapus. +- Pertahankan skrip ini untuk alur kerja regresi/debug. Ini mungkin diperlukan lagi untuk validasi perutean thread ACP, jadi jangan hapus. -Env vars yang berguna: +Variabel env yang berguna: - `OPENCLAW_CONFIG_DIR=...` (default: `~/.openclaw`) di-mount ke `/home/node/.openclaw` - `OPENCLAW_WORKSPACE_DIR=...` (default: `~/.openclaw/workspace`) di-mount ke `/home/node/.openclaw/workspace` -- `OPENCLAW_PROFILE_FILE=...` (default: `~/.profile`) di-mount ke `/home/node/.profile` dan dimuat sebelum menjalankan test -- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` untuk memverifikasi hanya env vars yang dimuat dari `OPENCLAW_PROFILE_FILE`, menggunakan direktori config/workspace sementara dan tanpa mount auth CLI eksternal +- `OPENCLAW_PROFILE_FILE=...` (default: `~/.profile`) di-mount ke `/home/node/.profile` dan di-source sebelum menjalankan pengujian +- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` untuk memverifikasi hanya variabel env yang di-source dari `OPENCLAW_PROFILE_FILE`, menggunakan direktori config/workspace sementara dan tanpa mount auth CLI eksternal - `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (default: `~/.cache/openclaw/docker-cli-tools`) di-mount ke `/home/node/.npm-global` untuk instalasi CLI yang di-cache di dalam Docker -- Direktori/file auth CLI eksternal di bawah `$HOME` di-mount sebagai read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum test dimulai +- Direktori/file auth CLI eksternal di bawah `$HOME` di-mount sebagai read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum pengujian dimulai - Direktori default: `.minimax` - File default: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` - - Eksekusi provider yang dipersempit hanya me-mount direktori/file yang dibutuhkan yang diinferensikan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` -- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit eksekusi + - Menjalankan provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang disimpulkan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` +- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit menjalankan - `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter provider di dalam container -- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan ulang image `openclaw:local-live` yang sudah ada pada rerun yang tidak memerlukan rebuild +- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan kembali image `openclaw:local-live` yang ada untuk menjalankan ulang yang tidak memerlukan rebuild - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memastikan kredensial berasal dari profile store (bukan env) - `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh Gateway untuk smoke Open WebUI -- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk menimpa prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI -- `OPENWEBUI_IMAGE=...` untuk menimpa tag image Open WebUI yang dipin +- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk mengoverride prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI +- `OPENWEBUI_IMAGE=...` untuk mengoverride tag image Open WebUI yang dipin -## Pemeriksaan kewarasan docs +## Kewarasan docs -Jalankan pemeriksaan docs setelah edit doc: `pnpm check:docs`. -Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading dalam halaman: `pnpm docs:check-links:anchors`. +Jalankan pemeriksaan docs setelah edit docs: `pnpm check:docs`. +Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading di dalam halaman: `pnpm docs:check-links:anchors`. ## Regresi offline (aman untuk CI) Ini adalah regresi “pipeline nyata” tanpa provider nyata: -- Pemanggilan tool Gateway (OpenAI dimock, Gateway + loop agent nyata): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") -- Wizard Gateway (WS `wizard.start`/`wizard.next`, menulis config + auth dipaksakan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") +- Pemanggilan alat Gateway (OpenAI tiruan, Gateway nyata + loop agen): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- Wizard Gateway (WS `wizard.start`/`wizard.next`, menulis config + auth diterapkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") -## Eval keandalan agent (Skills) +## Evaluasi keandalan agen (Skills) -Kami sudah memiliki beberapa test aman-CI yang berperilaku seperti “eval keandalan agent”: +Kami sudah memiliki beberapa pengujian aman untuk CI yang berperilaku seperti “evaluasi keandalan agen”: -- Pemanggilan tool mock melalui loop Gateway + agent nyata (`src/gateway/gateway.test.ts`). +- Pemanggilan tool tiruan melalui loop Gateway + agen nyata (`src/gateway/gateway.test.ts`). - Alur wizard end-to-end yang memvalidasi wiring sesi dan efek config (`src/gateway/gateway.test.ts`). Yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): -- **Decisioning:** ketika Skills terdaftar dalam prompt, apakah agent memilih skill yang tepat (atau menghindari yang tidak relevan)? -- **Compliance:** apakah agent membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? -- **Kontrak workflow:** skenario multi-giliran yang memastikan urutan tool, carryover riwayat sesi, dan batas sandbox. +- **Pengambilan keputusan:** ketika Skills dicantumkan dalam prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)? +- **Kepatuhan:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? +- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan tool, carryover riwayat sesi, dan batas sandbox. -Eval masa depan sebaiknya tetap deterministik terlebih dahulu: +Evaluasi mendatang harus tetap deterministik terlebih dahulu: -- Runner skenario yang menggunakan mock provider untuk memastikan pemanggilan tool + urutan, pembacaan file skill, dan wiring sesi. -- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, prompt injection). -- Eval live opsional (opt-in, dibatasi env) hanya setelah suite aman-CI tersedia. +- Runner skenario menggunakan provider tiruan untuk menegaskan pemanggilan tool + urutannya, pembacaan file skill, dan wiring sesi. +- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, injeksi prompt). +- Evaluasi live opsional (opt-in, dibatasi env) hanya setelah suite aman untuk CI tersedia. -## Test kontrak (bentuk plugin dan channel) +## Pengujian kontrak (bentuk plugin dan channel) -Test kontrak memverifikasi bahwa setiap plugin dan channel yang terdaftar sesuai dengan -kontrak interface-nya. Test ini mengiterasi semua plugin yang ditemukan dan menjalankan satu suite -asersi bentuk dan perilaku. Lane unit default `pnpm test` sengaja -melewati file seam bersama dan smoke ini; jalankan perintah kontrak secara eksplisit -saat Anda menyentuh surface channel atau provider bersama. +Pengujian kontrak memverifikasi bahwa setiap plugin dan channel yang terdaftar mematuhi +kontrak antarmukanya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan satu suite +penegasan bentuk dan perilaku. Lane unit default `pnpm test` sengaja +melewati file seam dan smoke bersama ini; jalankan perintah kontrak secara eksplisit +saat Anda menyentuh permukaan channel atau provider bersama. ### Perintah @@ -1072,55 +1080,55 @@ saat Anda menyentuh surface channel atau provider bersama. ### Kontrak channel -Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: +Berada di `src/channels/plugins/contracts/*.contract.test.ts`: - **plugin** - Bentuk plugin dasar (id, nama, kapabilitas) -- **setup** - Kontrak wizard setup -- **session-binding** - Perilaku session binding +- **setup** - Kontrak setup wizard +- **session-binding** - Perilaku pengikatan sesi - **outbound-payload** - Struktur payload pesan - **inbound** - Penanganan pesan masuk -- **actions** - Handler aksi channel -- **threading** - Penanganan thread ID +- **actions** - Handler tindakan channel +- **threading** - Penanganan ID thread - **directory** - API direktori/roster -- **group-policy** - Penegakan kebijakan grup +- **group-policy** - Penerapan kebijakan grup ### Kontrak status provider -Terletak di `src/plugins/contracts/*.contract.test.ts`. +Berada di `src/plugins/contracts/*.contract.test.ts`. - **status** - Probe status channel - **registry** - Bentuk registry plugin ### Kontrak provider -Terletak di `src/plugins/contracts/*.contract.test.ts`: +Berada di `src/plugins/contracts/*.contract.test.ts`: - **auth** - Kontrak alur auth - **auth-choice** - Pilihan/seleksi auth - **catalog** - API katalog model -- **discovery** - Penemuan plugin +- **discovery** - Discovery plugin - **loader** - Pemuatan plugin - **runtime** - Runtime provider -- **shape** - Bentuk/interface plugin -- **wizard** - Wizard setup +- **shape** - Bentuk/antarmuka plugin +- **wizard** - Setup wizard ### Kapan menjalankan - Setelah mengubah ekspor atau subpath plugin-sdk - Setelah menambahkan atau memodifikasi plugin channel atau provider -- Setelah merefaktor pendaftaran atau penemuan plugin +- Setelah merefaktor pendaftaran atau discovery plugin -Test kontrak berjalan di CI dan tidak memerlukan API key nyata. +Pengujian kontrak berjalan di CI dan tidak memerlukan API key nyata. ## Menambahkan regresi (panduan) -Saat Anda memperbaiki masalah provider/model yang ditemukan di live: +Saat Anda memperbaiki masalah provider/model yang ditemukan secara live: -- Tambahkan regresi yang aman untuk CI jika memungkinkan (provider yang dimock/di-stub, atau tangkap transformasi bentuk request yang tepat) -- Jika secara inheren hanya live (rate limit, kebijakan auth), pertahankan live test tetap sempit dan opt-in melalui env var -- Sebaiknya targetkan layer terkecil yang menangkap bug: - - bug konversi/replay request provider → direct models test - - bug pipeline sesi/riwayat/tool Gateway → smoke Gateway live atau test mock Gateway aman-CI +- Tambahkan regresi yang aman untuk CI jika memungkinkan (provider tiruan/stub, atau tangkap transformasi bentuk permintaan yang tepat) +- Jika memang hanya bisa live (rate limit, kebijakan auth), pertahankan pengujian live tetap sempit dan opt-in melalui variabel env +- Utamakan menargetkan lapisan terkecil yang menangkap bug: + - bug konversi/replay permintaan provider → pengujian model langsung + - bug pipeline sesi/riwayat/tool Gateway → smoke Gateway live atau pengujian tiruan Gateway yang aman untuk CI - Guardrail traversal SecretRef: - - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registry (`listSecretTargetRegistryEntries()`), lalu memastikan exec ID traversal-segment ditolak. - - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam test tersebut. Test ini sengaja gagal pada target ID yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam. + - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registry (`listSecretTargetRegistryEntries()`), lalu menegaskan ID exec traversal-segmen ditolak. + - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian tersebut. Pengujian ini sengaja gagal pada ID target yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam.