Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· EmailService
Siapa yang menyebabkan pemberitahuan perjalanan dengan itu, sehingga bel dapat menarik mereka sebagai anggota
- Permintaan NotificationRequest memperoleh aktorMemberId / actorName; konstruktor lama tetap untuk setiap produser yang mendahului mereka. - raise () menyimpan pasangan hanya ketika kedua bagian ada, nama cocok kolom, dan judul atau body really spell it: a name the text does not contact has nowhere to be drawn, and one past 255 jika tidak gagal menyisipkan dan mengambil seluruh pemberitahuan dengan itu. - ke Payload () mengirimkan aktorMenmberId sebagai TEXT di samping actorName - daftar, browse dan soket frame. - / api / internal / notifications baca actorMberId (teks atau nomor) dan actorName. - / api / notifications / self (the browser 's unread- chat card) menjaga aktor hanya ketika anggota tersebut berada Organisasi pemanggil sendiri. Id adalah kata browser; dapat nama pengirim yang dilihatnya, tetapi tidak memiliki seseorang dari tempat lain (sebuah exec2Exec counterpart, id basi) ditarik sebagai rekan. Kebutuhan kamo- shared- perpustakaan 727c0ec2 dan DDL dalam * * * * * * * * * * * * * diterapkan ke produksi dengan tangan pada 2026-09-23 sebelum ini didorong. Test: Penginapan Catatan ServiceTest (+ 4), NotificationSelfRaiseActorTest (4). Full suite: 1912 run, 0 kegagalan, 1 dilewati.
· kamo-shared-library
Sebuah pemberitahuan dapat mengatakan yang melakukannya adalah
Pemberitahuan memperoleh ACTOR _ MEMBER _ ID (INT8) dan ACTOR _ NAME (255): anggota yang menyebabkannya - siapa ditangani Anda dalam, yang pertemuan dimulai, yang menulis kepada Anda - dan nama mereka persis sebagai judul atau tubuh mengejanya. kamo- internal menarik bahwa peregangan teks sebagai nama anggota, jadi melayang itu membuka mereka kartu anggota. Sampai sekarang setiap nama di bel adalah teks biasa, karena tidak ada yang dicatat siapa itu. DDL, diterapkan dengan tangan untuk produksi pada 2026-09- 23 sebagai pemilik kamo (ddl- auto tidak ada di mana-mana): ALTER TABLE public.member _ notifications ADD COLUMN JIKA TIDAK EXISTS acctor _ member _ id INT8; ALTER TABLE public.member _ notifications ADD COLUMN JIKA TIDAK EXISTS acctor _ name VARCHAR (255); Kapal pernyataan yang sama dalam layanan email sebagai... EmailService adalah satu-satunya layanan yang membaca atau menulis tabel ini.
· InitializerService
Fitur rencana Catatan adalah "Catatan & Checklist"
Aplikasi Catatan menyimpan checklist juga sejak 2026-09- 23 dan disebut "Catatan & Checklist" dimana-mana namanya. Perbandingan halaman harga bagan mengambil nama baris dari _ subscription _ features, jadi baris NOTES juga berganti nama di sana: NotesChecklistsRenameMigrasi (@ Order 215) mengganti nama setiap baris NOTES masih membawa nama baku lama, dan menulis ulang Tanda tangani deskripsi Pink dimana masih membaca kalimat lama. Sebuah reworded baris ditinggalkan sendirian dan sebuah re- run mengubah apa-apa. Salin saja: service _ type dan adalah _ termasuk, yang memutuskan apa yang berhak rencana, tidak tersentuh. KamoCRMPricing Biji loader nama baru untuk katalog dibuat dari sini. Applied by hand on 2026-09- 23 with the same statement, since this service tidak dikerahkan.
· kamo-internal
Sebuah switched-to kotak surat tetap hidup, dan kotak pencarian dipoles
Pemutakhiran langsung. Halaman ini meminta EmailService untuk menonton kotak surat yang telah dibuka ketika itu bukan anggota sendiri (/ app / email / watch, dikirim kembali setelah koneksi ulang, berhenti saat meninggalkan halaman), dan daftar folder dan reload pohon di situ kotak surat berubah - surat baru, dan perubahan yang dibuat dari klien lain atau oleh orang lain - persis seperti yang mereka sudah lakukan untuk anggota sendiri. Relay memiliki topik sendiri, sehingga surat lencana dan new-mail suara tidak pernah mendengar tentang kotak surat orang lain; perubahan hanya dilakukan untuk kotak surat sebenarnya pada layar (lib / email / mailboxWatch). Polandia, semua ditemukan dengan mengemudi komponen nyata di Chrome: - Dialog bantuan dan bentuk canggih re- berlari efek pembuka mereka pada setiap halaman render (halaman melewati onClose), yang menarik fokus kembali ke tombol tutup / kotak "Dari" keluar dari bawah anggota. Mereka sekarang lari sekali per pembukaan. Dialog juga menyimpan Tab di dalamnya dan tangan fokus kembali untuk "Bagaimana untuk mencari" ketika menutup. - Placeholder kotak pencarian adalah "Cari"; yang panjang dipotong ke "Cari surat - coba f" dalam kolom 320px (kamus 6401409c). - "Bagaimana mencari" duduk di awal baris sendiri ketika kolom terlalu sempit untuk itu di samping toggle scope, bukan tergantung dari kanan. - Scope toggle adalah salah satu tab berhenti dengan tombol panah, seperti grup radio apapun; saran daftar mengumumkan pilihan yang disorot (aria- keturunan aktif), membuatnya digulung ke tampilan, dan menandai headdings sebagai presentasi.
· kamo-internal
Pelajaran audio - upload rekaman, dan pelajar benar-benar dapat menavigasi itu
Penulis (/ hr / penyunting kursus pelatihan) - "Upload file" di setiap slide, di samping "Pilih media": audio (MP3, M4A, AAC, WAV, OGG / Opus, FLAC), video atau gambar, melalui pipeline pencitraan ke Sumber Daya HR, dicantolkan saat ini disimpan. The picker perpustakaan tahu audio juga (lencana, waveform thumbnail), dan course- cover Picker sekarang menawarkan gambar saja. - Sebuah slide audio mendapat penyunting sendiri: deskripsi yang diperlukan (nama yang dapat diakses), pelajaran bermain persis sebagai pelajar bertemu itu, bab (tambahkan satu di playhead, edit kali sebagai m: ss atau h: mm: ss, putar dari apapun, atau tempel daftar dalam bentuk "00: 00 Judul"), dan transkrip yang mengikuti. Pekerjaan selesai tidak pernah overwrites teks diketik sementara dijalankan (ditawarkan sebagai gantinya), dan satu ditemukan berjalan ketika slide dibuka kembali ditawarkan dengan cara yang sama. - Rekaman diukur sekali, pada melampirkan: panjang dan gelombang berasal dari Layanan Percakapan dan disimpan di slide (media _ meta _ json), jadi tidak ada pelajar yang menunggu mereka. "Dengarkan rekaman "adalah pengubahan audio dari aturan main-melalui. Learners (pemain kursus) - Sebuah scrubber gelombang menunjukkan apa yang telah dimainkan, apa yang sebenarnya telah HEARD, bab, penanda buku mereka dan ulangi A-B; klik, seret atau panah melalui itu, dengan time-and-bab preview on hover. - Bab dengan per- bab mendengar kemajuan, sebelumnya / bab berikutnya, dan "mengulangi bab ini". - Sebuah transkrip yang mengikuti rekaman, melompat di mana saja pada klik, dan pencarian dengan berikutnya / sebelumnya melalui pertandingan; judul garis yang berbicara di bawah bentuk gelombang. - Bookmark dengan catatan, disimpan dalam preferensi anggota sendiri sehingga mereka mengikutinya antara perangkat (Tidak pernah ditulis sebelum daftar disimpan dimuat, yang akan menggantikannya; catatan yang tertunda dikirim, tidak dijatuhkan, ketika slide menutup). - Kecepatan dari 0.5 × ke 2 × (dan waktu tersisa pada kecepatan itu), = 10 s, volume, anggota dipilih speaker, tombol media sistem operasi, dan peta keyboard (Ruang / K, J / L, panah, Shift + panah atau P / N, < >, 0-9, M, B, A, C, /,?) dengan bantuan lembar. - Ini melanjutkan di mana mereka berhenti pada perangkat ini, dan menawarkan bagian pertama mereka belum mendengar. - The play- through jumlah persyaratan hanya membentang sebenarnya dimainkan: sebuah pencarian (scrubber, lewati, loop, devtools, or a tick that land mid-seek) arns nothing, and nor does faster than 2 ×. Tidak seperti aturan video itu kredit panjang tab latar belakang, karena audio adalah apa yang orang mainkan dalam satu. Mendengar dalam waktu setengah detik dari akhir dihitung sebagai seluruh rekaman: bentuk yang tersimpan putaran ke 0.1 s dan durasi tidak, dan 100% digunakan untuk membaca sebagai 99% selamanya. - Pintu keluar untuk berkas peramban tidak dapat bermain muncul setelah panjang rekaman memiliki lulus, seperti yang dilakukan untuk video; jalan pintas bekerja di mana pun fokus adalah di dalam dialog pemain. Tetap di jalan, untuk video sebanyak audio - The play- through gerbang diukur terhadap durasi beku versi, yang menerbitkan tidak pernah menulis: setiap versi video membawa kosong, jadi menonton tidak pernah bisa memenuhi persyaratan. The gerbang sekarang menggunakan durasi elemen sendiri. - Apa anggota telah menyaksikan mencapai server hanya ketika mereka menekan Berikutnya, jadi menutup kursus mid- pelajaran hilang itu. Hal ini disimpan setiap 20 s, pada jeda dan dekat, dengan persen Melengkapi muatan dibaca (itu tidak pernah dikirim, jadi setiap manifest dicatat 0% cakupan). - Media slide, pertanyaan gambar dan pelajaran itu sendiri sekarang dimuat melalui anggota sendiri assignment * * * * * * * * * * * * * * * * * bukan pencitraan stream, yang membutuhkan VIEW _ DOCUMENTS - 32 benar dari 149 anggota tidak terus. - Kartu slide dengan uid, yang setiap otomatis menyimpan tempat, sehingga masing-masing menyimpan dipasang ulang setiap kartu - dan akan menghentikan audio seorang penulis mendengarkan ketika mengetik sebuah bab. An upload dalam penerbangan mengikuti slide melalui sebuah move atau delete. - Rute anggota media menjawab dengan sebuah operasi sandboxing dan nosniff: sebuah gambar slide dapat menjadi SVG, yang dibuka secara langsung akan sebaliknya menjalankan script dalam asal ini. Perlu Layanan Dokter (titik akhir media, media _ meta _ json) dan Layanan Percakapan (puncak, transkrip) digunakan bersama; Inggris pada kamo- terjemahan - kamus a4c6f856.
· KlusterServices
Sebuah cara untuk benar-benar membangun gambar emas
building-golden-image.sh mengatakan "Jalankan oleh CI (lihat.. /.. / .forgejo / workflow /)". Tidak. alur kerja pernah ditulis. Perlu libguestfs, qemu-img dan virt-gustize, kosong yang dipasang pada mesin repo ini sedang bekerja, dan tidak ada kontainer waktu jalan di sana baik - jadi satu artefact seluruh aplikasi tergantung pada memiliki tidak ada jalur untuk ada. Itu adalah bagaimana orang pertama untuk menetapkan komputer menemukan. Bangunan berjalan di cluster bukan, yang merupakan salah satu tempat sudah dilengkapi untuk itu: node menjalankan KubeVirt dan mengekspos / dev / kvm melalui device.kubevirt.io / kvm plugin perangkat, sehingga libguestfs hardware-dipercepat daripada emulasi untuk Jam. Pekerjaan menulis ke dalam PVC emas langsung, karena vm / datavolume- template klon dengan source.pvc dan sebuah cDI klon dari sebuah salinan volume Filesystem isinya - jadi klaim apapun memegang disk.img adalah sumber yang valid. Yang menghilangkan HTTP hosting langkah, upload kredensial dan salinan kedua dari berkas multi- gigabyte. golden- datolume.yaml tetap untuk gambar dibangun di tempat lain. Tiga hal yang layak diketahui dari menulis itu: Naskah perjalanan sebagai ConfigMaps daripada sebuah klon git, sehingga pekerjaan membutuhkan tidak kredensial. Mereka mengaitkan baca-saja tanpa bit eksekusi, sehingga mereka disalin ke path writeable sebelum virt-commiize --run dapat mengeksekusi mereka. Pembangunan terjadi dalam goresan dan hanya file selesai disalin ke klaim. Skrip menulis sebuah 20 GB bekerja qcow2 dan kemudian qemu-img konversi -c menulis kedua dikompresi satu di sampingnya, melakukan itu dalam klaim emas akan membutuhkannya untuk dua kali ukuran gambar itu akhirnya memegang. VERSION adalah overriable sekarang. Jalur in- cluster harus tahu versi sebelum build starts, because the claim carry it in its name and must exist for the job to menulis ke dalam, sehingga pembungkus memecahkan Canonical serial sekali dan menggunakan satu nilai untuk keduanya. Sebuah pembangunan kembali dari versi yang ada ditolak daripada ditulis ke dalam: a menulis kedua menjadi penduduk emas PVC adalah kegagalan yang mencapai setiap penyewa di sekali.
· ConversionService
Audio - sebuah thumbnail gelombang bentuk pada upload, dan puncak dan transkrip sesuai permintaan
Berkas audio yang diunggah jatuh ke jalur Dok PDF, yang tidak dapat membuka satu, jadi setiap upload audio berakhir "Conversion gagal" dengan ubin pustaka kosong. Audio sekarang mengambil cabangnya sendiri, like video: streamed to scratch (never into heap), decode ONCE into peaks, and its page- 0 thumbnail diambil dari puncak tersebut di Jawa. Tidak frompeg ini showwavespic, yang memegang setiap diterjemahkan bingkai sampai akhir berkas: diukur pada 298 MB untuk MP3 30 menit dan 546 MB selama satu jam, pada thread tak terbatas per upload dalam sebuah pod berukuran untuk dokumen; baris puncak decode di 54 MB. FLAC, yang mana tabel MIME penyimpanan sebagai binari generik, dikenali oleh ekstensi. * * * * * * * * * * * * * * * - GET / puncak - durasi dan 1.600- ember waveform (base64 dari 0- 255 puncak). Frompeg 's PCM adalah membaca karena aliran dan hanya satu pendek per 50 meter jendela disimpan, sehingga biaya satu jam 72.000 celana pendek; decodeAudioData browser akan memegang lebih dari gigabyte untuk jam yang sama. Tersimpan di samping berkas sebagai < datId > _ peaks _ v1.json, sehingga dihitung sekali per konten. - POST 124; GET / transkrip - transkrip WebVTT waktu dari bisikan-asr (vad _ filter hidup), jalankan sebagai pekerjaan pada sebuah thread virtual dengan kondisinya dalam < datId > _ transkrip _ v1.json, yang baik replika dapat membaca (sebuah tabel pekerjaan in- memori akan terlihat dengan pod lain). Satu pekerjaan per pod pada satu waktu: Berbisik-asr adalah salah satu replika CPU-terikat bersama dengan voicemail dan pertemuan transkripsi. Berjalan pekerjaan menulis ulang penanda setiap menit dari benang sendiri (bergabung sebelum hasil ditulis), sehingga sebuah pekerjaan yang pod mati berbunyi sebagai gagal setelah tiga kali salah ketukan daripada mengunci penulis keluar untuk timeout Whisper;? restart = true menggantikan transkrip selesai. Diukur terhadap layanan langsung: rekaman 2 menit 7 s mengambil 25 s. Keduanya memerlukan VIEW _ DOCUMENTS dan tingkat akses pencitraan, dan hanya menyediakan SDM Resources: pesan suara, panggilan rekaman dan catatan suara obrolan masing-masing membawa aturan rekaman dalam Layanan Dokter bahwa layanan ini tidak dapat melihat, sehingga mereka tetap 404 sampai sesuatu yang membutuhkan mereka membawa aturan yang bersama. Pembangunan juga mengambil audio MIME dari kamo- perpustakaan yang dibagi-: M4A, WAV, OGG dan AAC uploads ditolak sebagai MIME tidak cocok.
· DocsService
Undo-type
Navigasi slide audio hidup di media _ meta _ json (durasi, waveform puncak, bab), yang editor menulis dan pemain membaca kembali verbatim. Ini disimpan (berbatasan dengan 256K dan untuk JSON objek, dan hanya disimpan ketika slide memiliki media), duplikasi, membeku di mempublikasikan dan disajikan di pemain DTO. Publikasikan juga menulis media _ durasi _ ms dari itu - dideklarasikan pada versi dari awal dan tidak pernah ditulis - dan estimasi kursus menghitung sebuah pelajaran audio nyata panjang. Sidik jari hashes sebuah transkrip dan metadata AUCoptic, jadi mengoreksi baris transkrip atau memindahkan bab adalah perubahan yang dapat dipublikasikan. Setiap slide lainnya bergegas persis seperti sebelumnya: memperluas hash untuk semua slide akan mengubah setiap kursus diterbitkan dengan transkrip video "tidak diterbitkan" hari ini dikirim. GET * * * * * * * * * * * * * melayani slide (atau pertanyaan) media dengan dukungan Range, diotorisasi oleh tugas anggota sendiri: berkas harus berada dalam versi mereka ditugaskan, di SDM Resources, dalam organisasi mereka, hidup dan tidak dibuang. The image-action setiap hak tidak memiliki - setiap salah satu dari mereka bertemu pemain mati. Karena seorang pelajar diperbolehkan oleh kehadiran berkas dalam kursus, menyimpan unit sekarang menolak berkas penulisnya tidak dapat membuka (422 nama slide atau pertanyaan), dan melampirkan berkas apapun di semua kebutuhan VIEW _ DOCUMENTS, hak pencitraan stream itu sendiri permintaan; penerbitan re- berjalan baik pemeriksaan selama seluruh kursus, sehingga draft disimpan sebelumnya atau oleh ko- penulis dipegang dengan aturan yang sama. Jika tidak Manage _ Training saja bisa menerbitkan file yang pemiliknya tidak dapat membaca ke dalam kursus dan menugaskannya untuk diri mereka sendiri. Jalan belajar juga hanya pernah melayani gambar, video atau rekaman - tidak pernah sebuah dokumen yang dibuat menyimpan bernama. Sumber Daya HR juga lebih kecil dari setiap aturan byte lainnya (paket dikeluarkan adalah SERVICE _ APPILIKASI, per- dokumen pihak LOAN atau ACCOMBT _ MEBER _ VAULT, dan percakapan / voicemail / panggilan media memiliki koleksi mereka sendiri). Pembaca diaudit seperti / image / stream, dan jawaban Range adalah salah satu pembantu bersama (ImgRangeResponses) yang / pencitraan / stream sekarang menggunakan juga. Publish menolak slide audio tanpa deskripsi dalam kata-kata audio sendiri. Butuh kamo- shared-library "feat (imaging, training): upload audio melewati pemeriksaan MIME, dan slide membawa metadata media "(media _ meta _ json pada kedua entiti slide; DDL diterapkan).
· kamo-shared-library
Upload audio melewati pemeriksaan MIME, dan slide membawa metadata media
Setiap upload audio tapi MP3 ditolak sebagai MIME tidak cocok. Sebuah upload hanya diterima ketika tipe browser dan bau Tika ke ImageMimeType yang sama, dan untuk audio dua sisi tidak pernah mengeja format dengan cara yang sama. Diukur terhadap Tika 2.9.2: sebuah WAV sniffs sebagai audio / vnd.wave (Peramban mengirim audio / wav), Ogg sebagai audio / vorbis atau audio / opus (audio / ogg), ADTS AAC sebagai audio / x-aac (audio / aac), dan Windows dan MacOS mengirim sebuah .m4a sebagai audio / x-m4a dimana Tika mengatakan audio / mp4. stringToImageMimeType sekarang mengabaikan kasus, sekitarnya ruang dan parameter, dan memetakan alias tersebut ke konstan mereka nama. Tidak ada yang memetakan wadah yang dapat membawa video (Matroska, WebM, MP4) ke sebuah konstanta audio, dan FLAC tetap sebuah binari generik di kedua sisi, seperti sebelumnya. TrainingSlide dan TrainingVersionSlide memperoleh media _ meta _ json (TEXT): durasi, gelombang puncak dan bab menandai pemain pelatihan navigasi pelajaran audio oleh - ditulis oleh editor, Beku dengan versi. DDL, yang diterapkan pada produksi secara manual sebelum commit ini (Layanan Inisial tidak dikerahkan): ALTER TABLE public.hr _ training _ slide ADD COLUMN JIKA TIDAK EXISTS media _ meta _ json TEXT; ALTER TABLE * * * * * * * * * * * * * * * * * ADD COLUMN JIKA TIDAK TERLEKAT media _ meta _ json TEXT;
· kamo-internal
Judul lengkap suatu jendela alat, namun dipotong pendek
Judul bar adalah satu baris, dan percakapan, email atau subjek tiket atau direktori terminal secara teratur lebih panjang dari ruangan yang ia dapatkan - anggota hanya bisa membaca potongan dimulai. Setiap tempat judul jendela digambar sekarang membuka kartu dengan semuanya: judul bar di baris depan, strip dari jendela berdiri di belakang, floating atau dimaksimalkan batang jendela, dan tab di atas panel yang dimaksimalkan (dimana menggantikan sendiri peramban unstyled 'title' tooltip). Mencapai setiap cara anggota dapat bertanya: - hover: setelah istirahat singkat, dan sekaligus ketika geser pada dari judul lain; satu kartu pada satu waktu - tekan: sekaligus; diturunkan saat pers menjadi drag jendela, dan terus turun sampai pointer daun atau datang kembali afresh - tap: sekaligus, diadakan setelah jari mengangkat sampai tanah keran di tempat lain - Keyboard: memfokuskan strip, tab, atau bilah jendela mengambang; Escape menutup - Benar - klik: menu jendela sekarang names jendela secara penuh di bagian atas dan memiliki baris "Salin judul" Hanya untuk judul yang benar-benar dipotong (diukur ketika akan terbuka, termasuk putaran sub-piksel overflow 'scrollWide'), dan itu mengikuti jendela sebagai baris bergerak, pemutakhiran ketika judul diganti nama atas soket, dan pergi sekali memaksimalkan atau baris yang lebih luas memungkinkan judul cocok. Kartunya adalah warna batang org sendiri, garis judul penuh up di bawah potongan satu, dapat dipilih, dan menyalin seluruh judul. Kartu ini portaled tapi React gelembung kejadiannya kembali ke judul bar, jadi it stops the press, click, double-click, context menu and keys that would seret, angkat, maksimalkan atau pindahkan jendela di bawahnya.
· InitializerService
Masukkan aplikasi dalam katalog hak, add- on saja
* * * * * * * * * * * * * asserts setiap aplikasi yang terjual dikategorikan dan duduk suatu tempat di tangga tingkat, karena sebuah katalog tidak menggambarkan tanah Nowhere pada matriks harga dan keheningan menulis adalah _ included = false di setiap tingkat. Hosted Computers dijual dan dijelaskan mana-mana, sehingga pecah kedua pernyataan saat ServiceType 37 ada. Alamat saja, dan untuk alasan tidak ada alamat lain -on -hanya aplikasi berbagi. MLOS, Sistem pinjaman pribadi dan Catatan Pasien dinegosiasikan karena apa yang mereka membawa; Hosted Komputer dinegosiasikan karena apa yang dibelanjakan. A tier rung akan menyerahkan setiap organisasi pada rencana yang hak untuk menetapkan VM KubeVirt, dan penjadwalan batasan armada oleh REQUESTS daripada penggunaan, sehingga orgs yang menggunakan hak pertama akan mengambil node dari sisanya - pada diterbitkan Harga, yang merupakan bagian yang membuat sulit untuk berjalan kembali. Apa yang bergerak ke Rung lebih node, bukan perubahan harga. Add- on mengikuti bentuk loop telah berlaku untuk aplikasi yang dinegosiasikan: tidak daftar harga, sehingga tidak menghasilkan satu, dan kompatibel hanya dengan rencana CUSTOM. Hal ini juga tidak ditawarkan di mana saja sampai aplikasi mencapai KOMPLETED, yang belum. Entri katalog terletak di Produktivitas di samping hal-hal lain yang orang kerjakan. A Kategori memegang satu aplikasi dibaca sebagai oversight kepada siapa pun yang membuka matriks.
· kamo-internal
Akun anggota Human / AI, nama fonetik, judul kerja dan persyaratan departemen
Tambah Anggota Tim / Tambah Anggota - Sebuah bagian "Orang atau AI" pertama: Intelijen Manusia (default) atau Kecerdasan Buatan sebagai dua keyboard- kartu pilihan beroperasi. AI membawa anggota tim pengawas (baku untuk Anda ketika Anda adalah anggota tim) dan model AI; lokasi kerja anggota tim sebelum-mengisi sebagai Remote. - Nama fonetik di samping nama yang disukai, dengan tips pengucapan dan dua tombol main yang membaca nama seperti dieja dan ditulis fonetik melalui mesin bicara browser. - Ringkasan menunjukkan Intelijen dan "Mengatakan itu"; memilih judul pekerjaan atau departemen menunjukkan apa yang mengharapkan (deskripsi + kebutuhan); pemberitahuan akun yang ada menyebutkan namanya dan pengucapan disimpan. - Tambah besar: penataan batch Intelligence (+ supervisor), sebuah override tegak dan kolom Phonetic; CSV mengimpor auto- map "pengucapan", "manusia atau ai" dan teman-teman ("AI", "Bot", "Manusia"...). Setelah penciptaan - Anggota / Anggota Tim grid: kolom Intelijen, Penyaring Semua Manusia dengan hitungan, dan pencarian cepat yang menemukan "AI" dan nama fonetik. - Kartu anggota (setiap nama hover): pil AI dan "Says it" baris dengan tombol bermain; baris daftar utama dengan keduanya. - Profil: pahlawan memakai pil AI dan "Mengatakan itu"; nama fonetik diedit di samping yang disukai nama; kartu Keanggotaan menunjukkan / edits Intelligence, supervisor dan model (Manage Member saja, tidak pernah pada profil Anda sendiri); ruang kerja mendapatkan kartu harapan langsung, baca-saja Peran. Judul pekerjaan dan departemen (/ pengaturan / esensial) - Dialog add / edit memperoleh suatu bagian Expectations: deskripsi (4.000 karakter, counter) dan pengubah persyaratan - kategori, teks, Diperlukan / disukai, urutan ulang, dihapus, Masukkan menambahkan berikutnya, pasting daftar split ke baris, contoh chip, 50-row cap. - Tabel menampilkan baris pertama deskripsi dan kolom permintaan dengan daftar hover; kedua halaman segarkan langsung (jeda sementara dialog terbuka) dan tampilkan kata-kata server sendiri pada simpan ditolak. Potongan bersama: app / lib / members / intelligence, app / lib / speech (feature- terdeteksi, SSR-safe), IntelligenceBadge / IntelligenceChoice / PhoneticNameField / SayItButton, app / lib / orgrency, Perlu Editor, RoleExpectations. Spec and plan under docs / superpower. Kebutuhan kamo- shared-library + securityservice (fitur yang sama) dan kunci kamus didorong pertama.
· SecurityService
Anggota Human / AI, nama fonetik, persyaratan peran; posisi perbaikan menyimpan penyeka keamanan
Anggota - Buat, buat - tim -anggota dan bulk-buat terima 'intelligenceType', 'namePhonetic' (baru akun hanya, seperti nama), dan untuk account AI 'aimvisorMberId' + 'aiModel'. The pengawas harus aktif, anggota tim manusia dari org dan tidak pernah akun itu sendiri; ketika tidak ada yang bernama pencipta berdiri di jika mereka memenuhi syarat (AimvisorPolicy). Setiap nama penolakannya bidang sebelum apa pun ditulis. - PUT / anggota / {id}: 'namePhonetic' adalah ruas identitas (otoritas sama dengan nama hukum). 'IntelligenceType', 'aiSupervisorAnggota Id', 'aiModel' perlu Manvage _ MEMBERS atau jendela dewa terbuka, dan ditolak oleh keanggotaan Anda sendiri (cannot _ RELABEL) sehingga AI tidak dapat relabel sendiri manusia. Beralih ke HUMAN membersihkan pengawas dan model. - GET / anggota / {id}, / anggota / {id} / kartu, daftar departemen dan daftar akun baris membawa 'intelligenceType' dan 'namePhonetic' (profil juga mendapat ID / name dan model). - Org- config 's pekerjaan judul dan departemen membawa deskripsi + persyaratan untuk bentuk pembuatan. Judul tugas dan departemen - POST / PUT / DELETE sekarang membutuhkan KONFIGURE _ SISTEM (atau membuka jendela dewa) - halaman pengaturan yang tulis mereka sudah melakukannya; server menerima sinyal apapun dalam anggota org. Membaca tidak berubah. - Deskripsi dan persyaratan mengalir melalui layanan bersama (lihat kamo- shared-library). Perbaiki: PUT / member- keamanan / {id} mengganti peran, hak langsung dan sesi timeout bahkan ketika Permintaan tidak menyebutkan nama mereka. Profil kartu Posisi mengirimkan hanya departemen / pekerjaan judul / resmi judul / manajer, jadi setiap posisi sunting menghapus peran adat anggota, hak langsung dan timeout override. Masing-masing kini hanya diganti saat kuncinya ada; editor keamanan mengirim ketiganya. DDL: * * * * * * * * * * * * * * (diterapkan dengan tangan sebagai pemilik sebelum ini push; skema nol-tidak cocok error dalam keamanan / email / media selama 15 menit berikut).
· kamo-shared-library
Tipe intelijen, nama fonetik, pengawasan AI, persyaratan jabatan / departemen
Anggota: 'Member.intelligenceType' (HUMAN 124; ARTIFISIAL, STRING, default HUMAN pada setiap konstruksi path dan dalam kolom), 'aiSupervisor Anggota Id' (plain id - anggota adalah tabel terpanas dan hard- dihapus) dan 'aiModel'. Pengguna: 'namePhonetic', disamping nama itu daripada di dalam EmbNameFull, yang mengarah, rekening, peminjam dan sesi juga embed. Judul pekerjaan dan departemen: 'deskripsi' (TEXT, 4.000 karakter) dan memerintahkan persyaratan dalam dua tabel anak ('org _ job _ title _ commentions', 'dept _ commentions': kategori, dibutuhkan / disukai, teks £500, ID stabil, ON DELETE CASCADE). 'Requients Organis' adalah salah satu aturan ditetapkan untuk keduanya - validasi sebelum apa pun ditulis, berbeda-oleh-id sehingga persyaratan terus terus menjaga id nya, dan id dari pemilik lain diperlakukan sebagai baru. Pemutakhiran mengikuti "absen berarti tidak berubah" untuk kedua bidang baru, jadi Penelepon yang tidak pernah mengirim mereka tidak dapat menghapus mereka, "jelas". * * * * * * * * * * * * * sekarang mengambil permintaan DTO (hanya SecurityService panggilan mereka). DDL adalah hand- diterapkan * * * * * * * * * * * * * * * * * * 2026-09- 22 03: 01Z, sebelum dorongan ini). Sebuah SesionFactory nyata di seluruh perpustakaan pin baru tabel dan kolom ke DDL (RoleRequirementsMaplingTest).
· kamo-internal
Opsi nav, bagian pengaturan, dan angka penyimpanan
Komputer Linux milik seorang anggota, dibuka dari bar teratas. Aplikasi (ServiceType 37) dan tiga hak mendarat di perpustakaan bersama; ini adalah setengah orang lihat. Pilihan NAV APPEARS tepat ketika ada sesuatu di balik itu Gated pada server jawaban untuk "komputer yang mungkin anggota ini terbuka", tidak pada hak dan tidak pada Tuhan. The pilihan mesin dev-harus diajarkan ini: itu godgated sekali, yang menempatkan ikon di depan orang dengan tidak ada akun pada mesin dan menghasilkan kesalahan generik Guacamole ketika mereka mengklik itu. Jadi manajer memegang AKSES _ SUBORDINATE _ COMPUTERS dan tidak ada komputer mereka sendiri masih mendapat ikon - ada sesuatu di belakang itu - dan administrator memegang Manvage dan tidak ditugaskan tidak. Daftarnya adalah milik server, dalam urutan server: pertama, lalu bawahan, lalu organisasi. Tidak ada filter atau reorders di sini, untuk alasan / daftar jaringan adalah server- memutuskan - sisi klien - filter adalah daftar yang telah dikirim, dan urutan membawa informasi klien tidak pernah melihat karena tidak memiliki rantai manajer. Setiap baris mengembang ke ukuran dari DESCTOP _ RESOLUTIONS, digunakan kembali daripada direset sehingga ukuran ditambahkan di sana tanah di sisi yang benar aturan di bawah "Fit jendela saya" tanpa ada yang bergerak batas. Setiap baris memakai kondisinya, karena "tertidur" adalah keadaan normal istirahat salah satu komputer ini daripada kesalahan, dan baris yang mengatakan tidak akan meninggalkan seseorang yang menunggu satu menit berpikir itu telah gagal. opending HostedComputer lebih dari sebuah fetch dan redirect untuk alasan yang sama: peluncuran memiliki tiga jawaban dan dua dari mereka bukan link. Tidur berarti bangun telah dimulai dan mengambil 30-90 detik sementara tamu membaca memori kembali dari volume yang direplikasi, sehingga tab SAYS yang - tab kosong selama satu menit adalah tidak dapat dibedakan dari yang rusak, yang membuka KamoDesktop harus diajarkan juga. Tidak ada login belum berarti Kamo tidak pernah menyimpan password dan anggota menegaskan itu sekali, itu adalah desain yang bekerja, bukan kegagalan, jadi tab menutup dan dialog meminta daripada meninggalkan halaman penjelasan tidak ada yang ingin. Tiga detik. Satu diminta untuk; dua lainnya mengapa hal itu dapat digunakan Komputer adalah salah satu: menetapkan, mengubah ukuran, mengubah penyimpanan, tidur, menghapus, hidup pada perubahan use-organic. Kapasitas jawaban "mengapa ini tidak dimulai?", yang jika tidak tidak memiliki jawaban di mana saja dalam produk - dan jawabannya adalah kontra-intuitif, sehingga bar mengatakan REQUESTS daripada penggunaan, karena mesin dapat terlihat setengah menganggur dan tidak ada ruang. Default menghentikan sebuah organisasi mengubah ukuran dan disk bagi setiap orang, dan setiap kotak ada dapat kosong, di mana kosong berarti "mengikuti platform" dan bukan nol. Dialog resize memperingatkan dan dialog penyimpanan mengatakan tidak akan, yang merupakan pasangan layak memiliki: ukuran mengubah awal ulang komputer karena gambar tidur terikat dengan ukuran memori yang ditulis pada, dan perubahan penyimpanan memperluas volume online dan tidak mengganggu apapun. STORAGE ON THE STATS PAGE, AS ITS SENDIRI PANEL HostedComputer UadgePanel duduk langsung setelah Penyimpanan pada Pengaturan Akun saya Amal Stats & Biaya. Tidak ada baris dalam tabel itu: baris-baris berasal dari snapshot penagihan menyapu penyimpanan RECORDS berjalan, dan disk komputer memiliki tidak ada - apa yang ada di dalamnya hanya diketahui tamu, yang melaporkan sendiri figur filesystem. Nomor Longhorn akan salah dalam cara yang penting, karena menghitung segala sesuatu yang pernah ditulis dan tidak pernah jatuh ketika seseorang menghapus file. Berkas swap tidak termasuk: ini adalah ukuran memori komputer dan ada sehingga Mesin bisa tidur. Dua hal cek saya sendiri tertangkap dan tetap: gerbang navigasi kembali 'tidak terdefinisi' daripada 'salah' untuk organisasi tanpa flag set ('undefined & x'), dan kolom penyimpanan melewati 'nomor 24; null' ke ICU placeholder - langit-langit dan "tumbuh" adalah fakta yang sama, sehingga sekarang membaca langit-langit sekali dan memungkinkan TypeScript mengikuti mempersempit. Verifikasi: tsc membersihkan segalanya tetapi empat kesalahan ReplyQuote yang telah ada dalam percakapan dan dukungan, hadir di garis yang sama pada asal / utama. 320 nav dan lib test pass. esline bersih di setiap berkas baru dan tidak ada baru peringatan dalam yang diedit. Semua tiga jimage- penjaga bangun lulus - check-i18n-kunci membersihkan lebih dari 4268 berkas terhadap kepala kamus, yang didorong pertama dan diverifikasi oleh keturunan.
· kamo-internal
Checklist dalam aplikasi Catatan - prasyarat, stickies, panes rumah dan kalender
Catatan adalah memori; daftar cek adalah pekerjaan. # note now has two halves - Notes and Checklist (? view = checklist) - dan checklist adalah catatan sendiri (/ api / checklist, KBService) dengan tugas-tugas yang dapat menunggu pada tugas-tugas lain. Checklist - Sebuah kartu per daftar pada dinding sendiri: kemajuan tepi dan cincin, tugas dapat diakses pada kartu, chip jadwal; penyaring rel untuk dalam proses / tidak dimulai / selesai / jadwal / di rumah / favorit, pencarian yang mencapai di dalam setiap tugas. - Editor: tambahkan tugas cepat (Masukkan; Shift + Masukkan menambahkan sebagai langkah berikutnya; paste sebuah daftar), klik untuk mengedit, seret atau Alt + panah untuk mengurutkan kembali, hapus dengan Batalkan, Semua / Siap / Menunggu / Selesai filter, "lakukan dalam rangka", untick semua, jelas dilakukan, duplikasi sebagai salinan segar, salin sebagai Markdown. - Prasyarat: mode link memilih apa yang menunggu tugas, greying keluar apa pun yang akan loop. Tugas terkunci menunjukkan gembok dan apa yang menunggu di; menekan itu mengguncang baris, menyalakan tugas-tugas dengan cara dan menawarkan untuk melompat ke mereka. Tidak berdetak sesuatu selesai bekerja tergantung pada, atau memberikan selesai tugas sebuah prasyarat terbuka, meminta pertama dan nama apa yang dibuka kembali. The jalur ketergantungan menarik setiap link dan lampu tugas hovered. Server Memaksa aturan yang sama, sehingga tidak mendapat putaran mereka. - Membuka kunci, kutu dan menyelesaikan daftar yang animasi, selesai mendapat confetti dan nada di permukaan mana centang terakhir dibuat. Everywhere a note goes - Floating: checklist float sebagai stickies di overlay yang sama, tumpukan order, disimpan tata letak dan hex-head dock sebagai catatan (grup dok mereka sendiri). - Rumah: sebuah checklist disematkan adalah panel launchpad di samping catatan yang disematkan, mudah geli. - Satu toko hidup feed setiap permukaan, disegarkan oleh 'checklist' org perubahan, sehingga centang mana saja tanah di mana-mana. Kalender - Sebuah checklist berlangsung kalender sebagai acara nyata (sourceType CHECLIST), dijadwalkan melalui kalender sendiri dialog acara dari permukaan apapun, atau oleh menyeret dari baki checklist baru kalender ke dalam sehari atau satu jam. - Acara Checklist menunjukkan kemajuan mereka di setiap tampilan; dialog acara menunjukkan daftar, mudah geli di tempat; terlambat pulses kerja merah. - Proksi kalender sekarang menerbitkan perubahan 'kalender' org pada setiap penulisan: Topik EmailService sendiri adalah per pod, jadi tab pada pod lain tidak pernah mendengar. Desain: * * * * * * * * * * * * * * * * * * * *
· APIService
Forward / api / checklist ke KBService
Checklist hidup dalam aplikasi Catatan dan dilayani oleh KBService di samping catatan sendiri; tanpa rute ini keseluruhan fitur jawaban 404 di gateway.
· KBService
Daftar cek API, dengan prasyarat server memaksa
/ api / checklist: list, get, create, update, delete, duplikasi, reset, clear-done, sequence ("do in order"), clear links, and per task add, edit, tik / untick, set prasyarat, move and delete. Setiap mutasi menjawab seluruh checklist sehingga setiap permukaan menarik kembali dari satu jawaban. Aturan hidup di ChecklistRules, murni dan melelahkan diuji, dan memegang satu invarian: tugas yang dilakukan tidak pernah menunggu yang terbuka. Sebuah kutu ditolak sementara prasyarat terbuka (409 PREQUIITES _ OPEN, nama mereka); sebuah untick yang tugas selesai bergantung pada ditolak kecuali cascade = true; sebuah link yang akan loop ditolak (409 CYCLE, dengan loop); sebuah link yang akan meninggalkan pekerjaan selesai menunggu pada pekerjaan terbuka perlu dibuka kembali = true (409 DIREQUIRED). Aturan yang sama jalankan di browser untuk umpan balik instan, tapi ini adalah salah satu yang memutuskan - sebuah lengket, kalender atau tab basi tidak bisa mendapatkan putaran itu. Hak cipta adalah aplikasi Catatan: VIEW _ NOTES untuk dibaca, CREATE _ NOTES, EDIT _ NOTES dan DELETE _ NOTES untuk mengubah. Mutasi membawa @ RetryOnDbKonflik dan benjolan versi checklist, jadi dua tab berdetak sekaligus serialisasi. buat _ checklists.sql adalah DDL, idempoten, diterapkan sebagai pemilik.
· kamo-shared-library
Checklist dan ChecklistItem entitas, repositori dan DTOs
Checklist adalah tipe record Note app kedua: work to get through, whose tugas dapat menunggu pada tugas lain. Tiga tabel - checklist, checklist _ items dan checklist _ item _ preerequisites - semua diketemukan oleh UUID sehingga tidak ada id pernah sebuah int64 sebuah browser bisa berputar. Teks tugas adalah ciphertext di bawah kunci catatan anggota. Baris checklist memuat sendiri buatan _ at / diperbarui _ at (EmbRecordState 's DATE _ UPDATED adalah insert / update = false dan tidak pernah bergerak) dan sebuah @ Versi service bump on every mutation, so concurt edits to one list collide Bukannya berpisah. DDL diterapkan dengan tangan * * * * * * * * * * * * * * * * * * tidak ada di sini menciptakan Meja.
· SecurityService
Browser- menghadap permukaan, dan gerbang kedua Guacamole
SecurityService adalah batas kepercayaan untuk Hosted Computers. Ini memegang sesi, hak dan org bagan; Layanan Komputer memegang kredensial Kubernetes dan tidak ada sesi sama sekali. Tidak ada hilir re- pemeriksaan hak dan tidak ada di sini menyentuh cluster. ID ORG tidak pernah diambil dari permintaan. Setiap perangko panggilan yang dimiliki oleh organisasi penelepon. A Hosted Computer adalah mesin yang ada di jaringan yang hanya melihat organisasinya sendiri dan internet, jadi penangan yang menerima id org dari tubuh tidak akan menjadi daftar bocor - itu akan menjadi pintu ke seseorang desktop lain. Path assign secara otomatis memecahkan email anggota target melalui pemilik penelpon organisasi, yang ganda sebagai cek keanggotaan: tanpa itu administrator bisa menetapkan komputer ke anggota id milik penyewa lain dan memiliki mesin dibangun dalam namespace org ini di bawah nama orang. Tiga kali taruhan berbeda, karena ada tiga pertanyaan berbeda. Mengatur kebutuhan Mengelola COMPUTERS. Membuka satu memerlukan komputer untuk menjadi milikmu, atau salah satu dari dua hak AKSES untuk memperluas itu - dan apakah pemanggil dapat membuka komputer itu dijawab dengan kembali meminta visibilitas yang sama pertanyaan menu nav dibangun dari, daripada oleh aturan kedua yang tidak setuju. Seorang anggota yang tidak pernah menunjukkan komputer tidak dapat mencapainya dengan menebak id. Mengkonfirmasi sandi tidak perlu benar sama sekali: itu adalah bagaimana komputer anggota sendiri mendapatkan login. CHART ORG DITEMUKAN HANYA KETIKA A KANAN NEDS IT, dan dalam satu query. AKSES _ SUBORDINATE _ COMPUTERS mencapai seluruh subtree di bawah anggota, sehingga tepi datang kembali sebagai pasangan dan arus traversal berjalan mereka atas satu set kunjungan - mandrierId adalah sebuah daerah profile free- form, bukan sebuah pohon validasi, jadi sebuah siklus adalah salah satu reorganisasi pergi. Seorang anggota tanpa hak membayar satu panggilan, yang penting karena nav meminta ini pada setiap halaman dimuat. TOKEN FORMAT SEKARANG DITEMBAK, TIDAK COPIED. GuacamoleTokenCodec diekstraksi dari Guacamole JsonAuth karena ada dua gateways: desktop. < domain > untuk platform admin dan komputer. < domain > untuk para penyewa, dengan kunci tanda tangan dan model koneksi berbeda. Dua salinan dari format yang akan menjadi satu implementasi dan satu kewajiban, dan kesalahan salinan akhirnya akan membuat adalah kesalahan 'berakhir' - ini dibaca seperti link TTL dan sebenarnya sesi terhubung kembali jendela, dan mendapatkan kosong salah daftar koneksi pengguna hidup diam-diam. Lantai dipaksa oleh kedua penelepon. HostedComputerSso adalah saudara daripada cabang. Gerbang itu menawarkan tiga target tetap dan menempatkan semua mereka dalam setiap token; yang satu ini memiliki satu koneksi per komputer, bernama setelah komputer, dengan satu waktu credential minted per peluncuran - jadi password milik anggota Kamo sendiri tidak pernah bepergian dalam sebuah token. Platform desktop harus menyimpan salinan yang dapat didekripsi dari sandi akun secara tepat sehingga Guacamole dapat login otomatis; ini tidak, dan itu adalah perbaikan. Password ChangeController sekarang menekan password baru ke komputer anggota. Ini adalah satu-satunya saat plaintext ada - Kamo menyimpan hash dan tidak membuat salinan reversibel di mana saja - dan dorongan adalah upaya terbaik oleh konstruksi: kegagalan tidak boleh gagal mengubah anggota yang diminta, dan komputer tidur ditandai basi sehingga peluncuran berikutnya meminta konfirmasi. Tidak ada antrian, karena sebuah antrian sandi tersimpan sandi dengan penundaan. Suite: 2755 tes, 5 kegagalan, dan kelima adalah yang sama asal murni / utama menghasilkan - Tidak sah dengan EndpointRatchet pada PromotionCodeInternall Controller (ditambahkan oleh 9578ca0 dan tidak pernah ditambahkan ke baseline) dan empat * * * * * * * * * * * * * * * * * NPEs di Shooted JobStamp. Diverifikasi dengan berjalan baik di sebuah worktree bersih di asal / utama. Pengontrol saya sendiri melewati ratchet: setiap penanganan menyelesaikan sebuah sesi dan jawaban 401 tanpa satu. Kebutuhan H-Guac-sso rahasia untuk link mint, sampai ada jalur peluncuran mengatakan begitu jelas daripada menyerahkan kembali link yang mendarat pada layar error umum Guacamole.
· EmailService
Seorang anggota dapat menempatkan daftar cek pada kalender mereka, sekali
Checklist hidup di KBService dan kalender hanya memiliki KETIKA, jadi checklist terjadwal adalah acara anggota biasa yang membawa sourceType CHECKLIST, daftar cek UUID dan link dalam ke / catatan. Taut adalah turunan server- sisi, tidak pernah membaca dari tubuh, dan acara berjalan melalui anggota normal membuat jalur sehingga kalender berubah mempublikasikan masih kebakaran. Jadwal aktif kedua dari checklist yang sama adalah nama 409 yang pertama. GET * * * * * * * * * * * * * * daftar mereka untuk chip pada / catatan. Sebuah sunting masih tidak dapat mengubah tentang apa suatu peristiwa. Checklist pengingat menjaga jenis kalender dan mendapatkan ikon checklist.
· APIService
Meneruskan path agen komputer host, dan hanya jalur itu
/ api / hosted- komputer / agen / * * - > Layanan Komputer. Kebijakan jaringan komputer yang diselenggarakan menyangkal cluster seluruhnya - tidak ada basis data, tidak ada layanan, bahkan tidak ada cluster DNS - jadi satu-satunya cara untuk mesin virtual penyewa untuk memberitahu Kamo apapun adalah keluar ke internet dan kembali melalui api. < domain > seperti klien lain. Segala sesuatu tentang komputer didorong ke dalamnya; ini adalah jalan masuk tunggal. The NARROWNESS IS THE POINT. Saudara-saudaranya di bawah / api / hosted- komputer / adalah manajemen internal API: menugaskan komputer, mengubah ukuran, menghapus satu, membaca kapasitas penyewa lain. Gerbang ini SecurityConfig sepenuhnya berkomentar, sehingga jalur diteruskan adalah publik dan layanan upstream memiliki auth - wildcard di sini akan menerbitkan API penciptaan VM- ke internet. Itu adalah kesalahan yang sama / api / bulktext / inbound / * * ada untuk menghindari, dan alasan permukaan agen dibuat anak / agen bukan saudara dari rute manajemen. forward daripada forwardWebhook: Tidak seperti pembawa webhook tidak ada tanda-tanda pihak ketiga atas bytes mentah, dan kredensial adalah Otorisasi biasa: Header kurung - sebuah per- komputer rahasia diputar pada setiap bangun, yang ComputeService cek terhadap satu komputer. Titik akhir hanya menulis telemetri respon yang membawa apa-apa tentang organisasi, sehingga kredensial diangkat dari desktop penyewa sendiri membeli kemampuan untuk memposting tokoh penyimpanan desktop itu dan tidak ada yang lain.
· kamo-shared-library
Satu query untuk seluruh grafik pelaporan organisasi
find Umber and ManagerIds return every (memberId, manager) edge in one organization, for Hosted AKSES Komputer _ SUBORDINATE _ KOMPUTER kanan - yang mencapai seluruh subtree di bawah anggota bukan daripada hanya laporan langsung mereka. Alternatif adalah find DirectReportAnggota berjalan tingkat demi tingkat, yang merupakan query per level pada path menu nav hits pada setiap halaman beban, dan kedalaman adalah properti dari pelanggan org bagan daripada apa pun kode ini kontrol. Mengembalikan EDGES daripada subtree yang diselesaikan, karena traversal harus menjaga terhadap siklus: manajerId adalah referensi bentuk bebas pada profil anggota sendiri, bukan pohon validasi, jadi A pelaporan ke B sementara B melaporkan ke A adalah salah satu mis- klik atau satu reorganisasi pergi dan permintaan rekursif tidak akan kembali. Penelepon berjalan ini roti pertama selama set kunjungan. Filter cermin find Reports Anggota persis, termasuk JOIN LEFT eksplisit pada tm.user - implisit path join adalah sebuah INNER bergabung di JPQL dan akan diam-diam menjatuhkan setiap laporan yang baris pengguna adalah hilang, yang metode itu sendiri komentar catatan. Validasi oleh PustakaryQueryParseTest, yang menerjemahkan setiap @ Query di pustaka terhadap entitas nyata pemetaan. Yang penting di sini: Spring Data memvalidasi sebuah query yang terganggu ketika membangun kacang repositori, jadi jalan yang buruk compiles, melewati CI, kapal, dan kemudian berhenti layanan mengkonsumsi dari mulai sama sekali.
· kamo-internal
Kutipan inbox sosial dari pesan yang lebih tua nama penulisnya dengan kartu mereka
Kutipan sekarang mengambil penulisnya dari server (@ kamo / chat-core quote.senderAnggota), yang mengabaikan id kontak sosial sejak mediaservice ceee73e - kata kontak disimpan di bawah pemilik koneksi, dan kutipan yang digunakan untuk nama pemiliknya. Jadi nama rep dalam kutipan pesan lebih tua dari halaman yang dimuat membuka kartu mereka, seperti yang sudah dimuat. Sebuah pesan kontak dimuat ditolak di sini juga, apa pun server tua mengatakan.
· kamo-internal
Kartu menunjukkan ID anggota kepada mereka yang mengelola anggota
HR dan dukungan membaca id anggota dari tooltip pada rosters HR, yang diganti dengan kartu anggota (tooltip duduk di mana kartu terbuka). Rincian kartu sekarang membawa Anggota ID baris, dengan sama tombol salin sebagai nilai kontak, bagi pemirsa yang dapat membuka profil anggota tersebut - hak-hak yang mengelola anggota, Tuhan, dan anggota sendiri. Semua orang tidak melihat identitas.
· kamo-shared-library
Aplikasi, tiga hak, enums tingkat / negara dan entitas
ServiceType.HOSED _ COMPUTERS di id 37, TESTING daripada KOMPLETED. Panggung membawa berat badan di sini daripada menggambarkan kemajuan: AppCatalogService memecahkan 'available' sebagai 'stage = = COMPLETED', dan sebuah aplikasi tidak tersedia dilewati oleh loop auto- penyediaan FeatureController. Setiap KOMPLETED lainnya aplikasi tiba diaktifkan untuk semua 25 organisasi hari itu kapal; ini satu tangan keluar mesin virtual memegang RAM nyata pada cluster dua- node, sehingga harus diberikan per organisasi oleh operator yang telah melihat kapasitas. Tidak ada yang hilang - platform Apps & Features layar ada justru untuk mempublikasikan sebuah aplikasi secara independen dari panggungnya, sehingga baris menunggu di sana di bawah "Tidak Tersedia". Tiga hak di 326- 328, bukan 320- 322: check-out lokal adalah 30 berkomitmen di belakang dan 320 adalah Mengelola _ EMAIL _ OPT _ OUT. Baca IDS dalam file itu, tidak pernah urutan baris - 318-325 duduk ratusan baris di atas konstan yang terlihat terakhir. Ketiganya adalah akar dan tidak ada anak dari yang lain, yang merupakan keputusan yang layak direkam daripada Hitungannya. Manvage _ HOSED _ COMPUTERS gates the settings section; the two ACSESS rights gate HOUSE _ COMPUTERS komputer muncul dalam menu nav anggota. Perpisahan baik di bawah Kelangsungan akan salah dalam mahal Arah - memimpin IT yang perlu membuka mesin apapun akan tiba memegang layar provisioning, dan seorang manajer diberikan pandangan dari komputer tim mereka akan dapat mengubah ukuran mereka. Baik gerbang a anggota komputer OWN: itu bukan hak sama sekali, karena membuatnya satu memungkinkan pengaturan komputer untuk seseorang yang tidak bisa mencapainya. HostedComputer Tier and HostedComputer State bertahan dengan NAMA. Meja-meja ini baru, jadi tidak ada untuk melindungi dan tidak ada alasan untuk mewarisi reorder bahaya Astist Tipe dan ServiceType harus hidup dengan. Dua derivations di tingkat yang rendah dan keduanya gagal tenang tanpa mereka: - MinemumDiskGb () adalah memori tamu + 25. Sebuah komputer tidur dengan menulis RAM ke file swap sendiri, sehingga disk tanpa ruang untuk gambar menghasilkan komputer yang tidak pernah tidur - atau menulis parsial gambar dan sepatu bersih dengan sesi anggota hilang. Baik laporan apa-apa, sehingga lantai dipaksa daripada disarankan. - Permintaan Mib () menambahkan kubeVirt 's peluncur overhead, diukur di ~ 324 MiB pada desktop- 1 dan dibulatkan ke Kapasitas harus membandingkan dengan apa permintaan POD: cek yang hilang itu mengatakan komputer cocok dan kemudian meninggalkan podnya tanpa batas waktu, yang tidak dapat dibedakan dari komputer yang tidak pernah muncul dan log apa-apa anggota dapat melihat. * * * * * * * * * * * * * * adalah apa kapasitas perencanaan subtracts, dan ASLEEP sengaja tidak di dalamnya - itu adalah fitur keseluruhan. Pause KubeVirt sendiri "membekukan proses tanpa melepaskan CPU sumber daya, tapi memori tetap dialokasikan, "jadi tidur di sini berarti suspensi -to-disk: VMI dan nya pod peluncur hilang dan permintaan memori kembali dengan penjadwal. Penyimpanan adalah salah satu pasangan dapat dibuang dengan makna ketiga dan tidak boolean. Langit-langit di atas disk saat ini "tak terbatas" sebagai anggota mengalaminya; ketidakhadiran langit-langit berarti disk tidak tumbuh. Tidak ada 'Bendera' tak terbatas karena bendera set tanpa langit-langit adalah konfigurasi yang diam-diam makan cluster - aturan StorageAutoExpandanSweep sudah memaksa untuk file, untuk alasan itu merekam. Phimodule.HOSED _ COMPUTERS adalah BLOCKED _ NO _ BAA, dan alasannya adalah properti dari hal daripada celah dalam dokumen. Setiap modul lain adalah permukaan yang dikenal dengan aliran data yang dikenal; ini adalah desktop seseorang dapat menginstal apapun pada dan menempelkan apapun ke dalam, dan Kamo tidak dapat menginventarikannya tanpa menonton layar. Isolasi ini benar-benar kuat dan bukan itu yang diminta BAA. Juga dipetakan KAMO _ UNIVERSE, CHESS dan HOLDEM, yang dikirim tanpa PhiModule dan kiri PhiServiceTypeMapping Tes merah. Bukan milikku, tapi tes gagal pada kesenjangan pertama ia menemukan, jadi tanpa mereka tidak dapat membuktikan HOSED _ KOMPUTERS dipetakan baik. Mereka mengambil Gamework, yang orang tua mereka sendiri mengambil. Suite: 3026 tes, dan 4 kegagalan yang tersisa adalah yang sama asal murni / utama menghasilkan - ReportVisibility Uji (Koordinat PlatormRightType, tak tersentuh di sini), penyimpanan weII GROTH _ REQUEST _ IMAGE uji domain, dan SystemBugCountContractTest NoSuchMethod. Yang akan menghanguskan sampai ke kulit luarnya. Di sana terdapat sembilan belas malaikat yang akan menjaga dan menyiksa penghuninya. pohon kerja di asal / utama sebelum mengubah apa pun. Table berada dalam * * * * * * * * * * * * * * dan telah diterapkan ke database langsung.
· kamo-internal
Jawaban ke nama pesan yang lebih tua penulisnya dengan kartu mereka juga
Pindahkan @ kamo / chat-core ke 0.1.19, kutipan jawaban yang membawa serverMenmberId: server parentSenderMenmberId ketika mengirim satu (kosong untuk pengunjung web- chat, yang kata-kata disimpan di bawah anggota sistem), selain anggota induk dimuat. Sebelumnya, konsol hanya bisa membaca penulis saja induk dimuat, sehingga jawaban ke pesan lebih tua dari halaman dimuat dikutip nama polos. - Rekan obrolan (MessageList) mengambil penulis kutipan seperti itu. - Tiket menerapkan aturan wajah gelembung mengikuti untuk itu - hanya penonton sendiri sisi, sekali sisi Yang sekarang memegang untuk orang tua yang tidak berbeban juga. - Inbox sosial menjaga aturan mereka sendiri (orangtua dimuat dari salah satu repetisi organisasi): server tidak menahan id kontak sosial, karena kontak disimpan di bawah anggota sistem. packace- lock.json: versi masukan inti, diselesaikan dan integritas (diperiksa terhadap diunduh tarball); ketergantungan yang disematkan (@ kamo / net 0.1.2, @ kamo / realtime 0.1.1) tidak berubah.
· KlusterServices
Pulau-org VM, suspending-to-disk, dan gambar emas berlabel putih
Komputer Linux milik seorang anggota, berjalan sebagai VM KubeVirt di dalam namespace organisasinya dan Dibuka dari browser. Pisahkan dari desktop / dalam segala hal: yaitu satu bersama mesin untuk aplikasi admin, sengaja pada jaringan pod sehingga dapat mencapai basis data, NAS dan MinIO. Ini adalah mesin penyewa yang menentukan properti sebaliknya. Tiga fakta berbentuk ini, dan masing-masing bertentangan membaca jelas: - Mengistirahatkan VM membebaskan apa-apa. Docs KubeVirt: berhenti "membekukan proses tanpa melepaskan CPU Sumber daya, tapi memori tetap dialokasikan ". Jadi tidur adalah menangguhkan-untuk-DISK - tamu menulis nya memori ke swap dan kekuasaan sendiri off, pod peluncur berakhir, dan permintaan memori pergi kembali ke penjadwal. Yang membutuhkan RunStrategy RerunOnKegagalan, didokumentasikan untuk membiarkan seorang tamu menutup itu sendiri turun tanpa menjadi relaunched; di bawah Selalu tidur akan dibatalkan dalam hitungan detik. - Headroom dibatasi oleh penjadwalan REQUESTS, bukan RAM fisik. Sebuah pod peluncur yang tidak cocok duduk Pending selamanya, yang terlihat persis seperti komputer yang tidak pernah muncul dan log apa-apa. Jadi kebangkitan ditolak sebelum dicoba, dan penolakan nama nomor tersebut. - Identitas Cilium tak bisa dicocokkan dengan aturan CIDR. * * * * * * * * * * * * * * * records that from an outage, where toEntity [host, remote-node] had to be added to ALLOW node. Di sini fakta yang sama adalah pertahanan terbalik: tidak ada nama aturan mereka, dan default - menyangkal. Ya! egressDenies mereka sehingga tidak ada editing kemudian dapat membuka mereka - Cilium menyangkal mengalahkan setiap memungkinkan, dari file apapun. Isolasi lebih menegaskan daripada ditinjau. canary / verify-isolation.sh menjalankan pod membawa yang sama kamo.io / hc-org label sebuah pod peluncur membawa, sehingga mendapat identitas yang sama dan kebijakan yang sama, dan probe kedua arah: node, kube-apiserver, Yugabita DB, NATS, MinIO, kube- dns, metadata alamat dan komputer org lain harus semua tidak dapat dicapai; internet dan same-org komputer harus bekerja. Ini juga melaporkan, tanpa menegaskan, apakah upstream router jepit rambut - api.kamocrm.com memecahkan ke 47.181.8.84 sementara Traefik 's LoadBalancer IP adalah sendiri K1m1 192.168.4.22, sehingga agen detak jantung adalah upaya terbaik oleh konstruksi dan tidak ada yang tergantung pada hal itu. White- labeling tidak perlu ada distro building, yang diperiksa permukaan oleh permukaan pertama. Setiap terlihat Identitas Xubuntu adalah konfigurasi atau paket yang dapat dilepas. strip- distro- identity.sh menghapus mereka dan pin mereka sehingga apt tidak dapat mengembalikan mereka - berkas bayangan datang kembali pada upgrade berikutnya dan kegagalan adalah Penyewa melihat logo orang lain seminggu kemudian. Gambar kapal emas tanpa logo dan tanpa warna sama sekali; agen melukis mereka per org dari Perilaku & Labeling, menghormati aturan bahwa penyewa tidak pernah melihat gambar KamoCRM. Agen adalah stdlib- hanya dan tidak dapat memanggil, karena kebijakan jaringan berarti tidak ada seorang pun untuk Call. Config ditekan masuk, keputusan tidur adalah lokal sehingga bertahan dari pemadaman Kamo, dan hibernasi kesiapan diverifikasi (ukuran swap, resume = AND resume _ offset =, disk in / sys / power / state) sebelum timer idle dipersenjatai - hibernasi salah dikonfigurasi tidak meningkatkan, itu sepatu bersih dan kehilangan sesi. 26 tes meliputi aritmatika ditambah validasi masukan branding. * * * * * * * * * * * * yang diterapkan oleh tangan (ddl-auto adalah tidak ada dan InisializerService bukan digunakan) dan telah, terhadap database langsung sebagai pemilik. Ini membutuhkan hibah resep yang ada tidak disebutkan: sebuah NEW schema tidak memiliki ACL, sehingga hak baku global yang tersisa kamo _ app dengan "ijin ditolak untuk skema host _ komputer" pada insert pertama. Diverifikasi setelah. Setiap manifest divalidasi dengan kubectl menerapkan --dry-run = server.
· kamo-shared-library
Biarkan pemanggil menyelesaikan MediaObjImg oleh id Img saja
Pencitraan akhir layanan dokter (download / stream / list / delete) tahu id Img tetapi tidak memiliki alasan untuk menahan MediaObj itu melekat - sampai mereka membutuhkan untuk menghormati chat- lampiran mencabut bendera di atasnya (MediaObjImg.isAccessRevoked) tanpa memiliki skema obrolan / media sendiri. Hanya MediaObjImgRepositori didukung arah lain (oleh obj id, diurut, untuk merender satu pesan lampiran). findByImg _ Id menutup jeda; plural karena unik batasan pada (OBJ _ ID, IMG _ ID), tidak pada IMG _ ID saja. Tes baru: MediaObjImgRepositoryQueryTest, piting query 's turunan signature jalan * * * * * * * * * * * * * * * sudah tidak untuk its repositori sibling (pustaka ini tidak dapat dijalankan @ DadaJpaTest / H2 harness, jadi a turunan no- @ Query metode dispesifikasikan oleh refleksi daripada dilaksanakan). Suite penuh: 3013 tes, 4 sebelum-ada kegagalan + 1 sebelum-ada error, semua dikonfirmasi hadir pada checkout asal / utama bersih sebelum perubahan ini dan tidak berhubungan dengannya (PhiServiceTypeMapping Test: ServiceType.KAMO _ UNIVERSE tidak PhiModule; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * tidak diklaim oleh Domain Storage; ReportViolyTest: off-by-satu laporan count; SystemBugCountContractTest: SystemBugRepository.findIooked drift tanda tangan).
· DaemonService
Lipat buku besar utama setiap 30 s dan kaitkan ulang mereka malam; pemicu pekerjaan membutuhkan rahasia cluster
Buku besar utama (layanan keamanan create _ lead _ ledgers.sql, diterapkan 2026-09-22) menggantikan countt (*) melalui 796k.lead pool and over lead _ kredit dengan total dipertahankan ditambah tambahan-hanya jurnal yang baris pemicu menulis. Layanan ini membuat mereka dilipat dan jujur: - LeadLedgerFoldJob (setiap 30 s): satu pernyataan per batch menghapus baris jurnal dan menambahkan mereka ke totals, sehingga pembaca melihat sosok sebelum atau setelah, tidak pernah setengah. Pembaca sudah menambahkan jurnal ke total, sehingga biaya kutu tidak terjawab membaca waktu, tidak pernah benar. Setidaknya 40 batch 5.000 per tik. - LeadLedgerReconcileJob (03: 40 malam): recounts setiap kolam org dan kredit setiap anggota yang tersedia dari baris dan membandingkan mereka dengan total + jurnal dalam pernyataan SATU (satu snapshot). Perbedaan adalah APPENDED sebagai 'REKONCILE' deltas, tidak pernah ditulis lebih dari total, sehingga penghitungan ulang tidak dapat ras pemicu atau lipatan. Ini juga nama setiap pemicu jurnal yang hilang atau dinonaktifkan. Dalam sistem yang sehat ia menemukan Tidak ada, jadi setiap koreksi dicatat di WARN. Keduanya adalah @ DiscowlowContraceActiontion dan coba lagi pernyataan Yugabita DB selain 40001 (masing-masing adalah atom, sehingga retry tidak dapat double count). SQL dimainkan ulang melawan Yugabita-teDB sebelum pengiriman ini (temp tabel: pemicu, baca, lipat dan hitung ulang, 60 cek). JobTriggerController: POST / api / daemon / trigger / {job} dan GET / status menjawab siapa pun. SecurityConfig mengijinkan semua, dan daemon- rute IngressRoute menempatkan layanan ini pada entrypoint web publik yang aman (Host daemon.prooral.kamocrm.com; disorot 200 anonim), jadi pekerjaan apapun - sekarang termasuk reccount - bisa dimulai dari internet, banyak salinan tumpang tindih seperti kolam renang Quartz. Keduanya sekarang membutuhkan X-Internall -Auth = mlos.proceal-secret (constant-time) dan menolak semua orang ketika rahasia itu tidak diatur. Tidak ada di platform panggilan titik akhir ini; operator masih bisa, dari dalam cluster. Tes: LeadLedgerMaintendaridtest (lipatan loop dan cap, mengingat laporan, pemicu hilang, coba lagi aturan, dan bentuk SQL yang membuatnya aman di samping lalu lintas langsung), JobTriggerControllerAuttest.

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit