Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-shared-library
Aggiungi VENDOR CALLBACK RESOLVED chiavi tipo evento (0.6a ingress)
· kamo-shared-library
Sostrato di registro di LoanIdentifier — 42 ids di tipo (keystone 0.5, slice 1)
Nuovo pkg com.kamo.z.shared.mlos.identity (la chiave di inbound-webhook routing): LoanIdentifierType (42 id di prima classe, ogni portante cardinalità + proprietà; @Enumerated STRING; singleActiveTypes() derivato da metadati) + E' il momento giusto. + Identificazione entità (BaseUuidEntity; FK-by-id prestito lungoFileUid + organizzazione denormalizzataId, decoupled da bloccato LoanFile; write-once @PreUpdate guard getta sul valore/tipo/customSubtype change, solo stato flip consentito; @PrePersist normalizza emittente/subtype +applicatori Verificato localmente: mvn install BUILD SUCCESS, 49 MLOS passa prova (incl single-active drift-guard test asserting the enum set match the KamoInitializer par-index DDL). KamoInitializer DDL: scansione + 3 indici parziali unità + ALTRE CHECK. RESOLVER + webhook ingress = il primo nuovo microservizio MLOSIdentifierService (deferito).
· kamo-shared-library
StewardFeedback volano — cattura ogni verdetto steward (chiave 0.11)
Nuovo pkg ************************** ** append-only StewardFeedback ground-truth Row (FK ai decision.uid; verdect CONFIRM/OVERRIDE/MODIFY; Reg-B-aligned ReasonCode; correttoValue jsonb; isTestLoan timbrato a tempo di scrittura per doc12 §4.4.4; @PreUpdate WORM Registratore gated mlos.governance.enabled (default off -> raggio di esplosione zero). KamoInitializer DDL: scan + indici steward feedback + FK a ai decision.
· kamo-shared-library
Immutable AiDecision WORM ledger + twowall DecisionGate (keystone 0.3, slice 1)
Nuovo pkg com.kamo.z.shared.mlos.decisione (spina di decisione di campo verde, mai edits dontmodify): ammutabile solo AiDecision (WORM via @PreUpdate guard; prestitoFileId è un lungo FK a LoanFile.uid per doc01/gotchas, NON UUID; supersessione tramite supersedesDecisionIdOR sul NUO fila E' il momento giusto. enums + AiDecisionRepository (trovatori a gironi). DecisionGate = in-process libreria a due pareti (parete legale ABSOLUTE/non-tunable; parete di fiducia sintonabile; non-tunable piattaforma piano di sicurezza sotto) — configurazione-solo @Component, nessun repo dep, sicuro a livello immobiliare. DEFERRED a fette di dipendenza: DecisionInput (FKs the Phase-2 catalogo), StewardTask/OrchestrationState, registro legale, HMDA-firewall CHECK, ModelVersion FK. KamoInitializer DDL aggiunto (indice di decisione + indice DB WORM contrassegnato che necessita di CRDB v24.x).
· kamo-shared-library
Porta di isolamento per la spina dorsale dell'evento (Slice 3)
Roadmap 0.10: ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** MlosTenantIsolamento La prova è il cancello cross-tenant eseguibile (incl token-boundary: org 12 mai corrisponde org 123). MlosDeadLetterRepository acquisisce un cervo org-scoped steward (reparatore da repo-layer org-scope) accanto a quello cross-tenant. Lo scopo per-tenant su X-Internal-Auth hops è a livello immobiliare e differito alla chiave auth; un test di isolamento live-broker segue con il primo consumatore concreto.
· kamo-shared-library
Idempotency, DLQ + Steward replay (Slice 2)
Aggiunge il nucleo di affidabilità che qualsiasi consumatore MLOS collega a: ProcessedEvent dedup ledger (unique consumer name+event id) + MlosDeadLetter DLQ + MlosDeadLetterStatus; IdempotentEventProcessor (INSERT-or-skip dedup in the handler's tx in modo da un guasto rolls indietro il marcatore; MlosEventEnvelope guadagna @Jacksonized per la deserializzazione di andata e ritorno. I nuovi @Components condividono l'opzione mlos.outbox.enabled; i repos sono nel pacchetto già registrato. Live AbstractMlosDurableConsumer (abbonamento NATS) differito al suo primo consumatore concreto.
· kamolos
Adottare MLOS uscita transazionale (percorso del produttore)
Abilita la spina dorsale dell'evento Phase-0 in KamoLOS: aggiunge com.kamo.z.shared.mlos.event alla scansione @EnableJpaRepositories, mlos.* config (mlos.outbox.enabled=true, MLOS EVENTS stream + finestra dedup, spazzatrice) e un test di cablaggio produttore-path che prova enqueue-> Il relè AFTER COMMIT pubblica esattamente una volta con l'evento di bustaId come Nats-Msg-Id. Schema (mlos outbox event + indexes) viene applicato separatamente dal KamoInitializer gestito dall'utente.
· kamo-shared-library
Backbone dell'evento di uscita Transactional (Phase-0 keystone B)
Percorso del produttore di denaro/compliance in NEW sibling pkg (mai modifiche donotmodify): MlosEventEnvelope DTO + MlosOutboxEvent outbox entità/repo + OutboxWriter (single-tx enqueue) + OutboxRelay (AFTER COMMIT hot-path + @Scheduled spazzatrice, pubblica con Nats-Msg-Id) + MlosNatsStreamCong Riutilizza il NATS Connection/JetStream chiuso. Opt-in via mlos.outbox.enabled (default off) in modo che i servizi non-opting non siano influenzati. Esattamente-once-effetto = outbox transazionale + JetStream Nats-Msg-Id dedup. Dedup di consumo/DLQ + CI inquilino-isolazione sono Slice 2/3.
· kamo-internal
Mostra gli strati di dati per stadio incl. Maschera oceanica EDT4 + marcature TRF2
Le schede di fase del cruscotto di livello mondiale ora elencano gli strati di dati ogni fase di piastrella cuoce, accentuando quelli appena aggiunti: la maschera EDT4 oceano (connettività marittima) sotto idro, e TRF2 lane marcature + runtime terreno pendenza sotto il trasporto. Formato puro/dati Etichette (STAGE LAYERS in type.ts) — nessuna nuova stringa i18n. Stale/regen conta già superficie automaticamente una volta che la provenienza urti EDT3→EDT4 / TRF1→TRF2.
· kamo-internal
Staleness di piastrelle di superficie + mirato "Rigenerare N" sulla pagina
L'istantanea dell'agente ora porta la staleness per-recipe (aggiornamento / stallo / mancante); far passare l'API + SSE alla pagina: - La scheda Servizi mostra una linea di freschezza per servizio di piastrelle e il pulsante Start diventa "Rigenerare N" (= stallo + mancante) quando c'è lavoro mirato, o "Aggiungi ad oggi". - Panoramica completamento tile suggerimento mostra quanti piastrelle bisogno di aggiornamento. L'avvio è già basato sulla provenienza dell'host, quindi il pulsante attiva un mirato regen di esattamente le celle di stallo / licenziamento.
· kamo-internal
Pagina di amministrazione di generazione mondiale dell'universo
Aggiunge /settings/platform/universe in Platform Administration — la sua piattaforma card + tre sotto-tabs (Overview, Services, Actions) — per avviare e monitorare Live. Backend (Next API, platform-admin gated tramite la sessione ***, stessa regola del guardia cliente): - app/lib/worldgenNats.ts: una connessione NATS di lunga durata + un abbonato di stato che memorizza l'ultimo stato di per-stadio + snapshot (in-memory + Redis) e riemette su un bus in-process per SSE. Pubblica i comandi di avvio. - app/api/universe/servizi GET stato corrente di ogni fase (status + tile conta + lockHeld). - No, no. POST un comando di avvio all'agente k3m1. - app/api/universe/stream SSE stream di eventi live status/snapshot. Frontend (MUI + next-intl, rispecchia la pagina di configurazione): - useWorldgen: un flusso SSE condiviso (auto-reconnect) + start() per tutte le schede. - Panoramica: agente/batch/completion/tile stat piastrelle + una linea di condotta live. - Servizi: una carta ricca per script — ruolo + ciò che realizza, stato dal vivo badge, barra di avanzamento/totale, ultimo evento e pulsante Start (disabilitato mentre qualsiasi lotto tiene la serratura globale). - Azioni: eseguire la pipeline completa o una fase individuale (con conferma), più un aggiornamento istantaneo. Wiring: NATS URL ha aggiunto alla configmap; `nats` client dipendenza aggiunto. Il k3m1 agente + copione telemetria live in universo-earthdata; stringhe nella traduzione dizionario. tsc pulire su tutti i nuovi file.
· kamo-shared-library
Aggiungi caso insensibile trovareByEmailEmailIgnoreCase
Le e-mail sono memorizzate con caso inconsistente (ad esempio Sage@KamoCRM.com) e CockroachDB string uguaglianza è caso sensibile, quindi trovareByEmailEmail manca sul caso da solo. Bisogno di recupero password di ricerca e-mail.
· EmailService
Conti di casella di posta self-heal da app DB (ricupero del motore)
L'app DB è la fonte della verità per la quale dovrebbero esistere le caselle di posta; KamoMail account in diretta negli utenti virtual user del server di posta. Se la posta DB perde i dati, mailboxes andare mancante sul fornitore mentre i record app rimangono. - MailboxSelfHealService: all'avvio + al giorno, riprogramma qualsiasi applicazione KAMO MAIL casella di posta mancante da virtual users (fresh casual app-managed password). - syncMailboxes (le impostazioni "Sync" azione) ora spinge anche app->provider per qualsiasi casella di posta mancante, non solo importa fornitore->app.
· kamo-internal
Compose/send per conto della casella di posta dei membri commutati
- Gestore della casella di posta filettataId dal commutatore tramite attivaMailbox in il contesto di composizione (event + URL param). - Nuovo Messaggio / risposta / forward aperto comporre per la casella di posta del membro selezionato: Dalle liste a discesa che le caselle di posta del membro + alias, firma personalizzata a loro, e inviare/disegnare autentica come loro casella di posta (mailboxId). - L'auto è immutata quando non è attiva nessuna casella di posta.
· kamo-internal
Carry *** in sessione per-tabStorage invece di un cookie condiviso
La sessione id ha vissuto in un cookie del browser condiviso in tutte le schede di un origine, quindi una seconda scheda (impersonazione) non poteva tenere la propria sessione. Spostare il vettore a sessioneStorage (per-tab): - sessionClient: helper token + un wrapper fetch globale che allega il id as X-***-Token su chiamate /api di origine stessa, più una volta cookie->sessionMigrazione distorsione. Installato tramite SessionBootstrap nel layout. - **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** genera-otk, sessione/info, sessione/esecuzione, logout, meet/invite-email. - generareOTK + getKsemIdFromRequest preferiscono X-***-Token sul cookie. - /api/validate non imposta più un *** cookie; restituisce l'id e il /validate pagina memorizza nella sessione di questa schedaStorage. - useUserInfo + tutti i ganci WebSocket leggere il id da sessionStorage. - logout cattura il token prima di svuotare lo storage in modo che la sessione Redis è ancora invalidata. Impersonation ora solo si apre /validate?otk=... in una nuova scheda (stesso percorso come login: Redis sessione creata lato server, OTK consegnato a /validate); nuova scheda ottiene la propria sessione e la scheda admin è intatta. Rimuove il manutenzione obsoletaPrev/ImpersonationBanner ritorno-admin macchinari. Org rimangono separati da dominio — invariato.
· kamo-internal
Pulsante Impersonate God-mode sull'intestazione delle impostazioni dei membri
Aggiunge un'azione top-right 'Impersonate' su /settings/member/[id], visibile solo quando la sessione firmata porta la modalità dio (getIsGod) e l'obiettivo non è auto/nuovo. Chiama il nuovo /api/security/impersonate, poi scambia il *** cookie tramite il percorso OTK (/validate?otk=...&keepPrev=1) in una nuova scheda. keepPrev conserva la sessione dell'amministratore in Redis; un globale Impersonazione Banner mette in scena l'amministratore *** e offre un clic su 'Ritorno al mio account' (i cookie di stessa origine non possono tenere due sessioni in tempo reale). ImpostazioniVisualizza guadagna uno slot opzionale intestazione.
· SecurityService
Endpoint dell'impersonazione di Dio
POST /api/security/impersonate mints un fresco ***+OTK per un arbitrario membro dell'attuale org del chiamante, portato alla sessione del chiamante modalità dio (GD). Registra il membro del dio admin come SUDO MEMBER ID per audit. Stessa sessione a forma di login costruire come EnterAsController, ma stesso-org e Dio-gated piuttosto che cross-org.
· SecurityService
Ritorno orgName + lingua in /user-info
Risolvere il nome del display dell'org e la lingua selezionata del membro (ISO-639- 1 codice) dal DB così kamo-universe può mostrare ogni giocatore's org + la bandiera della lingua sulla loro targhetta. Risolto dal vivo (non dalla sessione) in modo da sessioni esistenti Raccoglili immediatamente.
· kamo-internal
Scheda di lancio KamoUniverse + icona nav (gated ACCESS KAMOWORLD, OTK redirect to play.*)
· kamo-shared-library
Aggiungi ACCESS KAMOWORLD destra (145, GAMES) per l'accesso KamoUniverse
· KlusterServices
Registro delle immagini K1m1 sostituendo k0m1:5000 in pensione (stesse credenziali)
· KlusterServices
Kamo-universe namespace+quota+valkey, backup CockroachDB, stack di osservabilità
- universo/: namespace + ResourceQuota, valkey-universe (AOF, hostPath k1m1), nightly CockroachDB backup CronJob, operatore bootstrap script - Monitoraggio/: valori di timone spillati install script, percorso grafana.*, cruscotto dell'universo + regole di avviso - CI: applica il namespace+valkey dell'universo nella fase k1m1 (pacchetto NATS caduto: 43030d6 già ri-homed k3m1 con isolamento account)
· KlusterServices
Aggiungi nodo k3m1 + peering cluster di migrazione a IP LAN
- statofulset: pubblicizzare/aggiungere oltre 192.168.4.x (k1m1=.22, k3m1=.36); WireGuard è caduto (k3m1 wg0 10.8.0.1 colliso con l'IP di pubblicità di k0m1). - init-job + CI kubeconfig endpoints spostati in LAN IPs. - CI: aggiungere la sezione di distribuzione di K3M1 CockroachDB (bisogno K3M1 KUBECONFIG B64 secret).
· kamo-login
Percorso pagato iscrizioni per il checkout dopo il login
Dopo aver avuto successo (manuale o auto-login), consumare l'apice-dominio sp checkout plan cookie lasciato da kamo-registra e reindirizzare l'acquirente al marca /subscribe?plan= pagina (Stripe checkout) invece dell'app predefinita destinazione. One-shot: biscotto cancellato su lettura.
· kamo-register
Carry pagato ?plan dalla registrazione al checkout
Quando un membro iscrizione proviene da un prezzo pagato CTA (?plan=pro|business), rilasciare un cookie apex-domain sp checkout plan al completamento. kamo-login consuma dopo che l'utente autentica e li indirizza a /subscribe -> Stripe, sopravvivere al registro -> verificare -> login hops.
· kamo-shared-library
Modelli di firma elettronica canonici (verificazione + invito)
Aggiungere due modelli di e-mail canoniche su piattaforma seme lazily per org: - esign.signer verification (step-up OTP: {{code}}, {{name}}) - esign.signer invite (invito di firma: {{name}}, {{sender}}, {{message}}, {{link}}) Fili nella lista chiave di CanonicalTemplateLoader + risorse in modo da EmailService.seedForOrg li prende sul primo invio. Abilita OTP/invita consegna per il flusso di e-sign (è stato il no-op migliore sforzo senza i modelli).
· BillingService
Misurazione di utilizzo E-sign + controllo self-serv del consumatore
#4 metro: - EsignMeterSubmissionService (@Scheduled day): aggrega API-origin EsignUsageRecords per org+period; primo 40/periodo incluso, il resto presentato come Stripe MeterEvents. Idempotent via segnalatoToStripe + l'UID del record di utilizzo come l'identificatore MeterEvent (Stripe-side dedupe). Risolve il nome dell'evento metro Il prezzo reale di Stripe dell'addon e'... corrisponde a qualsiasi metro il prezzo è legato a (fissa il mismatch di denominazione). #5 consumatore checkout: - ConsumerCheckoutService: Stripe Checkout Session (mode=abbonamento) contro prezzo di piano della radice del prodotto (+ linea di overage misurata per Business); registra il AccountSubscription (fonte PAID) + AbbonamentoMembro + AccountLicense su e invalida i diritti. - ConsumerSessionResolver: autentica l'acquirente con il proprio *** cookie via Redis (mai un client-set org header). - ConsumerCheckoutController POST E' il momento giusto. - StripeWebhookService gestisce ora checkout.session.completed. Additivo/inert fino a quando un consumatore si abbona; la carica live ha bisogno di una carta reale.
· kamo-internal
Expose API SIGNATURE (E-Signature API) portachiavi
Aggiungi il campo API E-Signature al gestore chiave API org in modo che il personale possa concedere Accesso e-sign programmatico per affari o per affari. Utilizzo oltre il mensile incluso l'assegnazione è misurata per firma.
· APIService
Gateway API e-sign programmatico pubblico (ambito API SIGNATURE)
Aggiungi /api/public/esign/** a PublicApiController: convalida la chiave API org, richiede il campo API SIGNATURE, limiti di velocità e inoltro a ESigService busta interna API (/api/esig/internal/**) con X-Internal-Auth + X-Org-Id. Specchi il gateway abbonamento-catalogo precedente.
· ESigService
API di busta programmatica interna (origin=API) per affari
- EsignInternalController (/api/esig/internal/*): X-Internal-Auth + X-Org-Id authed, chiamato da APIService dopo che convalida la chiave API SIGNATURE-scoped; riutilizza EsignEnvelopeService, tag buste EsignUsageOrigin. API - **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** - Percorso di firma ora metri dall'origine della busta (API -> overage, MANUAL mai) - OTKAuthFilter bypassa /api/esig/internal (internal-secret authed, not OTK)

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