Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · EmailService

    Chi ha causato una notifica viaggia con esso, così la campana può disegnarli come membro

    - NotificazioneRichiesta guadagna attoreMemberId/actorName; il vecchio costruttore rimane per ogni produttore che Li precede. - raise() mantiene la coppia solo quando entrambe le metà sono lì, il nome si adatta alla sua colonna, e il titolo o il corpo lo scrive davvero: un nome che il testo non contiene non ha nessun posto da disegnare, e un precedente 255 altrimenti fallire l'inserto e prendere l'intera notifica con esso. - aPayload() invia l'attoreMemberId come TEXT accanto all'attoreName - la lista, sfogliare e la cornice della presa. - /api/internal/notificazioni legge attoreMemberId (testo o numero) e attoreName. - /api/notificazioni/self (la scheda non-chat del browser) mantiene l'attore solo quando quel membro è in l'organizzazione del chiamante. L'id è la parola del browser; può nominare il mittente che ha visto, ma non avere qualcuno da un'altra parte (una controparte Exec2Exec, una stale id) disegnata come collega. Necessità di una borsa di studio 727c0ec2 e del DDL in un'altra... applicato alla produzione a mano il 2026-09-23 prima che questo sia stato spinto. Test: MemberNotificationServiceTest (+4), NotificationSelfRaiseActorTest (4). Suite completa: 1912 run, 0 guasti, 1 saltato.

  2. · kamo-shared-library

    Una notifica può dire di chi lo fa

    La Notifica dei Soci acquisisce ACTOR MEMBER ID (INT8) e ACTOR NAME (255): il membro che lo ha causato - chi ti ha trattato, il cui incontro inizia, che ti ha scritto - e il loro nome esattamente come il titolo o il corpo lo incantesimi. kamo-internal disegna quel tratto del testo come il nome del membro, così hovering che apre il loro tessera. Fino ad ora ogni nome nella campana era un testo chiaro, perché nulla ha registrato chi era. DDL, applicato a mano alla produzione il 2026-09-23 come il proprietario kamo (ddl-auto non è ovunque): ALTER TABLE public.member notificazioni ADD COLUMN IF NOT EXISTS attore member id INT8; ALTER TABLE public.member notificazioni ADD COLUMN IF NOT EXISTS attore name VARCHAR(255); Le stesse dichiarazioni spediscono in e-mail come... EmailService è l'unico servizio che legge o scrive questa tabella.

  3. · InitializerService

    La funzione di pianificazione Notes è "Notes & Checklists"

    L'app Note detiene liste di controllo e dal 2026-09-23 ed è chiamata "Note e liste di controllo" ovunque si chiama. Il confronto della pagina dei prezzi grafico prende i suoi nomi di riga da commerce subscription features, quindi il Anche la riga NOTE viene rinominata: NotesChecklistsRinominaMigration (@Order 215) rinomina ogni riga NOTES che porta ancora il vecchio nome predefinito e riscrive Firma la descrizione di Pink dove legge ancora la vecchia frase. Un rewords riga è lasciata sola e una ri-run non cambia nulla. Copia solo: service type e è incluso, che decidono che cosa un piano dà diritto, sono intatti. KamoCRMPricing Loader semi il nuovo nome per i cataloghi creati da qui in poi. Applicato a mano il 2026-09-23 con le stesse dichiarazioni, da questo servizio non è schierato.

  4. · kamo-internal

    Una casella di posta commutata rimane in diretta, e la casella di ricerca è lucidata

    Aggiornamenti dal vivo. La pagina chiede a EmailService di guardare la casella di posta che ha aperto quando non è il membro (/app/email/watch, rientro dopo una riconnessione, ha smesso di lasciare la pagina), e l'elenco delle cartelle e l'albero ricaricare modifiche della casella di posta - nuova posta, e modifiche fatte da qualsiasi altro cliente o da chiunque altro - esattamente come hanno già fatto per il membro. Il relè ha un argomento proprio, quindi il distintivo della posta e il suono della nuova posta non sentono mai di casella di posta di qualcun altro; un cambiamento è agito solo per la casella di posta in realtà sullo schermo (lib/email/mailboxWatch). Polacco, tutto trovato guidando i componenti reali in Chrome: - La finestra di dialogo di aiuto e il modulo avanzato ri-ran il loro effetto di apertura su ogni rendering pagina (la pagina passa una nuova onClose), che ha tirato fuoco indietro a il pulsante di chiusura / la casella "Da" fuori da sotto il membro. Ora scappano una volta per apertura. La finestra di dialogo mantiene anche Tab dentro di esso e le mani si concentrano indietro "Come cercare" quando si chiude. - La casella di ricerca segnaposto è "Search mail"; il lungo è stato tagliato a "Search mail - provi f" nella colonna 320px (dizionario 6401409c). - "Come cercare" si trova all'inizio della propria linea quando la colonna è troppo stretto per esso accanto al campo di gioco, invece di appendere fuori la destra. - Lo scopo di attivare è una scheda di arresto con i tasti freccia, come qualsiasi gruppo radio; elenco suggerimenti annuncia l'opzione evidenziata (aria-attivadescendant), mantiene scorretto in vista, e segna le sue voci come presentazione.

  5. · kamo-internal

    Lezioni audio — caricare una registrazione e gli studenti possono davvero navigare

    Autori (/hr/direttore del corso di formazione) - "Upload file" su ogni diapositiva, accanto a "Choose media": audio (MP3, M4A, AAC, WAV, OGG/Opus, FLAC), video o un'immagine, attraverso l'imaging pipeline in Risorse HR, allegato al momento in cui è memorizzato. Il raccoglitore della biblioteca conosce anche l'audio (badge, miniatura della forma d'onda), e la copertura del corso picker ora offre solo immagini. - Una slide audio ottiene il proprio editor: una descrizione richiesta (il nome accessibile), la lezione giocare esattamente come un discente lo incontra, capitoli (add uno alla testa di gioco, modificare i tempi come m:ss o h:mm:ss, giocare da qualsiasi, o incollare un elenco nelle solite forme "00:00 Titolo"), e una trascrizione che segue. Un lavoro finito non sovrascrive mai il testo digitato mentre correva (è offerto invece), e uno trovato in esecuzione quando la diapositiva è riaperto è offerto allo stesso modo. - La registrazione viene misurata una volta, sul collegamento: lunghezza e forma d'onda provengono da ConversionService e sono memorizzati sulla diapositiva (media meta json), quindi nessun apprendista li aspetta. "Ascolta la registrazione" è la formulazione audio della regola play-through. Studenti (il giocatore del corso) - Uno scrubber di forma d'onda che mostra quello che è stato giocato, quello che è stato effettivamente HEARD, i capitoli, i loro segnalibri e una ripetizione A-B; fare clic, trascinare o freccia attraverso di esso, con un time-and-chapter anteprima su Hover. - I capitoli con per-chapter hanno ascoltato i progressi, il capitolo precedente/next e "ripetto questo capitolo". - Una trascrizione che segue la registrazione, salta ovunque su clic, e cerca con il prossimo / precedente attraverso le partite; le didascalie della linea sono parlate sotto la forma d'onda. - Segnalibri con note, tenuti nelle preferenze del membro in modo che li seguano tra dispositivi (mai scritto prima che l'elenco salvato sia caricato, che lo sostituirà; viene inviata una nota in sospeso, non caduto, quando la diapositiva si chiude). - Velocità da 0.5× a 2× (e il tempo lasciato a quella velocità), ±10 s, volume, scelta del membro altoparlante, i tasti multimediali del sistema operativo e una mappa della tastiera (Space/K, J/L, frecce, Shift+arrows o P/N, < >, 0–9, M, B, A, C, /, ?) con un foglio di aiuto. - Riprende dove si sono fermati su questo dispositivo, e offre la prima parte che non hanno sentito. - Il requisito di play-through conta solo tratti effettivamente giocati: una ricerca (scrubber, skip, loop, devtools, o una zecca che atterra mid-seek) non guadagna nulla, e né fa più veloce di 2×. A differenza della regola video accredita una scheda di sfondo lunga zecca, perché l'audio è ciò che la gente gioca in uno. Ho sentito entro mezzo secondo della fine conta come tutta la registrazione: il modulo memorizzato tondi a 0,1 s e la durata non, e 100% usato per leggere come 99% per sempre. - Il portello di fuga per un file che il browser non può riprodurre appare una volta che la lunghezza della registrazione ha passato, come fa per il video; le scorciatoie funzionano ovunque la concentrazione sia all'interno della finestra di dialogo del giocatore. Fisso sulla strada, per il video tanto quanto l'audio - Il cancello play-through misurato contro la durata congelata della versione, che non pubblica mai ha scritto: ogni versione video porta null, in modo da guardare non potrebbe mai soddisfare il requisito. The gate ora utilizza la durata dell'elemento. - Quello che un membro aveva visto ha raggiunto il server solo quando hanno premuto Next, quindi chiudendo il corso L'ho perso a meta' zero. Viene salvato ogni 20 s, in pausa e in chiusura, con il per cento il il manifesto di completamento legge (non è mai stato inviato, così ogni manifesto registrato 0% copertura). - Slide media, immagini di domande e la lezione stessa ora carica attraverso il proprio membro assegnazione, assegnazione. invece dell'imaging stream, che richiede VIEW DOCUMENTS — un diritto 32 di 149 membri non ha tenuto. - L'editor keyed slide card by uid, che ogni autosave sostituisce, in modo da ogni salvare rimontato ogni scheda — e avrebbe fermato l'audio un autore stava ascoltando mentre digitava un capitolo. An caricare in volo segue la sua diapositiva attraverso una mossa o un'eliminazione. - L'itinerario dei media membri risponde con un CSP sandboxing e un nosniff: un'immagine di scorrimento può essere un SVG, che ha aperto direttamente altrimenti eseguire script in questa origine. Ha bisogno di DocsService (media endpoint, media meta json) e ConversionService (pecchi, trascrizioni) schierato a fianco; l'inglese è su kamo-translation-dictionary a4c6f856.

  6. · KlusterServices

    Un modo per costruire realmente l'immagine d'oro

    build-golden-image.sh ha detto "Run by CI (vedere .././.forgejo/flows/)". No il flusso di lavoro è mai stato scritto. Ha bisogno di libguestfs, qemu-img e virt-customize, nessuno di cui sono installati sulla macchina su cui si lavora questo repo, e non c'è contenitore runtime là o — quindi l'unico artefatto l'intera app dipende da non esiste. Ecco come la prima persona ad assegnare un computer scoperto. La costruzione funziona invece nel cluster, che è l'unico posto già attrezzato per it: i nodi eseguono KubeVirt ed espongono /dev/kvm attraverso i dispositivi.kubevirt.io/kvm plugin del dispositivo, quindi libguestfs è accelerato dall'hardware piuttosto che emulare per ore. Il lavoro scrive direttamente nel PVC dorato, perché vm/datavolume-template cloni con source.pvc e clone CDI di un volume Filesystem copia il suo contenuto — così qualsiasi reclamo che tiene disk.img è una fonte valida. Questo rimuove il passaggio di hosting HTTP, le credenziali di upload e una seconda copia di un file multi-gigabyte. Golden-datavolume.yaml soggiorni per un'immagine costruita altrove. Tre cose che vale la pena sapere dalla scrittura: Gli script viaggiano come ConfigMaps piuttosto che un clone git, quindi il lavoro non ha bisogno di credenziali. Montano in sola lettura senza bit di esecuzione, quindi vengono copiati a un percorso writable prima virt-customize --run può eseguirli. La costruzione avviene in zero e solo il file finito viene copiato nel reclamo. Lo script scrive un qcow2 di lavoro di 20 GB e poi qemu-img convert -c scrive un secondo compresso uno accanto a esso; facendo che nella rivendicazione d'oro avrebbe bisogno che sia due volte la dimensione dell'immagine finisce per tenere. La VERSIONE e' sopraffatta ora. Il percorso incluster deve conoscere la versione BEFORE costruire inizia, perché il reclamo lo porta in suo nome e deve esistere per il lavoro scrivere in, così il wrapper risolve il serial di Canonical una volta e utilizza quel valore per entrambi. Una ricostruzione di una versione esistente è rifiutata piuttosto che scritta in: seconda scrittura in un PVC dorato popolato è il fallimento che raggiunge ogni inquilino a una volta.

  7. · ConversionService

    Audio — una miniatura a forma d'onda al caricamento, e picchi e trascrizioni su richiesta

    Un file audio caricato è caduto attraverso il percorso Docs PDF, che non può aprire uno, così ogni caricamento audio finito "Conversione fallito" con una piastrella libreria vuota. L'audio ora prende il proprio ramo, come video: in streaming a graffi (mai in cumulo), decodificato ONCE in picchi, e la sua pagina-0 thumbnail tratto da quelle cime in Java. Non lo showwavespic di ffmpeg, che tiene ogni decodificato telaio fino alla fine del file: misurato a 298 MB per 30 minuti MP3 e 546 MB per un'ora, su un filetto non incollato per upload in un baccello dimensionato per documenti; il codice in streaming picchi a 54 MB. FLAC, che il tavolo MIME negozi come un binario generico, è riconosciuto dalla sua estensione. E' il momento giusto. - GET /peaks — la durata e una forma d'onda di 1600-bucket (base64 di 0-255 picchi). Il PCM di ffmpeg è leggere come scorre e solo un breve per 50 ms finestra è tenuto, quindi un'ora costa 72,000 pantaloncini; il decode del browserAudioData tratterebbe un gigabyte per la stessa ora. Conservato accanto al file come <datId> peaks v1.json, quindi viene calcolato una volta per contenuto. - POST|GET /transcript — una trascrizione WebVTT timed da sussurro-asr (vad filter on), eseguito come lavoro su un thread virtuale con il suo stato in <datId> transcript v1.json, che o replica può leggere (un tavolo di lavoro in memoria sarebbe invisibile all'altro baccello). Un lavoro per pod alla volta: sussurra-asr è una replica di CPU-bound condivisa con segreteria e trascrizione di riunione. Una corsa il lavoro riscrive il suo marcatore ogni minuto dal proprio filo (unito prima che il risultato sia scritto), così un lavoro il cui pod è morto legge come fallito dopo tre battiti mancati invece di bloccare l'autore fuori per un timeout di Whisper; ?restart=true sostituisce una trascrizione finita. Misurato contro il servizio live: una registrazione di 2 min 7 ha preso 25 s. Entrambi richiedono VIEW DOCUMENTS e il livello di accesso all'immagine e servono solo risorse umane: segreteria, chiamata registrazioni e chat voce note ogni portare una regola per-record in DocsService che questo servizio non possono vedere, quindi rimangono un 404 finché qualcosa che ha bisogno di loro porta avanti questa regola. La costruzione raccoglie anche gli alias MIME audio di kamo-shared-library: M4A, WAV, OGG e AAC sono stati rifiutati come un errore del MIME.

  8. · DocsService

    Diapositive audio — metadati media, e gli studenti giocano i media attraverso il loro incarico

    La navigazione di una diapositiva audio vive in media meta json (durata, picchi di forma d'onda, capitoli), che l'editor scrive e il giocatore legge indietro verbatim. Viene salvato (con un carico di 256K e un JSON oggetto, e tenuto solo mentre lo scorrevole ha media), duplicato, congelato a pubblicare e servito su giocatore DTO. Publish scrive anche media duration ms da esso — dichiarato sulla versione dall'inizio e mai scritto — e la stima del corso conta la lunghezza reale di una lezione audio. L'impronta hash di una trascrizione e metadati di una diapositiva AUDIO, quindi correggere una linea di trascrizione o spostare un capitolo è un cambiamento pubblicabile. Ogni altra diapositiva cela esattamente come prima: ampliamento hash a tutte le diapositive avrebbe girato ogni corso pubblicato con una trascrizione video "inedita" il giorno della spedizione. E' un gioco da ragazzi. supporti con supporto Range, autorizzati dall'assegnazione del membro: il file deve essere nel versione sono state assegnate, in Risorse Umane, nella loro organizzazione, dal vivo e non battute. The flusso di imaging che sostituisce per gli studenti ha bisogno di VIEW DOCUMENTS, che 32 dei 149 membri che detengono qualsiasi diritto non aveva — ognuno di loro ha incontrato un giocatore morto. Perché uno studente è autorizzato da la presenza del file in un corso, salvare un'unità ora rifiuta un file che il suo autore non può aprire (422 nominare la diapositiva o la domanda), e collegare qualsiasi file a tutte le esigenze VIEW DOCUMENTS, a destra il l'imaging stesso richiede; la pubblicazione ri-corre entrambi i controlli su tutto il corso, quindi un progetto salvato prima o da un coautore è tenuto alla stessa regola. Altrimenti MANAGE TRAINING da solo potrebbe pubblicare un file il suo titolare non può leggere in un corso e assegnarlo a se stesso. Il sentiero degli studenti anche serve solo una foto, un video o una registrazione — mai un documento un salvato artigianale chiamato. Risorse HR è anche più stretta di ogni altra regola byte (pacchetti emessi sono SERVICE APPLICATION, documenti per parte LOAN o ACCOUNT MEMBER VAULT, e chat/voicemail/call media hanno le proprie collezioni). Le letture sono verificate come /imaging/stream, e la risposta Range è un aiutante condiviso (ImgRangeResponses) che /imaging/stream ora utilizza anche. Publish rifiuta una diapositiva audio senza una descrizione nelle parole proprie dell'audio. Ha bisogno di kamo-shared-library "feat (imaging, formazione): gli upload audio passano il controllo MIME, e le diapositive portare metadati multimediali" (media meta json su entrambe le entità di scorrimento; il DDL viene applicato).

  9. · kamo-shared-library

    Gli upload audio passano il controllo MIME e le diapositive portano metadati multimediali

    Ogni upload audio ma MP3 è stato rifiutato come un errore MIME. Un upload è accettato solo quando tipo del browser e lo sniff di Tika risolvono alla stessa ImageMimeType, e per l'audio i due lati mai scrivere un formato allo stesso modo. Misurato contro Tika 2.9.2: uno sniff WAV come audio/vnd.wave (browser invia audio/wav), Ogg come audio/vorbis o audio/opus (audio/ogg), ADTS AAC come audio/x-aac (audio/aac), e Windows e macOS inviano un .m4a come audio/x-m4a dove Tika dice audio/mp4. stringToImageMimeType ora ignora il caso, lo spazio circostante e i parametri, e mappa quegli alias sulla costante che chiamano. Niente mappa un contenitore che può trasportare video (Matroska, WebM, MP4) a una costante audio, e FLAC rimane un binario generico su entrambi i lati, come prima. TrainingSlide e TrainingVersionSlide ottengono media meta json (TEXT): la durata, i picchi delle forme d'onda e il capitolo segna il giocatore di formazione naviga una lezione audio da — scritta dall'editore, congelato con la versione. DDL, applicato alla produzione a mano prima di questo commit (InitializerService non è distribuito): ALTER TABLE public.hr training slide ADD COLUMN IF NOT EXIST media meta json TEXT; TABELLA MINUTI ADD COLUMN IF NOT EXISTs media meta json TEXT;

  10. · kamo-internal

    Titolo completo di una finestra di strumento, tuttavia è tagliato corto

    Una barra del titolo è una riga, e una conversazione, un'email o un soggetto del biglietto o una directory del terminale è regolarmente più lungo della stanza che ottiene — il membro potrebbe solo leggere l'inizio del taglio. Ogni luogo il titolo di una finestra è disegnato ora apre una carta con il tutto: la barra del titolo in prima fila, la strisce di finestre in piedi dietro, una barra di finestra galleggiante o massimizzato, e le schede sopra il pannello massimizzato (dove sostituisce il proprio browser unstyled `title` tooltip). Raggiungere ogni modo che un membro può chiedere: - hover: dopo un breve riposo, e subito quando si scivola su da un altro titolo; una carta alla volta - premere: subito; abbattuto il momento in cui la stampa diventa una finestra trascina, e tenuto giù fino a quando il puntatore lascia o torna di nuovo - rubinetto: subito, tenuto dopo il dito solleva fino a quando un rubinetto atterra altrove - tastiera: concentrando una striscia, una scheda o una barra della finestra galleggiante; Escape chiude - tasto destro del mouse: il menu della finestra ora nomina la finestra in pieno in alto e ha una riga "Copy title" Solo per un titolo che è effettivamente tagliato fuori (misurato quando si aprirebbe, incluso un overflow sub-pixel `scrollWidth` arrotonda), e segue il finestra come la riga si muove, aggiornamenti quando il titolo viene rinominato sopra la presa, e se ne va una volta che un massimo o una riga più ampia permette il titolo in forma. La carta è un'ombra più profonda del colore della barra del titolo dell'org, titola il titolo completo sotto il cut-off uno, è selezionabile e copia l'intero titolo. La carta è portale ma React bolle i suoi eventi alla barra del titolo, quindi ferma la stampa, fare clic, fare doppio clic, menu contestuale e chiavi che potrebbero trascinare, alzare, massimizzare o spostare la finestra sotto di esso.

  11. · InitializerService

    Metti l'app nel catalogo dei diritti, aggiungi solo

    ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** da qualche parte sulla scala di livello, perché un'app il catalogo non descrive le terre da nessuna parte sulla matrice prezzi e il silenzio scrive è included=false su ogni livello. I computer ospitati sono stati venduti e descritti da nessuna parte, quindi ha rotto entrambe le affermazioni momento ServiceType 37 esisteva. Add-on solo, e per un motivo nessuna delle altre app aggiuntive condividono. MLOS, il sistema di prestito personale e i registri dei pazienti sono negoziati a causa di ciò che essi trasportare; I computer ospitati è negoziato a causa di ciò che spende. Un tier rung avrebbe consegnato ogni organizzazione su quel piano il diritto di assegnare le VM KubeVirt, e il programmatore delimita la flotta da REQUESTS piuttosto che l'uso, quindi gli org che usato il diritto prima prendere i nodi dal resto - a un pubblicato prezzo, che è la parte che rende difficile camminare indietro. Che cosa si muove su un rung è più nodi, non un cambio di prezzo. L'add-on segue la forma che il loop si applica già alle applicazioni negoziate: no list price, quindi nulla rende uno, e compatibile solo con i piani CUSTOM. È anche non offerto ovunque fino a quando l'app raggiunge COMPLETED, che non ha. La voce del catalogo si trova nella produttività accanto alle altre cose in cui le persone lavorano. A categoria in possesso di una app legge come una supervisione a chiunque apra la matrice.

  12. · kamo-internal

    Conti membri/AI umani, nomi fonetici, titolo di lavoro e requisiti di reparto

    Aggiungi membro / Aggiungi membro del team - Una prima sezione "Person o AI": intelligenza umana (default) o intelligenza artificiale come due tastiere-operabili carte di scelta. AI porta il membro del team di supervisione (predefiniti quando si sono un membro del team) e il modello AI; il posto di lavoro di un membro del team pre-riempisce come Remote. - Nome fonetico accanto al nome preferito, con punte di pronuncia e due pulsanti di gioco che leggono il nome come scritto e come scritto foneticamente attraverso il motore vocale del browser. - Il riassunto mostra l'Intelligence e "Says it"; la raccolta di un titolo di lavoro o di un dipartimento mostra che cosa esso si aspetta (descrizione + requisiti); un avviso di conto esistente dice il suo nome e pronuncia sono tenuti. - Bulk add: un'impostazione di intelligence batch (+ supervisore), un override per-row e una colonna fonetica; CSV importa auto-mappa "pronuncia", "umano o ai" e amici ("AI", "Bot", "Human"...). Dopo la creazione - Membri / Gruppi Membri: una colonna di intelligenza, un filtro All · Human · AI con conteggi, e ricerca rapida che trova "AI" e nomi fonetici. - La scheda membro (ogni nome hover): una pillola AI e una linea "Says it" con un pulsante di gioco; righe roster Preparalo con entrambi. - Profilo: l'eroe indossa la pillola AI e "Says it"; il nome fonetico viene modificato accanto al preferito nome; la carta di appartenenza mostra/edits Intelligence, supervisore e modello (solo membri di gestione, mai sul proprio profilo); la sala di lavoro guadagna una carta di attesa Role live, di sola lettura. Titoli di lavoro e reparti (/settings/essential) - La finestra di dialogo Aggiungi/Modifica ottiene una sezione Aspettative: una descrizione (4.000 caratteri, contatore) e una requisiti editor — categoria, testo, richiesto/preferito, riordinare, rimuovere, Inserisci aggiunge il successivo, incollare un elenco lo divide in righe, esempio chip, 50-row cap. - Le tabelle mostrano la prima riga della descrizione e una colonna Requisiti con un elenco hover; entrambe le pagine aggiornare dal vivo (pagato mentre la finestra di dialogo è aperta) e mostrare le parole proprie del server su un salvataggio rifiutato. Pezzi condivisi: app/lib/members/intelligence, app/lib/speech (detected, SSR-safe), IntelligenceBadge / IntelligenceChoice / PhoneticNameField / SayItButton, app/lib/orgRequisiti, RequisitiEditore, RoleExpectations. Spettacolo e piano sotto doc/superpoteri. Ha bisogno di kamo-shared-library + securityservice (stessa caratteristica) e le chiavi del dizionario hanno spinto prima.

  13. · SecurityService

    Membri umani/AI, nomi fonetici, requisiti di ruolo; posizione fissa salva la sicurezza di pulizia

    Membri - Create, create-team-member e bulk-create accettano `intelligenceType`, `namePhonetic` (nuovo account solo, come il nome), e per account AI `aiSupervisorMemberId` + `aiModel`. The il supervisore deve essere un membro attivo del team umano dell'org e mai il conto stesso; quando nessuno è chiamato il creatore sta in se si qualificano (AiSupervisorPolicy). Ogni rifiuto nomina i suoi campo prima di tutto è scritto. - PUT /members/{id}: `namePhonetic` è un campo di identità utente (stessa autorità come nome legale). `intelligenceType`, `aiSupervisorMember Id`, `aiModel` bisogno MANAGE MEMBERS o una finestra di dio aperta, e sono rifiutati per la propria appartenenza (CANNOT RELABEL SELF) in modo che un AI non possa ribellarsi umanamente. Passare a HUMAN libera supervisore e modello. - GET /members/{id}, /members/{id}/card, il roster di by-department e le righe della lista dei conti portano `intelligenceType` e `namePhonetic` (il profilo ottiene anche il supervisore id/name e il modello). - i titoli di lavoro e i reparti di org-config portano la descrizione + i requisiti per il modulo di creazione. Titoli di lavoro e dipartimenti - POST/PUT/DELETI ora richiedono CONFIGURE SYSTEM (o una finestra di Dio aperta) — le pagine delle impostazioni che scrivili già; il server ha accettato qualsiasi membro firmato dell'org. Legge invariata. - Descrizione e requisiti corrono attraverso i servizi condivisi (vedi kamo-shared-library). Fisso: PUT /member-security/{id} ha sostituito ruoli, diritti diretti e timeout di sessione anche quando richiesta non li ha nominati. La carta di posizione del profilo invia solo il titolo di reparto / lavoro / ufficiale titolo / manager, in modo che ogni posizione modifica cancellato i ruoli personalizzati del membro, diritti diretti e timeout override. Ognuno è ora sostituito solo quando la sua chiave è presente; l'editor di sicurezza invia tutti e tre. DlDl: (applicato a mano come il proprietario prima di questo push; zero errori di schema-mismatch in sicurezza/email/media nei seguenti 15 minuti).

  14. · kamo-shared-library

    Tipo di intelligenza, nomi fonetici, supervisione dell'AI, requisiti di titolo/dipartimento del lavoro

    Membri: `Member.intelligenceType` (HUMAN | ARTIFICIAL, STRING, default HUMAN su ogni costruzione percorso e nella colonna), `aiSupervisorMember Id` (plain id — i membri sono il tavolo più caldo ed è hard-deleted) e `aiModel`. Utenti: `namePhonetic`, accanto al nome piuttosto che dentro EmbNameFull, che conduce, conti, mutuatari e sessioni anche incorporato. Titoli di lavoro e reparti: una `descrizione` (TEXT, 4.000 caratteri) e requisiti ordinati in due tavoli per bambini (`org job title requirements`, `dept requirements`: categoria, richiesto/preferito, testo ≤ 500, id stabili, ON DELETE CASCADE). `OrgRequirements` è l'unica regola impostata per entrambi — la convalida prima di tutto è scritta, diff-by-id in modo che un requisito mantenuto mantiene il suo id, e un id da un altro proprietario è trattato come nuovo. Gli aggiornamenti seguono "absent significa invariato" per entrambi i nuovi campi, quindi un chiamante che non li manda mai non può pulirli; "" / [] chiaro. ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** DDL e' applicato a mano. 2026-09-22 03:01Z, prima di questa spinta). Una vera e propria SessionFactory su tutta la biblioteca pins la nuova tabelle e colonne a quella DDL (RoleRequirementsMappingTest).

  15. · kamo-internal

    L'opzione nav, la sezione impostazioni e la figura di archiviazione

    Il computer Linux di un membro, aperto dalla barra superiore. L'app (ServiceType 37) e i suoi tre diritti atterrato nella biblioteca condivisa; questa è la metà della gente vede. L'OPERAZIONE DEL NAV E' Esattamente quando c'e' qualcosa di strano. Gated sulla risposta del server a "che i computer possono aprire questo membro", non su un diritto e non su Dio. The l'opzione dev-machine doveva essere insegnata: una volta era Dio-gated, che ha messo un'icona di fronte alle persone con nessun account sulla macchina e ha prodotto l'errore generico di Guacamole quando l'hanno cliccato. Quindi, un manager che si occupa di ACCESS SUBORDINATE COMPUTERs e nessun computer del proprio ancora ottiene l'icona — c'è qualcosa dietro esso — e un amministratore che tiene MANAGE e nulla assegnato non lo fa. L'elenco è quello del server, nell'ordine del server: possedere prima, poi subalterni, poi l'organizzazione. Nulla qui filtra o riordina, per il motivo /network's quotazione è server-deciso — un lato client filtro è un elenco che è già stato inviato, e l'ordine trasporta informazioni che il cliente non vede mai perché non ha la catena del direttore. Ogni riga si espande alle dimensioni da DESKTOP RESOLUTIONS, riutilizzato piuttosto che ribadito in modo da una dimensione aggiunta lì atterra sul lato corretto della regola sotto "Fit my window" senza che nessuno muova un confine. Ogni riga indossa il suo stato, perché "asleep" è lo stato di riposo normale di uno di questi computer piuttosto che un colpa, e una fila che ha detto nulla lascerebbe qualcuno che aspetta un minuto pensando che era fallito. openHostedComputer è più di un fetch e un redirect per lo stesso motivo: un lancio ha tre risposte e due di loro non sono un collegamento. Asleep significa che una sveglia è iniziata e richiede 30-90 secondi mentre l'ospite legge la sua memoria indietro un volume replicato, quindi la scheda SAYS che — una scheda vuota per un minuto è indistinguibile da uno rotto, che openKamoDesktop doveva essere insegnato pure. Nessun login significa Kamo non ha mai memorizzato la password e il membro lo conferma una volta; questo è il progetto di lavoro, non un fallimento, così la scheda si chiude e una finestra di dialogo chiede invece di lasciare una pagina di spiegazione che nessuno voleva. Tre Impostazioni. Uno è stato chiesto; gli altri due sono il motivo per cui è utilizzabile Computer è quello: assegnare, ridimensionare, cambiare lo storage, dormire, rimuovere, vivere su usoOrgChanges. Capacità risponde "perché questo non inizierà?", che altrimenti non ha risposta da nessuna parte nel prodotto — e la risposta è contro-intuitivo, così le barre dicono REQUESTS piuttosto che l'uso, perché una macchina può guardare metà inattivo e Non ho spazio. Defaults ferma un'organizzazione ri-scelta di una dimensione e un disco per ogni persona, e ogni scatola ci può essere vuoto, dove vuoto significa "seguire la piattaforma" e non zero. La finestra di dialogo ridimensionamento avverte e la finestra di dialogo di archiviazione dice che non lo farà, che è la coppia che vale avere: una dimensione cambiamento riavvia il computer perché un'immagine di sonno è legata alla dimensione della memoria a cui è stato scritto, e un il cambiamento di storage espande il volume online e non disturba nulla. STORIA SULLE STATS PAGE, AS ITS OWN PANEL HostedComputerUsagePanel siede direttamente dopo lo Storage su Impostazioni → Il mio account → Stats & Costs. Non una riga quella tabella: le sue righe provengono dall'istantanea di fatturazione spazzare a piedi archiviazione RECORDS, e un disco del computer ha Nessuno — ciò che è su di esso è noto solo all'ospite, che riporta la sua figura filesystem. Il numero di Longhorn sarebbe sbagliato in un modo che conta, perché conta tutto mai scritto e mai cade quando Qualcuno cancella un file. Il file swap è escluso: è la dimensione della memoria del computer e esiste così la macchina può dormire. Due cose che i miei assegni catturati e fissi: il cancello nav tornò `non definito` piuttosto che `false` per un organizzazione senza set di bandiere (`undefined && x`), e la colonna di archiviazione passò `numero | null` in un ICU segnaposto — il soffitto e "cresce" sono lo stesso fatto, quindi ora legge il soffitto una volta e lascia TypeScript seguire la restringimento. verificato: tsc clean of everything but four preesistente ReplyQuote error in chat and support, presente a le stesse linee su origine/principale. 320 nav e lib test passare. eslint pulire su ogni nuovo file e nessun nuovo avvertimento in quelli modificati. Tutte e tre le guardie di creazione di immagini passano — check-i18n-keys pulire oltre 4268 file contro la testa del dizionario, che è stato spinto prima e verificato da antenati.

  16. · kamo-internal

    Elenchi di controllo nell'app Notes — prerequisiti, stickies, riquadri di casa e il calendario

    Una nota è la memoria; una lista di controllo è lavoro. /note ora ha due metà — Note e Liste di controllo (?view=checklists) — e una lista di controllo è il suo record (/api/checklist, KBService) con compiti che possono aspettare su altre attività. Liste di controllo - Una carta per lista sulla propria parete: bordo di progresso e anello, attività ribaltabili su scheda, programma chip; filtri ferroviari per in corso / non iniziato / fatto / programmato / su casa / preferiti, ricerca che raggiunge dentro ogni compito. - L'editor: aggiungere le attività in fretta (Enter; Shift+ Inserisci lo aggiunge come il passo successivo; incollare un elenco), fare clic per modificare, trascinare o Alt+arrows per riordinare, eliminare con Undo, All/Ready/Waiting/Done filter, "fare in ordine", staccare tutto, chiaro fatto, duplicare come copia nuova, copia come Markdown. - Prerequisiti: la modalità link sceglie su cosa aspetta un compito, grigiando tutto che andrebbe bene. Un compito bloccato mostra il suo lucchetto e su cosa aspetta; premendolo scuote la riga, accendere i compiti nel modo e offre di salti da loro. Slegare qualcosa di lavoro finito dipende da, o dare un compito finito un prerequisito aperto, chiede in primo luogo e nomi che riapre. The dipendenze binario disegna ogni link e illumina il compito hovered. Il server fa rispettare le stesse regole, quindi niente li aggira. - Sblocchi, zecche e rifinitura di una lista sono animati; il finale ottiene confetti e un tono in superficie dove è stata fatta l'ultima zecca. Ovunque un biglietto va - Floating: le liste di controllo galleggiano come stickies nello stesso overlay, impilamento ordine, layout salvato e ormeggio testa di esagonale come note (il loro gruppo di banchina). - Casa: una lista di controllo pinned è un pannello di lancio accanto a note pinned, selezionabile. - Un negozio live nutre ogni superficie, rinfrescata dalle liste di controllo cambiamento, quindi una zecca ovunque atterra ovunque. Calendario - Una lista di controllo va sul calendario come un evento reale (sourceType CHECKLIST), programmato attraverso la finestra di dialogo eventi del calendario da qualsiasi superficie, o da trascinandolo dal nuovo vassoio della lista di controllo del calendario su un giorno o un'ora. - Gli eventi della lista di controllo mostrano i loro progressi in ogni vista; la finestra di dialogo dell'evento mostra l'elenco, selezionabile in posizione; in ritardo polso lavoro rosso. - Il proxy del calendario ora pubblica il `calendar` org cambiamento su ogni scrittura: I propri argomenti di EmailService sono per pod, quindi una scheda sull'altro pod non ha mai sentito. Disegno:

  17. · APIService

    Avanti /api/checklist a KBService

    Le liste di controllo vivono nell'app Notes e sono servite da KBService accanto alle note se stessi; senza questo percorso l'intera funzione risponde 404 al gateway.

  18. · KBService

    L'API della lista di controllo, con i prerequisiti che il server applica

    /api/checklists: elenco, ottenere, creare, aggiornare, eliminare, duplicare, reset, chiaro, sequenza ("fare in ordine"), link chiari e per attività aggiungere, modificare, tick/untick, impostare prerequisiti, spostare ed eliminare. Ogni mutazione risponde tutta la lista di controllo in modo che ogni superficie riscatta da una risposta. Le regole vivono in ChecklistRules, puro ed esaustivamente testato, e tenere uno invariante: un compito fatto non aspetta mai su uno aperto. Una zecca viene rifiutata mentre una prerequisito è aperto (409 PREREQUISITES OPEN, nominandoli); un problema che le attività svolte dipendono da è rifiutato a meno che non cascade=true; un collegamento che avrebbe loop è rifiutato (409 CYCLE, con il loop); un collegamento che lascerebbe il lavoro finito in attesa di lavoro aperto ha bisogno di riaprire=true (409 REOPEN REQUIRED). Le stesse regole eseguire nel browser per feedback istantaneo, ma questo è quello che decide — un appiccicoso, il calendario o una scheda di stallo non possono ottenere intorno. I diritti sono l'app Note: VIEW NOTES da leggere, CREATE NOTES, EDIT NOTES e DELETE NOTES per cambiare. Mutazioni portare @RetryOnDbConflict e urtare il la versione della lista di controllo, quindi due schede ticking subito serializzare. create checklists.sql è il DDL, idempotent, applicato come il proprietario.

  19. · kamo-shared-library

    Elenco di controllo e ChecklistEsso entità, repository e DTO

    Le liste di controllo sono il secondo tipo di record dell'app Notes: lavoro da superare, il cui i compiti possono aspettare su altri compiti. Tre tabelle — checklist, checklist items e checklist item prerequisiti — tutti keyed da UUID così nessun id è mai un int64 a browser potrebbe arrotondare. Il testo delle attività è un testo cifrato sotto la chiave di nota del membro. La riga della lista di controllo porta il suo creato at/updated at (EmbRecordState's DATE UPDATED è insert/update=false e mai si muove) e un @Version servizio urti su ogni mutazione, in modo concomitante modifiche a un elenco collide invece di interleaving. Il DDL viene applicato a mano e non crea nulla. un tavolo.

  20. · SecurityService

    La superficie del browser e il secondo gateway Guacamole

    SecurityService è il confine di fiducia per i computer ospitati. Detiene la sessione, i diritti e l'org grafico; ComputeService detiene le credenziali Kubernetes e nessuna sessione. Niente ricontrolla a valle un diritto e niente tocca un cluster. L'identita' di ORG non e' mai stata presa dalla richiesta. Ogni chiamata timbra l'organizzazione risolta del chiamante. A Hosted Computer è un'intera macchina su una rete che vede solo la propria organizzazione e internet, quindi una gestore che ha accettato un org id da un corpo non sarebbe una lista trapelata — sarebbe una porta in qualcuno Il desktop dell'altro. Il percorso di assegnazione risolve inoltre l'e-mail del membro di destinazione attraverso il proprio chiamante organizzazione, che raddoppia come controllo di appartenenza: senza di essa un amministratore potrebbe assegnare un computer a un membro id appartenente a un altro inquilino e hanno la macchina costruita nello spazio dei nomi di questo org sotto quello Il nome della persona. Tre giorni diversi, perché ci sono tre domande diverse. Gestione delle esigenze MANAGE HOSTED COMPUTERS. Aprire uno ha bisogno che il computer sia tuo, o uno dei due diritti ACCESS per allargarlo — e se il chiamante può aprire Che il computer è risposto riascoltando la stessa visibilità domanda il menu nav è stato costruito da, piuttosto che da una seconda regola che potrebbe non essere d'accordo. Un membro che era mai mostrato un computer non può raggiungerlo indovinando un id. Confermare una password non ha alcun diritto: è come il computer di un membro ottiene un login. L'ORG CHART è bloccato solo quando una destra ha bisogno di esso, e in una domanda. ACCESS SUBORDINATE COMPUTERS raggiunge l'intero sottotreo sotto un membro, così i bordi ritornano come coppie e il traversale a valle li cammina su un set visitato — managerId è un campo di profilo libero, non un albero convalidato, quindi un ciclo è uno riorganizzazione via. Un membro senza diritti paga una chiamata, che conta perché il nav chiede questo su ogni pagina carica. Il segreto e' ora condividito, non confutato. GuacamoleTokenCodec viene estratto da GuacamoleJsonAuth perché ci sono due gateway: desktop. diverse chiavi di firma e diversi modelli di connessione. Due copie di quel formato sarebbero una implementazione e una responsabilità, e l'errore che la copia avrebbe eventualmente fatto è l'errore `espires` — si legge come un collegamento TTL ed è in realtà la finestra di ricollegamento della sessione, e ottenere i vuoti sbagliati un lista di connessione dell'utente in diretta silenziosamente. Il pavimento è applicato da entrambi i chiamanti. HostedComputerSso è un fratello piuttosto che un ramo. Quel gateway offre tre obiettivi fissi e mette tutti loro in ogni token; questo ha una connessione per computer, intitolata al computer, con una sola volta credenziali coniate per lancio — quindi la password Kamo del membro non viaggia mai in un token. La piattaforma desktop deve mantenere una copia decrittabile di una password di account precisamente in modo che Guacamole può auto-login; questo non lo fa, e questo è il miglioramento. PasswordChangeController ora spinge la nuova password ai computer del membro. Questo è il momento SOLO esiste il testo normale — Kamo memorizza un hash e non mantiene alcuna copia reversibile ovunque — e la spinta è migliore sforzo da costruzione: un fallimento non deve mai fallire il cambiamento richiesto dal membro, e un computer addormentato è segnato stale così il suo prossimo lancio chiede una conferma. Nulla è in coda, perché una password in coda è memorizzata password con un ritardo. Suite: 2755 test, 5 guasti, e tutti e cinque sono gli stessi prodotti di origine/principale pristina — i UnuthenticatedEndpointRatchet on PromotionCodeInternalController (aggiunto da 9578ca0 e mai aggiunto al e quattro... NPE su applicataJobStamp. Verificato sia in esecuzione un trattato di lavoro pulito all'origine/principio. Il mio controller passa il ratchet: ogni gestore risolve una sessione e risponde 401 senza uno. Ha bisogno del segreto hc-guac-sso per i collegamenti di menta; fino a quando non esiste il percorso di lancio dice così chiaramente piuttosto che restituire un link che atterra sulla schermata di errore generico di Guacamole.

  21. · EmailService

    Un membro può mettere una lista di controllo sul loro calendario, una volta

    Le liste di controllo vivono in KBService e il calendario possiede solo WHEN, quindi un elenco di controllo programmato è un evento membro ordinario che trasporta fonteTipo CHECKLIST, la lista di controllo UUID e un link profondo in /notes. Il link è derivato lato server, mai letto dal corpo, e l'evento passa attraverso il membro normale crea il percorso in modo che il cambiamento del calendario pubblichi ancora incendi. Un secondo programma attivo della stessa lista di controllo è un 409 che nomina il primo. E' il momento giusto. li elenca per i chip su /notes. Una modifica non può ancora cambiare di cosa si tratta un evento. Elenco dei promemoria mantenere il tipo di calendario e ottenere un'icona della lista di controllo.

  22. · APIService

    Avanti il percorso dell'agente del computer ospitato, e solo quel percorso

    /api/hosted-computers/agent/** -> ComputeService. La politica di rete di un computer ospitato nega completamente il cluster — nessun database, nessun servizio, nemmeno cluster DNS — quindi l'unico modo per una macchina virtuale di un inquilino per dire a Kamo qualcosa è fuori su Internet e di nuovo attraverso api. Tutto il resto su un computer è spinto in esso; questo è il solo sentiero in entrata. Il problema è il punto. I suoi fratelli sotto /api/hosted-computers/ sono l'API di gestione interna: assegnare un computer, ridimensionare uno, cancellarne uno, leggendo la capacità di un altro inquilino. Questa porta è SecurityConfig è completamente commentato, quindi un percorso inoltrato è pubblico e il servizio a monte possiede il auth — una wildcard qui avrebbe pubblicato un VM-creation API su Internet. Questo è lo stesso errore /api/bulktext/inbound/** esiste per evitare, e il motivo per cui la superficie dell'agente è stato fatto un bambino di /agent piuttosto che un fratello delle rotte di gestione. avanti piuttosto che forwardWebhook: a differenza di un webhook vettore non c'è firma di terze parti sopra grezzi byte, e le credenziali è una ordinaria autorizzazione: intestazione del cuscinetto — un segreto per computer ruotato su ogni scia, che ComputeService controlla contro quel computer. Il punto finale è solo la telemetria la cui risposta non porta nulla sull'organizzazione, quindi una credenziale sollevata dal desktop di un inquilino compra la capacità di pubblicare la figura di archiviazione del desktop e nient'altro.

  23. · kamo-shared-library

    Una domanda per l'intero grafico di report di un'organizzazione

    trovareMemberAndManagerIds restituisce ogni (memberId, managerId) bordo in una organizzazione, per Hosted ACCESS SUBORDINATE COMPUTERS destra — che raggiunge l'intero sottotitolo sotto un membro piuttosto che solo i loro rapporti diretti. L'alternativa è trovareDirectReportMemberIds camminato livello per livello, che è una query per livello su un percorso il menu nav colpisce su ogni carico di pagina, e la profondità è una proprietà del grafico org del cliente piuttosto che qualsiasi cosa questo codice controlli. Restituisce le EDGES piuttosto che un subtreo risolto, perché il traversale deve sorvegliare un ciclo: managerId è un riferimento di forma libera sul proprio profilo di un membro, non un albero convalidato, quindi A reporting a B mentre B riferisce a A è un clic sbagliato o una riorganizzazione via e una domanda ricorsiva non sarebbe tornato. Il chiamante cammina questa larghezza-prima su un set visitato. Filtri specchio trovareDirectReportMemberIds esattamente, tra cui l'esplicito JOIN sinistro su tm.user — un percorso implicito unire è un INNER unire in JPQL e sarebbe silenziosamente cadere ogni relazione la cui riga utente è mancante, che il metodo è il proprio commento record. Validato da LibraryQueryParseTest, che traduce ogni @Query nella libreria contro l'entità reale mappatura. Ciò conta qui: Spring Data convalida una query annotata quando costruisce il fagiolo del repository, così un percorso cattivo compila, passa CI, navi, e poi ferma il servizio consumante da iniziare affatto.

  24. · kamo-internal

    Una citazione di una casella di posta sociale di un messaggio più vecchio nomina il suo autore con la loro carta

    La citazione ora prende il suo autore dal server (@kamo/chat-core's quota.senderMemberId), che detiene un contatto sociale dal mediaservice ceee73e — le parole di un contatto sono memorizzate sotto il proprietario del collegamento, e il preventivo utilizzato per il nome del proprietario. Quindi il nome di un rappresentante in una citazione di un messaggio più vecchio della pagina caricata apre la loro carta, come uno caricato già fatto. Un messaggio di contatto caricato è rifiutato anche qui, qualsiasi cosa dica un server più vecchio.

  25. · kamo-internal

    La carta mostra il membro id a coloro che gestiscono i membri

    L'HR e il supporto leggono l'ID di un membro su un tooltip sui roster HR, che la scheda membro ha sostituito (il tooltip si sedeva dove la carta si apre). I dettagli della carta ora portano una riga ID membro, con la stessa copiare il pulsante come i valori di contatto, per gli spettatori che possono aprire il profilo di tale membro — i diritti che gestiscono i membri, Dio e il membro stesso. Tutti gli altri non vedono id.

  26. · kamo-shared-library

    L'app, tre diritti, tier/state enum e le entità

    ServiceType.HOSTED COMPUTERS a id 37, TESTING piuttosto che COMPLETATO. La fase sta portando peso qui piuttosto che descrivere il progresso: AppCatalogService risolve `disponibile` come `stage == COMPLETED`, e un'app non disponibile è saltata dal loop di auto-provision di FeatureController. Tutti gli altri COMPLETI app arriva acceso per tutte e 25 le organizzazioni il giorno in cui navi; questo porta macchine virtuali tenere RAM reale su un cluster a due nodi, quindi deve essere concesso per organizzazione da un operatore che ha guardato la capacità. Nulla è perso — la piattaforma Apps & Features schermo esiste esattamente per pubblicare un'app indipendentemente dalla sua fase, quindi la riga è in attesa lì sotto "Non disponibile". Tre diritti al 326-328, non 320-322: il checkout locale era di 30 commit e 320 è MANAGE EMAIL OPT OUTS. Leggi l'IDS in quel file, mai l'ordine linea — 318-325 sedersi centinaia di linee sopra la costante che sembra durare. Tutti e tre sono radici e nessuno è un bambino di un altro, che è la decisione che vale la registrazione piuttosto che il conte. MANAGE HOSTED COMPUTERS gates la sezione impostazioni; i due diritti ACCESS gate WHOSE computer appare nel menu nav di un membro. Parenting sia sotto MANAGE sarebbe sbagliato nel costo direzione — un piombo IT che ha bisogno di aprire qualsiasi macchina arriverebbe tenendo lo schermo di provisioning, e un manager ha concesso una visione dei computer del loro team sarebbe in grado di ridimensionarli. Né porte a computer OWN del membro: questo non è affatto un diritto, perché rendendolo uno permette un computer fornito per qualcuno che non può raggiungerlo. HostedComputerTier e HostedComputerState persistono da NAME. Questi tavoli sono nuovi, quindi non c'è niente per proteggere e nessun motivo per ereditare il pericolo di reorder AssocType e ServiceType devono vivere con. Due derivazioni nel livello sono portanti di carico ed entrambi falliscono QUIETLY senza di loro: - minimoDiskGb() è la memoria degli ospiti + 25. Un computer dorme scrivendo la sua RAM nel suo file swap, così un disco senza spazio per l'immagine produce un computer che non dorme mai — o scrive un parziale immagine e stivali puliti con la sessione del membro andato. Né segnala nulla, quindi il pavimento è più che suggerito. - richiestoMib() aggiunge l'overhead del lanciatore di KubeVirt, misurato a ~324 MiB sul desktop-1 e arrotondato a 400. La capacità deve confrontare con ciò che il POD richiede: un controllo che omette dice che un computer si adatta e poi lascia il suo pod Pending indefinitamente, che è indistinguibile da un computer che mai è apparso e non registra nulla che un membro può vedere. L'ASLEEP non è volutamente in esso — questa è l'intera caratteristica. La pausa di KubeVirt "blocca il processo senza rilasciare la CPU risorse, ma la memoria rimane assegnata", così addormentata qui significa suspend-to-disk: il VMI e il suo baccello del lanciatore sono andati e la richiesta di memoria è tornato con il programmatore. Lo stoccaggio è una coppia nullable con un terzo significato e nessun booleano. Un soffitto sopra il disco corrente è "illimitato" come un membro lo sperimenta; un soffitto assente significa che il disco non cresce. Non c'è `bandiera illimitata` perché un set di bandiera senza soffitto è la configurazione che tranquillamente mangia un cluster — la regola StorageAutoExpandSweep già fa rispettare per i file, per il motivo che registra. PhiModule.HOSTED COMPUTERS è BLOCKED NO BAA, e la ragione è una proprietà della cosa piuttosto che una lacuna nelle carte. Ogni altro modulo è una superficie conosciuta con flussi di dati noti; questo è un desktop qualcuno può installare qualcosa su e incollare qualcosa dentro, e Kamo non può inventario senza guardando lo schermo. L'isolamento è sinceramente forte e questo non è ciò che chiede una BAA. Anche mappato KAMO UNIVERSE, CHESS e HOLDEM, che spedito senza PhiModule e sinistra PhiServiceTypeMapping Prova rosso. Non il mio, ma il test fallisce sul primo gap che trova, quindi senza di loro non può dimostrare HOSTED COMPUTERS è mappato. Prendono GAMES, che il loro genitore prende. Suite: 3026 test, e i 4 guasti rimanenti sono gli stessi prodotti di origine/principale pristina — RelazioneVisibilità Test (PlatformRightType ordinale, qui intatto), i due GROWTH REQUEST IMAGE storage test di dominio e NoSuchMethod di SystemBugCountContractTest. Verificato correndole in modo pulito lavoraretree all'origine/principio prima di cambiare nulla. Le tabelle si trovano nel database live.

  27. · kamo-internal

    Una risposta a un messaggio più vecchio nomina il suo autore con la loro carta troppo

    Sposta @kamo/chat-core a 0.1.19, la cui citazione di risposta porta mittenteMemberId: il server genitoreSenderMemberId quando ha inviato uno (null per un visitatore web-chat, le cui parole sono memorizzate sotto membro del sistema), altro membro del genitore caricato. Prima, la console poteva leggere l'autore solo fuori un genitore caricato, quindi una risposta a un messaggio più vecchio della pagina caricata citato un nome normale. - Colleague chat (MessageList) prendere l'autore del preventivo come è. - I biglietti applicano la regola il volto di una bolla segue a esso — il solo lato dello spettatore, una volta i lati sono noti (isOwnSide) — che ora vale anche per i genitori scaricati. - Le caselle sociali tengono la loro regola (un genitore carico da uno dei rappresentanti dell'organizzazione): il server non blocca l'ID di un contatto sociale, poiché i contatti sono memorizzati sotto il membro del sistema. pacchetto-lock.json: la versione di chat-core, risolta e integrità (controllata contro la tarball scaricato); le sue dipendenze pinned (@kamo/net 0.1.2, @kamo/realtime 0.1.1) sono invariate.

  28. · KlusterServices

    Per-org isole della VM, suspend-to-disk, e un'immagine d'oro in white label

    Un computer Linux di un membro, in esecuzione come una VM KubeVirt nel namespace della sua organizzazione e aperto dal browser. Separato dal desktop / in ogni modo che conta: quello è uno condiviso macchina per gli amministratori della piattaforma, deliberatamente sulla rete pod in modo da poter raggiungere il database, NATS e MinIO. Queste sono macchine inquilini la cui proprietà di definizione è l'opposto. Tre fatti hanno plasmato questo, e ciascuno contraddice l'ovvia lettura: - Fare una VM non libera niente. Documenti di KubeVirt: pausing "blocca il processo senza rilasciare la CPU risorse, ma la memoria rimane allocata". Così dormire è sospend-to-DISK — l'ospite scrive il suo memoria nel proprio swap e poteri off, il baccello del lanciatore termina, e la richiesta di memoria va torna al programmatore. Ha bisogno di runStrategy RerunOnFailure, documentato per far chiudere un ospite se stesso senza essere rilanciato; sotto Sempre il sonno sarebbe annullato in pochi secondi. - La camera è delimitata dal programmatore REQUESTS, non RAM fisica. Un baccello di lancio che non si adatta sits Pending per sempre, che sembra esattamente un computer che non appare mai e non registra nulla. Quindi una veglia viene rifiutata prima che venga tentata, e il rifiuto nomina il numero. - Le identità riservate Cilium non possono essere abbinate a una regola CIDR. Non e' vero. registra che da un'interruzione, dove aEntities [host, remote-node] doveva essere aggiunto a ALLOW il Nodo. Qui lo stesso fatto è la difesa invertita: nessuna regola li nomina, e la densità di default. Ciao. egressDenies loro in modo che nessuna modifica successiva può aprirli — un Cilium nega batte ogni permesso, da qualsiasi file. L'isolamento è affermato piuttosto che recensito. canary/verify-isolation.sh gestisce un baccello che trasporta lo stesso kamo.io/hc-org etichetta un baccello lanciatore porta, così ottiene la stessa identità e la stessa politica, e sonde entrambe le direzioni: i nodi, kube-apiserver, YugabyteDB, NATS, MinIO, kube-dns, i metadati l'indirizzo e i computer di un altro org devono essere tutti irraggiungibili; il computer internet e lo stesso-org Deve funzionare. Si riferisce anche, senza affermare, se le forcine router a monte — api.kamocrm.com si risolve a 47.181.8.84 mentre Traefik's LoadBalancer IP è di proprietà di k1m1 192.168.4.22, quindi l'agente battito cardiaco è il miglior sforzo per costruzione e nulla dipende da esso. White-labeling non ha bisogno di ricostruire distro, che è stato controllato la superficie prima dalla superficie. Ogni visibile L'identità di Xubuntu è config o un pacchetto rimovibile. strip-distro-identity.sh li rimuove e perni loro così apt non può ripristinarli — un file ombreggiato ritorna sul prossimo aggiornamento e il fallimento è un inquilino che vede il logo di qualcun altro settimane dopo. L'immagine d'oro navi senza logo e senza colori a tutti; l'agente li dipinge per org da Behavior & Labeling, onorando la regola che un inquilino non vede mai le immagini di KamoCRM. L'agente è solo stdlib e non può chiamare fuori, perché la politica di rete significa che non c'è nessuno per Chiama. Config è spinto dentro, la decisione del sonno è locale in modo che sopravvive a un'interruzione di Kamo, e l'ibernazione la prontezza è verificata (dimensione del salto, riprendere= E riprendere offset=, disco in /sys/power/state) prima del idle timer è armato — un ibernato non configurato non solleva, si avvia pulito e perde la sessione. 26 test coprono quello aritmetico più la validazione di ingresso di marca. ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* distribuito) ed è stato, contro il database live come il proprietario. Occorreva una sovvenzione alla ricetta esistente non menziona: un NUOVO schema non ha ACL, quindi i privilegi di default globali che coprono le tabelle lasciate kamo app con "permesso negato per schema ospitato computer" sul primo inserto. Verificato dopo. Ogni manifesto convalidato con kubectl si applica --dry-run=server.

  29. · kamo-shared-library

    Lasciare un caller risolvere un MediaObjImg da solo Img id

    Gli endpoint di imaging di DocsService (download/stream/list/delete) conoscono un id di Img ma non hanno motivo di tenere il MediaObj è stato attaccato a — fino a quando hanno bisogno per onorare la chat-attachment revoca bandiera su di esso (MediaObjImg.isAccessRevoked) senza possedere qualsiasi chat / schema multimediale stessi. MediaObjImgRepository solo supportato l'altra direzione (da obj id, ordinato, per il rendering di un messaggio allegati). findByImg Id chiude il gap; plurale perché l'unico vincolo è su (OBJ ID, IMG ID), non solo su IMG ID. Nuovo test: MediaObjImgRepositoryQueryTest, pinning la query derivata firma il modo in cui si fa. sibling repository (questa libreria non ha l'imbracatura runnable @DataJpaTest/H2, quindi un metodo no-@Query derivato è affermato da riflessione piuttosto che esercitata). Suite completa: 3013 test, 4 guasti preesistenti + 1 errore preesistente, tutti confermato presente su un'origine pulita / checkout principale prima di questo cambiamento e non correlato ad esso (PhiServiceTypeMappingTest: ServiceType.KAMO UNIVERSE non ha PhiModule... Non c'e' bisogno di un deposito. ReportVisibilityTest: un numero di report off-by-one; SystemBugCountContractTest: SystemBugRepository.findVisible firma deriva).

  30. · DaemonService

    Piegare i registri di piombo ogni 30 s e raccontarli di notte; il trigger di lavoro ha bisogno del segreto del cluster

    I registri principali (securityservice create lead ledgers.sql, applicato 2026-09-22) sostituiscono COUNT(*) su un piscina 796k-lead e oltre lead credits con totali mantenuti più un append-solo rivista che fila I trigger scrivono. Questo servizio li mantiene piegati e onesti: - LeadLedgerFoldJob (ogni 30 s): una dichiarazione per lotto cancella le righe di giornale e le aggiunge alle totali, quindi un lettore vede la figura prima o dopo, mai metà. I lettori aggiungono già la rivista il totale, quindi una spunta mancata costa tempo di lettura, mai correttezza. Al massimo 40 lotti di 5000 per zecca. - LeadLedgerReconcileJob (03:40 notte): racconta la piscina di ogni org e i crediti disponibili di ogni membro dalle righe e le confronta con il totale + diario in un'affermazione (una snapshot). Le differenze sono MODIFICAto come 'RECONCILE' delta, mai scritto su un totale, quindi il conte non può correre i trigger o una piega. Nomina anche qualsiasi trigger di giornale che manca o disabilita. In un sistema sano trova nulla, quindi ogni correzione è registrata a ATTENZIONE. Entrambi sono @DisallowConcurrentExecution e riprovare una dichiarazione aborti YugabyteDB con 40001 (ciascuno è atomico, così una riprova non può doppio conteggio). L' SQL è stato riprodotto contro YugabyteDB prima di questo naufragato (tempi tabelle: attiva, legge, piega e racconta, 60 controlli). JobTriggerController: POST /api/daemon/trigger/{job} e GET /status ha risposto a chiunque. SicurezzaConfig. consente a tutti, e il daemon-route IngressRoute mette questo servizio sul sito web pubblico (Host daemon.internal.kamocrm.com; probed 200 anonimo), quindi qualsiasi lavoro — ora compreso il conteggio — potrebbe essere iniziato da internet, come molte copie sovrapposte come la piscina di quarzo detiene. Entrambi ora richiedono X-Internal-Auth = mlos.internal-auth-secret (constant-time) e rifiutare tutti quando quel segreto e' fuori luogo. Nulla nella piattaforma chiama questo endpoint; un operatore può ancora, dall'interno del cluster. Test: LeadLedgerMaintenanceTest (fold loop e cap, racconta reportistica, trigger mancanti, la riprovazione regola, e le forme SQL che lo rendono sicuro accanto al traffico live), JobTriggerControllerAuthTest.

Il tuo universo ti sta aspettando.

Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.

Gratis per sempre — nessuna carta di credito richiesta