Jump to content
KAMOUniverse

Changelog

Ada kabar baru.

Setiap perbaikan pada platform, sebagai kapal.

  1. · VOIPService

    Persist panggilan dan asosiasi panggilan, teks dan voicemail dengan lead

    Panggilan tidak pernah direkam di mana saja - VoipCallCallEventService menerbitkan acara NATS untuk peramban dan menyimpan apa-apa, dan RECORDINGS hanya ada ketika audio adalah ditangkap. Sinkronisasi perinstance sekarang menarik riwayat panggilan melalui PhoneProvider abstraksi dan upserts PHONE _ CALL _ LOG, keyed on (instance, provider call id). Itu adalah satu-satunya rute yang bekerja untuk FreePBX dan Microsoft Teams, keduanya yang menawarkan sebuah per- call webhook yang dapat digunakan. Penyapuan adalah penulis tunggal. Persisting from the RingCentral webhook as well dicoba dan dihapus: pemberitahuan tersebut membawa teleponySessionId sementara call- sejarah API kembali id rekaman yang berbeda, sehingga dua penulis dihasilkan dua baris dan dua entri timeline untuk satu panggilan. Panggilan dikaitkan dengan sebuah ekstensi hanya ketika ekstensi yang sebenarnya pada Call. Titik akhir RingCentral adalah ekstensi / ~ dan mengabaikan argumen, jadi looping per ekstensi akan file setiap anggota panggilan di bawah mana loop terakhir dikunjungi. Ids rekaman diselesaikan per halaman via Recording Lookup Service, sama memperkaya softphone sejarah mendapat - tanpa itu tab tahu rekaman ada tapi tidak bisa memainkannya. Teks link di send / receive; voicemail link di sync.

  2. · InitializerService

    Skema dan konteks benih titik untuk komunikasi memimpin

    Hibernasi menciptakan tiga tabel baru dari entitas shared- lib; ini menambahkan apa yang tidak dapat mengekspresikan - indeks parsial unik yang membuat paling satu terbuka kotak-titik jendela per (lead, slot), dan DESC meliputi indeks untuk Pemindaian keyset timeline. Benih membuka jendela pertama untuk setiap petunjuk yang mendahului indeks. Bukan komunikasi back- fill: tidak ada panggilan atau pesan historis diasosiasikan ke apa saja. Tanpa itu memimpin pre-existing tidak memiliki titik kontak sama sekali dan bisa tidak pernah cocok dengan panggilan masuk, jadi setiap tab akan tetap kosong selamanya. Ini berjalan melalui LeadContactPointService daripada dalam jumlah besar INSERT.. SELECT so ada persis satu implementasi canonisation. Sebuah kembar SQL akan untuk memperoleh digit stripping, penanganan NANP, lantai ekstensi dan alamat membuka pembungkus, dan divergensi kemudian akan terlihat - baris akan Hentikan pencocokan lalu lintas langsung. Terapan terhadap produksi: 66 titik kontak dibuka di 45 lead.

  3. · kamo-shared-library

    Point-in-time contact- point indeks dan link komunikasi memimpin

    Tambahkan tulang belakang yang disebut dari tab Komunikasi. LEAD _ CONTACT _ POINTS mencatat setiap nomor telepon dan e-mail yang pernah ada, sebagai jendela dengan activeFrom / activeTo. LEAD _ COMUNIKASI mencatat tahan lama link antara lead dan satu panggilan, voicemail, teks atau email, ditulis di saat itu terjadi terhadap titik kontak hidup pada saat itu - begitu berubah nomor lead yang mengikat lalu lintas masa depan saja dan meninggalkan sejarah persis seperti itu. PHONE _ CALL _ LOG adalah catatan panggilan platform tidak pernah memiliki: RECORDINGS hanya memiliki baris ketika audio ditangkap, sehingga tidak terjawab dan tidak direkam panggilan meninggalkan jejak. ContactCanon adalah definisi tunggal dari "nomor yang sama" untuk keseluruhan platform; LeadController.canonical Telepon sekarang delegasi untuk itu sehingga pencarian terbalik dan pencocokan komunikasi tidak bisa tidak setuju. Pembatas PointService LeadCommunicationLinker sengaja TIDAK stereotip - sebuah shared-lib @ Service membutuhkan sebuah repositori startup konteks gagal dalam setiap layanan yang belum ditambahkan paket, yang telah mengambil produksi turun tiga kali. Layanan memiliki menyatakan kacang; LeadService membawa mereka @ Autowired (dibutuhkan = false) sehingga masih kabel di tempat lain.

  4. · MediaService

    Menangkap demo memimpin sebelum langkah pemesanan

    Bentuk demo pemasaran mengumpulkan nama, email, perusahaan, ukuran perusahaan, Industri dan pesan, kemudian maju ke penjadwalan tanpa memberitahu siapa pun. Penciptaan timbal tinggal hanya di dalam * * * * * * * * * * * * * * setiap pengunjung yang tidak menyelesaikan pemesanan - termasuk setiap pengunjung sama sekali sementara tidak ada ketersediaan diterbitkan - dibuang setelah menyerahkan mereka rincian. - POST * * * * * * * * * * * * * * * * * *) menulis memimpin pada sendiri. Owning org berasal dari X- Public-Chat-Organi- Id header perangko APIService dari kunci validasi, tidak pernah dari tubuh. - FindOrCreatePublicLead sekarang jalan tunggal menulis untuk ketiga permukaan publik (bentuk demo, jadwal, bergabung), jadi satu pengunjung menghasilkan satu petunjuk Namun banyak langkah mereka lengkap. Ini cap org "KamoCRM" / "Demo Permintaan "produk vendor dan mengambil pasar dari penjual itu, dan itu rute melalui LeadService.createLead bukannya menyimpan entitas langsung - yang Simpan inline lama tidak menghasilkan riwayat baris dan tidak ada event LEAD _ CREATED, sehingga mereka lead tidak pernah muncul dalam jaringan yang sudah terbuka. - Ukuran perusahaan, industri dan pesan pengunjung disimpan sebagai sejarah utama entry; Lead tidak memiliki kolom untuk salah satu dari mereka dan mereka adalah bagian salesman benar-benar membaca. - GET / api / public / webinar / tipe memungkinkan halaman publik menemukan tipe id bukan daripada membawa salinan hardcode, dan slot / tersedia sekarang juga kembali availableTimes - tersedia yang sama diselesaikan terhadap pemilik org zona waktu ke dalam instant yang dapat diposting kembali sebagai schedledStartTime.

  5. · kamo-shared-library

    Demo publik meminta proses penangkapan utama

    Seorang pengunjung yang mengisi dalam bentuk demo situs pemasaran tetapi tidak pernah buku waktu tidak meninggalkan jejak: lead hanya pernah ditulis di dalam transaksi pemesanan. Menangkap itu di depan kebutuhan tiga potong perpustakaan tidak memiliki. - * * * * * * * * * * * * * * cocok dengan penyerahan pengulangan kembali ke memimpin bentuk yang sama sudah diproduksi. Menyamar ke produk penjual daripada ke email saja sehingga bentuk anonymous tidak pernah dapat mengadopsinya (dan cap ulang) memimpin Staf yang dibuat untuk alamat itu. - PublicWebinarDateSlotsDTO: ketersediaan diselesaikan dalam instant absolut. The slot disimpan adalah tanggal lokal plus waktu wall-clock tanpa zona, dimana browser tidak dapat berubah menjadi sebuah StartTime yang dijadwal. - PublicWebinarTypeDTO: sebuah tipe webinar tanpa daftar presenter, sehingga publik halaman dapat menemukan tipe id tanpa alamat email presenter bocor.

  6. · kamo-internal

    Penyiapan Pendaftaran dalam navigasi, dan tulis tip singkat

    Tab Setup Penyedia yang diberikan dalam Tampilan SettingsView tetapi hanya dapat dicapai oleh mengetik URL - itu hilang dari kedua tempat bahwa daftar pengaturan tujuan: pengaturan menu nav dan pengaturan halaman pendaratan. Sekarang mengarah masing-masing, pencocokan urutan tab, karena yang penyedia host pertemuan memutuskan yang dari pengaturan lain bahkan tersedia. Tips cepat pada lima tab yang ada tidak pernah ditulis - setiap string adalah a placeholder ("Help Heading", "Bullet Lobby Judul"). Mereka sekarang mengatakan sesuatu, dan menutupi pengaturan ditambahkan untuk Zoom dan Teams: kontrol in- rapat, passcode kebijakan, bypass lobi dan peran presenter, rekaman remote menarik dan transkrip, dan provider - dikirim undangan. Setiap tab juga menjelaskan di mana penyedia berbeda, jadi kontrol cacat memiliki alasan yang dinyatakan bukan hanya terlihat rusak.

  7. · kamo-internal

    Paksa aturan akses geo dan IP pada loads halaman

    checkAccess dievaluasi aturan itu sendiri dan tidak cocok untuk seluruh hidupnya: itu perbandingan tipe aturan terhadap * * * * * * * * * * * * * * * sementara penerbit menulis nama enum WHITELIST / BLACKLIST / TEMP _ BLOCK. Geo adalah komentar yang mengatakan Node memiliki tidak ada basis data GeoLite. Kedua bagian hilang - sekarang membaca vonis SecurityService cache di Redis dan meminta bahwa layanan pada kehilangan, sehingga ada satu implementasi kebijakan dan tidak ada salinan tersisa di sini untuk melayang. Alamatnya adalah hop publik yang paling benar di X- ForwardedFor daripada yang paling kiri. Proxy append, sehingga elemen kiri adalah apa pun klien yang dikirim, dan membacanya akan telah membiarkan header memutuskan negara mana pengunjung diperlakukan sebagai berada di. Seorang pengunjung diblokir sekarang mendapat dokumen 403 polos bukan JSON mentah - ini mencapai peramban melakukan navigasi tingkat atas. Ini nama tidak ada aturan dan negara: pembaca tidak dapat melakukan itu, dan seseorang menyelidiki batas tidak boleh diberikan peta itu. Gagal membuka setiap jalan. Proksi yang memblok saat Redis sebentar tak bisa dihubungi Seluruh penyewa offline.

  8. · APIService

    Memaksa aturan akses penyewa pada gateway

    Filter ini telah inert sejak ditulis. resolveOrganiId read org: domain: < host > dari Redis, tidak ada yang pernah menulis kunci itu, dan kembali null jatuh melalui untuk memungkinkan; cabang geo adalah sebuah blok IF-kosong dengan sebuah komentar detending ke SecurityService, yang Tidak menegakkan baik. Setiap permintaan berlalu. Sekarang membaca vonis cache SecurityService dan meminta bahwa layanan pada miss, sehingga kebijakan tinggal di satu tempat daripada diimplementasikan kembali di sini. Hot path adalah satu Redis baca; sebuah kehilangan biaya satu short-timeout HTTP panggilan per organisasi dan alamat per 30-an. Alamat klien adalah kanan - kebanyakan umum hop X- ForwardedFor. Proxy append, so the elemen kiri attacker-diberikan - membacanya akan membiarkan header memilih yang Negara permintaan dinilai sebagai berasal. Exempt probe litness, CORS preflight dan keputusan titik akhir itu sendiri, dan tidak pernah hakim cluster- alamat internal: layanan-ke-layanan lalu lintas tidak memiliki negara dan Menghalangi itu akan mengambil platform bawah. Buka di setiap jalur, dengan tes per ketergantungan. Ini duduk di depan semua penyewa Lalu lintas API, jadi filter yang memblok ketika Redis lambat adalah pemadaman total. Juga tetes * * * * * * * * * * * * * * * - template scaffolding dari commit awal, dalam sebuah paket tanpa konfigurasi @ SpringBootConfig ke menemukan. Ini tidak pernah berlalu; CI membangun dengan -DskipTests sehingga tidak ada yang melihat. Menghapus itu membuat 'mvn test' dapat digunakan di sini.

  9. · SecurityService

    Sebenarnya peraturan akses geo dan IP

    Aturan disimpan, cache untuk Redis dan tidak pernah berkonsultasi. Controller AccessCheckController pemanggil hanya dari evaluasi dan tidak ada yang disebut AccessCheckController; APIService 's filter orgs diselesaikan dari tombol Redis tidak menulis dan memperlakukan miss sebagai izin. Mengkonfigurasi blok geo tidak melakukan apa-apa. Layanan AccessdecisionService sekarang otoritas tunggal. Login menyebutnya secara langsung, pintu gerbang filter dan aplikasi kamo- internal mencapai keputusan yang sama melalui titik akhir cek, dan kebijakan ada sekali bukannya sekali per lapisan. Node copy telah hanyut jauh cukup untuk mencocokkan apa-apa: itu dibandingkan tipe aturan ke "whitelist" / "sementara-blok" sementara penerbit menulis WHITELIST / TEMP _ BLOCK. Resolusi GeoLite cached di Redis untuk satu hari, positif dan negatif, dan melompat alamat pribadi sepenuhnya. Alamat berasal dari header, jadi tanpa cache negatif penelepon berputar bogon mengubah setiap permintaan menjadi probe segar dari 5.7M-row tabel - bentuk DoS findByIpInRange sudah ditulis ulang sekali untuk menghindari. ClientIpresolver membaca RIGHT-most public hop dari X- ForwardedFor, bukan kiri-paling. Elemen kiri adalah apapun yang dikirim klien: proxy append, jadi "X- ForwardedFor: 8.8.8.8 "ditambah bundaran Traefik sendiri akan membiarkan siapa pun memilih negara blok mereka Divonis terhadap. Setiap aturan geo akan menjadi salah satu header jauh dari bypass. Buka seluruh, per ketergantungan dan asserted per ketergantungan. Sebuah kontrol akses yang gagal ditutup pada Redis bergetar mengunci setiap penyewa keluar dari platform, yang lebih buruk insiden daripada jendela ditutup. Alamat putih juga melewati geo, jadi admin yang memblokir negara mereka sendiri terus jalan kembali masuk.

  10. · kamo-internal

    Platform kartu pendaftaran untuk aplikasi Zoom Marketplace

    Selesaikan satu jalur sambungan Zoom. Backend telah memecahkan PlatformOAuthority ProviderType.ZOOM, tetapi tanpa kartu di sini operator platform memiliki tempat untuk memasukkan kredensial Marketplace, sehingga pertemuan Penyiapan Penyedia layar selalu melaporkan satu-klik koneksi sebagai tidak terdaftar. Opsional dengan desain: jalur per-org Server- to- Server tidak perlu apa-apa di sini dan tetap standar yang direkomendasikan, jadi kartu kosong hanya terus satu klik tersembunyi. Pertemuan tim menggunakan kembali pendaftaran Microsoft 365 yang ada.

  11. · kamo-internal

    Microsoft Teams Phone provider, front to back

    Adds Teams to **************** and wires the whole path through: provider selection, the Entra + Azure Communication Services config, tenant admin consent, the per-member connect, and an in-browser softphone. The softphone is the part that differs structurally from every other provider. Teams exposes no SIP registrar to third parties, so a Teams line cannot be registered with SIP.js or RingCentral's WebPhone. The supported route is Azure Communication Services' custom Teams endpoint: the backend exchanges the member's Entra token for an ACS token, and TeamsAcsPhoneSdk turns that into a call agent behind the same PhoneSdk interface the SIP adapters implement, so useSoftphone and every UI component stay provider-agnostic. SipCredentials gains optional acs* fields; sipInfo is simply empty for Teams. The ACS bundle is browser-only and imported dynamically inside start(), since a static import would break server rendering. Two Teams-specific truths surfaced in the UI rather than left to fail at runtime: in-browser calling is optional (leave ACS blank and the org still gets presence and call history, with the dialler hidden rather than erroring), and voicemail is off by default because Teams has no voicemail API — messages land in each member's Exchange mailbox, so reading them is a materially wider consent that an admin should opt into deliberately. The member connect card on the phone-settings tab is now provider-aware instead of RingCentral-only. Both providers need a per-member authorization, for different reasons: RingCentral because a softphone may only register as the connected account's own extension, Teams because presence writes and the calling token exchange are delegated-only. Branding: the tile uses the Microsoft corporate mark and the plain product name. Microsoft permits naming Teams to describe an integration but restricts Teams logos and branding to certified Teams partners, so no Teams glyph is shipped. Verified: npm test — 40 files, 394 tests, 0 failures; tsc --noEmit clean; the i18n key guard and client-navigation guard both pass. Dictionary strings landed first in kamo-translation-dictionary 0801a17.

  12. · VOIPService

    Telepon Microsoft Teams sebagai penyedia

    Tim bukan satu API, jadi penyedia lem tiga pesawat kontrol bersama-sama: Grafik, app-only - call history (getPstnCalls), present reads, directory dan persediaan perangkat tim. Catatan panggilan adalah peralatan izin oleh desain; Microsoft menyatakan jelas bahwa mereka tidak memiliki bentuk delegasi. Grafik, delegasi - kehadiran menulis (Kehadiran. ReadWrite hanya ada sebagai delegated, self-only permission) dan voicemail, yang hidup di anggota Pertukaran kotak surat karena tim tidak memiliki sumber suara sama sekali. Layanan Komunikasi Azure - Telepon lembut In- browser pada anggota sendiri Jalur telepon tim, melalui custom Teams titik akhir pertukaran token. Ini adalah hanya rute yang didukung: Tim tidak mengekspos registrar SIP ke pihak ketiga, dan Grafik memanggil API bergabung sebagai robot daripada sebagai pengguna. Kemampuan dihitung dari apa yang sebenarnya dikonfigurasi untuk daripada hardcode, jadi org tanpa laporan ACS voicls = false dan UI Menyembunyikan dialog bukannya permukaan 501 mid- panggilan. Disengaja absen, karena tidak ada Microsoft API di versi manapun: SMS dari nomor Teams, panggil antrian, panggil penerusan, auto- jawaban, dan mulai / berhenti merekam. Mereka tetap pada interface default yang meningkatkan 501. Hasil kredensial perinstance pertama (sebuah org register aplikasi Entra sendiri - bentuk perusahaan umum, dan perlu apa-apa dari platform Kamo) dan Kembali ke lapangan ke baris MICROSOFT _ TEAMS dalam platform registry OAuth. Onboarding berjalan dalam dua hop karena penyewa harus ditemukan sebelum dapat disematkan: sebuah tanda admin dalam, id _ token 'tid' memberikan penyewa nyata, maka mereka dikirim ke penyewa / v2.0 / adminpersetujuan. Consent dikonfirmasi oleh mengambil token aplikasi dan memanggil Graph - Microsoft mengembalikan admin _ agretion = Benar bahkan pada kegagalan, dan memperingatkan bahwa 'penyewa' redirect parameter adalah forgable, jadi tidak dipercaya. Kedua Tim mengalir dan anggota dalam mendelegasikan sambungan multiplex ke / api / voip / oauth / callback, satu jalan sudah publik di gateway, sehingga APIService tidak membutuhkan rute baru. Ubah pemberitahuan naik yang ada / api / voip / webhook untuk alasan yang sama. Jabat tangan Grafik berbeda dari RingCentral - a? validasi Kuiri token parameter bergema sebagai teks / polos - dan dijawab sebelum apa pun, karena Grafik tetes pemberitahuan selama sepuluh menit jika titik akhir lambat. Berlangganan diciptakan tanpa filter dengan tujuan: filter berlangganan masih menargetkan koleksi 'partisipan' warisan yang berhenti mengembalikan data pada bulan Juni 2026. Dua kelemahan yang ada sebelumnya tetap karena Tim membuat mereka load- bantalan: CallController, CapabylesController dan CallFeaturesController diselesaikan penyedia melalui getPrimaryForOrg - org tertua aktif instance dari APAPUN tipe. Yang hanya pernah tepat untuk single-provider org. Biasanya tim menjadi penyedia kedua, jadi setiap riwayat anggota, voicemail dan keadaan agen akan dilayani oleh penyedia manapun yang pertama dibuat. Mereka sekarang menggunakan Seorang anggota getForMember, mencerminkan apa SipController sudah dilakukan. Menghapus instansi anggota _ voip _ oauth _ token baris di belakang, karena ada tidak ada FK untuk cascade dari, dan mereka terus melaporkan "terhubung". Diverifikasi: tes mvn - 133 tes, 0 kegagalan (49 baru).

  13. · kamo-internal

    Penyedia tab Setup dan pengaturan pertemuan berbalabilitas

    Tambahkan tab Penyiapan Menyetel ke / pengaturan / fitur / memenuhi dan membuat setiap lainnya tab jujur tentang penyedia itu adalah konfigurasi. use tidak lagi membangun memenuhi. < domain > / < kamar > dalam peramban - itulah yang membuat setiap pertemuan Kamo Meets pertemuan terlepas dari konfigurasi. Sekarang membuat pertemuan melalui backend dan menggunakan URL yang kembali penyedia, sehingga Pusat Interaksi, jendela alat obrolan dan direktori anggota semua rute melalui abstraksi tanpa perubahan mereka sendiri: mereka berbagi MeetingDialog, yang berbagi hook ini. - Setup provider: kartu penyedia dengan kotak cakupan settings-, sehingga biaya switching terlihat sebelum switch daripada ditemukan sesudahnya pada tab dari greed- out kontrol. Formulir kredensial hanya ditulis - server mengembalikan field mana yang telah diset, tidak pernah nilai-nilai mereka - ditambah uji sambungan langsung dan instruksi setup per-. - Pengawakutuan: useMeetProvider membaca pengaturan yang didukung oleh penyedia dan MeetSettingRow menonaktifkan sisanya dengan nama penyedia tooltip. Tak didukung pengaturan ditampilkan daripada disembunyikan, dan benar-benar dinonaktifkan daripada hanya redup, sehingga mereka tidak dapat diubah dengan keyboard. Menyelamatkan mereka sepenuhnya. Gating gagal membuka - pencarian kemampuan gagal menunjukkan segalanya, karena greying keluar layar kerja lebih buruk daripada menunjukkan kontrol backend akan mengabaikan. - Pengaturan baru dukungan penyedia lain: join-sebelum-host, in-pertemuan chat, berbagi layar, dia- dalam, autencated- pengguna -saja, panjang passcode dan embedding, over scope lobby, presenter and attendee controling, cloud recording, transkrip, rekaman download dan provider- dikirim undangan. - / meet / join / < ref > kini tersedia -aware: Kamo Meets masih mendapat satu kunci waktu Ditandai pada waktu klik, Zoom dan Teams mengarahkan ke URL penyedia sendiri. Ini menerima id pertemuan atau nama kamar, sehingga undangan dikirim sebelum perubahan ini Terus bekerja. - Link undangan email dibangun dari pertemuan UUID-validasi daripada nama kamar, menjaga aturan yang ada bahwa URL yang diberikan oleh klien tidak pernah ada Dipercaya pada sebuah email bermerek.

  14. · kamo-shared-library

    Tipe penyedia MICROSOFT _ TEAMS

    Tambahkan MICROSOFT _ TEAMS ke VoipProviderType. Enum berlanjut sebagai ORDINAL pada * * * * * * * * * * * * * * sehingga posisi load-bearing dan konstanta berlangsung terakhir; kelas Javadoc sekarang mengatakan begitu daripada meninggalkan berikutnya orang untuk menyimpulkan itu. Tidak ada perubahan DDL - kolom ORDINAL tidak membawa nilai whitelist, so this needs no KamoInitializer run. Tambahkan dua kueri turunan pada MemberVoipOOttoTapenRepositori: Dicari ByProviderandInstanceId - memetakan sebuah inbound operator identitas (sebuah Microsoft Entra objek id pada Tim call record) kembali ke anggota Kamo. DescenteByInstanceId - baris ini tidak memiliki FK untuk contoh, sehingga menghapus sebuah Operator meninggalkan mereka di belakang masih melaporkan "tersambung".

  15. · APIService

    Rute penyedia OAuth callback pertemuan

    Zoom dan Microsoft mengarahkan peramban ke gateway ini setelah sebuah otoritas org Aplikasi Kamo. popup tanah di sini tanpa sesi penyewa - perjalanan org di state - so the callback needs the sesionless, whis- stripping passing penyedia email callback telah menggunakan, bukan biasa / api / meet / * ke depan.

  16. · MediaService

    Bertemu penyedia abstraksi dengan Zoom dan Microsoft Teams

    Pertemuan adalah Kamo Meets oleh konstruksi - MeetService bertahan ruang Bertemu nama dan tidak ada yang lain. Ini memperkenalkan abstraksi dan dua penyedia remote di belakangnya. meet / provider mirror the email provider layer: MeetingProviderResolver perakit a MeetingContext (mandat didekripsi, hibah OAuth segar, kebijakan org, provider- sisi akun host) dan sebuah peta kapabilitas, sehingga penelepon meminta untuk MeetingScheduler daripada percabangan pada tipe penyedia. Menambahkan keempat Operator berarti menambahkan kacang, bukan mengedit situs panggilan. - KamoMeetProvider: penamaan kamar dan konstruksi URL, memindahkan server-side. The org- namesparing yang menghentikan dua penyewa berbagi konferensi Prosody yang digunakan untuk hidup di browser; sekarang disematkan oleh tes. - ZoomProvider: REST v2, Server- to-Server OAuth atau aplikasi Marketplace. atas nama anggota pengorganisasian, menarik rekaman awan dan transkrip. - MicrosoftTeamSprovider: Graphs onlineMeetings, app- hanya atau delegated. Its menghubungkan probe pertemuan penciptaan, karena kebijakan akses aplikasi Tim juga membutuhkan hal yang biasa dan admin meleset - izin saja Otentikasi halus dan kemudian 403 pada setiap pertemuan. Rapat Fitur adalah kontrak dengan UI admin: setiap penyedia mendeklarasikan pengaturan itu dapat menghormati, dan layar pengaturan menonaktifkan sisanya. Klaim adalah asserted dalam tes daripada dipercaya, karena penyedia over- klaim menghasilkan toggle yang diam-diam tidak melakukan apa-apa - kegagalan lapisan ini ada untuk mencegah. Menyediakan Rekaman Sapu menarik rekaman remote ke dalam penyimpanan Kamo sendiri jadi retensi, kuota dan rangkuman setelah rapat secara identik pada setiap penyedia. Unduhan tertutup: layanan ini juga melayani obrolan dan pertemuan di bawah 1Gi batas, sehingga rekaman terlalu besar dilewati dengan peringatan daripada risiko Pod. Kredensial dienkripsi dengan kunci platform yang ada, jadi tidak ada rahasia baru untuk diatur. Penanganan sesi yang dibagikan oleh titik akhir pertemuan pindah ke MeetSessionResolver - sengaja tanpa memperluas hak cek.

  17. · InitializerService

    Skema untuk multi- provider lapisan rapat

    Creates * * * * * * * * * * * * * dan org _ meeting _ oauth _ token, menambahkan kolom pengubahan untuk meeting _ RECORDS dan meeting _ RECORDINGS dan Pembesaran / Teams- pengaturan yang mampu ke ORG _ MEET _ CONFIG, dan backfills setiap ada organisasi ke baris eksplisit KAMO _ MEET / AKTIVE. Dua hal yang diajarkan pada kita, keduanya dikodekan di sini. Hibernasi 's ddl- auto build Pabrik Sesi sebelum setiap Perintah LineRunner, sehingga pernyataan TABLE CREATE normal no- op dan kolom tiba dengan tidak ada baku - backfill karenanya persediaan id dan penanda waktu secara eksplisit daripada mengandalkan mereka, itulah sebabnya versi pertama diam-diam dimasukkan apa-apa. Dan keunikan menyatakan pada entitas berarti Hibernasi mempertahankan keterbatasan sendiri, sehingga indeks bernama revisi sebelumnya ditambahkan adalah duplikat; mereka dijatuhkan di sini. Tambahkan com.kamo.z.shared.meet ke eksplisit @ EnableJpapositories daftar, tanpa yang repositori baru tidak memiliki kacang dan KI aborts sebelum kebakaran pelari.

  18. · kamo-shared-library

    Pertemuan model sebagai provider- agnostik

    Kamo Meets adalah satu-satunya backend yang mungkin: OrolMeetConfig adalah Pertemuan datar tas pengaturan dan MeetingRecord tidak mempunyai apa-apa kecuali nama kamar. Ini menambahkan Skema untuk menjalankan organisasi di Zoom atau Microsoft Teams sebagai gantinya. - meet.provider: MeetingProviderType / MeetingProviderStatus, per-org Organ MeetingProviderEntity (blob kredensial terenkripsi, keadaan last- diverifikasi) dan Organ MeetingOOtorisasi Entity, mencerminkan paket surel _ provider yang sudah ada mendukung penyedia surel abstraksi. - MeetingRecord memperoleh identitas penyedia hosting sendiri - ID rapat jarak jauh, join dan host URL, passcode, host account - sehingga pertemuan dapat bergabung kembali dan berdamai dengan siapa pun tuan itu. - MeetingRecording keuntungan provider RecordingId, yang terus menarik remote Alat perekam awan penyedia. - Organik MeetConfig memperoleh pengaturan Zoom dan Tim dukungan bahwa MeetConfig saja config tidak punya alasan untuk membawa: join-sebelum-host, passcode shaping, lobi pemeriksaan bypass, presenter dan attendee kontrol, rekaman awan, transkrip, Provider- dikirim undangan, dan pertemuan host fallback diciptakan di bawah ketika anggota tidak memiliki akun pada penyedia. Setiap org tanpa baris penyedia menjawab ke KAMO _ MEET, jadi ini tidak digunakan sampai admin memilih sebaliknya. Kolom yang diterapkan untuk produksi oleh KamoInitializer sebelum ini mendarat. PlatformOOthorProviderType memperoleh ZOOM (9) untuk aplikasi Zoom Marketplace; Teams pertemuan menggunakan MICROSOFT (3). Tes penjaga bergerak dengan itu, sejak enum dan tes pin nya bertahan tidak bisa mendarat secara terpisah.

  19. · kamo-internal

    Allow- list negara pada kartu geo- blocking

    Kartu hanya dapat menyangkal negara, sehingga org yang melayani satu negara harus menghitung Semua lainnya. Sekarang memiliki kedua daftar: sebuah mode pilihan toggle yang daftar negara yang dipilih tanah pada, dan dua tabel duduk berdampingan. Daftar perizinan kosong memungkinkan segala sesuatu tidak diblokir; yang tidak kosong menyangkal setiap negara tidak hadir dari itu. Pembalikan yang cukup drastis untuk menyatakan pada kartu daripada meninggalkan ke ditemukan, sehingga pemberitahuan di atas tabel mengatakan rezim mana yang berkuasa. Unik (org, negara) batasan menyimpan sebuah negara pada satu daftar, yang akan membuat tambahkan ke yang lain gagal, jadi setiap baris membawa aksi bergerak yang membalik itu melalui PUT sebagai gantinya.

  20. · SecurityService

    Allow- list negara bersama blok geo

    Seksi Geo hanya pernah ditolak: sebuah negara diblokir atau tidak hadir. Orgs yang ingin melayani satu negara harus menghitung masing-masing lainnya, yang tidak dapat diandalkan dan diam-diam salah saat kode negara baru muncul. org _ geo _ block _ rules.is _ blocked sudah ada dan hardcode benar, sehingga memungkinkan aturan adalah bahwa kolom set false - tidak ada skema berubah. Evaluasi: sebuah blok eksplisit menang, maka daftar memungkinkan menyangkal segala sesuatu absen dari itu, dan izin daftar kosong Semuanya tidak diblokir. Itu terus ada block-hanya orgs berperilaku persis seperti sebelumnya. publishGeoRules sekarang kapal kedua sisi aturan yang ditetapkan, karena memungkinkan aturan-bantalan sekali satu ada. Pembayaran cached ditulis sebelum perubahan ini tidak membawa daerah isBlocked dan survive the cache TTL across a outfin, so a missing field reads as blocked. Juga scopes setBlocked dan delete ke penelepon org. hapus aturan sebelumnya yang terselesaikan UUID sendiri, sehingga id dari penyewa lain akan dihormati.

  21. · kamo-shared-library

    Baca kualitas pada versi penyesuaian dan pedoman

    Harga yang dirakit adalah sel dasar PLUS penyesuaian ditumpuk ke atasnya, jadi menilai hanya juri sel setengah nomor: a bersih-baca 99.875 dengan salah baca -1.250 LLPA di atas masih harga yang salah. MlosPriceAdjustment sekarang membawa kualitas membaca dari satu penyesuaian, sehingga tanda-off gerbang dapat mengambil link terlemah di seluruh seluruh pertemuan. MlosGuidelineversion mendapat bidang yang sama untuk konsistensi dengan tulang belakang lembar-garis - ia sudah membawa sourceDokumentId, jadi ini melengkapi asalnya. Kedua null; null berarti NO SIGNAL daripada baik. Kolom yang diterapkan pada prod CockroachDB melalui KamoInitializer.

  22. · kamo-internal

    Buka tautan kembali ke aplikasi ini dalam tab anggota telah masuk

    Surat dalam panel bacaan membuka setiap link dalam tab baru, yang tepat untuk seluruh internet dan salah bagi kita. Email pemberitahuan kami hampir seluruhnya link kembali ke aplikasi, dan mengirim mereka ke tab segar membuang sesi anggota telah dan membuat mereka duduk melalui boot dingin untuk mencapai halaman tab ini bisa membuat segera. Asal yang sama adalah seluruh tes - byte- sama dengan halaman rendering email, bukan "terlihat seperti domain Kamo" dan bukan akhiran yang cocok di domain org. Itu adalah seperangkat dari URL sesi saat ini valid untuk, yang merupakan seluruh alasan untuk tetap dalam tab ini, dan itu tidak bisa diposefsebagaimana lewat surat: tuan rumah penyewa lain, a lookalike, atau ureninfo menunjuk host di tempat lain adalah semua asal yang berbeda dan pergi ke tab baru seperti link orang asing lainnya. Routing daripada menassign lokasi: sebuah dokumen penuh memuat air mata ke Rect pohon dan menghancurkan setiap jendela alat terbuka bersama dengan draft yang belum dikirim, itulah sebabnya Repo ini memiliki gerbang membangun melawan navigasi internal keras. Diubah dan tengah klik ditinggal sendiri - bahwa gerakan adalah pengguna sengaja meminta tab baru. Mendengarkan dari orang tua bekerja karena kotak pasir sudah terus allow- same- asal untuk ukuran tinggi ketika mengabaikan allow- script, sehingga tidak ada dari email sendiri pernah berjalan; handler adalah milik kita, terpasang dari luar. Satu trap layak merekam, tertangkap oleh tes sendiri: mengembalikan sebuah path daripada sebuah URL diperlukan tapi TIDAK cukup. "https: / / host / vile.test" benar-benar sama - asal, dan nama pathname nya adalah "/ / evile.test" - yang router baca sebagai proto relatif dan mengikuti off-site. Sebuah email terbuka redirect yang melewati pemeriksaan asal. Seperti link sekarang masuk ke tab baru, dimana peramban menyelesaikan URL nyata yang tidak berbahaya, daripada ditulis diam-diam ke suatu tempat email tidak menunjuk.

  23. · kamo-shared-library

    Per- sel ekstraksi kepercayaan + eligibility- provenance matriks

    Dua celah dalam model kepercayaan diri, keduanya di jalur uang. Orang baik. Lantai lebar-domba adalah gandum yang salah untuk menilai satu harga: satu Kupon buruk-membaca menyeret seluruh lembar ke bawah dan akan mengirim setiap harga LAIN di atasnya untuk manusia, sementara lantai lembaran tinggi mengatakan apa-apa tentang sel tertentu seorang peminjam benar-benar dikutip dari. * * * * * * * * * * * * * * * catatan seberapa baik Angka / harga / kunci baris ini dibaca, sehingga salah membaca biaya kupon hanya harganya sendiri. PROVENCE ELIGIBILITY. MlosEligibility Matrix tidak memiliki path ke suatu dokumen sumber di semua - rute hanya adalah pedoman NULLABLE, sehingga matriks dipromosikan bisa tidak dilacak untuk lembaran itu berasal. Eligibilitas memutuskan apakah pinjaman adalah Diserahkan, yang membuatnya persis di mana penolakan harus dijelaskan; sebuah asalnya Ada celah pada titik seorang peminjam mengatakan tidak. Sekarang membawa sourceDokumentId dan kontrak ekstraksi sama seperti tulang belakang lembar rate-. Keduanya bisa rusak, dan kosong berarti tidak ada sinyal daripada baik. Kolom yang diterapkan untuk prod CockroachDB melalui KamoInitializer.

  24. · kamo-signer-monorepo

    Tampilkan telepon agen, tol-gratis dan email pada salinan pelanggan

  25. · kamo-internal

    Tampilkan telepon agen, tol-bebas dan email pada pratinjau

    Masing-masing pada baris sendiri: run-on dari dua nomor dan alamat dibaca sebagai satu string dan mendapat panggilan salah.

  26. · SecurityService

    Selesaikan rincian kontak yang telah diterbitkan oleh agen

    Email berasal dari kotak surat primer anggota bukan Pengelola Team.emailWork - yang kolom adalah teks predating bebas penyediaan kotak surat dan secara rutin tidak setuju dengan alamat mereka sebenarnya dikirim dari. Ini tetap fallback ketika tidak ada kotak surat primer. Sebuah anggota VOIP-diaktifkan dengan ekstensi diterbitkan sebagai baris sendiri org ditambah bahwa ekstensi, menawarkan nomor tol-bebas juga ketika org memiliki satu. Tanpa perpanjangan, Telepon kerja mereka - satu-satunya nomor yang mereka pegang yang dimaksudkan untuk diterbitkan. A dinonaktifkan VOIP config mempublikasikan apa-apa, karena ekstensi yang tidak menjawab. Setiap lookup adalah defensif: gagal untuk membuat sebuah dokumen menghadap pelanggan karena sebuah kotak surat baris hilang akan lebih buruk daripada mencetak satu cara lebih sedikit untuk membuat kontak.

  27. · kamo-shared-library

    Terbitkan setiap cara untuk mencapai agen, bukan hanya nama

    Nama dan judul saja memberitahu pelanggan yang memiliki kutipan tapi tidak bagaimana untuk bertanya tentang hal itu. Blok sekarang membawa email dan telepon, diselesaikan oleh penelepon - kotak surat utama tinggal di skema penyedia email dan ekstensi dalam config VOIP, baik Dapat dihubungi oleh penolong statis. Baris utama dan tol bebas adalah ruas terpisah sehingga dokumen dapat mencetak keduanya: memilih Antara mereka adalah memilih apa biaya panggilan pelanggan. inlintWittExtension dipasangkan sebuah ekstensi dengan baris org yang hang off, dan kembali null jika baik setengah hilang. Seorang yatim piatu "ext. 204" bukanlah nomor yang bisa dihubungi orang, dan telanjang Garis org akan salah rute pelanggan ke switchboard seolah-olah itu adalah agen.

  28. · kamo-shared-library

    Ekstraksi kepercayaan pada katalog tulang belakang + auto sinyal-off basis

    Harga hanya dapat dipercaya sebagai lembar itu dirakit dari, dan tidak ada di jalan berharga membawa sinyal itu: kepercayaan ada hanya pada promosi sebelum pementasan baris (MlosExtracteCandidate) yang tidak ada kode produksi dibaca. * * * * * * * * * * * * * adalah PER@-@ field WEAKEST di kandidat yang disetujui dipromosikan ke versi - minimum, tidak pernah berarti. Sebuah lembar dari 200 sel bersih dan satu 0,20 rata-rata salah baca ke 0.996 dan akan jelas ambang apapun, sementara satu sel adalah salah satu yang menyalahgunakan pinjaman. Nall berarti NO SIGNAL (tulisan tangan, atau dipromosikan sebelum kolom ada) dan konsumen harus menolak untuk otomatis menyetujui itu; membaca absen sebagai baik adalah bagaimana harga yang belum diverifikasi keluar tanpa ditinjau. Worm-protected like the other afportable pivils -- snapshoted dalam @ PostLoads dan diffed di @ PreUpdate, atau itu akan menjadi lubang mutable diam-diam di rantai audit. MlosPricingSignoff memperoleh otomatis / basis _ confidence / threshold _ applied. Without mereka persetujuan mesin tidak dapat dibedakan dari satu manusia kecuali oleh anggota id, yang pada jalur uang adalah cacat audit. Ambang disimpan di samping nilai karena pergerakan konfigurasi: 'kepercayaan diri adalah 0.72' tidak dapat dinilai nanti tanpa mengetahui apakah bar hari itu adalah 0.70 atau 0.90. Kolom yang diterapkan untuk prod CockroachDB melalui KamoInitializer.

  29. · kamo-internal

    Kutipan tab - setiap kutipan di seluruh akun petunjuk

    Server- paged DataGrid di samping Leads, dengan pencarian atas jumlah dan judul, status, total kisaran dan pembuatan-rentang tanggal. Filter berbagi satu debounce dan runtuh menjadi satu query, sehingga menyesuaikan kisaran sementara mengetik biaya satu putaran-perjalanan daripada satu per tombol per bidang. Perubahan filter reset ke halaman 1 - tinggal di halaman 6 dari set hasil yang lebih kecil dibaca sebagai grid kosong. Expiry ditampilkan selain dari status: kutipan SENT dapat melewati tanggal validitas dan masih dibaca sebagai SENT, sehingga mereka baris membawa penanda mereka sendiri bukannya diam-diam salah label. Baris dan kolom memimpin baik rute ke dalam tab kutipan memimpin itu.

  30. · SecurityService

    GET / quotes / account / {uid} - paged, disaring, terurut

    Tanggal tiba sebagai ISO string dan parse ringan: filter klien mengirim buruk harus Persempit apa-apa daripada 400 seluruh grid. Sebuah date- hanya "to" terikat mencakup seluruh hari itu, atau penyaringan untuk hari ini tidak kembali naik sejak tengah malam.

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