Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-shared-library
DecisionGate.applied Threshold espone la barra di fiducia reale
Il cancello si applica internamente max (corridoio tenant, sicurezzaFloor, piano) ma I chiamanti avevano solo il muro pre-gate. applicato La soglia restituisce il vero bar in modo da una decisione di registrazione può persistere la soglia-IN-EFFECT (esaminatore- riproducibile) invece di un valore che il cancello solleva silenziosamente. Additivo; valutare() invariato. DecisionGateTest 14/14 pass.
· kamo-internal
Spazio di lavoro dei materiali aziendali (P0) — cartelle, ricerca, massa, anteprima reale, compositore di posta elettronica condiviso
Sostituisce la griglia piana di 200 caratteri con uno spazio di lavoro completo del documento sull'imaging esistente backend (che già supporta cartelle, cestino, condivisione, storia, massa per MATERIALI): - Barra laterale pieghevole (creare / rinominare / cancellare, drag-to-folder) + Tutte / Vista cestino - Cerca, ordina, griglie - Bulk selezionare + bulk download (ZIP) / email / spostare / eliminare - Cassetto di dettaglio destro: anteprima reale, rinomina in linea + descrizione, move-to-folder, condivisione interna (membro, permesso, scadenza) e storia dell'attività - Email ora riutilizza il compositore condiviso MessageTool tramite lo strumento globale:open event (Da/mailbox, CC/BCC, corpo ricco, firme, bozze) invece di una forma su misura - Nuovi percorsi proxy di imaging: la cartella crea/[id] rinomina+delete/move-doc, rinomina, descrizione, ripristino, livello di accesso - Rimuove la libreria dei materiali sovrastati; tutte le funzioni Canva (creare/import/autofill/ orari) riportati. imgIds gestito come stringhe precise durante tutto.
· kamo-internal
Overhaul /messages — iframe rendering, elenco menu di contesto, threading, gare, a11y
Implementa l'audit della pagina /messages end-to-end. Questioni segnalate: - Rispondere/Ripristinare i pulsanti All/Forward ora mostrare le etichette di testo; rimosso dalle più-azioni a discesa (sono pulsanti adiacenti) mentre il nuovo menu di lista li mantiene. - Le righe della lista dei messaggi ora aprono il menu di azione condiviso con il tasto destro del mouse e tocca lunga pressione E' il momento giusto. le righe guadagnano anello di messa a fuoco (j/k), checkbox di selezione (x), e scroll-into-view. - Email ora rende in un iframe auto-altezza sandboxed (srcdoc) invece di inline pericolosamenteSetInnerHTML. Questo isola l'email CSS/layout, che risolve il lettura-pane "bounce" e la perdita di selezione del testo a metà raggio, chiude l'app CSS-leak, e aggiunge un predefinito "immagine esterna bloccata" il tracking-pixel gate. Correttezza/premi: - Risposta/Ripristina-Tutto ora impostato In-Reply-To/References (SuppleMessage unificato tipo) così risponde rimanere filettato; thread rapido-riparare Riferimenti + genitore id, HTML- sfugge al corpo, e invia dalla casella di posta condivisa/membro attiva. - Avanti porta gli allegati originali; rispondere/previa risolvere il messaggio completo Invece di citare ciò che è aperto. - Paraurti di gara (ultimo-wins) su caricoMessages / messaggio selezionare / carico filetto / carico di conversazione; sondaggio non più yanks utenti paginad a pagina 0; WS ricarica filtrato alla cartella attiva; searchPage resetta il cambiamento di query. - ThreadDettaglio espandere lo stato chiave da cartella+uid (crollo trasversale); markRead solo quando non letto; retry utilizza il prop della cartella. - Composito: ricevitore digitato a filo ma non fornito su Invia/Draft; dedupe di attacco + 40MB tappo aggregato + aggiornamenti funzionali; rilasciare il cliente ridondante OTK. - Proxy: intervallo in avanti + validatori di caching per lo streaming di allegati/inline; chiudere il multipart carve-out su percorsi di provisioning custoditi. - Email WebSocket: arresto reale dopo max retries, backoff esponenziale, connessione stabile reset di riprovazione; valore contestuale memoizzato per tagliare il mandrino di rientro del consumatore. Qualità: unificato. a11y (aria-labels, righe / tastiere arie; i18n (nomi delle cartelle, date dell'elenco, pagers, ICU plural); rimosso codice morto e phantom tastiera-shortcut voci.
· kamo-internal
Riprogettazione del pannello dello strumento — famiglie di accenti, testata, sezione-indice nav, carta di vetro unificata
Ridisegna i due sbarchi più visitati in una console operatore a forma di permesso. Fondazione - Accendere il già beccato Geist Sans/Mono (è stato scartato da un fallback Ariale); percorrere la tipografia MUI attraverso il Geist. - Aggiunga i gettoni per famiglie accente-* a white-label, una scala di elevazione, un top-edge in vetro acceso, un'utilità Operator-Label + .tabulare e un token --ease-house. Fisso --gradient-primary-trasparente (era hardcoded blue → ora derivato da --colore-primario). FeatureCard condivisa (un componente, corretto dalla tastiera) - Ora un vero ancoraggio (NextLink): il lavoro Tab/Enter/middle-click e l'anello visibile a fuoco può finalmente sparare. Aggiunge l'usoReducedMotion guard, mentreInView ingresso sulla facilità di casa, famiglia-accent chip acceso, conta pip, livelli di peso, e onClick passante. Rivela l'intento di colore per-modulo che è stato scartato sul render. Elimina la home card forked inline. Home - Masthead (mono kicker + time/name hello + tabular status strip) sostituisce il banner org-only; oklab Backdrop sostituisce la filigrana multiply di scala grigia; launchpad a due livelli a forma di permesso (normale ordinata + directory raggruppata) con una striscia di attenzione "Needs you today" e "Jump back in" (nuovo usoHomeRecent + globale Impostazioni impostazioni - Il rendering del registro sostituisce 18 blocchi di Collapse copiati: binario di sezione-indice appiccicoso + IntersezioneObserver scroll-spy + conteggi dal vivo, 4 supergruppi, divulgazione progressiva (Personal open, recenti-aware, ultima sezione di ripristino, espandere/collegare tutti), righe dello strumento di SectionHeader, e un accesso rapido fisso (contatto MAX RECENT slice + relativo-time + Start qui). Conserva ogni cancello permesso/prodotto-flag esattamente. Cross-cutting: scheletro + EmptyState, preferisce-ridotto-trasparenza + percorsi di movimento ridotto, per-locale Cappelli Operator-Label opt-out. Le nuove stringhe dell'interfaccia utente atterrano nel kamo-translation-dictionary (en) in un compagno commettere.
· kamo-shared-library
l'aggiornamento mirato
Conversione asincrona (fili virtuali) e spazzate programmate tengono un ImgDat staccato; salvare()/merge() cascate nell'orfanoRemoval=true raccolta immagini e getti "una collezione con cascade=all-delete-orphan non è più stata richiamata dalla proprietaria istanza di entità. Un UPDATE di massa solo le colonne di miniature evita il grafico dell'entità completamente ed è sicuro da qualsiasi thread.
· kamo-internal
Rispondi Tutto al pannello di lettura dei messaggi e la visualizzazione del thread
Rispondi Tutto era pubblicizzato (etichetta keyboard-shortcut + chiave i18n) ma non aveva Manico. Filo su: nuovo computeReplyAllRecipients helper mette il mittente in A e ad ogni altro destinatario originale in Cc, esclusi l'auto e la de-duping caso insensibile. Aggiunge un pulsante, il `a` scorciatoia, e una voce contestuale-menu in MessageBrowser, più un pulsante per messaggio in ThreadDetailView.
· InitializerService
Indice parziale-unique che rafforza un pacchetto di chiusura attivo per prestito (eClose double-close backstop)
INDICE CRONOLOGICO (seguito) Su mlos closing package (loan file uid) QUI stato <> 'CANCELLED'. Durable backstop dietro In-app idempotency guard: un pacchetto di chiusura attivo duplicato guidare la propria registrazione MERS + finanziamento (una doppia chiusura). ChiusuraPackage vive in condiviso-lib con solo voci @Index non uniformi e non può esprimere un vincolo parziale-unità tramite JPA, quindi è DDL scritto a mano qui (KI possiede schema). Idempotent; si applica sulla prossima corsa KI.
· MediaService
Tumbnail materiali generati dal programma
Una spazzata senza testa non può guidare la miniatura OTK di ConversionService, quindi generare una miniatura PNG pagina-0 via ImageIO subito dopo aver memorizzato l'esportazione — i materiali programmati ora rendono nella griglia come qualsiasi altro, nessuna backfill necessaria.
· kamo-internal
Programmi di generazione ricorrenti UI
ScheduleManager: creare/list/eliminare gli orari (recipe + giornaliero/settimanale/mese + ora/giorno + bersagli auto-post opzionali + didascalia); lanciato da Materiali, recintato sulla capacità di autofill Canva (Enterprise). + canvaApi + /api/canva/schedules proxies.
· MediaService
Generazione programmata — spazzare le ricette su una cadenza
- CanvaScheduleController: CRUD per gli orari di org (recipe + cadenza + ora/giorno + obiettivi sociali opzionali), calcoli successiviRunAt - CanvaGenerazione Servizio: senza testa E' una cosa che non va. Materiale (in-process ImageService; senza miniatura fino al riempimento) - CanvaScheduleSweep: @Scheduled spazzare, atomica per-schedule rivendicazione, genera e best-effort auto-posts il risultato alle connessioni sociali target tramite il cucitura pubblica firmata URL
· kamo-shared-library
CanvaSchedule entità + repo (generazione ricorrente)
Programma di ricorsi in oroscopio (recipe + cadenza + obiettivi sociali facoltativi) con una domanda atomica-claim in modo che una spazzata MediaService esegue ogni programma due una volta.
· kamo-internal
Trascrizione Whisper espandibile in linea su softphone voicemail + call-history righe
Ogni riga registrata (voicemail e cronologia delle chiamate) ottiene un 'Transcript' toggle che esegue la trascrizione di Whisper su richiesta e lo mostra in linea, quindi i membri possono leggerlo senza aprire il giocatore. Cached per registrazione.
· kamo-internal
Salvare + riutilizzare le ricette di autofill
TemplateAutofill: "Ricette salvate" chip caricare un modello + mappatura preriempita; "Salva come ricetta" persiste il modello corrente + valori di campo org-wide. + elenco canvaApi/save/delete + /api/canva/recipes proxies.
· MediaService
Ricette autofill salvate CRUD (org-scoped)
CanvaRecipeController: GET/POST /api/media/canva/recipes + DELETE /{id} — salvare/list/soft-delete una marca-template + mappatura del campo, portata al Il richiamo.
· kamo-shared-library
CanvaAutofillRecipe entità + repo (ricedimenti di riempimento automatico)
Rilegatura di un modello di marca Canva ai valori di campo (lettera testo o un'immagine dei Materiali), così gli amministratori possono eseguire una ri-mergenza dati standard.
· kamo-internal
Aggiungi campo ID materiale per creare forma, pagina dettagli e importazioni
Fila un materiale nullableId (max 40) attraverso il tipo di piombo, conduceApi (creare + aggiornare le richieste di fili), e il campo di sistema leadFields condiviso elenco — che guida sia la procedura guidata importazione manuale e l'API/vendor mappatura di aspirazione UI (più il modello CSV scaricabile). Aggiunge l'ingresso a /leads/new e una vista / riga di uscita sulla pagina dei dettagli di piombo, collegato al mappa in tempo reale del pannello-flash. Etichette via lead.new.fields / lead.view.fields / lead.view.rows (materialId).
· kamo-internal
Enterprise autofill UI — modelli di marca data-merge
TemplateAutofill: scegli un modello di marca Canva, riempi ogni campo con letterale testo, un org/compliance token (NMLS #, Equal Housing Declaration, org name/phone/ sito/indirizzo, nome del membro), o un'immagine dei Materiali; generare un data-merged progettare e importarlo nuovamente in Materiali. Gated sul Canva `autofill` (Enterprise) capacità. + metodi canvaApi e /api/canva/{brand-templates, E' il momento giusto. Proxies.
· MediaService
Autofill Enterprise — modelli di marca data-merge
- CanvaApiClient: elenco modelli di marca (dataset=non empty), ottenere dataset, lavori di asset-upload, creare/get autofill - CanvaController: GET /brand-templates, GET /brand-templates/{id}/dataset, POST /autofill — risolve i campi delle immagini caricando le MATERIALI di riferimento materiale a Canva come risorsa, poi data-merge; sondaggi al nuovo design. Canva 403 (nessuna capacità di riempimento automatico) superfici come autofill not disponibile.
· SecurityService
Persist mappato ID materiale su importazione manuale + aspirazione API
Entrambi gli switch setDirectFieldOnCreateRequest non hanno un caso predefinito, quindi un sistema non mappatoFieldPath è silenziosamente caduto. Aggiungere un caso materialId al manuale-importazione (LeadImportController) e venditore/API-intake (LeadIntakeController) in realtà persiste una colonna/campo di ID materiale mappato.
· kamo-shared-library
Aggiungi campo ID materiale end-to-end in condiviso-lib
Aggiunge un materiale nullable, max-40-charId all'entità di piombo (MATERIAL ID VARCHAR(40)), lo registra in LeadHistoryFieldRegistry (categoria del profilo) così le modifiche sono verificate, threads it attraverso Crea/Aggiorna/Leggi DTO e LeadService creare/aggiornamento (trim + truncate a 40, mirroring companyName), e lo preserva attraverso la conversione del piombo di base di >mortgage.
· kamo-internal
Attacco sociale + email-a-materiale + link pubblici
Distribuzione per materiali di marketing, costruita sulla nuova cucitura pubblica-URL firmata. - materialiApi.publicLink(imgId) + /api/materials/link proxy - Materiali: "Copy public link" e "Email questo materiale" (attacca il file a un invio in uscita tramite l'esistente multipart /api/email/send, gated on org email) - MaterialePickerDialog (Griglia riutilizzabile sopra l'assoc MATERIALE) - SocialComposer: il pulsante foto una volta disattivato ora apre il raccoglitore e attacca un materiale come supporto postale tramite il suo URL pubblico (funziona per Meta/Telegram/Discord)
· MediaService
URL pubblici firmati a breve termine per le attività di marketing
Consente ai fornitori sociali (Meta) e alle e-mail di acquisire un materiale specifico per un limitato finestra senza esporre l'imaging-materials privato secchio. - MaterialeUrlSigner: HMAC-SHA256 (platform.enc-key) token = imgId:orgId:exp, 1h TTL - MaterialsController: POST /api/media/materials/link (auth → mint URL per un L'immagine MATERIALE) + GET ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** (unauth → servire byte per un token valido; org + assoc controllato). Rides l'esistente sessionless /api/media/** avanti — nessuna modifica APIService necessaria.
· kamo-shared-library
Una transizione auto-sottomessa di prima classe
DRAFT→APPLICATION TAKEN per un mutuatario (un prestito, non un operatore, quindi nessun LOS TAKE APPLICATION). Percorsi attraverso la transizione() con un predicato di portata che concede SOLO il diritto di presa e un pinned aStatusId, quindi il mutuatario la presentazione diventa una corretta transizione delle tubazioni — legalità delle macchine statali, la hah-chained milestone, il ApplicationSubmission (INITIAL DISCLOSURE), e il dopoCommettere evento STATUS CHANGE — invece di un poke di stato di prestito silenzioso. L'appartenenza a un gruppo è verificata dal chiamante.
· kamo-internal
Elimina + anteprima + Import-file-to-Canva
- eliminare un materiale (gated on MANAGE MATERIALS) con conferma - fare clic su una miniatura per visualizzarla in un lightbox - "Import a file" trasforma un PDF/PPTX/immagine in un design Canva modificabile (proxy ricostruisce il corpo multipart come l'imaging uploader)
· MediaService
Importare un file in Canva come disegno modificabile
- No, no. (importazione di design combinato) - CanvaController POST /imports (multipart) → creare+poll import job → editor deep-link con correlazione state per il ritorno-nav - drop now-unused Base64 import in CanvaOAuthController
· InitializerService
La migrazione aggiunge la colonna di registrazione.transcript TEXT
· VOIPService
Trascritto di ritorno nella registrazione dei metadati per il lettore softphone
· kamo-internal
Mostra trascrizione Whisper nel lettore multimediale softphone
· ConversionService
TranscriptionService + endpoint generico; trascrivere registrazioni VOIP
- Estrarre un TranscriptionService riutilizzabile (ffmpeg normalizzare -> bisbigliare) e un generico POST /api/conversion/transcribe endpoint, sostituendo il punto di incontro specifico Controllore. Meet + VOIP ora condividere un percorso di trascrizione. - RecordingProcessController: trascrivi ogni registrazione VOIP finale/voicemail in-process (non-fatal on fail) e memorizzare la trascrizione sulla registrazione.
· kamo-shared-library
Colonna trascrizione su Recording + RecordingMetadata
Aggiunge una colonna TEXT TRANSCRIPT all'entità di registrazione e filetta una trascrizione E' il momento giusto. (con retrocompatto) Costruttori così esistenti 5 e 9-arg chiamanti sono inalterati). Popolato da registrazione finale flusso via Whisper; creato dalla migrazione KI.

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