Work: workspace terisolasi
Work adalah antarmuka agen pemrograman bawaan Libre WebUI. Setiap tugas menggabungkan percakapan durable, rute penyedia eksplisit, dan filesystem /workspace terpisah. model dapat memeriksa dan mengubah file, menjalankan perintah dalam kontainer Docker atau Pod Kubernetes tugas, serta memulai preview.
Work diimplementasikan secara native tanpa Libre Claw atau daemon terpisah.
:::peringatan Hanya pengguna tepercaya
Semua API memerlukan akun terautentikasi dengan akses. Secara bawaan hanya administrator; akses dapat dibuka bagi semua pengguna aktif dari tab Manajemen Pengguna di Pengaturan. Folder host selalu khusus administrator karena memasang path server. Work sengaja dapat menjalankan perintah shell arbitrer dalam sandbox. Tugas memakai trafik trafik keluar kecuali kebijakan bernama terpilih mematikannya. Anggap setiap pengguna yang diizinkan sebagai operator runtime tepercaya, bukan sekadar pengguna chat.
:::
Kemampuan utama rilis
- Mode Work dan Chat terpisah dengan selector mode terlihat.
- Tugas pada daftar samping utama, posisi stabil, dan penghapusan langsung.
- Identitas sandbox terpisah serta volume Docker persisten atau PVC Kubernetes per tugas; lingkungan dapat dihentikan atau dibuat ulang tanpa kehilangan file.
- Percakapan, status proses, aktivitas alat, pilihan model, dan pemilik tugas disimpan dalam basis data Libre WebUI.
- Stream terautentikasi untuk teks asisten, reasoning yang dibuka penyedia, alat panggilan/result, usage, keterampilan, dan perubahan status.
- keterampilan alur kerja milik server mengajari model memeriksa, mengedit, menguji, dan memulai preview tanpa membuat file kontrol dalam proyek.
- model Ollama lokal berkemampuan alat, Ollama Cloud, dan plugin penyedia terkonfigurasi.
- Split Percakapan/workspace adaptif yang dapat diubah dengan mouse/keyboard di desktop dan selector pada layar kecil.
- View Files, Activity, Git, Terminal, Preview, dan Screen bawaan; Screen menampilkan desktop Work Computer.
- Syntax highlighting mode terang/gelap, formatting browser, deteksi konflik simpan, dan draf sementara.
- Data disclosure per pengguna yang dapat ditutup saat memilih penyedia jarak jauh.
- Terjemahan Work lengkap dalam 25 bahasa, termasuk layout RTL Arab native sambil mempertahankan arah LTR untuk kode, path, ID model, dan keluaran.
Unit persisten adalah workspace tugas, bukan kontainer yang selalu berjalan. Libre memulai, menghentikan, dan bila perlu membuat ulang kontainer sambil mempertahankan volume bernama.
Arsitektur
Libre WebUI—bukan model atau browser—memilih nama sandbox/workspace, citra, pemasangan volume, pengguna, batas, mode jaringan, dan port preview. model hanya menerima alat berikut:
list_filesread_filewrite_filedelete_filemove_filesearch_filesrun_commandstart_previewstop_preview
delete_file dan move_file tidak dapat keluar dari workspace, tidak mengikuti symlink, memerlukan flag rekursif eksplisit untuk direktori, dan tidak menimpa tujuan. Karena memakai helper file, alat tetap bekerja saat preview ketika run_command diblokir.
Permintaan model dilakukan server, bukan kontainer Work, sehingga tidak bergantung pada kebijakan jaringan kontainer.
Persyaratan
- Untuk Docker: daemon terpasang dan dapat dijangkau, serta izin proses server memanggil
dockeratau program dalamWORK_DOCKER_COMMAND. - Untuk Kubernetes: kredensial API Role/RoleBinding yang dibatasi namespace, namespace sandbox, dan NetworkPolicies yang dibuat Helm ketika
work.enabled=true.
Selain itu:
- model berkemampuan alat melalui Ollama/Ollama Cloud sehat, atau plugin completion/chat aktif dengan model tepat dan kredensial administrator.
- Memori cukup untuk citra lingkungan, proyek, dan dependency lokal.
- Akun terautentikasi dengan akses Work; bawaan hanya administrator, tetapi dapat dibuka bagi semua pengguna aktif.
Libre memeriksa capability Ollama dan menolak model tanpa tools. model plugin harus mendukung protokol alat-calling penyedianya. Kegagalan mengakhiri proses tanpa cadangan diam-diam.
Menjalankan secara lokal
Pilihan paling sederhana pada satu komputer:
docker info
npx libre-webui@latest
Buka http://localhost:8080, login sebagai administrator, pilih Work dan model kompatibel, lalu jelaskan tugas.
Jika Docker tidak ada atau tak dapat dijangkau, Work menampilkan runtime tidak tersedia beserta alasannya dan menonaktifkan start. Perintah tidak pernah dijalankan langsung pada host.
Pada penggunaan pertama, citra lingkungan diperiksa dan otomatis diunduh jika belum ada; proses dapat memakan waktu lebih lama.
Antarmuka Work
Membuat dan membuka kembali
Pilih Work, masukkan instruksi, pilih model, lalu tekan Jalankan. Pesan pertama membuat tugas, proses pertama, rute penyedia, dan workspace persisten.
Tugas tetap di sidebar utama. Membuka kembali memulihkan percakapan terbaru, tab file, penyedia/model saat ini, dan workspace. Pesan lama dimuat per halaman. Tugas dapat di-rename dari judul dan dihapus dari menu/sidebar.
Hanya satu proses dapat aktif per tugas; instruksi berikutnya memakai percakapan dan filesystem yang sama.
Composer mendukung dikte: tombol mikrofon memakai API ucapan browser atau model pengenalan ucapan terkonfigurasi dan menambahkan transkrip ke teks. file yang dibuat/dipindah muncul sebagai badge yang dapat diklik di bawah tindakan alat; klik membuka editor dan pada layar sempit berpindah ke workspace. Hanya alat mutasi membuat badge, sehingga dua puluh read dan satu write menampilkan satu artefak.
Mempekerjakan sebagai agen
Jika persona tersedia, Pekerjakan sebagai agen mengubah tugas menjadi agen bernama persisten. Persona bertahan antar-proses; nama dan prompt sistemnya mendahului prompt Work, tetapi kontrak sandbox selalu prioritas. Sidebar menempatkan agen dalam grup Agen di atas tugas sekali pakai dengan avatar, aktivitas, dan status. Ketika sidebar diringkas, hanya avatar agen tersemat itu yang tersisa di rail; tugas Work sekali pakai kembali muncul saat sidebar dibentangkan.
Baris status memiliki dua tingkat. Setelah proses agen, permintaan model murah tanpa alat meminta status sekitar 8 kata (“Kotak masuk kosong. 2 jawaban siap.”); respons dibatasi satu baris 90 karakter. Jika kesalahan/timeout, dipakai baris pertama jawaban akhir asisten. Tugas sekali pakai dan proses gagal memakai cadangan deterministik ini; WORK_STATUS_BLURB_MODEL=0 menonaktifkan permintaan. Membuka tugas memajukan marker viewed monotonik yang tersinkron antarperangkat; titik menunjukkan proses terminal yang lebih baru.
Agen melaporkan pekerjaan melalui notifikasi: work-run-finished, work-run-attention, dan work-takeover. Banner layar hanya terlihat di tab terbuka; push notification menjangkau pengguna di tempat lain. Setiap tautan menuju agen.
Gunakan persona sendiri atau shared; tampilan shared tidak membocorkan memory pemilik. Jika persona dihapus, agen terus bekerja tanpanya dan mencatat peringatan. API menerima personaId dan isAgent; tugas dengan persona otomatis menjadi agen.
Tab Agent
Tab tambahan pertama adalah Agent:
- Identitas: avatar, nama, indikator aktivitas, dan baris status terakhir.
- Screen: jika Work Computer tersedia, gambar mini langsung hanya-baca. Ini koneksi penuh yang dihitung dalam batas; klik membuka layar penuh dengan pengambilalihan, pengajaran, dan audio.
- Routine: automasi terkait tugas. Setiap trigger berjalan dalam workspace dan percakapan yang sama dengan model/lingkungan agen, bukan tugas baru, sehingga laporan pagi terkumpul di satu tempat. Baris menampilkan jadwal dan toggle pause; form + Routine sudah terikat agen. Trigger saat agen sibuk berakhir sebagai
work-task-busytanpa masuk antrean. - Tinjauan Otomatis: sakelar persetujuan per agen dan aturan "izinkan selalu" yang telah dikumpulkan agen (hapus sebuah aturan untuk menutup cakupannya kembali). Jika kebijakan tugas mewajibkan tinjauan, sakelar terkunci dalam keadaan menyala.
- keterampilan yang diajarkan: routine yang didemonstrasikan dengan toggle enable.
Alat terhubung (server MCP dan OpenAPI)
Agen Work dapat memanggil server alat yang sama seperti yang dikonfigurasi untuk Chat — MCP atau OpenAPI, didaftarkan administrator di Pengaturan → Alat. Alat muncul bagi agen dengan nama ber-namespace (server__tool) dan panggilannya berjalan dari backend Libre WebUI melalui gerbang alat yang diperkuat (egress berpenjaga SSRF, kredensial per pengguna, batas ukuran dan waktu) — tidak pernah dari dalam sandbox.
Daftar yang ditawarkan jujur tentang apa yang benar-benar dapat dipakai proses otonom:
- Tugas offline tidak menerima satu pun: egress lewat backend atau bukan, tugas tanpa akses jaringan tetap offline — alasan yang sama seperti
web_search. - Server yang memerlukan kredensial pribadi yang belum disimpan pengguna disaring saat penawaran, karena proses otonom tidak dapat berhenti untuk memintanya. Tambahkan kredensial di Pengaturan → Alat dan proses berikutnya akan menawarkan server itu.
- Mode akses alat (khusus administrator atau semua pengguna) dan visibilitas per server berlaku persis seperti di Chat, dan pengikatan server alat pada persona mempersempit server yang dilihat agen yang dipekerjakannya.
- Ketika persetujuan aktif, alat terhubung yang diklasifikasikan server sebagai memiliki efek samping berhenti menunggu keputusan Anda seperti aksi terkendali lainnya; alat hanya baca berjalan tanpa bertanya.
Delegasi antaragen (@-mention)
Agen yang dipekerjakan dapat saling menyerahkan pekerjaan. Ketik @ di penyusun Work untuk menyebut salah satu agen Anda yang lain; agen saat ini melihat daftar rekannya (nama dan baris status) dalam instruksinya dan mendelegasikan permintaan yang cocok dengan alat message_agent. Delegasi adalah koordinasi lewat pesan, sengaja bukan lewat komputer bersama: setiap agen mempertahankan workspace dan sandbox terisolasinya sendiri, dan agen tujuan tidak dapat melihat percakapan yang mendelegasikan — permintaan harus membawa konteksnya sendiri.
Delegasi bersifat asinkron. Alat langsung kembali, agen tujuan berjalan dalam tugasnya sendiri (percakapannya menampilkan permintaan berlabel Didelegasikan oleh pengirim), dan saat selesai — selesai, perlu masukan, gagal, atau dibatalkan — respons akhirnya dikirim kembali ke percakapan agen pendelegasi sebagai pesan berlabel Laporan dari agen tersebut. Jika pendelegasi masih berjalan, laporan mencapai modelnya pada putaran berikutnya; jika idle, laporan cukup menunggu di percakapan — laporan tidak pernah memulai proses secara otomatis, sehingga dua agen tidak dapat saling berbalas tanpa henti. Proses hasil delegasi tidak dapat mendelegasikan lebih lanjut, agen tujuan yang sibuk menggagalkan upaya secara jujur alih-alih mengantre, dan ketika persetujuan aktif message_agent berhenti untuk ditinjau seperti aksi berefek samping lainnya (aturan "izinkan selalu" hanya berlaku untuk satu agen tujuan itu).
Persetujuan aksi (Tinjauan Otomatis)
Aksi yang memiliki efek samping dapat berhenti menunggu keputusan Anda sebelum berjalan. Ketika persetujuan aktif untuk sebuah tugas — kebijakan Work menyetel Wajibkan persetujuan untuk aksi yang menimbulkan efek samping, atau sakelar Tinjauan Otomatis agen menyala — proses berhenti sebelum menjalankan run_command, computer_act, delete_file, move_file, atau message_agent dan menampilkan kartu keputusan di percakapan: Izinkan sekali, Izinkan selalu, atau Tolak.
- Izinkan sekali menjalankan tepat panggilan ini dan bertanya lagi lain kali.
- Izinkan selalu menjalankan panggilan dan menyimpan aturan pada tugas: seluruh alat untuk aksi file dan komputer, dibatasi pada program perintah (token pertamanya) untuk
run_command— menyetujuinpm run buildberarti pra-menyetujui perintahnpmberikutnya, bukan seluruh shell — dan dibatasi pada satu agen tujuan untukmessage_agent. Aturan tercantum di bagian Tinjauan Otomatis pada tab Agent dan dapat dihapus di sana. - Tolak menolak panggilan. Model diberi tahu bahwa pengguna menolak aksi tersebut dan tidak boleh mengulanginya apa adanya; proses berlanjut dengan jawaban itu.
Persetujuan yang tertunda juga memunculkan notifikasi (dalam aplikasi, dan web push bila diaktifkan), karena proses bisa saja sudah berjalan tanpa pengawasan beberapa menit ketika mencapai gerbang ini. Jika tidak ada yang memutuskan dalam lima menit, permintaan kedaluwarsa, aksi tidak dieksekusi, dan proses berakhir sebagai Perlu masukan dengan handoff normal alih-alih menghabiskan anggarannya.
Persetujuan mengendalikan aksi, bukan visibilitas: write_file dan alat hanya baca tetap tidak terkendali, dan setiap keputusan tercatat di log audit keamanan.
status tugas
| Antarmuka | status server | Warna |
|---|---|---|
| Idle | idle | rgb(255, 255, 255) |
| Memproses | preparing atau running | rgb(48, 121, 255) |
| Siap | completed | rgb(76, 212, 117) |
| Perlu masukan | needs_input atau cancelled | rgb(255, 204, 0) |
| kesalahan | failed | rgb(255, 61, 129) |
Menghentikan proses aktif mengubahnya menjadi Perlu masukan dan mempertahankan file. Kehabisan anggaran putaran/alat berakhir sama setelah handoff final tanpa alat; pekerjaan belum selesai tidak ditandai Siap.
proses aktif tidak memblokir percakapan: pesan langsung bergabung dan mencapai model pada putaran berikutnya, memungkinkan pengarahan, koreksi, dan konteks tanpa stop.
Mengubah ukuran
Pada lebar desktop xl, percakapan dan workspace dipisahkan divider draggable:
- Lebar percakapan bawaan 45%.
- Rentang pilihan 30%–70% dengan minimum lebar isi.
- Rasio tersimpan milik pengguna login di browser ini.
- Panah memindah 2%, dengan Shift 10%.
- Home/End memilih minimum/maksimum.
- Enter atau double-klik me-reset split.
Kontrol mengikuti arah tulisan. Dalam bahasa Arab, percakapan di kanan dan workspace di kiri; pointer/panah bergerak sesuai arah visual.
Pada layar kecil, gunakan switch di header tugas.
file
Tab file mencantumkan isi /workspace langsung, hanya membuka file teks UTF-8 valid, dan menyimpan perubahan ke volume tugas. Urutan byte invalid ditolak, bukan diganti dengan kehilangan data.
Editor menyediakan:
- syntax highlighting terang/gelap untuk bahasa umum;
- simpan dengan
Cmd/Ctrl+S; - format dengan
Shift+Alt+F; - deteksi konflik simpan optimistis;
- draf per tugas/path dalam memori sesi; dan
- peringatan ketika pergi dengan perubahan belum disimpan.
Highlighting langsung berhenti di atas 8.000 karakter/400 baris. Formatting tersedia hingga 100.000 karakter/4.000 baris untuk JavaScript/JSX, TypeScript/TSX, varian JSON, CSS/SCSS/Less, HTML, Markdown/MDX, dan YAML.
Saat model mengubah file terbuka, tab menampilkan diff merah/hijau sejak awal putaran dan menciutkan bagian panjang yang tidak berubah. Toggle berpindah antara diff/editor; counter +added −removed memberi ringkasan. Baseline adalah isi yang dilihat browser sebelum putaran; file yang baru dibuka sesudahnya tidak menampilkan diff.
Draf adalah kemudahan, bukan backup; dibersihkan setelah save, delete tugas, atau akhir sesi.
Aktivitas
Tab menampilkan alat panggilan/result, operasi file, keluaran command, dan kesalahan. Metadata dapat diperluas. keluaran tetap LTR bahkan dalam UI RTL.
proses aktif membuka stream SSE terautentikasi dengan event:
snapshot,run_state;reasoning_deltajika penyedia membuka reasoning;assistant_delta;tool_call,tool_result;usage;skill_loaded; danerror,done.
Ketersediaan reasoning bergantung pada model/penyedia; Libre hanya menampilkan isi dari API dan tidak dapat merekonstruksi chain-of-thought tersembunyi. Beberapa model tidak mengirimnya. Teks dan tindakan alat dapat stream independen.
keluaran sengaja dibatasi; hasil terpotong bukan bukti tidak ada lanjutan. Minta model memeriksa hasil yang lebih sempit.
Git
Tab Git melakukan operasi lokal di /workspace:
- init repository dengan branch
main; - menampilkan status porcelain, ahead/behind, dan hingga 20 commit;
- menampilkan diff terbatas;
- stage hingga 200 path;
- membuat commit dengan nama/email administrator atau alamat no-reply lokal;
- membuat branch setelah commit pertama; dan
- switch ke branch yang ada jika working tree bersih.
Permukaan hanya lokal: tanpa clone, fetch, pull, push, pengelolaan repository jarak jauh, perintah arbitrer, token, SSH key, atau pull request. Gunakan broker kredensial tepercaya terpisah, idealnya GitHub App atau token instalasi yang dibatasi satu repository/action. Jangan simpan kredensial berumur panjang dalam workspace, lingkungan kontainer, atau konfigurasi repository.
Read Git tersedia saat tugas idle/aktif. Write ditolak ketika proses model, terminal, atau preview memiliki kontainer; switch branch memerlukan tree bersih. Ini mencegah race.
Perintah UI memakai array argumen tetap dan berjalan sebagai 1000:1000; masukan tidak dievaluasi shell. lingkungan mematikan konfigurasi sistem/global, prompt, hook, helper kredensial, signing, submodule, external diff, textconv, dan protokol jaringan. Repository ditolak jika work tree bukan /workspace atau Git dir keluar. Write juga diblokir jika ada filter clean/smudge/process executable.
Ini melindungi Git API Libre WebUI. Administrator melalui terminal dan model melalui run_command tetap dapat menjalankan perintah Git biasa; perintah arbitrer dibatasi sandbox dan batas deployment.
keterampilan alur kerja bawaan
Setiap proses menerima referensi milik server tentang batas /workspace persisten, root hanya-baca, proses sementara dan /tmp, jaringan, batas, dan siklus hidup preview. keterampilan mengharuskan:
- periksa instruksi, manifest, lockfile, skrip, dan status repository sebelum edit;
- pertahankan pekerjaan tak terkait dan batch read independen;
- lanjutkan implementasi, jangan berhenti pada rencana;
- lakukan pemeriksaan targeted sebelum yang lebih luas;
- diagnosis kesalahan, jangan retry buta; dan
- verifikasi aplikasi sebelum memulai preview sebagai proses panjang terakhir.
Referensi hanya ada dalam konteks model. Libre tidak membuat AGENTS.md, direktori keterampilan, atau file kontrol lain. Instruksi proyek tidak dapat menimpa batas keamanan.
Terminal
Shell interaktif terhubung ke sandbox yang sama agar administrator dapat memeriksa status, build, dan debug proyek.
kebijakan yang sama berlaku: 1000:1000 tanpa privilege, direktori /workspace, dan kontainer hardened tanpa capability. Terminal tidak memberi privilege lebih dari run_command; hanya menyediakan antarmuka manusia ke batas yang sama.
- Autentikasi — header Authorization ditukar melalui HTTP menjadi tiket sekali pakai berumur pendek yang terikat protokol dan tugas tepat. Hanya tiket dan ID tugas ada di
/ws/work-terminal. Akun, akses, tugas, dan pemilik diperiksa ulang sebelum setiap masukan; pencabutan menutup sesi dan melepas lease. - Pemeriksaan origin — jika
CORS_ORIGINatauBASE_URLdiatur, origin browser harus cocok. Atur setidaknya satu untuk deployment jarak jauh. Client Electron/non-browser dapat tidak mengirim Origin, tetapi tetap memerlukan tiket dan pemeriksaan; kelola dengan TLS, firewall, dan proxy. - Admission — terminal mengambil lease runtime dan dihitung dalam
WORK_MAX_ACTIVE_RUNTIMES_*. - Umur kontainer — terminal terhubung menahan kontainer agar tidak dihentikan karena idle.
- Concurrency —
WORK_TERMINAL_MAX_SESSIONS_PER_TASKbawaan 2. - Idle timeout —
WORK_TERMINAL_IDLE_TIMEOUT_MSbawaan 15 menit. - proses aktif — terminal menunggu giliran model selesai.
TTY memerlukan stream dua arah yang ditangkap, sehingga terminal mengakses Docker Engine API langsung. Urutan: WORK_DOCKER_SOCKET, lalu DOCKER_HOST—socket unix:// atau tcp:// HTTP biasa melalui proxy dengan tunnel Connection: Upgrade—kemudian /var/run/docker.sock. ssh:// atau tcp:// dengan DOCKER_TLS_VERIFY tidak didukung dan membuat terminal tidak tersedia dengan penjelasan tanpa memengaruhi Work lain. Kubernetes memakai TTY WebSocket subresource exec API, termasuk resize, tanpa Docker.
Sesi interaktif tidak direkam dan perintah tidak muncul dalam Aktivitas.
preview
preview memulai, menghentikan, menyematkan, dan membuka aplikasi. bidang command kosong mendeteksi:
- skrip
devdalam rootpackage.jsondengan host/port yang diperlukan; - root
index.htmlyang disajikan server statis bawaan; atau - satu aplikasi dalam direktori nested.
Aplikasi root diprioritaskan. Beberapa aplikasi nested setara atau entry point hilang menghasilkan kesalahan jelas, bukan perintah npm acak. Untuk proyek lain, berikan command sebelum Mulai preview; dimulai di /workspace, misalnya cd apps/web && npm run dev -- --host 0.0.0.0 --port 4173. Proses harus listen pada 0.0.0.0 dan WORK_PREVIEW_PORT serta siap dalam 15 detik.
model dapat memakai start_preview, satu-satunya cara didukung untuk meninggalkan proses panjang. run_command membersihkan child process background saat selesai.
Screen (Work Computer)
Demo lengkap: proses nyata tanpa edit (30x, lalu real time) ketika agen menjelajahi NASA, memilih foto, serta membangun dan menguji galeri Three.js dari satu prompt.
Kebijakan Work Computer menambah tab Screen: jendela langsung desktop virtual dalam sandbox yang sama, dengan window manager, panel, dan Chromium 1280×800. Anda dapat mengamati agen, mengambil alih mouse/keyboard, mendengar audio komputer, dan mengajari tindakan lewat demonstrasi. Membuka tab memulai sesi grafis on-demand (tidak ada yang berjalan sebelum pengamat) dan menghubungkan view VNC melalui WebSocket.
Administrator memakai Enable sekali klik: Libre membuat citra grafis bawaan pada daemon Docker deployment (pertama kali beberapa menit) dan kebijakan siap tanpa docker build manual. Di balik proxy filter, endpoint build sengaja ditutup; pull citra ghcr.io/libre-webui/libre-work-computer dengan tag libre-work-computer:latest di host atau build dari deploy/work-computer/, lalu tombol hanya membuat kebijakan. Tugas memerlukan jaringan karena layar diakses melalui port loopback seperti preview.
Server VNC dalam kontainer listen di localhost dan memakai dua kata sandi per sesi: setiap pengamat diizinkan mendapat kata sandi hanya-lihat, hanya pemilik lease kontrol yang mendapat kata sandi penuh. server mengabaikan masukan lain. Bridge WebSocket adalah satu-satunya permukaan terjangkau, dipublikasikan hanya pada loopback host. Setiap pengamat autentikasi dengan tiket sesi/tugas sekali pakai seperti terminal; akses Work diperiksa tiap koneksi dan pencabutan langsung memutus layar. Maksimum empat pengamat dan tampilan dihitung sebagai aktivitas tugas.
tampilan tidak bersaing dengan execution: membuka saat proses terhubung ke sandbox yang sama, layar yang diamati tidak memblokir proses berikutnya, dan sesi bertahan sesudah completion bahkan pada deployment team dengan worker eksternal. Profil browser disimpan di /workspace/.browser-profile sehingga login bertahan melewati restart kontainer.
Kontrol agen memakai dua alat. computer_observe mengembalikan screenshot penuh, posisi pointer, window aktif, URL browser saat ini, focus halaman/antarmuka browser, ringkasan elemen focused, dan hash screenshot. Sinyal semantik datang dari DevTools pada loopback kontainer dan tidak ada pada citra lama. computer_act menjalankan batch hingga 24 tindakan—move, klik, double/right klik, type, key combo, scroll, wait—lalu mengembalikan screenshot setelah stabil.
Guard bekerja di tiga tempat: tindakan type/key dapat mendeklarasikan focus yang diharapkan dan gagal aman jika bidang tidak focused agar teks tidak masuk address bar; batch berhenti jika window, title, atau focus berubah karena koordinat tersisa sudah stale; batch dapat mendeklarasikan title, URL, atau perubahan region yang diharapkan dan lingkungan memverifikasinya dengan deadline adaptif—waiting bukan success.
Setelah batch, layar dipoll hingga stabil alih-alih delay tetap. Hasil berisi bukti: klik melaporkan perubahan pixel sekitar, scroll_until scroll ke teks/tepi dan melaporkan visibility, setiap observation dibandingkan dengan sebelumnya dan no-change dinyatakan jelas. subgoal satu baris disimpan sebagai checkpoint dan diulang saat recovery. Tiga tindakan sama pada layar tak berubah memicu peringatan; pengulangan menghentikan proses dengan permintaan masukan. Wait tak terkonfirmasi beruntun memerlukan observation baru. Telemetri putaran, delay, screenshot, guard, dan verdict dicatat bersama alat dan outcome.
Screenshot dikirim sebagai gambar nyata pada semua rute—Ollama, Anthropic, Gemini, serta Chat/Responses kompatibel OpenAI—sehingga model vision lebih baik untuk kontrol. Jika penyedia menolak gambar, proses tidak gagal: screenshot dihapus untuk sisa proses, model beralih ke observation teks, dan log menjelaskan. Verifikasi ini lebih lemah. Hanya screenshot terbaru berada dalam konteks; log persisten hanya menyimpan teks, tidak pernah byte gambar.
Content blocking bawaan browser mencakup uBlock Origin Lite untuk iklan/tracker (versi dipin dan diverifikasi checksum saat build; mode filter diatur kebijakan terkelola) serta penutupan otomatis banner consent cookie. Iklan tidak menghabiskan screenshot, token, atau klik. Skrip iklan dikenal diganti stub lokal aman agar halaman tetap bekerja. Agen dilarang memasukkan kredensial atau melewati CAPTCHA/2FA; agen melaporkan penghalang. Untuk tugas tidak tepercaya, gabungkan kebijakan grafis dengan DNS filtering.
Audio nonaktif secara bawaan karena browser memerlukan klik. Tombol speaker mengalirkan audio komputer real time. PulseAudio memutar ke null sink; monitor membawa PCM mentah melalui WebSocket terautentikasi kedua di loopback dengan tiket, recheck akses, dan batas pengamat yang sama. Diperlukan citra terbaru dari deploy/work-computer/.
Take over control memberikan mouse/keyboard untuk login, CAPTCHA, atau langkah khusus manusia; Done mengembalikan Screen. Sesi VNC memakai kata sandi penuh/view yang dibuat dan tidak dicatat; kata sandi penuh hanya untuk pemilik lease. Lease kedaluwarsa dua menit, diperpanjang UI terbuka, dan tidak dapat direbut dari pengguna lain.
Kebijakan Allow screen takeover dapat melarang kontrol sepenuhnya: tombol pengambilalihan/pengajaran disembunyikan, endpoint menolak, request_takeover melaporkan tidak tersedia; tampilan tetap ada. Saat manusia mengontrol, computer_observe/computer_act diblokir agar agen tidak mengganggu atau menangkap masukan. request_takeover menampilkan banner alasan dan menunggu pengembalian. Kredensial mengalir dari keyboard langsung ke halaman, bukan melalui model/log. Citra lama hanya mendukung tampilan.
Mode Teach task merekam demonstrasi: manusia mengontrol layar dengan indikator terlihat dan tindakan disimpan sebagai koordinat. Setiap klik juga diikat ke tag hanya-baca, ID, label terlihat, dan URL saat ini, sehingga langkah menamai target, misalnya “Klik button#submit (Place order)”; koordinat tetap sebagai petunjuk.
Save membuat skenario deterministik tanpa model: keystroke digabung menjadi string, klik dibedakan dari drag dengan ambang 8 pixel, pause menjadi wait; teks yang cocok leksikon secret atau pola kredensial (8+ karakter dari tiga kelas) di-redact dan diganti request_takeover. Routine bahasa alami memakai target terikat lalu koordinat dan ditafsirkan ulang melalui computer_observe. Routine berisi condition, masukan, langkah, verifikasi, scope yang diizinkan dari host yang benar-benar dikunjungi (harus berhenti dan bertanya sebelum keluar), batas approval, dan stop saat failure.
Skenario disimpan sebagai keterampilan normal berawalan taught- dengan versioning, edit, dan sharing. proses Work Computer memuat dan mencantumkan keterampilan yang diajarkan dan aktif milik pemilik; replay adalah proses biasa dengan routine cocok. Setelah proses, badge menambahkan penilaian success/kesalahan bertanggal ke Track record dengan satu klik (terbaru di atas, jumlah terbatas, tiap record versi normal). Jangan masukkan kata sandi nyata saat merekam: tunjukkan alur hingga login, save, lalu gunakan request_takeover saat replay.
Penyedia, perutean, dan data disclosure
Rute yang didukung
| Rute | Pemeriksaan dan perilaku |
|---|---|
| Ollama lokal | Ollama sehat; model tepat mendeklarasikan dukungan alat. |
| Ollama Cloud | Dirutekan eksplisit melalui Ollama; suffix cloud menampilkan disclosure. |
| plugin completion/chat | Aktif, memiliki model tepat dan kredensial administrator saat ini. |
| plugin Anthropic | Memakai adapter pesan/alat Anthropic untuk Work. |
| plugin Gemini | Memakai adapter content/function-panggilan Gemini untuk Work. |
| Kompatibel lain | Memakai bentuk OpenAI untuk pesan, alat, dan alat choice. |
Tipe penyedia dan ID plugin disimpan pada tugas serta setiap proses. Nama model saja tidak memilih rute; plugin bernama sama tidak mengambil alih tugas yang ada.
Data yang diterima penyedia
- prompt sistem Work;
- keterampilan alur kerja dan batas lingkungan saat ini;
- 30 pesan terakhir pengguna/asisten, maksimum 256 KB;
- definisi alat;
- riwayat alat panggilan; dan
- hasil termasuk list, isi file, search, keluaran, dan kesalahan.
Volume tidak di-upload seluruhnya, tetapi isi yang dikembalikan alat menjadi bagian percakapan dan dikirim ke penyedia. Periksa retention, training, pricing, dan ketentuan penggunaan sebelum pekerjaan sensitif.
kredensial tetap server-side dan tidak pernah dipasang pada kontainer Work.
Enkripsi kredensial oleh aplikasi bukan enkripsi seluruh tugas. Percakapan, hasil, keluaran, dan metadata adalah isi basis data biasa; file adalah file volume/PVC biasa. Terapkan kontrol host dan enkripsi disk sesuai threat model.
Disclosure penyedia jarak jauh
model plugin dan nama Ollama berisi :cloud atau -cloud dianggap jarak jauh. Saat dipilih, notifikasi yang dapat ditutup menjelaskan aliran data dan beberapa panggilan berbayar; preferensi disimpan per pengguna.
Semua rute memakai WORK_MAX_AGENT_ROUNDS, bawaan 48 putaran; tidak ada batas 12 khusus plugin. anggaran alat adalah max(128, configured rounds × 8) panggilan. Saat habis, Libre meminta handoff final tanpa alat tentang pekerjaan, pemeriksaan, blocker, dan sisa, lalu menulis Perlu masukan, bukan exception atau completion palsu. Lanjutan memakai workspace yang sama. Satu proses tetap dapat membuat banyak permintaan berbayar.
Folder host (opsional)
Docker biasanya memakai volume bernama sehingga model tidak melihat file nyata. Tugas dapat di-bind ke direktori host nyata. Kubernetes menolak direktori tersebut dan memakai PVC.
WORK_HOST_WORKSPACES_ENABLED=true
WORK_HOST_WORKSPACE_ROOTS=/Users/you/Projects
WORK_HOST_WORKSPACE_ROOTS adalah daftar root dipisahkan :; bawaan home pengguna server. Folder workspace opsional; nilai kosong mempertahankan isolasi.
Path harus direktori absolut yang ada dan tetap dalam root setelah symlink diselesaikan. .ssh, .gnupg, .aws, .config, .kube, .docker, .claude, .libre-webui, dan node_modules selalu ditolak. Path yang diizinkan disimpan dan ditampilkan.
model membaca dan mengubah file nyata; pengguna tanpa-hak-istimewa, capability yang di-drop, dan batas tidak lagi memisahkan model dari direktori. Biarkan fitur nonaktif kecuali perlu, tetapkan root sempit, dan pilih direktori dengan version control.
Persistence dan siklus hidup
| status | Penyimpanan | Umur |
|---|---|---|
| pemilik, judul, penyedia, status | Basis data Libre | Hingga tugas/pengguna dihapus |
| proses, kesalahan, pesan, aktivitas | Basis data Libre | Hingga tugas dihapus |
| file | Volume Docker atau PVC K8s | Bertahan dari cancel, stop preview, restart |
| Sistem root dan file sementara | Kontainer atau Pod | Ephemeral; dapat dihentikan/dibuat ulang |
| Proses preview | Sandbox berjalan | Sementara; dipertahankan hanya jika health terverifikasi |
| Draf belum disimpan | Sesi browser | Kemudahan sementara |
server membuat UUID tugas dan hanya server yang menentukan nama sumber daya. Label management/pemilik diperiksa sebelum reuse/delete; sumber daya tugas lain ditolak.
Sandbox disiapkan on-demand. Helper file menghentikan lingkungan idle, command melepas saat selesai, dan preview terverifikasi dapat menahannya. workspace persisten dipasang lagi.
Administrator menentukan kebijakan runtime bernama: citra, batas memori/CPU/PID, ukuran Kubernetes, idle timeout, jaringan, serta toggle Work Computer (GUI + browser) dan Izinkan pengambilalihan layar (juga pengajaran). Tugas memakai kebijakan terpilih; bidang kosong mewarisi nilai global dan penghapusan kebijakan mengembalikannya saat recreate berikutnya. kebijakan hanya mengubah sumber daya/fitur dan tidak dapat melemahkan mode tanpa-hak-istimewa, root hanya-baca, capability yang di-drop, atau isolasi jaringan.
WORK_RUNTIME_IDLE_TIMEOUT_MS menghentikan sandbox dan melepas slot jika tidak ada command, terminal, atau permintaan preview bertanda tangan. workspace dipertahankan dan preview dimulai ulang. Bawaan 0 menahan lingkungan hingga dihentikan eksplisit.
Saat startup server, proses aktif ditandai gagal dan status preview dibersihkan. Driver mengambil kontainer/Pod terkelola dalam satu query. lingkungan tugas dikenal yang berjalan dihentikan, yang sudah berhenti tidak diubah, orphan dihapus. pemilik ditentukan label, bukan nama. Hanya satu instance Libre per namespace/daemon. Jika pembersihan tidak dapat dibuktikan, Work fail closed, retry tiap 10 detik, dan memblokir operasi mutasi.
Jaringan
Tanpa kebijakan bernama, jaringan aktif. Administrator dapat membuat kebijakan dengan jaringan nonaktif secara bawaan dan author memilihnya saat membuat tugas. Tidak ada toggle per tugas; perubahan kebijakan memerlukan recreate lingkungan.
Docker menghubungkan tugas berjaringan ke bridge terkelola (libre-webui-work, WORK_NETWORK_NAME) dengan com.docker.network.bridge.enable_icc=false:
- sandbox tidak dapat terhubung satu sama lain; dan
- secara bawaan tidak dapat menjangkau kontainer deployment pada bridge bersama, termasuk basis data atau Ollama yang tidak dipublikasikan.
Jaringan bernama sama tanpa label management ditolak.
Pada Kubernetes, Pod mendapat label jaringan. Helm membuat tolak-bawaan, trafik masuk khusus-preview, dan trafik keluar internet bagi Pod diizinkan dengan pengecualian work.networkPolicy.blockedEgressCidrs. Efektif hanya jika CNI mendukung; lihat Kubernetes.
Trafik trafik keluar diizinkan untuk package, Git, dan API. Ini bukan firewall trafik keluar. Kode dapat menjangkau:
- layanan host Docker;
- LAN host;
- internet; dan
- endpoint metadata infrastruktur.
Alat kebijakan trafik keluar
WORK_RUNTIME_DNS(Docker) — alamat IPv4/IPv6 dipisahkan koma dan dipaksa dengan--dns; resolver filter memberi daftar nama. Alamat invalid ditolak dan dicatat sehingga flag tak dapat diinjeksi.- Firewall host atau upstream pada subnet stabil bridge terkelola.
WORK_NETWORK_NAMEuntuk jaringan precreated dengan opsi sendiri, label management, dan ICC nonaktif.
DNS tidak membatasi IP langsung; firewall diperlukan untuk jaminan.
Jangan anggap Work perlindungan exfiltration. Berikan akses hanya kepada pengguna tepercaya. Untuk tugas otonom pilih kebijakan offline bernama; tidak ada variabel lingkungan global yang mengubah bawaan.
Jaringan tidak menambahkan kredensial: SSH key, cloud kredensial, profil browser, home host, atau socket Docker tidak dipasang ke tugas. Kode tetap dapat mengirim secret yang ditulis di /workspace.
Trafik sandbox terpisah dari permintaan model; Ollama dan plugin selalu dipanggil server melalui rute eksplisit.
Batas keamanan sandbox
Kontainer Docker:
- berjalan non-root sebagai
1000:1000; - memakai
/workspacesebagai working directory; - hanya memasang volume tugas terpilih;
- memakai root hanya-baca dan
/tmpterbatas; - drop semua capability Linux;
no-new-privileges;- tidak privileged dan memakai proses init;
- menerapkan batas CPU, memori, proses, waktu, dan keluaran;
- mengunci swap (
--memory-swap=--memory); - terhubung ke jaringan terkelola tanpa ICC atau tanpa jaringan; dan
- hanya mempublikasikan port preview pada loopback yang ditetapkan.
Semua properti diverifikasi ulang melalui docker inspect dan di-hash dalam ai.libre-webui.policy. Kontainer dengan kebijakan lama dihancurkan dan dibuat ulang setelah update.
Kubernetes menerapkan ekuivalen: pengguna tanpa-hak-istimewa, root hanya-baca, seccomp RuntimeDefault, tanpa privilege escalation, capability di-drop, sumber daya sementara terbatas, tanpa token ServiceAccount, dan PVC di /workspace. Label dan fingerprint diverifikasi.
Validasi path menolak path absolut, traversal, backslash, NUL, dan panjang berlebihan. Helper menyelesaikan real path dan menolak escape melalui symlink. Write memakai file sementara dan rename atomik.
Langkah ini mengurangi exposure host tak sengaja, tetapi tidak menjadikan Work VM atau lingkungan analisis malware aman. Kontainer berbagi kernel host; vulnerability Docker, Kubernetes, runtime, citra, dependency, atau kernel dapat melewati batas.
Volume Docker tidak memiliki kuota independen. Proyek dapat menghabiskan storage; pantau pertumbuhan dan terapkan batas host. Enforcement ukuran PVC Kubernetes bergantung pada penyedia storage.
Checklist hardening Docker
Pada Kubernetes, periksa juga RBAC namespace, keamanan Pod, storage class, dan enforcement CNI NetworkPolicy menurut panduan.
Aplikasi mengatur flag kontainer, memvalidasi path, dan melindungi API, tetapi tidak dapat menyediakan firewall host, kuota storage, atau tingkat privilege daemon. Ini tanggung jawab operator.
1. Isolasi kontrol Docker
Kontainer utama memerlukan kontrol daemon; socket adalah credential control plane. Kompromi aplikasi dapat menyebabkan kompromi host.
docker-compose.socket-proxy.yml tidak memberi socket ke aplikasi. Proxy hanya melewatkan containers, images, volumes, networks, exec, dan info; memblokir swarm, secrets, configs, build, commit, dan system. Libre memakai DOCKER_HOST=tcp://docker-socket-proxy:2375 tanpa memasang socket atau group; CLI, terminal, dan diagnostik mengikuti alamat ini. Permukaan API mengecil, tetapi blast radius tetap: pembuatan kontainer memungkinkan pemasangan path host.
Batas lebih kuat adalah VM terpisah tanpa workload tak terkait; lebih kuat lagi daemon tanpa-root khusus atau host runtime terpisah. Sebelum penerapan, verifikasi kepemilikan file, perutean, pembersihan, dan terminal. Memasang socket biasa secara hanya-baca tidak membuat API hanya-baca.
2. Blokir kontrol host dari sandbox
Menonaktifkan ICC tidak memblokir layanan host. Periksa bridge dan subnet aktual:
docker network inspect libre-webui-work \
--format 'id={{.Id}} subnets={{range .IPAM.Config}}{{.Subnet}} {{end}}'
ss -lntup
Firewall persisten harus menolak trafik bridge ke SSH, Docker API, basis data, dan port admin. Uji aturan dengan kontainer sekali-pakai dan download diizinkan, lalu persist. DOCKER-USER mengontrol trafik forwarded; akses ke host sendiri dapat memerlukan aturan INPUT.
3. Batasi target trafik keluar
Blokir metadata cloud, infrastruktur privat, dan LAN client jika tidak perlu. Gabungkan DNS dan firewall. IP langsung melewati DNS; proxy HTTP tidak cukup untuk koneksi langsung. Terapkan kebijakan di luar kontainer.
Buat kebijakan terpisah tanpa jaringan, hanya-registry, dan trafik keluar terbuka. kebijakan menentukan lampiran jaringan; aturan eksternal menentukan target diizinkan.
4. Kuota storage nyata
batas CPU, memori, dan PID tidak membatasi volume. Gunakan project quota XFS, logical volume berkuota, atau driver volume/PVC yang menegakkan ukuran. Docker local pada ext4 tidak mendapat kuota andal hanya dari ukuran deklarasi.
Pantau setiap volume ai.libre-webui.managed=true dan data root Docker, beri alert sebelum penuh, dan uji perilaku failure. UI atau du hanya memberi peringatan, tidak menegakkan batas antar-check.
5. Verifikasi kebijakan
Setelah perubahan, buat tugas sekali-pakai dan periksa melalui docker inspect: UID, root hanya-baca, capability, no-new-privileges, memori, swap, CPU, PID, satu volume tugas, dan jaringan. Kontainer utama hanya boleh memiliki pemasangan yang diharapkan; trafik masuk publik harus melalui proxy/tunnel terautentikasi, bukan port Docker atau preview.
Keamanan dan reachability preview
Docker mempublikasikan preview secara dinamis pada loopback server; Kubernetes memakai IP Pod. model/browser tidak memilih origin arbitrer. Libre menandatangani URL untuk tugas/endpoint tepat, memverifikasi proses setiap request, dan memproxy HTTP/WebSocket melalui /api/work/previews. Stop atau restart mencabut URL.
Respons menghapus kredensial Libre dan cookie upstream. HTML dibatasi iframe sandbox dan CSP yang mengizinkan script, form, modal, dan download tanpa same-origin; perlindungan juga berlaku pada tab terpisah. Kode hasil generasi tetap tidak tepercaya dan dapat mengirim data workspace/browser. URL adalah secret berumur pendek.
browser memuat origin publik yang sama sehingga HTTPS jarak jauh bekerja tanpa membuka port atau IP Pod dan tanpa mixed content. Reverse proxy harus mempertahankan WebSocket untuk /api/work/previews/; Nginx bawaan melakukannya.
Aplikasi utama hanya mengizinkan origin sendiri dan Turnstile dalam frame. preview melewati kebijakan Helmet global agar dapat meneruskan body dan menerapkan sandbox lebih sempit. kebijakan cross-origin embedder dinonaktifkan karena server development jarang memiliki header diperlukan.
Matriks deployment
| deployment | proses/file | preview |
|---|---|---|
npx libre-webui lokal | Didukung jika Docker terpasang/terjangkau. | Proxy bertanda tangan pada origin aplikasi. |
| proses source lokal | Persyaratan sama. | Origin API development pada port 3001. |
| Electron | Kondisional: memakai backend eksternal tanpa runtime Work tersendiri. | Proxy bertanda tangan backend tersebut. |
| Bare metal/VM jarak jauh | Berjalan jika Docker ada di host. | Reverse proxy HTTP/WebSocket. |
| Compose standar | Didukung secara bawaan pada Docker Desktop: citra berisi CLI, Compose memasang socket host, dan port Work dirutekan melalui host.docker.internal. Docker Engine native masih memerlukan WORK_PREVIEW_BIND non-publik yang dapat dijangkau. | Origin publik sama. |
| Kubernetes/Helm | --set work.enabled=true: Pod/PVC melalui IP Pod untuk proses, file, command, Git, terminal, layar/audio Work Computer, Role namespace, dan tolak-bawaan NetworkPolicies; tanpa socket. Lihat Kubernetes. | Proxy dalam cluster ke IP Pod. |
Work ketika Libre WebUI berada dalam Docker
Semua file Compose repository menyertakan Work: citra berisi CLI dan memasang /var/run/docker.sock. Docker Desktop bekerja dengan bawaan routing yang disertakan. Docker Engine native masih memerlukan WORK_PREVIEW_BIND yang disetel ke antarmuka host non-publik yang dapat dijangkau dari kontainer saudara, seperti dijelaskan di bawah.
Kontainer tugas adalah sibling kontainer Libre WebUI, terlihat di docker ps, dan dikelola siklus hidup sama.
Socket memberi kontrol host setara root. Work tidak berjalan tanpanya; akibatnya jelas: setiap administrator Libre WebUI secara efektif administrator host Docker. Keamanan, jaringan, siklus hidup, backup, dan akses adalah tanggung jawab operator. Hapus baris socket untuk mematikan Work; fitur lain tidak bergantung padanya.
Alternatifnya docker-compose.socket-proxy.yml melalui DOCKER_HOST; lihat isolasi kontrol.
Tiga kondisi harus dipenuhi:
- Docker CLI tersedia. citra resmi menyertakannya; citra khusus memerlukan
docker-cliatauWORK_DOCKER_COMMAND. Jika tidak:The "docker" CLI is not installed…. - Socket terpasang. Jika tidak:
No Docker daemon is reachable…. - Pengguna berada dalam group socket. citra berjalan sebagai
nodejsuid 1001; socket biasanya milikrootataudocker, sehingga Compose memakaigroup_add: ['${DOCKER_GID:-0}']. Bawaan cocok untuk Docker Desktop; Linux memerlukan ID sendiri. Jika tidak:The Docker socket is mounted but the Libre WebUI user cannot open it….
# Read the socket's group as seen INSIDE a container. A macOS host reports a
# different value, because Docker Desktop proxies the socket through a VM.
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
docker compose up -d --force-recreate
Port preview tetap pada loopback host dan diakses melalui proxy bertanda tangan pada origin sama untuk HTTP/WebSocket. Ini bekerja dengan HTTPS/tunnel, menerapkan sandbox, dan mencabut URL lama.
Pada Docker, alamat publish dan connect dapat berbeda. Biarkan WORK_PREVIEW_BIND=127.0.0.1; atur WORK_DOCKER_PUBLISHED_HOST ke alamat host terjangkau (host.docker.internal pada Docker Desktop). Profil Compose bawaan menyetel kedua nilai itu dan memetakan nama host tersebut. Deployment Linux native wajib menimpa WORK_PREVIEW_BIND dengan gateway bridge Docker (atau antarmuka host non-publik lain yang jelas dapat dijangkau); mapping saja tidak membuat listener loopback terjangkau. Jangan pernah mengikat port sementara mentah ini ke 0.0.0.0.
Concurrency dibatasi: WORK_MAX_ACTIVE_RUNTIMES_PER_USER 2 dan WORK_MAX_ACTIVE_RUNTIMES_GLOBAL 3. Respons capability melaporkan busy status. Naikkan hanya jika sumber daya cukup.
Untuk Kubernetes gunakan work.enabled=true; chart membuat RBAC, namespace, kebijakan, dan Pod/PVC dari panduan.
Konfigurasi runtime
| Variabel | Bawaan | Tujuan |
|---|---|---|
WORK_RUNTIME_BACKEND | docker | Backend sandbox: docker atau kubernetes |
WORK_RUNTIME_IMAGE | node:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3 | citra sandbox tugas |
WORK_DOCKER_COMMAND | docker | Executable Docker CLI |
WORK_COMMAND_TIMEOUT_MS | 120000 | Timeout command bawaan |
WORK_MAX_OUTPUT_CHARS | 50000 | keluaran tertangkap maksimum |
WORK_MAX_AGENT_ROUNDS | 48 | putaran model/alat per proses |
WORK_MEMORY_LIMIT | 2g | batas memori kontainer |
WORK_CPU_LIMIT | 2 | batas CPU kontainer |
WORK_PIDS_LIMIT | 256 | batas proses kontainer |
WORK_PREVIEW_PORT | 4173 | Port aplikasi dalam kontainer |
WORK_PREVIEW_BIND | 127.0.0.1 | Interface publish host |
WORK_DOCKER_PUBLISHED_HOST | sama dengan WORK_PREVIEW_BIND | host/IP untuk port Work terpublikasi |
WORK_COMPUTER_SCREEN_PORT | 6080 | Port bridge WebSocket layar |
WORK_COMPUTER_AUDIO_PORT | 6081 | Port bridge WebSocket audio |
WORK_RUN_LEASE_WAIT_MS | 60000 | Menunggu pemilik lease runtime sementara |
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL | 3 | Tugas kontainer concurrent per instance |
WORK_MAX_ACTIVE_RUNTIMES_PER_USER | 2 | Tugas concurrent per administrator |
WORK_MAX_TASKS_GLOBAL | 500 | Maksimum tugas persisten instance |
WORK_MAX_TASKS_PER_USER | 100 | Maksimum tugas persisten per administrator |
WORK_NETWORK_NAME | libre-webui-work | Bridge terkelola sandbox berjaringan |
WORK_RUNTIME_DNS | tidak diatur | IP resolver dipisahkan koma |
WORK_DOCKER_SOCKET | DOCKER_HOST jika unix:///tcp://, selain itu /var/run/docker.sock | Endpoint Docker Engine terminal/diagnostik |
WORK_TERMINAL_MAX_SESSIONS_PER_TASK | 2 | Terminal browser concurrent per tugas |
WORK_TERMINAL_IDLE_TIMEOUT_MS | 900000 | Idle timeout terminal |
WORK_RUNTIME_IDLE_TIMEOUT_MS | 0 (nonaktif) | Hentikan sandbox idle, termasuk preview |
WORK_K8S_NAMESPACE | libre-webui-work | Namespace Pod/PVC sandbox Kubernetes |
WORK_K8S_STORAGE_CLASS | bawaan cluster | StorageClass PVC workspace |
WORK_K8S_WORKSPACE_SIZE | 5Gi | Ukuran PVC workspace per tugas |
WORK_K8S_POD_READY_TIMEOUT_MS | 900000 | Tunggu Pod sandbox Running |
WORK_K8S_POD_GONE_TIMEOUT_MS | 60000 | Tunggu Pod terhapus menghilang |
Pada produksi, gunakan versi citra atau digest tetap dan terverifikasi. Tag mutable dapat mengubah alat CLI dan batas keamanan tanpa perubahan Libre WebUI.
proses, preview, helper file, command, dan recreate sandbox memakai pencatatan capacity bersama. Operasi nested dari tugas yang sudah dihitung tidak dihitung lagi. Melebihi batas mengembalikan HTTP 429.
batas protokol dan UI tetap
| Item | batas |
|---|---|
| Pesan tugas/proses baru | 65.536 karakter dan byte UTF-8 |
| ID model saat create/change | 500 karakter dan byte UTF-8 |
| ID penyedia plugin | 200 karakter |
| proses aktif per tugas | 1 |
| Teks command | 20.000 karakter |
| Timeout command alat | 1–600 detik |
| Readiness preview | 15 detik |
| Read/write file | 2.000.000 byte teks UTF-8 |
| List direktori langsung | 1.000 item pertama |
| Halaman pesan | 200 pesan, 1.000.000 byte |
| Pesan tersimpan tunggal | 100 KB |
| konteks percakapan model | 30 pesan terakhir, 256 KB |
| keluaran alat tersimpan | Sekitar 20.000 karakter sumber dan marker truncation |
| Highlight editor langsung | 8.000 karakter/400 baris |
| Formatting browser | 100.000 karakter/4.000 baris |
| keluaran status Git | 2.000.000 karakter |
| keluaran diff Git | 600.000 karakter |
| Riwayat Git | 20 commit lokal |
| Path dalam satu request stage | 200 |
| Pesan commit | 4.000 karakter |
| Loop agen | 48 putaran bawaan melalui WORK_MAX_AGENT_ROUNDS |
| anggaran alat panggilan | max(128, configured rounds × 8) panggilan |
API file memakai teks UTF-8. Editor bawaan tidak mengedit file binary; file di atas 2 MB tidak dapat dibuka melalui Work API.
Ringkasan API
Semua endpoint berada di bawah /api/work dan memerlukan autentikasi serta akses Work terkini dari basis data. Work bawaan khusus administrator; operasi biasa dapat dibuka bagi pengguna aktif. Pilihan folder host dan endpoint admin untuk kebijakan/akses tetap khusus administrator.
| Metode | Path | Tujuan |
|---|---|---|
GET | /capabilities | Availability dan batas lingkungan/penyedia |
GET | /tasks | List tugas administrator saat ini |
POST | /tasks | Membuat tugas dan proses async pertama |
GET | /tasks/:id | Memuat status dan pesan terbaru |
GET | /tasks/:id/messages | Memuat pesan lebih lama |
PATCH | /tasks/:id | Rename atau ubah rute model tepat |
DELETE | /tasks/:id | Hapus tugas dan workspace persisten |
POST | /tasks/:id/runs | Mulai proses berikutnya |
POST | /tasks/:id/messages | Kirim pesan ke agen saat proses |
GET | /tasks/:taskId/runs/:runId/events | Stream event SSE terautentikasi |
POST | /tasks/:id/cancel | Batalkan proses aktif |
GET | /tasks/:id/approvals | Persetujuan tertunda dan status Tinjauan Otomatis tugas |
PUT | /tasks/:id/approvals | Alihkan keikutsertaan persetujuan per tugas |
POST | /tasks/:id/approvals/:approvalId | Putuskan persetujuan tertunda (izinkan sekali/selalu, tolak) |
DELETE | /tasks/:id/approval-rules/:ruleId | Hapus aturan "izinkan selalu" |
GET | /computer/setup | status setup Work Computer untuk administrator |
POST | /computer/setup | Buat citra GUI dan kebijakan |
POST | /tasks/:id/computer/start | Mulai sesi Work Computer |
GET | /tasks/:id/computer/control | Controller saat ini dan request pengambilalihan |
POST | /tasks/:id/computer/control | pengambilalihan atau perpanjang kontrol |
DELETE | /tasks/:id/computer/control | Kembalikan kontrol ke agen |
POST | /tasks/:id/computer/teach | Simpan demo sebagai keterampilan |
POST | /tasks/:id/computer/anchor | Resolve elemen di bawah klik |
POST | /computer/skills/:slug/trace | Tambah outcome ke keterampilan |
GET | /tasks/:id/files | List direktori workspace |
GET | /tasks/:id/file | Read file teks |
PUT | /tasks/:id/file | Save file teks |
GET | /tasks/:id/git | Read status/history Git hardened |
GET | /tasks/:id/git/diff | Read diff lokal terbatas |
POST | /tasks/:id/git/init | Init Git lokal |
POST | /tasks/:id/git/stage | Stage path eksplisit |
POST | /tasks/:id/git/commit | Commit perubahan staged |
POST | /tasks/:id/git/branches | Buat branch lokal |
POST | /tasks/:id/git/switch | Switch ke branch bersih |
POST | /tasks/:id/preview/start | Mulai preview terkelola |
POST | /tasks/:id/preview/stop | Hentikan preview terkelola |
ID tugas selalu diperiksa terhadap pemilik terautentikasi. status akun, role, dan kebijakan akses dibaca dari basis data setiap request sehingga pencabutan berlaku meski JWT memiliki claim role stale.
Schema update tugas mempertahankan bidang server networkEnabled untuk kompatibilitas internal. bidang tidak ditampilkan sebagai kontrol Work terpisah. Saat create, pilih kebijakan bernama dengan status jaringan bawaan yang diinginkan; jangan gunakan bidang mentah sebagai konfigurasi API persisten.
Penghapusan, perubahan akun, dan backup
Menghapus tugas
Penghapusan sengaja destruktif:
- server menandai tugas sedang decommission dan memblokir mutasi baru.
- proses aktif dibatalkan dan sandbox dihentikan.
- Libre WebUI memverifikasi label kepemilikan sumber daya runtime.
- Kontainer atau Pod serta volume bernama atau PVC dihapus.
- Tugas dihapus cascade dari basis data bersama proses dan pesan.
- Draf browser dibersihkan setelah berhasil.
Jika pembersihan runtime gagal, Libre WebUI mempertahankan record dan mengembalikan kesalahan agar operator memperbaiki Docker/Kubernetes lalu retry. Metadata tidak diam-diam dihapus sambil meninggalkan sumber daya tak terlacak.
Menghentikan proses atau preview berbeda dari delete: execution berhenti tetapi volume dan percakapan dipertahankan.
Downgrade administrator dan penghapusan pengguna
Saat downgrade, Libre WebUI menyimpan pencabutan role terlebih dahulu; setiap request berikutnya memeriksa hak saat ini. server menangguhkan tugas dan mencoba menghentikan proses/sandbox. kesalahan pembersihan tidak memulihkan akses dan dilaporkan kepada operator untuk retry.
Saat pengguna lain dihapus, sumber daya terkelolanya dihapus terlebih dahulu. Jika pembersihan gagal, record pengguna dipertahankan agar metadata kepemilikan tidak hilang.
Backup tugas lengkap
Backup Work lengkap memerlukan:
- basis data Libre WebUI dengan kepemilikan, nama sumber daya Docker/Kubernetes, perutean, proses, pesan, dan aktivitas; dan
- semua volume Docker/PVC Kubernetes berlabel
ai.libre-webui.managed=trueyang berisi file Work.
Kontainer ephemeral dan proses preview tidak perlu disalin. Untuk salinan konsisten, hentikan aktivitas Work baru dan server, lalu gunakan prosedur snapshot storage.
Pulihkan basis data dan workspace terkait bersama-sama. Buat setiap volume/PVC dengan nama tercatat yang tepat; pulihkan label ai.libre-webui.task=<task UUID> dan ai.libre-webui.managed=true. file saja kehilangan label; basis data saja tidak memiliki file; storage saja kehilangan kepemilikan dan nama sumber daya.
Jika instalasi juga memiliki kredensial penyedia terenkripsi, ikuti prosedur backup utama untuk direktori data dan key.
Localization dan RTL Arab
Work diterjemahkan lengkap ke 25 bahasa: Inggris, Arab, Bengali, Ceko, Denmark, Jerman, Spanyol, Prancis, Hindi, Indonesia, Islandia, Italia, Jepang, Korea, Melayu, Belanda, Polandia, Portugis, Rusia, Swedia, Thai, Turki, Ukraina, Vietnam, dan Tionghoa.
Bahasa Arab menetapkan lang="ar" dan dir="rtl" sebelum render React: sidebar/percakapan ke kanan, workspace ke kiri, ikon arah dicerminkan, tab dan resize mengikuti RTL.
Isi teknis yang memengaruhi kebenaran tetap LTR:
- kode dan highlighting;
- path filesystem;
- ID model;
- command dan log preview;
- keluaran dan metadata alat; dan
- isi code block.
Judul tugas, prompt bahasa alami, kesalahan, nama file, dan command preview memakai arah teks otomatis.
Pemecahan masalah
runtime tidak tersedia dengan npx
npx libre-webui memulai server pada host tetapi tidak memasang Docker. Jalankan docker info sebagai pengguna OS yang sama. Instal/mulai Docker atau perbaiki izin lalu reload Work. Verifikasi juga Ollama sehat atau plugin aktif dengan model dan kredensial administrator saat ini.
runtime tidak tersedia dalam Docker atau Kubernetes
Compose repository seharusnya tidak menampilkan kesalahan ini: citra berisi CLI dan file memasang socket host. Panel menyebut penyebab—CLI, socket, atau group hilang. Untuk group, atur DOCKER_GID dan recreate kontainer. Lihat Work dalam Docker.
Pada Kubernetes atur --set work.enabled=true. Libre melaporkan kubernetes, memeriksa API, dan meluncurkan Pod dengan PVC. Jangan pasang socket runtime node; lihat Kubernetes.
Tidak ada model kompatibel Work
Untuk Ollama pilih model yang mendeklarasikan tools. Untuk plugin, periksa:
- tipe completion/chat;
- aktivasi;
- model tepat dalam mapping;
- API key administrator saat ini; dan
- dukungan alat-panggilan model.
Work tidak pernah beralih ke penyedia lain sebagai cadangan.
Package tidak terpasang atau Git jarak jauh gagal
Pastikan kebijakan bernama terpilih mengizinkan jaringan; tidak ada toggle per tugas. Lalu periksa DNS, proxy, firewall/NetworkPolicy, registry, certificate, runtime, layanan upstream, dan keberadaan command. Tab Git hanya lokal; gunakan terminal/model untuk Git jarak jauh hanya dengan jaringan dan kredensial yang sengaja diizinkan. Jangan tempel token berumur panjang.
proses berhenti pada batas agen
anggaran putaran/panggilan mungkin habis. Work meminta handoff final tanpa alat; tinjau pekerjaan dan sisa. Perlu masukan adalah status terminal proses, bukan klaim selesai. Mulai proses berikutnya atau naikkan WORK_MAX_AGENT_ROUNDS secara sadar jika sumber daya/biaya memungkinkan.
HTTP 429 saat proses
batas runtime aktif atau tugas persisten tercapai. Tunggu operasi lain, hentikan preview tak perlu, hapus tugas lama, atau naikkan WORK_MAX_* terkait jika sumber daya cukup.
preview tidak siap
Command harus terus berjalan, bind ke 0.0.0.0, dan listen pada WORK_PREVIEW_PORT dalam 15 detik. bidang kosong menemukan dev dalam package.json, index.html sederhana, atau satu aplikasi nested. Jika banyak/tidak ada, masukkan command eksplisit. Dimulai di /workspace; gunakan cd <app-directory> && ... untuk aplikasi nested.
preview bekerja di server, tidak di browser jarak jauh
Periksa build proxy bertanda tangan dan restart URL lama. Reverse proxy/tunnel harus mengizinkan WebSocket untuk /api/work/previews/. Port Docker terpublikasi harus tetap loopback dan tidak memerlukan firewall dibuka.
file tetap ada, preview berhenti
Ini diharapkan setelah cancel, restart server, stop eksplisit, atau readiness check gagal. Proses sementara, volume persisten. Buka tugas dan mulai preview lagi.
file tidak terbuka atau tersimpan
API menerima teks UTF-8 hingga 2 MB. Jika file berubah setelah dibuka, reload sebelum save. Highlighting menjadi teks biasa di atas 8.000 karakter/400 baris; formatting memiliki batas 100.000 karakter/4.000 baris dan hanya tipe terdokumentasi.
Work melaporkan pemulihan sandbox
Saat startup/shutdown, sandbox dikenal tidak terbukti berhenti. Work fail closed dan retry tiap 10 detik. Perbaiki akses API Docker/Kubernetes dan periksa log server. Jangan hapus baris basis data hingga sumber daya berlabel direkonsiliasi.
Tugas tidak dapat dihapus
Pastikan runtime terjangkau. sumber daya konflik tanpa label ai.libre-webui.task yang diharapkan sengaja ditolak. Perbaiki konflik hati-hati lalu retry.
Ringkasan keamanan
- Work bawaan khusus administrator; membuka bagi semua menjadikan setiap akun aktif operator sandbox. Folder host selalu admin.
- server harus mengontrol daemon Docker atau namespace Kubernetes terkonfigurasi.
- Kontainer mengurangi akses filesystem tetapi bukan VM.
- Tugas tanpa kebijakan offline memiliki trafik keluar; pembatasan target tanggung jawab operator.
- Volume Work tidak memiliki kuota disk independen.
- Git hanya lokal; kredensial jarak jauh tidak dipasang atau diterima API.
- Firewall, isolasi daemon, batas trafik keluar, dan kuota nyata disediakan operator.
- Penyedia jarak jauh menerima hasil diminta dan dapat membuat beberapa panggilan berbayar.
- Port preview tetap loopback dan hanya diakses melalui URL bertanda tangan yang dapat dicabut.
- Compose standar menyediakan Docker; Kubernetes/Helm menyediakan Pod/PVC dengan
work.enabled=true. - Backup lengkap memerlukan basis data Libre WebUI dan volume Work.