Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· kamo-shared-library
Domain yang diklaim dengan membuktikannya, bukan dengan mengetikkannya
Tiga aturan, dan mereka hanya masuk akal bersama-sama. Menandai domain tanpa klaim. FQDN unik secara global di sini, sehingga organisasi pertama yang masuk "acme.com" mengunci semuanya - termasuk perusahaan yang sebenarnya memiliki acme.com, yang kemudian tidak punya jalan sama sekali. Seseorang yang telah membuktikan tidak harus tidak dapat menyangkal domain untuk seseorang yang Bisa. Duplikasi baris di seluruh organisasi sekarang legal; sebuah pengulangan dalam ONE organisasi masih ditolak, karena itu adalah kesalahan dengan tidak berarti bukan daripada klaim bersaing. * * Hanya sebuah rute domain yang diverifikasi. * * FindByDomain sekarang membutuhkan kepemilikan _ diverifikasi di atas-tingkat baris, sehingga host pergi ke organisasi yang terbukti kontrol DNS nya daripada siapa pun mengetik terlebih dahulu. Tanpa pasangan ini yang pertama aturan akan menjadi pintu terbuka: klaim somebank.com dan menunggu. Sebuah alias mewarisi nya verifikasi orangtua - tantangan TXT hanya pernah diterbitkan untuk puncak - dan yang dibaca off eksplisit orang tua bergabung, tidak pernah sebagai d.parent.ownershipted, yang Hibernasi memancarkan sebagai batin bergabung atas seluruh permintaan dan akan drop setiap baris puncak. * * Verifying mengambil domain off everyone else. * * setOwnershipted Dibatalkan FQDN yang sama di mana pun berada, jadi paling banyak ada satu pemegang pada waktu. Ini bukan kesopanan: dua baris diverifikasi baik rutin, dan resolver akan menyerahkan lalu lintas ke database mana kembali pertama. An organisasi yang diverifikasi domain tahun lalu dan sejak membiarkannya gagal akan terus menerima surat dari siapa pun yang memilikinya sekarang. The loser 's DNS verifikasi pergi dengan itu, karena menggambarkan nama host yang tidak lagi menunjuk pada mereka. Memungkinkan duplikat kemudian istirahat setiap lookup yang diasumsikan satu baris, dan satu dari itu bukan kecelakaan tapi pembajakan: upsertDomain cocok pada domain NAMA dan kemudian dipindahkan apa pun yang ditemukan ke organisasi panggilan, sehingga upsert akan diam-diam diambil domain organisasi lain jauh dari itu. Hal ini organisasi - scoped sekarang. Sisanya - findByDomain, updateSslllfoByDomain, transferDomainOwity - pergi melalui tunggal holderOf (), yang lebih suka baris diverifikasi dan sebaliknya mengambil id terendah, sehingga pemilik domain tidak dapat perubahan antara dua permintaan. Kiri sebagai binding Opsional mereka akan dilemparkan * * * * * * * * * * * * * pada data skema sekarang izin.
· SecurityService
Membawa default jenis anggota rumah-layar
Baca pada POST / PUT / security- model dan PUT / master- model, dan dikeluarkan dari / diterapkan-model pengaturan sehingga shell dapat memutuskan mana anggota tanah pada "/". A terpisah applyHomeScreenDefault panggilan daripada tiga lebih posisi argumen pada metode layanan yang sudah membutuhkan lima belas. Tombol yang ditinggalkan tersisa sendirian daripada direset, jadi klien yang memposting model keamanan tanpa mengetahui tentang bidang ini tidak dapat diam-diam menyerahkan setiap anggota model launchpad mereka kembali - atau mengambilnya. / sudah ditempel - model normalisasi dalam perjalanan keluar serta masuk REQUIRES _ CHILD _ ORG _ OWNERSHIP menahan layar rumah, sehingga kolom kosong pada baris yang ditulis sebelum ini Dikirim, atau apa pun yang tidak dikenal, dibaca sebagai launchpad. Klien sendiri fallback adalah nilai yang sama, sehingga dua tidak bisa tidak setuju.
· kamo-shared-library
Sebuah model keamanan mengatakan di mana masing-masing anggota jenis tanah pada "/"
Tiga kolom di ChildOrganm SecurityModel - DEFAULT _ MEMBER _ HOME _ SCREEN, * * * * * * * * * * * * * * * DEFAULT _ ORG _ OWNER _ HOME _ SCREN. Masing-masing memegang HOME _ SCREEN _ DEFAULT atau REQUIRES _ CHILD _ ORG _ OWNERSHIP; kedua menahan Launchpad sampai anggota yang memiliki organisasi mereka sendiri. Tiga daripada satu karena tiga jenis anggota adalah tiga pekerjaan yang berbeda: model yang sama secara rutin ingin anggota polos didorong ke dalam menciptakan mereka sendiri organisasi sementara anggota tim dan pemiliknya langsung pergi bekerja. Pisah cermin APPLIES _ TO _ MEMBERS / _ TEAM _ MEMBERS / _ OWNERS persis. VARCHAR, bukan sebuah enum ordinal - sebuah relabel ordinal setiap baris disimpan hari pilihan ketiga disisipkan di mana saja kecuali akhir. setHomeHomeScreenDefauls adalah setter yang ditargetkan dalam bentuk setAllowRootSubdomains daripada tiga parameter posisi lebih pada updateModel, yang sudah dibutuhkan 15. Nall berarti "tinggalkan yang satu ini saja", sehingga penelepon yang tahu tentang salah satu dari tiga tidak bisa diam-diam mereset yang lain. normalizeHomeScreenDefault gagal OPEN dan diuji untuk itu: hanya string yang tepat ternyata persyaratan pada, karena alternatif mengambil layar rumah anggota jauh dan salah ketik atau klien basi tidak boleh bisa melakukan itu secara tidak sengaja.
· InitializerService
The three per-member-type home-screen columns on a security model
CHILD_ORG_SECURITY_MODELS gains DEFAULT_MEMBER_HOME_SCREEN, DEFAULT_TEAM_MEMBER_HOME_SCREEN and DEFAULT_ORG_OWNER_HOME_SCREEN. Each holds HOME_SCREEN_DEFAULT (the launchpad) or REQUIRES_CHILD_ORG_OWNERSHIP, which withholds it until that member owns an organization of their own. The DEFAULT clause is the load-bearing part, not the ADD COLUMN. The columns are NOT NULL and the estate is not empty, so the default is what backfills every existing security model in the same statement — and it is deliberately the permissive value, because defaulting the other way would take the launchpad away from every member of every model the moment this ran. Order(0) for the usual reason: the shared-library entity carrying these fields is loaded by every Java service, so an earlier runner would die on "column does not exist" before a late-ordered migration was ever reached. The SET NOT NULL statements repair the case where Hibernate's ddl-auto created the columns first, from the entity's columnDefinition, without the constraint. Each is preceded by its own null-clearing UPDATE, because SET NOT NULL is refused while any row still holds a null — the test pins that ordering.
· kamo-internal
Satu daftar dari apa yang ditemukan scan, selain apa yang Anda gunakan
Bagian merek dari / jaringan / membuat menjadi tiga band dengan bentuk yang sama: Apa yang website Anda miliki di sebelah kiri, apa yang digunakan oleh organisasi Anda di sebelah kanan. Logo. Dulu ada DUA rel atas kandidat yang sama, satu per slot, peringkat berbeda - sehingga perusahaan dengan empat logo tampaknya memiliki delapan, dan Pertanyaan adalah menempatkan putaran dengan cara yang salah. Seorang anggota tidak melihat rel dan bertanya "yang mana adalah logo lengkap saya"; mereka melihat tanda mereka sendiri dan mengatakan "yang satu adalah satu penuh. "Jadi itu adalah salah satu daftar logo situs, setiap baris membawa keduanya tujuan - Set sebagai Penuh, Set sebagai Sederhana - dan setiap baris ditandai Vector atau Gambar, karena itu adalah satu hal tentang file logo yang tidak dapat Anda lihat dengan melihatnya dan satu hal yang dipedulikan slot sederhana. Ditandai, tidak pernah disaring: bersembunyi rasters dari slot sederhana menyembunyikan logo perusahaan sendiri pada lokasi tepatnya Pemindaian bekerja dengan baik. Daftar langkah dengan panah naik / turun dan mengatakan berapa banyak di sana adalah "logo saya di sini" yang dijawab dengan melihat. Latar belakang kembali. Penyihir kedua belas langkah mengumpulkan tanda-tanda di wallpapers dan halaman satu menulis ulang menjatuhkan mereka; scan sudah menemukan pahlawan perusahaan gambar dan kemudian menawarkan tempat untuk meletakkannya. Band yang sama: pemindaian gambar pada kiri, unggah dan urutan jalan di sebelah kanan, dengan pilihan watermark di bawah sekali ada sesuatu untuk perangko. Warna yang diadopsi daripada ditawarkan. Pemindaian selesai menentukan pasangan yang ditemukan, dan pemetik tetap hidup. Para penjaga adalah seluruh risiko, sehingga mereka murni dan diuji dalam scanAutoApply.ts: sekali per hasil pemindaian, dan tidak pernah lebih dari warna Pencipta telah menyentuh - termasuk untuk pemindaian kemudian dari situs yang berbeda. Juga di sini: - "Siapa ini untuk" adalah absen seluruhnya, menuju disertakan, sampai ada sesuatu di dalamnya untuk menjawab. Itu rendering kartu kosong sebelum jenis adalah memilih, dan sekali lagi untuk model yang menyelesaikan setiap pertanyaan kepatuhan sendiri. - Pratinjau langsung menunjukkan logo FULL, kiri atas daerah isi di atas teks tiruan, dimana tanda tangan di layar meletakkannya. Batang di atasnya adalah navigasi bar dan menunjukkan tanda - dan dua slot mudah untuk mencampur, sehingga preview adalah satu-satunya tempat pencipta dapat memberitahu mana yang mereka isi. - "Logo Kompak" adalah "logo sederhana" di mana-mana itu dibaca, di sini dan dalam Getting Mulai penyihir. Pengenal internal dibiarkan sendiri. - "Nama pendek" adalah "Nama Organisasi (Versi pendek)". - Website mengatakan dengan jelas bahwa Anda tidak perlu satu, daripada meninggalkan ketiadaan dari tanda bintang merah untuk membawa pesan.
· kamo-internal
Tipe anggota standar layar rumah
Sebuah model keamanan sekarang mengatakan di mana masing-masing dari tiga jenis anggota tanah ketika mereka buka "/". Dua nilai: HOME _ SCREN _ DEFAULT adalah launchpad semua orang selalu memiliki, dan REQUIRES _ CHILD _ ORG _ OWNESHIP Menahannya sampai anggota memiliki organisasi mereka sendiri - "/" pergi ke / jaringan / membuat bukan, dan organisasi-link jaringan meninggalkan bar atas sampai mereka memiliki satu. Tiga kolom daripada satu, merefleksi APLIES _ TO _ MEMBERS / _ TEAM _ MEMBERS / _ OWNERS, karena model yang sama rutin ingin anggota biasa didorong ke menciptakan organisasi mereka sendiri sementara anggota dan pemiliknya pergi bekerja. Aturan ini murni dan diuji dalam aplikasi / lib / homeScreenGate.ts: kolom yang berlaku, dan apa yang dianggap memiliki sebuah organisasi (pemilik org mereka sudah di dalam belum menciptakan satu - yang sama exclusion FirstOrganCta membuat). Gagal Buka di setiap langkah. Hanya string yang tepat menutup gerbang; kolom kosong, sebuah nilai tidak dikenal, sebuah failed applied- model fetch dan sebuah jaringan my- tidak dapat dicapai semua dibaca sebagai "tidak", karena mengambil layar rumah seseorang jauh pada kekuatan permintaan yang tidak menjawab bukanlah sesuatu untuk dilakukan. Satu konteks, dipasang di atas nav dan halaman, daripada kait di kedua NavTop dan launchpad membutuhkan jawaban yang sama pada setiap halaman beban, dan dua salinan akan biaya dua putaran perjalanan dan tidak setuju untuk panjang satu. Launchpad sengaja tidak menunggu di atasnya - memegang setiap rumah anggota halaman belakang sebuah / appeed- model fetch untuk cadangan segelintir dari mereka flash singkat adalah Pertukaran yang salah.
· kamo-internal
Buat Bebas Org menjadi widget tiga langkah
Widget yang tertanam di seluruh Bentuk Kreatif - lima bagian, merek pratilik, meteran kesiapan - yang kira-kira 1.400px dalam panel sekitar Baris HomeGrid adalah minmax (unit, auto), dan 'auto' adalah katup pengaman bukan langit-langit, sehingga sebuah panel yang isinya tidak dapat menyusut mengembangkan baris: "widget" diberikan sebagai satu bentuk panjang di halaman. Sekarang adalah jalur cepat yang selalu digambarkan sebagai. Tiga langkah - tipe, nama dan alamat, ulasan - hanya meminta field yang benar-benar blok membuat dan mengirim segala sesuatu yang lain persis seperti TozardFormData selalu dikirim untuk pencipta yang Melewatkan langkah-langkah. Branding, aplikasi dan kepatuhan selesai setelah di New org 's Getting Started wizard. / jaringan / membuat tidak berubah dan masih meminta untuk semuanya di depan. Jenis langkah adalah SEARCH, bukan grid kartu. Dalam tata letak padat widget kisi adalah satu kartu per baris, sehingga penyewa dengan tiga puluh jenis cabang adalah delapan belas ratus Pixel kartu - peregangan, lagi, dan akan lebih buruk sebagai platform tumbuh. Pencarian membuat langkah ketinggian tetap pada empat tipe atau tiga ratus. Juga di sini: - WidgetFrame mengambil sebuah opsional maxightPx, dan widget ini melewati sendiri paneHeightPx (HalfRows), sehingga panel adalah ukuran yang diberikan anggota dan gulungan daripada tumbuh. Opsional, jadi tak ada widget lain yang mengubah perilaku. WidgetComponentProps memperoleh halfRows untuk membuat itu mungkin. - Pratinjau alias sekarang membaca KamoCRM.com / o / < alias > pada kedua permukaan yang menunjukkan itu, melalui satu pembantu bukannya masing-masing membangun string itu sendiri. DISPLAY HANYA - routing adalah dengan nama host dan tidak ada / o / rute, sehingga ruang kerja dan / api / org / current secara sengaja tidak tersentuh dan peluncuran masih mendarat di internal. < host >. Domain gubahan masih menunjukkan sendiri. - The / branch-types / creattable fetch dan parsing bergerak ke satu modul bersama dan Hook, karena kedua mesin tik membutuhkannya dan juga membawa orang tua subdomain- branch konteks. Yang menyelesaikan duplikasi langsung: Organisme TypePicker dibangun BranchTypeData dua kali dan dua salinan telah melayang pada paksaan array. - workspace Url bergerak keluar dari CreateOrgantion Form sehingga widget dapat membangun ruang kerja link tanpa mengimpor seluruh bentuk halaman. - berikutnya / link untuk "membuka halaman penuh" melompat. check-client- navigasi melewatkan marw anchor karena regex nya membutuhkan < a dan href pada satu baris. Penjaga, tsc dan 4.039 tes hijau; kunci kamus didorong pertama.
· kamo-internal
Mendapatkan kartu yang dimulai pada halaman Pendaratan Pengaturan
Tambahkan kartu grup penting yang terhubung ke / settings / wizard, yang cocok dengan idiom makeCard digunakan oleh saudara-saudaranya. Tombol kamus telah ditekan * * * * * * * * * * * * * * *
· kamo-internal
A KIRIM TO AI switch on the report form
Benar - selaras pada "Apa yang Anda melaporkan?" baris, off setiap kali jendela membuka - itu mulai sesi pada mesin memegang kredensial cluster, dan switch yang ingat posisi terakhir akhirnya akan mengirim sesuatu tidak ada dimaksudkan untuk mengirim. Mengakui itu di tangan laporan langsung di atas: dan membaca oleh operator yang mengirimkannya. Digambar hanya untuk pemegang Kelangsungan _ SYSTEM _ BUGS, dibaca dari server- diselesaikan PlatformRightsContext - checkRight adalah hak-hak Tenant tulang punggung dan tidak dapat menjawab untuk platform yang benar sama sekali, jadi meminta itu akan telah tersembunyi saklar dari setiap Administrator platform. Itu adalah krom cara baik: titik akhir SecurityService duduk di bawah kelas-tingkat @ RequirePlatformRight dan menolak orang lain dengan 403. Permintaan membawa ID bug dan kagak ada orang lain. Formulir tidak memiliki kotak prompt, tidak model picker dan tidak ada screenshot picker, sehingga server memilih mereka semua; mengumpulkan muatan di sini akan menempatkan pilihan-pilihan dalam browser, di mana anggota memegang hak bisa mengedit mereka. Hand--off berjalan setelah upload, tidak di samping mereka - operator membaca apapun yang terpasang pada saat itu berjalan, dan sesi dimulai lebih awal akan Bekerja dari setengah laporan. Pengiriman yang gagal masih berlaku statusnya, jadi Laporan Dalam Kemajuan pada saat tombol ditekan lagi dan reporter hanya dapat menyunting satu yang masih baru: jendela ingat apa yang terakhir ditulis dan melewati redundan-save, atau coba lagi akan melaporkan bahwa laporan disimpan bisa tidak disimpan dan tidak pernah mencoba hal yang benar-benar gagal.
· SecurityService
Kirim ke AI langsung dari bentuk laporan
Sebuah pemegang Kelangsungan _ SISTEM _ BUGS mendapat SAKD TO AI switch pada Laporan Bug jendela, dan mengirimnya dengan tangan laporan ke sesi tanpa dialog triase di antaranya. Titik akhir yang baru tidak mengambil body, dan itulah intinya. Formulir tidak memiliki prompt kotak, tidak ada model picker dan tidak ada screenshot picker, sehingga instruksi, model, usaha, screenshot dan status adalah setiap salah satu dari mereka dipilih di sini - pemanggil melewati gerbang tidak dapat mengekspresikan apa pun dialog tidak bisa, yang membuat switch ketat lebih sempit dari permukaan ia berdiri di untuk. It then goes melalui pengiriman () tidak berubah, sehingga throttle, baris audit ditulis sebelum panggilan jaringan, dan pemeriksaan kepemilikan cuplikan layar adalah yang sama, bukan kedua salin untuk menjaga langkah. Dijaga oleh tingkat-kelas * * * * * * * * * * * * * * * * dialog sudah duduk di bawah. Konsol menyembunyikan saklar dari orang lain, tapi adalah krom: laporan yang diajukan dengan bendera oleh anggota tanpa hak adalah Ditolak dengan 403 di sini dan tidak mencapai sesi. "Sudah dilihat" adalah fakta per- anggota dan tidak dapat ditulis untuk semua orang - PlatformRightResolver menjawab "apakah anggota ini memegangnya", tidak pernah "yang memegangnya". Jadi membaca direkam untuk operator yang meminta pengiriman, sebelum panggilan jaringan daripada sesudahnya (dapat mengambil dua menit dan dapat gagal), dan PROGRESS adalah apa yang mengambil laporan dari setiap manajer lain apos; s NEW lencana.
· kamo-internal
Sedang Memulai Wizard Konfigurasi pada / pengaturan / wizard
Ternyata sembilan penyihir pindah langkah ke editor atas organisasi anggota sudah ditandatangani ke. Setiap langkah sekarang benih nilainya dari hidup org data (useorganity Context, GET / api / Security / org / {id}, / api / security / features, atau useAppliedModel sebagai sesuai) dan menyimpan ke titik akhir yang sudah memiliki bahwa pengaturan pada "Simpan & terus"; "Lewati langkah ini" progres tanpa menulis. - orgSettingsSave.ts: pe-langkah jenis muatan (StepSavePayloads) dan SaveStep generik (kunci, orgId, nilai) pengiriman, diketik tanpa 'never' / 'apapun'. - orgDetails.ts: berbagi fetch untuk bidang org bertema tipis Kelas organisasi tidak membawa (kontak, label, deskripsi, dll). - WizardSteps.tsx / StepRail.tsx / page.tsx: tabel langkah, always rel yang dapat diklik, dan shell (BrandScanprovider, inert selama menyimpan). - Tisu identitas * * * * * * * * * * * * * * * kontrol - mereka adalah Pengaturan - > Domain / Perilaku & Labeling wilayah sekarang. - BackgroundsStep trek yang ada + baru slot bersama-sama, karena / background / commit menggantikan seluruh pemesanan dan hanya berkomitmen baru berkas akan menghapus sebuah slideshow organisasi yang ada. - Compligence Wizard.ts: Widden getCompliances StepUi 's parameter ke lima bidang itu benar-benar membaca, sehingga langkah Compliance dapat menyebutnya dengan use appliedModel pengaturan bukan create- time BranchTypeData. - api.ts: diekspor buildCustomLabels untuk digunakan kembali oleh label saver.
· kamo-internal
Pahlawan / kopilot dan kedua kode pemindaian membawa tanda bunglon juga
adalah dua situs terakhir, dan tidak bisa hanya mengambil src baru tidak berubah, karena karya seni adalah transparan 127x102 silhouette mana raster adalah persegi buram. CopilotHero. 'Tujuan Fit: penutup' akan tanaman moncong off kedua sisi alun-alun ubin, jadi tanda adalah 'contain' ed dalam wrapper inset - 'isi' memecahkan terhadap kotak padding, sehingga inset tidak dapat hidup di piring itu sendiri. Piring juga memperoleh keuntungan translucent fill: it used to BE the icon, and an unfilled one leaving the border and bayangan drop menguraikan apa-apa. QrFrame, kedua kode. Dua perbaikan: - Tanda putih, dan kode QR dicetak pada putih. Seperti dikirim itu adalah Logo tak terlihat yang duduk di lubang menekan keluar dari kode. 'kecerahan (0)' pada mengeluarkan < image > drive ke hitam dan meninggalkan knockout transparan. Ini memiliki untuk menjadi CSS - imagesettings menghasilkan sebuah < image hint >, dan sebuah eksternal SVG direferensikan dengan cara itu adalah dokumen terisolasi yang tidak mewarisi warna. - 48x39, bukan 48x48. qrcode.react hardcodes preserveAspectRasio = "none" pada yang elemen, sehingga kotak IS rasio aspek dan satu persegi terjepit tanda. The kotak kecil juga menyusut lubang digali ke ~ 2.9% dari kode, di bawah 3.5% itu sebelum dan jauh di dalam apa tingkat M bisa kehilangan dan masih scan. Diverifikasi dengan merender QRCodeSVG dengan props yang tepat dan rasterising itu: tanda membaca jelas di pusat dan penggalian membersihkan tidak ada pola penemu. Kedua kode, tidak hanya Pasang - mereka adalah salah satu frame bersama pada satu piring putih bersama, dan dokumen QrFrame sendiri mengatakan untuk menahan styling baik situs panggilan individu.
· kamo-internal
Tukar tanda mobil- aplikasi untuk bunglon SVG di rel dan di rumah
raster. Keduanya sekarang menggambar karya seni KamoMobileApp sebagai vektor. Diperiksa sebagai SVG karena itulah tanda adalah: siluet putih tunggal dengan Ketukan transparan. Melewati svgo pada presisi 2- desimal pertama, yaitu lossless untuk geometri jejak ini tetapi mengambil berkas dari 675 KB ke 106 KB (~ 23 KB di atas kawat sekali dikompresi) - ekspor membawa enam desimal pada setiap satu - 5k segmen jejak. Dua hal TIDAK membawa lebih dari raster: - Kotak. viewBox adalah 127x102, sehingga lebar / tinggi persegi squashes itu. Masing-masing tiga situs panggilan mendapat 127: 102 kotak berukuran untuk menjaga tinggi optik glyph ini dimana PNG itu berada. - optimasi berikutnya / gambar. 'Tidak didukung' pada ketiga: / _ next / image tidak dapat mengulang vektor, jadi tanpa itu permintaan adalah round trip yang tangan kembali byte yang sama. CopilotHero dan pusat QR masih menggunakan icon.png pada ukuran mereka sendiri; raster tetap.
· kamo-internal
Buat widget Free Org saya
Mengirimkan CreateOrganity Formulir yang sama yang / jaringan / membuat halaman render, dalam nya tata letak widget, sebagai widget home- launchpad (org.create) gated on CREATE _ FREE _ ORG _ WIDGET. Terdaftar terakhir: itu adalah undangan berdiri, bukan time- panel kritis. Tidak ada gerbang - menciptakan sebuah organisasi tidak aplikasi, dan lima hak adalah seluruh keputusan. Juga mirror CREATE _ FREE _ ORG _ WIDGET dan empat kebijakan anak-anak ke Hirarki hak TS yang dijaga (205 - > 210 tepi), yang widgetPolicy.testlests 's lima - benar-bentuk assertions dibutuhkan untuk setiap widget terdaftar.
· KlusterServices
Buka Kirim Ke AI dalam tab sesi VS, bukan jendela Konsole
Sebuah pengiriman sekarang mulai sesi BACKGROUND dan tangan VS Kode sesi id, Alih-alih menjalankan CLI dalam jendela terminal: Melewati prompt ke URI sebagai perangkap: panggilan ekstensi setInputText dan tidak pernah mengirim, dan mensintesis Return adalah mustahil sementara Loker KDE memegang X grab nya. Sebuah sesi yang SUDAH RUNNING tidak ada yang tersisa untuk menyerahkan, yang membuat handoff bekerja dengan tidak ada di mesin. Empat hal diukur daripada beralasan tentang: - cwd harus berupa jalur real (workspaceFolders [0]), TIDAK orangtua umum yang digunakan sebelumnya. Host panel itu sendiri pada folder pertama dan daftar hanya sesi yang ditemukan di sana, jadi sesi dimulai di tempat lain tidak terlihat jendela itu dimaksudkan untuk membuka masuk - handoff membuka tab kosong. Yang lain repositori tetap dapat dicapai melalui --add-dir sebagai gantinya. - - add-dir adalah VARIADIC dan makan prompt, sehingga sesi datang dengan Komposer kosong. Daftar direktori sekarang pergi pertama, ditutup oleh bendera setelah itu. - Peluncuran dapat mencetak tidak ada handle, atau satu ditandai "(idle - mengirim prompt untuk memulai). Keduanya berarti pesan tidak pernah tiba, jadi keduanya dihentikan dan mencoba lagi agak daripada dibuka di depan operator sebagai tab kosong. - Panel tidak dapat memiliki agen latar belakang, dan yang selesai tetap penghuni, jadi Seorang watcher menghentikannya setelah pekerjaan selesai. Membuka kembali tab kemudian melanjutkan sesi normal, seluruh percakapan utuh. Konfirmasi sekarang transkrip yang ditujukan oleh id sesi, yang menghapus Pencarian jarum suntik yang dilaporkan mengirimkan pesan sebagai kegagalan.
· kamo-internal
/ network / create adalah satu halaman; dua belas langkah bergerak ke / pengaturan / wizard
Membuat Form.tsx adalah salah satu komponen dengan dua layout (halaman / widget), yang dibangun dari Task 7 / 8 Model Creature Fields, kelompok lapangan dan Ordo BrandPreview. page.tsx sekarang hanya shell full- lebar di sekitarnya. Penyihir tua itu sembilan berkas langkah ditambah Stepper / Stolcons bergerak untuk app / settings / wizard, dimana Task 12 menyambungkan mereka ke konfigurasi sedang dimulai Wizard; BranchTypeStep, Anggota InfoStep, ReviewStep, StepNavigation, CancelModal dan sesionTrage- didukung kail UseWizardForm pensiun langsung, karena satu halaman membuat memiliki tidak ada langkah untuk menavigasi antara dan tidak ada yang tersisa untuk menyimpan draft. Setiap impor relatif dalam berkas yang menunjuk pada.. / ui / *,.. / brandscan / *,.. / / jenis, .. /.. / validasi,.. / / pemilihan,.. / / Penyihir pujian atau.. / / kait / * ditulis ulang untuk bentuk @ / app / network / create /... sejak komponen / ui dan komponen / brandscan tetap letakkan (komponen field yang selamat masih menggunakannya) dan hanya menyelesaikan satu direktori dari langkah 'lokasi lama. kait / Use WizardForm.ts dipangkas daripada dihapus: _ _ testing _ _ / submitWitd.tects impor freshWizardData dari sana dan harus tetap hijau dan tidak diedit, jadi file menyimpan satu ekspor tersebut (Dan INTIAL _ DATA dibutuhkan) dan tetes segala sesuatu yang lain yang tidak lagi memiliki penelepon. Dua perbaikan perbaikan yang ditemukan dalam tinjauan sebelum kabel komponen lapangan ke atas: - Pembentukan Formulir CreateOrganity 's onChange sekarang secara referensial stabil di seluruh render (REquestscan baca melalui sebuah ref daripada sebuah ketergantungan useCallback) - OrganTypePicker dan IdentityFields setiap daftar onChange dalam sebuah array ketergantungan useEffect, dan perubahan identitas sendiri dalam setiap merek yang selesai Memindai, yang akan membakar kedua efek pada setiap pemindaian daripada hanya pada perubahan masukan nyata. - DropZone mengambil sebuah prop cacat nyata (tabIndex = -1, penanganan dijaga, asli dinonaktifkan di file input dan fallback button) alih-alih mengandalkan hanya pada sebuah leluhur pointer- events -none, yang tidak melakukan apa-apa untuk aktivasi keyboard; kabel melalui logo BrandFields 'slot sehingga sebuah formulir terkunci mengunci pengguna keyboard juga. / network / create? fresh = 1 become plain / network / create in FirstOrganCta.tsx and network / pages.sx: formulir satu halaman dimulai dari initialCreateOrganization Fields () di setiap mount daripada memulihkan sesionStorage draft, sehingga param tidak ada yang tersisa untuk dilakukan.
· kamo-internal
Gunakan ulang grup dan pratinjau merek hidup
Mengekstrak masukan dari BranchTypeStep, BasicsStep, LogoStep, ColresStep, AppsStep dan AgeRestrictionStep kedalam lima ketentuan komponen yang dikendalikan (OrolTypePicker, IdenttityFields, BrandFields, AppSwitters, Compliandarifields) bahwa baik / jaringan / create- as-satu halaman dan widget launchpad dapat membuat, meninggalkan frame langkah (header, tombol lewati, navigasi) di belakang. Tambahkan Organ BrandPratilik, miniatur hidup yang didorong oleh previewPalet (), yang Pola - memeriksa kreator- warna menulis sebelum mencapai gaya atribut dan kembali ke platform variabel CSS. IdentityFields and Organization TypePicker disesuaikan mid- tugas untuk * * * * * * * * * * * * * * * * * tambahan mendarat di parallel: OrolTypePicker now captures the parent org 's subdomain- branch konteks di samping tipe branch, dan Konsultasi IdentityFields webAliasPossible () daripada re-deriving itu, menawarkan jalur web-alias hanya ketika benar-benar tersedia. Tugas 8 dari * * * * * * * * * * * * * * * * * * * Rencana.
· kamo-internal
Sedang memulai tombol Wizard Konfigurasi dengan batas perhatian
Tambahkan titik entri launchpad ke dalam penyihir setup: pemilik - saja, hak-gated pill yang berbunyi "Getting Started Configure Wizard (x / 9 steps complete)", ditempatkan pertama di baris pil depan Widget saya. Pembagian kosong sampai pemilik org- + kanan + jud- ringkasan + not-finish gerbang memecahkan, sehingga tidak pernah berkedip untuk pemilik yang organisasi sudah selesai setup. Batas membawa gradien conic- terus menerus Sheen plus sebuah box- bernapas bayangan dalam organisasi sendiri - warna - primer, dan berhenti animasi (sementara tetap terlihat dua- nada) di bawah lebih memilih -reduced- gerak.
· kamo-internal
Memulai langkah model dan klien penyihir
Tambahkan model langkah-sisi-klien (app / lib / orgSetupWIzard.ts), sebuah API tipis klien untuk GET / PUT / DELETE / API / keamanan / org- memisahkan wizard (app / lib / orgl SetupWizardApi.ts), dan useorganizorSetupWizard menghubungkan bahwa Wizard page and the launchpad button will both build on. Logika murni hidup di app / lib daripada di samping halaman karena app / settings / * * dan app / hook / * * tidak dalam vitest 's include allowlist. IsWizardFinistedDiputuskan hanya oleh gerendel lengkap server, bukan dengan menghitung langkah selesai, sehingga tombol launchpad tetap hilang untuk organisasi yang sudah selesai bahkan setelah daftar langkah tumbuh. normalizeSummary total atas masukan yang tidak diketahui dan jatuhkan tombol step klien tidak mengenali. useorganity SetupWizard membuat 'loaded' terpisah dari 'ringkasan' sehingga tombol launchpad tidak menghasilkan apa-apa sampai jawaban yang sebenarnya terkenal.
· SecurityService
Tambahkan progress service dan titik akhir di belakang Penyihir Memulai
Organic-scoped GET / PUT / DELETE under / api / Security / org- setup-wizard track dari sembilan Memulai langkah-langkah organisasi telah selesai. Sebuah membaca tidak pernah menciptakan baris, dan completeat adalah kunci yang disimpan set sekali ketika langkah terakhir tanah - bertahan keduanya tidak menyelesaikan sebuah langkah dan daftar langkah tumbuh kemudian, jadi organisasi selesai tombol launchpad tidak pernah muncul kembali.
· kamo-internal
Panel yang dimaksimalkan diperkecil ke dalam percakapan yang Anda pilih
Mengganti percakapan dalam tampilan maksimal adalah sebuah sentuhan 8px dan 180ms memudar - Cukup dekat untuk apa-apa bahwa panel tampak seperti itu hanya dicat ulang. Sekarang membaca sebagai tiba di suatu tempat: percakapan masuk muncul dari 6% di bawah ukuran dengan kenaikan pendek dan tanah di panel, buram awal sehingga dapat dibaca sementara masih bergerak, pada kurva yang menghabiskan sebagian besar perjalanan ke depan dan kemudian mengendap. Bentuk didikte oleh z-stack daripada dipilih. Mengklik baris navigator fokus pada jendela baru, sehingga masuk dicat OVER keluar, dan yang memutuskan kedua belah: - Yang masuk mungkin tumbuh INTO panel tetapi tidak pernah melewatinya. Shell maksimum adalah elemen tetap ukuran viewport dan tidak ada di sini pin dokumen overflow, sehingga kedatangan yang overtunas 1 cat di luar viewport. - Yang keluar memegang ukuran penuh dan hanya memudar. Sementara masuk masih skala bawah tidak menutupi panel dan keluar adalah satu-satunya hal di belakang itu, begitu menyusut yang juga akan membuka tepi latar belakang sekitar jendela MAXIMIZED - berkedip, bukan kedalaman. Hal ini bebas untuk memudar karena masuk yang buram di atasnya jauh sebelum hilang. Aturan cakupan itu adalah aritmatika, bukan rasa, jadi ini adalah ujian: kerai keluar harus memudar outlast yang masuk. Dua pin lagi kendala yang tidak terlihat sampai mereka istirahat - kedatangan tidak pernah timbangan melewati 1, dan selesai di dalam fase swap, yang pensiun peran dan akan dinyatakan menargetkan kembali pertengahan-penerbangan. Mengurangi gerakan terus Lintasan polos. Kebetulan memperbaiki hal yang lebih kecil: kedatangan digunakan untuk menjadi 200ms dalam fase 180ms, jadi itu diserahkan target menetap 20ms sebelum selesai.
· kamo-internal
Tiga kolom ukuran minimum widget dan per- widget
Lebar widget lebar ke 14; 2 12.4; 3 = 124; 'penuh' dan biarkan WidgetDefinition declare minLebar / minHeight. widget MinSize (definisi) mengkonversi bahwa ke dalam lantai PaneSize (atau kosong ketika tidak ada dideklarasikan), memberikan keduanya kapak sebuah lantai bahkan ketika hanya satu dideklarasikan - sumbu tidak dideklarasikan lantai pada ukuran default sendiri. Thread bahwa lantai dari registri melalui setiap konsumen ukuran yang atau mengubah ukuran sebuah panel: Use HomePanes 'sizeOf / setSize, Panechrome' s drag AND undo-type situs render widget kisi-kisi halaman halaman halaman halaman halaman, dan tata letak settings- preview. Band pinned- widget dalam halaman. tsx tidak tersentuh pada tujuan - selalu dirender di widget DefaultSize dan tidak pernah membaca disimpan preferensi, sehingga sebuah baku dideklarasikan telah memenuhi lantai sendiri. Tidak ada widget dalam registri mendeklarasikan lebar 3 atau minimum belum; yaitu nanti kerja. Ini hanya memperluas kosakata dan kabel mesin.
· kamo-internal
Sentuh sebuah logo yang ditelusuri dengan tangan, dan unduh berkas yang telah dikonversi
Empat hal pada pengkonversi raster-to- vektor dan slot logo sederhana. * * Batang gulungan pada pilihan raster adalah tiga kali lebih lebar. * * 4px adalah target yang sulit untuk jadi Firefox tidak pernah punya gaya bar sama sekali - scrollbarLebar / scrollbarColor sekarang membawa maksud yang sama di sana. Sebuah sumber yang sudah memiliki latar belakang transparan yang ditinggalkan sendirian. The eyedropper digunakan dengan senang hati mengembalikan warna untuk pixel transparan: sebuah toko kanvas yang telah dikalikan alfa, jadi setiap salah satu dari mereka membaca kembali sebagai (0, 0, 0), dan memilih satu memberitahu pipa latar belakang hitam. Itu kemudian pergi dan menghapus bagian gelap dari logo. Mengklik transparansi sekarang Mengatakan demikian bukan memilih. Perbaikan sisi yang cocok dalam layanan vectorservice. Sebuah tongkat dan kuas, masing-masing mampu menambahkan atau menghapus. Penghapusan otomatis membuat dua hal salah cukup sering perlu berdebat dengan: latar belakang yang bocor ke bagian tertutup dari desain, dan sepotong desain yang berbagi warna latar belakang dan pergi dengan itu. The tongkat mengambil seluruh wilayah kontiguous dalam satu klik; sikat mengambil apa pun yang diseret atas. Setiap operasi memecahkan terhadap tanaman ORIGINAL, tidak pernah memotong-out saat ini. Itulah yang membuat "+" mungkin sama sekali - sekali penghapusan telah memusatkan perhatian sebuah daerah alpha tidak ada wilayah yang tersisa untuk menemukan, tapi aslinya masih memiliki warna. Ini juga membuat ops dapat dimainkan kembali, jadi menyenggol pengaturan setelah itu jalankan penghapusan tanpa mengabaikan koreksi. Cat penyuntingan lokal untuk umpan balik instan; hanya hasil diselesaikan melintasi kawat, dan hanya alpha mask, sebagai sebuah PNG 8- bit grayscale dari beberapa ratus bytes. * * Sebuah tombol download di samping logo sederhana * *, sehingga anggota dapat menjaga SVG konverter yang dihasilkan - sering satu-satunya salinan vektor logo mereka siapa pun memiliki, dan jika tidak terjangkau saja dari ember mereka tidak bisa browsing. Ekstensi berasal dari mengendus bita, bukan nama tersimpan: slot itu menulis setiap upload ke logo tetap. kunci svg terlepas dari tipe, jadi theme.kamocrm.com melayani PNG bytes dari sebuah nama .svg untuk org apapun yang mengatur sebuah logo sebelum ini konverter ada. Diambil ke gumpalan daripada dihubungkan, karena titik silang '< a download >' diabaikan dan akan membuka berkas daripada menyimpannya.
· kamo-internal
Satu ruas halaman ditata dan baku yang menggantikan langkah yang dijatuhkan
CreateOrganizons Fields adalah apa yang baru single-page / network / create formulir sebenarnya meminta untuk: sebuah tipe branch, nama, alias, aplikasi switches, dan segelintir opsional ladang. Untuk WizardFormData mengisi segala sesuatu yang kedua belas langkah penyihir yang digunakan untuk mengumpulkan tetapi halaman ini tidak pernah menunjukkan, menggunakan persis apa melewati masing-masing langkah yang digunakan untuk mengirim (bindPhone / binindEmail true, kosong kontak / label, watermark FULL, sumber merek PERUSAHAAN) sehingga org dibuat di sini tidak dapat dibedakan dari satu dibuat cara lama oleh seseorang yang mengisi hanya apa yang diperlukan. withBranchType also keeps parentAliasId menunjuk ke sebuah pilihan yang dipilih model benar-benar menawarkan (ROOT pertama ketika diijinkan, lain model pertama kustom alias) - wizard twelve- langkah melakukan ini dalam efek BasicsStep sang pencipta tidak pernah melihat api, dan tanpa setara di sini createOrganic Readiness blok selamanya pada sebuah field halaman ini tidak pernah menanyakan untuk setiap tipe cabang yang hanya pilihan induk adalah ROOT.
· kamo-shared-library
Buat hak widget Free Org-ku dan memulai kemajuan penyihir
Tambahkan RoleRightType 28-292 (CREATE _ FREE _ ORG _ WIDGET dan empat ADDED / OPTIONAL / REQUIRED / MOVABLE policy children), hang off CREATE _ ChiLD _ ORG (131). Tambahkan Organ SetupWizardStep, inine- step enum mendukung proses konfigurasi Wizard, dan * * * * * * * * * * * * * * * * * * * * * * pemetaan org _ setup _ wizard _ progress table dari Task 2. Juga update RoleRightHierarchyTest yang disematkan bentuk taksonomi (278 / 205 / 35 / 38 - > 283 / 210 / 36 / 37): CREATE _ CHILD _ ORG adalah akar standar dan memperoleh yang pertama anak di sini, bergerak ke dalam ember RootsWithChildren, pencocokan file ini Konvensi untuk merekam setiap pengiriman widget dalam tes tersebut.
· kamo-internal
Ukuran minimum per- panel, diterapkan pada pembacaan serta di drag
Threads sebuah opsional 'min?: PaneSize 124; null' melalui clampaneSize, dua resize- delta pembantu, dan dua fungsi baca / tulis dalam model panel launchpad murni. Backwards kompatibel: setiap penelepon yang ada Mengabaikan argumen dan menjaga perilaku hari ini, karena clampaneSize jatuh back to the grid-wide * * * * * * * * * * * * * * * * * * * floor when no per-panel minimum disediakan. Lantainya dipaksakan pada nilai REsolvePaneSize, tidak hanya di penangan drag, sehingga preferensi anggota direkam sebelum panel memiliki minimum (atau sebelum dibesarkan) akan ditarik kembali pada membaca.
· SecurityService
Masukan real time anggaran pada membenci-verifikasi
Titik akhir tidak memiliki batas apapun. Layar register menuntut sebelum mengaktifkan tombol pengiriman ulang tidak pernah dibaca di sini - badan permintaan adalah tiga bidang JSON dan tidak ada di server mencari a payload - sehingga kontrol gerbang tombol, bukan permintaan, dan script posting langsung di URL ini sudah tak terbatas. VerificationResendLimiter menggantikannya dengan anggaran yang dimiliki server: a 60s cooldown taken as a single SET NX so racing replicas can both menang, 5 / jam dan 15 / hari per alamat, dan 20 / jam setiap IP publik. Diperiksa Sebelum org dan user mencari dan mengetahui alamat SuBMITTED, jadi biaya probe anggaran apakah atau tidak rekening ada dan 429 tidak menjadi akun-keberadaan oracle bahwa titik akhir hati-hati "jika ini akun ada "jawaban ada untuk menghindari. Jendela IP dilewati untuk suatu alamat bukan-publik: tidak ditentukan harus tidak runtuh menjadi satu kunci bersama untuk setiap resimen. Mundur karena layanan ini berjalan replika, dan gagal terbuka pada outage Redis. Sebuah penolakan menjawab 429 dengan Retry-Setelah dan kembali Setelah dan sesudah itu, sehingga layar dapat menghitung mundur terhadap jam ini daripada menebak sendiri.
· InitializerService
Buat org _ setup _ wizard _ progress untuk memulai wizard
· kamo-internal
Tahun yang ditetapkan org adalah opsional, dan unset render sebagai absen
Tidak ada di server yang pernah diperlukan itu - kolom adalah nullable, membuat parser memetakan sebuah nilai kosong untuk null, dan patchOrganization hanya berlaku kunci tubuh PUT menyebutkan, jadi "tahun": kosong adalah jelas disengaja. Satu-satunya gerbang adalah penyihir ini validateBasics, yang memblokir seluruh Basics langkah sampai satu tahun Dipilih. Banyak pelanggan nyata tidak memiliki jawaban (LLC baru, divisi berputar keluar pertengahan tahun, siapa saja yang hanya tidak tahu), sehingga gerbang hanya mengajarkan mereka untuk menemukan satu. Jatuhkan; field menyimpan asterisk--free label dan memperoleh yang sama "Opsional". FieldHint setiap bidang opsional lain pada langkah sudah memiliki. Perbaikan alasan tak seorang pun melihat bidang itu sudah bernyali akhir ke akhir: DTO parsed year est with a bare * * * * * * * * * * * * * * * * and pemaksaan berjalan sebelum opsionalitas, jadi Nomor (null) = = 0 dan setiap org tanpa tahun tiba sebagai didirikan pada tahun nol. Ini tetap tak terlihat karena tampilan situs penjaga pada kebenaran dan 0 adalah falsy - itu akan muncul sebagai "Est. 0" di situs pertama yang diperiksa '! = null' sebagai gantinya. Praproses null dan "" kembali ke undefined, menormalkan cara yang sama dalam Organisasi. Dari JSON, dan memperluas DTOs jaringan / tema untuk mengakui null yang benar-benar tiba. Dua situs tampilan yang digunakan '{org.yearest & & & < Fakta / >}' menjadi ternararies: sebuah falsy--dan render adalah apa yang akan dicat 0 telanjang ke dalam laci. The konfigurasi bentuk sekarang rute save melalui parseYearEst, sehingga kotak kosong membersihkan nilai pada tujuan daripada dengan cara JSON.stringify mengubah NaN menjadi null.
· kamo-internal
Tampilkan anggota hanya tab yang mereka lihat
Tiga anggota-pengaturan permukaan terbuka untuk orang-orang mereka tidak dapat berarti apa-apa untuk. Setiap gerbang ada di TYPE MEMBER atau aplikasi org, tidak pernah di checkRight - checkRight kembali benar untuk setiap kanan di bawah mode dewa aktif, dan halaman can ViewOtherAnggota Account ORs in rights that have nothing to do with the subject * * * * * * * * * * * * * * * * di antara mereka). getmemberType () baku ke 'MEMBER', sehingga setiap salah satu dari mereka gagal ditutup pada sesi yang tipenya belum diselesaikan. Rencana & Billing: hanya anggota tim. Rencana, langganan, faktur, metode pembayaran dan kursi semua milik bisnis; anggota polos tanpa satupun dari mereka, sehingga tab menunjukkan kepada mereka uang perusahaan. Gated on VIEWER, sehingga pemilik membuka halaman orang lain menjaga administrasi Jalan. Kartu / pengaturan digated dengan cara yang sama - sebuah kartu yang membuka tab yang tidak akan menghasilkan lebih buruk daripada tidak ada kartu, persis sebagai komisi di sampingnya. Ringtones & Alerts: digated dengan kondisi yang sama dengan ikon telepon NavTop, yang sekarang satu fungsi (hasPhoneAccess) daripada dua salinan dari & &. Subtab tidak lain hanyalah konfigurasi telepon yang ikon buka - yang ringtone, perangkat yang, seberapa keras - sehingga anggota tanpa telepon sedang kontrol tangan yang tidak dapat mengubah apa pun yang mereka pernah akan mendengar. Video Audio Dan Suara Acara tidak tersentuh: mereka adalah perangkat pertemuan dan aplikasi sendiri pemberitahuan suara, yang setiap anggota memiliki. Legal & Compliance: anggota tim, dan org dengan aplikasi Docs dan HR. Daripada inline kondisi baru, mereka lipat ke legalBadgeAppliesTo, yang mana tombol tanda-tangan NavTop dan penyedia count di belakang lencananya sudah berbagi. Tombol itu adalah link langsung ke tab ini, sehingga salinan keempat dari kondisi akan membiarkannya hidup lebih lama tujuannya sendiri dan menjatuhkan anggota pada mereka profil tanpa penjelasan; penyedia pergi tenang pada kondisi yang sama daripada memegang langganan StoMP dan polling 60second untuk menghitung adalah 0 dengan konstruksi.

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