Jurnal de schimbări
Ce e nou.
Fiecare îmbunătățire a platformei, pe măsură ce se livrează.
· kamo-shared-library
Adaugă tasta VENDOR CALLBACK RESOLVED tip eveniment (0,6a pătrundere)
· kamo-shared-library
Substrat de registru de împrumut Identificator
Nou pkg com.kamo.z.shared.mlos.identity (cheia de rutare în bandă largă): LoanIdentifierType (42 de ID-uri de primă clasă, fiecare care transportă Cardinalitate + Proprietate; @Enumerated STRING; singleActiveTypes() derivate din metadate) + Nu-ţi face griji. + entity loanIdentifier (BaseUuidEntity; FK-by-id Long loanFileUid + denormalized organizationId, decoupled from locked LoanFile; writh-once @Preactualized guard throws on value/type/customSubtype change, only status flip permised; @PrePersist normalizes emitent/subtype + enforces other<=>customSubtype) + LoanIdentifierRepositor (resolutioner finders; Value- only is search-aid- only). Verificat local: mvn instala BUILD SUCCES, 49 MLOS teste trece (inclusiv un singur activ drift-guard test care afirmă setul enum se potrivește kamoInitializer parțial-index DDL). KamoInitializer DDL: scanare + 3 indici parţiali unici + ALTE CECURI. RESOLVER + webhook ingress = primul nou MLOSIdentifierservice microservice (apărat).
· kamo-shared-library
StewardFeedback flywheel
Pkg nou ********************* se completează numai pe rândul StewardFeedback (FK ai decision.uid; verdict CONFIRM/OVERRIDE/MODIFY; Reg-B-aliniat motivCode; correctedValue jsonb; isTestLoan ştampilat la ora de scriere per doc12 §4.4; @Predate WORM guard) + StewardFeedbackRepository + StewardFeedbackRecorder care compune toate cele trei pietre cheie de fază-0 într-un singur tx (judecarea spinului a unei Aidecizie + enqueues mlos.steward.feedback.recorded through the event-backbone outbox + marchs the test partition). Recorder gated mlos.governance.enabled (default off -> zero radius de explozie). KamoInitializer DDL: scanare + indexuri steward feedback + FK to ai decision.
· kamo-shared-library
Imutable AiDecizie Logger WORM + două-perete de decizieGate (cheie 0,3, felie 1)
Noi pkg com.kamo.z.shared.mlos.decision (verdefield three thine, never edits donotmodify): imuabil apendice-numai Aidecizie (WORM via @PreUpdate guard; împrumutFileId is a Long FK to LoanFile.uid per doc01/gotchas, NOUID; supersession via substitutsDecizieId on the NEW row to stay WORM-consistent with the DB declanşator) + Nu-ţi face griji. enums + AiDecisionRepository (căutători cu scop de împrumut). DecisionGate = in-process bi-wall library (legal wall ABSOLUTE/non-tunable; three wall tonible; non-tunable platforma de securitate podea dedesubt) DEFERATĂ la felii de dependență: DecisionInput (FKs catalogul de fază-2), StewardTask/OrchestrationState, registru juridic, HMDA-firewall CEC, ModelVersion FK. KamoInitializer DDL adăugat (ai index de decizie + semnalizat DB WORM declanșator nevoie CRDB v24.x).
· kamo-shared-library
Poarta de închiriere pentru coloana vertebrală a evenimentului (Slice 3)
Foaia de parcurs 0.10: ******************* (cusătura de abonament pertenent) + aparține lui Tenant (subiect,orgId) care se potrivește în mod logic cu filtrarea oglinzilor NATS; pentruEvenimentul respinge acum orgId non-pozitiv (fără evenimente fără chiriaș). Izolarea MLOSTEnant Testul este poarta executabila cross-tenant (inclusiv token-limbary: org 12 nu meciuri org 123). MlosDeadLetterRepository câștigă un dispozitiv de căutare a steward-ului telescopic (repo-player org-scope guard) alături de cel cross-tenant cu grad de operator. Domeniul de aplicare pertenent al hameiului X-Normal-Auth este la nivel de proprietate și este amânat până la piatra cheie aut; urmează un test de izolare live-broker cu primul consumator concret.
· kamo-shared-library
Idempotență pentru consumatori, DLQ + reluare pentru administrator (Slice 2)
Adaugă nucleul de fiabilitate pe care orice consumator MLOS îl conectează în: ProcesedEvent dedup Ledger (unique consumer name+event id) + MlosDeadLetter DLQ + MlosDeadLetterStatus; IdempotentEventProcessor (INSERT-or-skip dedup in the handler's tx so a eşecs rolls back the marker; mort-letters trecut maxAttempts in loc de looping; deadLetterUnprocesable for unparseable otrable); DeadLetterReplayer (re-enqueues a DEAD letter through the outbox as a new eventId with LineageId -> no msg id-unique/died-wind-wind, marchs REPLAYED). MlosEventEnvelope gins @Jacksonized for round-trip deserialisation. Nou @Components parts the mlos.outbox.enabled opt-in; repos sunt în pachetul deja scanat. Live AbstractMlosDurableConsumer (abonament NATS) amânat primului său consumator de beton.
· kamolos
Adoptă căsuța de tranzacționare MLOS (calea producătorului)
Activează coloana vertebrală a evenimentului Phase-0 din KamoLOS: adaugă com.kamo.z.shared.mlos.event la @EnableJpaRepositores scan, mlos.* config (mlos.outbox.enabled=true, MLOS EVENTS stream + fereastra dedup, matura), și un test de cablare producător-cale dovedind enqueue-> Releul DURATA COMMIT publică exact o dată cu plicul evenimentId ca Nats-Msg-Id. Schema (mlos outbox event + indexes) este aplicat separat de către kamoInitializer-ul de utilizare.
· kamo-shared-library
Tranzactional outbox eveniment coloana vertebrală (Phase-0 cheie B)
Traseul producatorului de bani/conformitate in New brother pkg ************* (never edits donotmodify): MlosEventEnvelope DTO + MlosOutboxEvent outbox entity/repo + OutboxWriter (single-tx enqueue) + OutboxRelay (AFTER COMMIT hot-path + @Scheduled master, publishes with Nats-Msg-Id) + MlosNatsStreamConfig (new MLOS EVENTS stream with the dedup window NatsConfig lipses). Reuses the blocat NATS Connection/JetStream beans. Opt-in prin intermediul mlos.outbox.enabled (default off) astfel încât serviciile de non-adoptare nu sunt afectate. Exact-o dată-efect = outbox tranzactional + JetStream Nats-Msg-Id dedup. Consumer dedup / DLQ + CI chiriaș-izolare sunt Slice 2/3.
· kamo-internal
Afișează straturile de date per etapă inclusiv. Masca oceanică EDT4 + marcaje TRF2
Cărţile de scenă ale tabloului de bord din lume enumeră acum straturile de date la fiecare găteşte pe scenă, accentul pe cele nou adăugate: oceanul EDT4 (conectivitatea la mare) sub hidrocentrale; și marcaje de bandă TRF2 + clasificare de teren pe timp de rulare în timpul transportului. Format/date pure etichete (STAGE LAYERS in types.ts) Numărul de referință/regeni deja suprafața automat după ce proveniența se denivelează EDT3→EDT4 / TRF1→TRF2.
· kamo-internal
Stabilitatea plăcilor de suprafață + "Regenerați N" vizat pe pagină
Snapshot-ul agentului are acum o stagnare per-rețetă (actualizare/stare/lipsă); API + SSE la pagina: - Fila de servicii prezinta o linie de prospeţime pentru fiecare serviciu de gresie şi butonul Start devine "Regenerați N" (= vechi + lipsă) atunci când există o activitate vizată, sau "până în prezent." - Prezentare generală completă indiciu gresie arată cât de multe plăci nevoie de actualizare. Start este deja condus de proveniență pe gazda, astfel încât butonul declanşează o ţintă Regenul exact al celulelor vechi/lipsite.
· kamo-internal
Pagina admin a generaţiei mondiale a universului
Adaugă/setări/platformă/univers în cadrul Administraţiei Platformei carte + trei sub-tab-uri (Overview, Servicii, Acțiuni) Conducta de date KamoUniverse în direct. Platformă (Următorul API, platforma-admin poartă prin sesiune ***, aceeași regulă ca și garda client: - app/lib/worldgenNats.ts: o conexiune NATS de lungă durată + un abonat de stare cea mai recentă stare per etapă + instantaneu (în memorie + Redis) și Re-emite pe un autobuz în proces pentru SSE. Editurile pornesc comenzile. - aplicatie/api/univers/servicii GET starea curenta a fiecarei etape (status + tigla Conte + lockHeld). - *************** Postează o comandă de pornire către agentul K3m1. - app/api/univers/stream SSE stream of live status/snapshot events. Frontend (MUI + nex-intl, reflectă pagina de configurare): - utilizareWorldgen: un flux SSE comun (auto-reconectare) + start() pentru toate filele. - Prezentare generala: agent/batch/completion/tigle stat + o conducta live. - Servicii: o carte bogata pe script rol + ceea ce realizeaza, live stat insigna, au/total bara de progres, ultimul eveniment, și un buton Start (dezactivat în timp ce orice lot deţine blocarea globală). - acţiuni: rulaţi conducta completă sau o etapă individuală (cu confirmare), plus o reîmprospătare instantanee. Wiring: NATS URL adăugat la configmap; K3m1 agent + script telemetrie live în univers-pământ date; siruri de caractere în traducere dicţionar. TSC curat pe toate fișierele noi.
· kamo-shared-library
Adaugă caz insensibil găsiByEmailIgnoreCase
E-mailurile sunt stocate cu un caz inconsecvent (de exemplu Sage@KamoCRM.com) și CockroachDB egalitate șir este caz sensibil, așa că găsițiByEmail ratează Doar pentru caz. Necesar pentru recuperare parolă e-mail căutare.
· EmailService
Conturi de căsuță poștală autovindecată din aplicația DB (recuperare în derivă)
Aplicația DB este sursa adevărului pentru care cutiile poștale ar trebui să existe; KamoMail conturi în direct în utilizatorii virtuali ai serverului de poștă. Dacă poşta DB pierde date, Cutiile poştale dispar în timp ce înregistrările aplicaţiilor rămân. - MailboxSelfHealService: la pornire + zilnic, re-transmite orice aplicație KAMO MAIL căsuța poștală lipsă de la virtual users (proaspătă parolă de administrare aleatorie). - SyncMailboxes (setări "Sync" acţiune) acum împinge de asemenea aplicaţia-> provider pentru orice cutie poştală lipsă, nu doar aplicaţia furnizorului de import.
· kamo-internal
Compune/trimite în numele căsuţei poştale a membrilor schimbate
- Thread mailbox proprietar membruId de la switcher prin activ Mailbox în contextul compus (eveniment + URL param). - Mesaj nou / răspuns / transmiteți compunerea deschisă pentru căsuța poștală a membrilor selectați: Din listele de dropdown care căsuțele poștale ale membrilor + pseudonime, semnătura personalizată să le trimită și să le trimită/factureze autentificarea ca căsuță poștală (cutia poștală). - Se compune neschimbat atunci când nici o cutie poștală membru este activ.
· kamo-internal
Carry *** în sesiune per-tabStorage în loc de un cookie comun
Id sesiune a trăit într-un cookie browser împărtășit peste toate filele unui originea, astfel încât o a doua filă (impersation) nu a putut organiza propria sesiune. Mutați transportatorul în sesiuneStorage (per-tab): - sesiuneClient: token helpers + un ambalaj global de colectare care ataşează ID ca X-***-Token pe apeluri de aceeași origine /api, plus o singură dată - Migraţie de depozitare. Instalat prin SessionBootstrap în aranjament. - ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** genera-otk, sesiune/info, sesiune/extindere, logout, meet/invite-email. - generaOTK + getKsemId FromRequest preferă X-***-Token peste cookie. - /api/validat nu mai setează un cookie ***; returnează ID-ul și /validarea paginii îl stochează în sesiunea acestei fileStorage. - utilizeazăUserInfo + toate cârligele WebSocket citește ID-ul din sesiuneStorage. - logout capturează jetonul înainte de a goli depozitul astfel încât sesiunea Redis este încă invalidat. Imperformation just opens /validat?otk=... in a new tab (aceeași cale ca autentificare: Redis sesiune creat server-side, OTK înmânat /validat); noua fila devine propria sesiune și fila admin este neatins. Elimină KeepPrev/ImpersonationBanner return-to-admin machines. Orgiile rămân separate de domeniul .
· kamo-internal
Name
Adaugă o acțiune de "impersonat" de dreapta sus pe /setări/membru/[id], vizibilă numai atunci când sesiunea de semnare poartă modul Dumnezeu (getIsGod) și ținta nu este auto/nou. Apeluri noi / api / securitate / personal, apoi swap *** cookie prin calea OTK (/validat?otk=...&keepPrev=1) într-o nouă filă. pastreazaPrev pastra propria sesiune a adminului in Redis; o globala Caracteristică Banner stashes admin *** și oferă un singur click 'Return în contul meu" (acelaşi cookie-uri de origine nu pot ţine două sesiuni live în acelaşi timp). SetăriView câștigă un headerAction opțional slot.
· SecurityService
Obiectivul de a fi imitat de Dumnezeu
Post/api/security/impersonate ments a fresh ***+OTK for an arbitrare membru al org curent apelantului, poartă pe sesiunea apelantului care transportă modul zeu (GD). Înregistrează membrul admin al lui Dumnezeu Id ca SUDO MINTE ID pentru audit. Aceeaşi sesiune în formă de conectare construi ca EnterAsController, dar acelaşi-org şi Dumnezeu mai degrabă decât cruce-org.
· SecurityService
Return orgName + limbă în /user-info
Rezolvați numele de afișare al org și limba selectată a membrului (ISO-639- 1 code) din DB astfel încât kamo-universul poate arăta org fiecare jucător + pavilion limbă pe placa lor. Rezolvat live (nu din sesiune) astfel încât sesiunile existente Ia-le imediat.
· kamo-internal
KamoUniverse launch card + nav pictogramă (Gated ACCES KAMOWORLD, OTK redirecționează pentru a juca.*)
· kamo-shared-library
Adaugă access KAMOWORLD dreapta (145, Jocuri) pentru acces KamoUniverse
· KlusterServices
Registrul de imagini K1m1 care înlocuiește k0m1:5000 pensionat (aceeași acreditare)
· KlusterServices
Kamo-universal namespace+contingent+valkey, CockroachDB backup-uri, stack observabilitate
- univers/: namespace + ResourceQuota, valkey- universe (AOF, hostePath k1m1), noapte CockroachDB backup CronJob, operatorul boottrap script - monitorizare/: valori fixe ale cârmei *************** instala script, grafana.* ruta, bord univers + reguli de alertă - CI: aplicaţi namespace+valkey universului în faza k1m1 (pachetul NATS a scăzut: 43030d6 deja re-amenajat k3m1 cu izolarea conturilor)
· KlusterServices
Adăugați k3m1 nod + emigrare grup peeering la IP-uri LAN
- statuete: publicitate/se alătură peste 192.168.4.x (k1m1=.22, k3m1=.36); WireGuard a scăzut (k3m1 wg0 10.8.0.1 s-a ciocnit cu reclama K0m1 IP). - init-job + CI kubeconfig finals mutat la IP-uri LAN. - CI: adăugaţi secţiunea K3M1 CockroachDB (necesită secretul K3M1 KUBECONFIG B64).
· kamo-login
Înregistrări plătite de rută pentru a verifica după autentificare
După aut (manual sau auto-login), consuma apex-domeniul sp checkout plan cookie lăsat de kamo-register și redirecționează cumpărătorul către brand /subscribe?plan= page (Stripe checkout) în loc de aplicația implicită Destinaţia. Un foc: cookie curatat pe citire.
· kamo-register
Carry paid ?plan de la inscriere la checkout
Atunci când o înscriere a unui membru provine dintr-un CTA de stabilire a prețurilor plătite (?plan=pro drop apex-domeniul sp checkout plan cookie la finalizare. kamo-login consumă după ce utilizatorul autentifică și le direcționează către /subscrie -> Stripe, supravieţuirea registrului - > verificaţi - > login hamei.
· kamo-shared-library
Șabloane canonice pentru semnalizarea electronică (verificare + invitație)
Adăugați două șabloane canonice de e-mail la nivel de platformă însămânțate leneș per org: - esign.signer verification (step-up OTP: {{cod}}, {{numele}}) - esign.sign invite (invitaţie de semnare: {{numele}}, {sender}}, {mesaj}}, {link}) Trimite-le în lista de chei a lui Loader + resurse EmailService.seedForOrg le ia la prima trimitere. Activează OTP/invite live livrarea pentru fluxul de e-sign (a fost cel mai bun efort no-op fără șabloane).
· BillingService
Contorizarea consumului de e-sign + verificarea de către consumatori a autoservirii
#4 contorizare: - EsignMeterSubmissionService (@Scheduled per zi): agregate de origine API EsignUsageRecords per org+ period; primul 40/perioadă inclusă, restul depus ca Stripe MeterEvents. Ipotent prin intermediul raportatToStripe + IUD-ul de înregistrare a utilizării ca Identificatorul MeterEvent (Strape-side dedupe). Rezolvă numele evenimentului contorului Din preţul real al stripe-ului. se potrivește indiferent de metru prețul este obligat să (remediem neconcordanța de denumire). #5 checkout de consum: - ConsumerCheckoutService: Stripe Checkout Session (mode=subscription) contra prețul planului de produs (+ linia de depășire măsurată pentru Business); înregistrează ContAbonare (sursa PAID) + AbonareMembru + ContLicense on finalizarea și invalidarea drepturilor. - ConsumerSesssionRezolvator: autentifică cumpărătorul prin intermediul propriului lor cookie Redis (niciodată un antet de org stabilit de client). - CheckoutController Post - Nu. - StripeWebhook Service se ocupă acum de checkout.sesiune.completat. Aditiv/inert până la subscrie un consumator; taxa live are nevoie de un card real.
· kamo-internal
API SIGNATURĂ (E-Signature API)
Adăugați domeniul de aplicare E-Signature API la managerul API-cheie org astfel încât personalul să poată acorda Orgii de afaceri acces programatic e-semn. Utilizarea după luna inclusă Alocarea este măsurată pe semnătură.
· APIService
Portalul API (API SIGNATURĂ)
Add /api/public/esign/** to PublicApiController: validează tasta API org, solicită domeniul de aplicare al API SIGNATURE, limite de rată și transmite către ESigService plicul intern API (/api/esig/intern/**) cu X-Normal-Auth + X-Org-Id. Oglindește precedentul de abonament-catalog.
· ESigService
Plicul programatic intern API (origine=API) pentru afaceri
- Esign IntermediarController (/api/esig/intern/*): X-Normal-Auth + X-Org-Id authed, numit de APIService după ce validează cheia API SIGNATURE-scoped; refolosiri EsignEnvelopeService, etichete plicuri EsignUsageOrigin. API - *************** obţine o supraîncărcare de origine (implicit Manual) - Semnarea traseului acum metri de originea plicului (API - > overage, MANUAL never) - OTKAuthFilter bypass /api/esig/intern (authed intern-secret, nu OTK)

Universul tău te așteaptă.
Începeți gratuit în câteva minute.Adăugați produse oricând sunteți pregătit — fără migrare, fără autentificări noi.
Gratuit pentru totdeauna — nu este necesar un card de credit