Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-shared-library
Adicionar chave tipo evento do tipo VENDOR CALLBACK RESOLVED (0.6a entrada)
· kamo-shared-library
Substrato de registo do identificador de empréstimos — 42 IDs dactilografados (pedra de chave 0.5, fatia 1)
Novo pkg com.kamo.z.shared.mlos.identity (a chave de roteamento de webhook de entrada): LoanIdentifierType (42 IDs digitados de primeira classe, cada um carregando Cardinalidade + Propriedade; @Enumerated STRING; singleActiveTypes() derivado de metadados) + **************************** + LoanIdentifier entity (BaseUuidEntity; FK-by-id Long loanFileUid + organização desnormalizadaId, dissociada do LoanFile bloqueado; write-once @PreUpdate guard arremessa no valor/tipo/customSubtype change, somente o status flip permitido; @PrePersist normaliza o emitente/subtype + obriga Other<=>customSubtype) + LoanIdentifierRepository (resolver finders; value- only is search-aid-only). Verificado localmente: mvn install BUILD SUCCESS, 49 passes de testes da MLOS (incl. teste de guarda de deriva monoativo que assevera o conjunto de enum corresponde ao índice parcial de KamoInitializer DDL). KamoInitializer DDL: scan + 3 índices parciais-únicos + OUTROS CONTROLE. RESOLVER + entrada webhook = o primeiro novo MLOSIdentifierService microservice (deferido).
· kamo-shared-library
StewardFeedback flywheel — capture todos os vereditos de mordomo (pedra de chave 0,11)
Novo pkg ************* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Gravador fechado mlos.governance.enabled (default off -> zero blast radio). KamoInitializer DDL: scan + índice steward feedback + FK para ai decision.
· kamo-shared-library
Registro imutável de AiDecision WORM + DecisionGate de duas paredes (keystone 0.3, fatia 1)
Novo pkg com.kamo.z.shared.mlos.decision (greenfield decision spinne, never edits donotmodify): imutable app-only AiDecision (WORM via @PreUpdate guard; loanFileId é um Long FK para LoanFile.ud por doc01/gotchas, NOT UUID; supersession via suplantationsDecisionId on the NEW row to stay WORM-consistente com o gatilho DB) + **************************** enums + AiDecisionRepository (encontradores em empréstimo). DecisionGate = biblioteca de duas paredes em processo (parede legal ABSOLUTE/non-tunable; parede de confiança tunble; piso de segurança de plataforma não-tunable abaixo) — config-only @Component, no repo dep, safe state-wide. DEFERRIDO às fatias de dependência: DecisionInput (FKs the Phase-2 catalog), StewardTask/OrchestrationState, legal registry, HMDA-firewall CHECK, ModelVersion FK. KamoInitializer DDL added (ai decision index + DB WORM sinalizado precisando CRDB v24.x).
· kamo-shared-library
Porta de isolamento de inquilinos para a espinha dorsal do evento (Slice 3)
Roteiro 0.10: **************** (a assinatura do consumidor per-tenant seam) +pertenceToTenant(sujeito,orgId) token-wise combinando que espelha filtragem NATS; paraEvent agora rejeita orgId não-positivo (nenhum evento sem um inquilino). MlosTenantIsolação Teste é o portão executável de cross-tenant (incl token-boundary: org 12 nunca corresponde org 123). O MlosDeadLetterRepository ganha um localizador de hospedeira com escopo de org (repo-layer org-scope guard) ao lado do operador-gated cross-tenant um. O escopo per-tenant no X-Internal-Auth hop é de toda a propriedade e diferido para o auth keystone; um teste de isolamento live-broker segue com o primeiro consumidor de concreto.
· kamo-shared-library
Idempotência do consumidor, DLQ + replay de mordomo (Slice 2)
Adiciona o núcleo de confiabilidade em que qualquer consumidor da MLOS se conecta: ProcessedEvent dedup bookger (unique consumer name+event id) + MlosDeadLetter DLQ + MlosDeadLetterStatus; IdempotentEventProcessor (INSERT-or-skip dedup in the handler's tx so a failure rolls back the mark; Dead-letters past maxAttemptts em vez de looping; deadLetterUnprocessable for unparseable envenen); DeadLetterReplayer (re-enqueue uma letra DEAD através da caixa de saída como um evento NOVOId with causationId lingene -> no msg id-unique/dedupwindow colision, marca REPLAYED). MlosEventEnvelope ganha @Jacksonized para desserialização de ida e volta. Novos @Components compartilham o mlos.outbox. habilitado opt-in; repos estão no pacote já escaneado. Live AbstractMlosDurávelConsumidor (subscrição NATS) diferiu para o seu primeiro consumidor concreto.
· kamolos
Adotar a caixa de saída transacional do MLOS (caminho do produtor)
Activa a espinha dorsal do evento Phase-0 em KamoLOS: adiciona com.kamo.z.shared.mlos.event à verificação @EnableJpaRepositórios, mlos.* config (mlos.outbox.enabled=true, MLOS EVENTS stream + dedup window, varredor), e um teste de fiação do caminho do produtor provando enqueue-> RELEN DE APÓS COMMIT publica exatamente uma vez com o evento envelopeId como o Nats-Msg-Id. Esquema (mlos outbox event + índices) é aplicado separadamente por KamoInitializer executado pelo usuário.
· kamo-shared-library
Caixa de saída transacional espinha dorsal do evento (Phase-0 keystone B)
Caminho de produção de dinheiro/cumprimento-grau no novo irmão pkg **************** (nunca edits donotmodify): MlosEventEnvelope DTO + MlosOutboxEvent outbox entity/repo + OutboxWriter (single-tx enqueue) + OutboxRelay (AFTER COMMIT hot-path + @Scheduled swewer, publica com Nats-Msg-Id) + MlosNatsStreamConfig (novo fluxo MLOS EVENTS com a janela de desdup NatsConfig falta). Reutiliza a ligação NATS/JetStream bloqueada. Opt-in via mlos.outbox.enabled (default off) para que os serviços de não-adoptação não sejam afetados. Exatamente uma vez efeito = saída transacional + JetStream Nats-Msg-Id dedup. O dedup/DLQ + CI locatário-isolamento são Slice 2/3.
· kamo-internal
Mostrar camadas de dados por estágio incl. Máscara de oceano EDT4 + Marcações TRF2
As placas de palco do painel worldgen agora listam as camadas de dados de cada palco de azulejos, acentuando os novos: a máscara do oceano EDT4 (conectividade marinha) sob hidro; e marcações de pista TRF2 + classificação de terreno em tempo de corrida em transporte. Formato/dados puros etiquetas (STAGE LAYERS in types.ts) — nenhuma nova string i18n. Contagem em estado estacionário/regen já superfície automaticamente uma vez que a proveniência colide EDT3→EDT4 / TRF1→TRF2.
· kamo-internal
Exaustividade da telha da superfície + alvo "Regenerar N" na página
O snapshot do agente agora carrega o staleness per-recipe (atual / stale / falta); plumb-lo através da API + SSE para a página: - A guia Serviços mostra uma linha de frescura por serviço de telha e o botão Iniciar torna-se "Regenerar N" (= velho + faltando) quando há trabalho direcionado, ou "atual". - Síntese de conclusão da dica de azulejo mostra quantas peças precisam de atualização. O Start já está orientado para a origem na máquina, por isso o botão activa um alvo Regen de exatamente as células velhas/desaparecidas.
· kamo-internal
Página de administração da geração mundial do universo
Adiciona /settings/platform/universo sob administração de plataforma — sua própria plataforma cartão + três sub-tabs (Overview, Serviços, Acções) — para iniciar e monitorizar O gasoduto KamoUniverse em directo. Infraestrutura (Próxima API, administração de plataforma por meio da sessão ***, mesma regra que a Guarda do cliente: - app/lib/worldgenNats.ts: uma conexão NATS de longa duração + um assinante de status que armazena o status mais recente por estágio + instantâneo (em memória + Redis) e Reemite num autocarro em processo para a SSE. Publica comandos de início. - app/api/universo/serviços GET current state of every stage (status + azulejo) Contagens + bloqueioSegurado). - Está bem. POSTE um comando inicial para o agente k3m1. - app/api/universo/stream SSE fluxo de eventos ao vivo / snapshot. Frontend (MUI + next-intl, espelha a página de configuração): - useWorldgen: um fluxo SSE compartilhado (auto-reconectar) + start() para todas as abas. - Visão geral: agente/batch/completação/telhas de stat + um live pipeline rail. - Serviços: um cartão rico por script - papel + o que ele realiza, estado ao vivo emblema, barra de progresso ter/total, último evento e um botão Iniciar (desactivado enquanto qualquer lote detém o bloqueio global). - Ações: executar o gasoduto completo ou uma fase individual (com confirmação), mais uma atualização de instantâneo. Fiação: NATS URL adicionado à dependência do cliente do configmap; `nats` adicionado. O k3m1 agente + script telemetry live in universe-earthdata; strings in the translation dicionário. tsc limpo em todos os arquivos novos.
· kamo-shared-library
Adicionar uma pesquisa sensível a maiúsculasPorEmailEmailIgnoreCase
Os e-mails são armazenados com caixas inconsistentes (por exemplo, Sage@KamoCRM.com) e BarataDB igualdade string é sensível a maiúsculas, por isso findByEmailEmail falta Só no caso. Necessário para a busca do email da recuperação da senha.
· EmailService
Contas de caixa de correio auto-curadas do aplicativo DB (recuperação de deriva)
O aplicativo DB é a fonte de verdade para a qual as caixas de correio devem existir; KamoMail contas ao vivo nos usuários virtuais do servidor de e-mail. Se o correio DB perder dados, caixas de correio desaparecem no provedor enquanto os registros de aplicativos permanecem. - MailboxSelfHealService: na inicialização + diariamente, re-provision qualquer aplicativo KAMO MAIL caixa de correio faltando de virtual users (senha aleatória nova gerenciada por aplicativo). - syncMailboxes (as configurações "Sync" ação) agora também empurra app->provider para qualquer caixa de correio em falta, não apenas o fornecedor de importação->app.
· kamo-internal
Compor/enviar em nome da caixa de correio do membro comutado
- Membro do proprietário da caixa de correio ThreadId do switcher através da caixa de correio ativa para o contexto de composição (evento + URL param). - Nova Mensagem / resposta / encaminhamento aberto composição para a caixa de correio do membro selecionado: A partir de listas suspensas que as caixas de correio dos membros + apelidos, assinatura personalizada para eles, e enviar/projetar autenticar como sua caixa de correio (mailboxId). - Autocompor-se inalterado quando nenhum membro caixa de correio está ativo.
· kamo-internal
Carregar *** na sessão por-tabStorage em vez de um cookie partilhado
O ID da sessão viveu num cookie de navegador partilhado em todas as páginas de um origem, então uma segunda aba (ipersonation) não pôde realizar sua própria sessão. Mover o operador para a sessãoStorage (per-tab): - sessionClient: token helpers + uma embalagem global de busca que liga o id como X-***-Token em chamadas de mesma origem /api, mais uma vez cookie->sessãoMigração de armazenamento. Instalado via SessionBootstrap em layout. - * **************** header-first (cookie fallback) usado por gerar-otk, sessão/info, sessão/extend, logout, meet/invite-email. - generateOTK + getKsemldFromPedido prefira X-***-Token em vez do cookie. - /api/validate já não define um cookie ***; devolve o ID e o /validate page guarda-o na sessão desta páginaStorage. - useUserInfo + todos os ganchos WebSocket ler o id da sessãoStorage. - logout captura o token antes de limpar o armazenamento para que a sessão Redis ainda está invalidado. A personificação agora apenas abre /validate?otk=... em uma nova aba (mesmo caminho como login: Redis sessão criada servidor-side, OTK entregue para /validate); o a nova aba recebe sua própria sessão e a guia de administração está intocada. Remove o Manutenção obsoletasPrev/ImpersonationMáquina de retorno à administração. Os orgs permanecem separados por domínio — inalterados.
· kamo-internal
Botão God-mode Impersonate no cabeçalho de configurações de membro
Adiciona uma ação 'Impersonate' superior direita em /settings/member/[id], visível Só quando a sessão iniciada tiver o modo de Deus e o alvo não é auto/novo. Chama o novo /api/security/ipersonate, em seguida, troca o *** cookie através do caminho OTK (/validate?otk=...&keepPrev=1) em uma nova aba. keepPrev preserva a própria sessão do administrador em Redis; um global Personagem Banner esconde o administrador *** e oferece um clique em 'Return na minha conta (os cookies da mesma origem não podem realizar duas sessões ao vivo ao mesmo tempo). SettingsView ganha um headerAction slot opcional.
· SecurityService
Endpoint de representação de membros em modo de Deus
POST /api/security/ipersonate menta um ***+OTK fresco para um arbitrário membro da org atual do chamador, fechado na sessão de chamada carregando modo deus (GD). Grava o ID do membro do administrador de deus como SUDO MEMBER ID para auditoria. A mesma compilação de sessão em forma de login do EnterAsController, mas o mesmo-org e por Deus, em vez de "cross-org".
· SecurityService
Devolver o orgName + idioma em / user- info
Resolver o nome de exibição da org e o idioma selecionado pelo membro (ISO-639- 1 código) do DB para que o kamo-universo possa mostrar a bandeira de linguagem org + de cada jogador no seu crachá. Resolvido ao vivo (não da sessão) então sessões existentes Apanha-os imediatamente.
· kamo-internal
Cartão de lançamento KamoUniverse + ícone de navegação (acesso fechado KAMOWORLD, redirecionamento OTK para jogar.*)
· kamo-shared-library
Adicionar Acesse KAMOWORLD à direita (145, JOGOS) para o acesso KamoUniverse
· KlusterServices
Registro de imagem K1m1 que substitui o k0m1:5000 aposentado (mesmas credenciais)
· KlusterServices
Namespace do universo Kamo+quota+valkey, backups do BarataDB, pilha de observação
- universo/: espaço de nomes + recursoQuota, valkey- universo (AOF, hostPath k1m1), noite BarataDB backup CronJob, operador script bootstrap - monitorização/: valores do leme fixados instalar script, grafana.* rota, painel do universo + regras de alerta - CI: aplicar espaço de nomes do universo+valkey na fase k1m1 (Pacote NATS caiu: 43030d6 já re-homed k3m1 com isolamento de conta)
· KlusterServices
Adicionar o nó k3m1 + migrar o conjunto para IPs de LAN
- statefulset: anunciar/juntar-se a mais de 192.168.4.x (k1m1=.22, k3m1=.36); WireGuard caiu (k3m1 wg0 10.8.0.1 colidiu com o IP de publicidade do k0m1. - os endpoints init- job + CI kubeconfig foram movidos para IPs LAN. - CI: adicionar a secção de implantação do K3M1 BarataDB (necessita do segredo K3M1 KUBECONFIG B64).
· kamo-login
Rota paga de inscrições para checkout após o login
Após a autenticação bem sucedida (manual ou auto- login), consumir o domínio do ápice cookie sp checkout plan deixado pelo kamo-register e redirecionado o comprador para o marca /subscribe?plan= page (Stripe checkout) em vez do aplicativo padrão Destino. Um tiro: cookie limpo na leitura.
· kamo-register
Carregar pago?plano de inscrição em checkout
Quando a inscrição de um membro é proveniente de um CTA de preços pagos (?plan=pro'business), soltar um cookie apex- domain sp checkout plan ao completar. kamo- logina consome ele após o usuário autenticar e encaminha-los para /subscribe -> Stripe, sobreviver ao registo -> verificar -> login hop.
· kamo-shared-library
Modelos de sinais eletrónicos canônicos (verificação + convite)
Adicione dois modelos de email canônicos de larga plataforma semeados por org: - esign.signer verification (step-up OTP: {{code}}, {{name}}) - esign.signe invite (assinando convite: {{nome}}, {{sender}}, {{mensagem}}, {{link}}) Transfira-os para a lista de chaves do CanonicalTemplateLoader + recursos para EmailService.seedForOrg os pega no primeiro envio. Habilita OTP/invite ao vivo entrega para o fluxo de sinal eletrónico (foi o melhor esforço no-op sem os modelos).
· BillingService
Medição de uso do sinal eletrônico + verificação de auto-serve do consumidor
#4 medição: - EsignMeterSubmissionService (@Scheduled daily): agregado API-origin EsignUsageRecords per org+period; primeiro 40/period included, the rest submeted como Stripe MeterEvents. Idempotente via reportToStripe + o UID de registro de uso como o identificador do evento de medição (dedupe-side). Resolve o nome do evento do medidor Pelo preço real da Stripe. corresponde a qualquer medidor que o preço esteja ligado (configura a incompatibilidade de nome). #5 checkout do consumidor: - ConsumerCheckoutService: Stripe Checkout Session (modo=assinatura) contra o preço do plano da raiz do produto (+ linha de overage medida para o negócio); ContaAssinatura (fonte PAID) + AssinaturaMembro + ContaLicença em Complementação e invalida os direitos. - ConsumerSessionResolver: autentica o comprador por seu próprio *** cookie via Redis (nunca um cabeçalho org definido pelo cliente). - Consumer Checkout Controller POST **************************** - StripeWebhookService agora lida com checkout.session.completed. Aditivo/inerte até que um consumidor se subscreva; o custo vivo precisa de um cartão real.
· kamo-internal
Expor o escopo da chave API SIGNATURE (E-Signnature API)
Adicione o escopo da API E-Signnature ao gerenciador de chaves da API org para que a equipe possa conceder Acesso a e-sign programático de orgs empresariais. Utilização para além do mensal incluído O loteamento é medido por assinatura.
· APIService
Gateway e-sign público de API (API SIGNATURE)
Adicionar /api/public/esign/** ao PublicApiController: valida a chave org API, requer o escopo API SIGNATURE, limites de taxa, e encaminha para ESigService API de envelope interno (/api/esig/internal/**) com X-Internal-Auth + X-Org-Id. Espelha o precedente do gateway de catálogo de assinaturas.
· ESigService
API de envelope programático interno (origem=API) para Negócios
- EsignInternalController (/api/esig/internal/*): X-Internal- Auth + X-Org-Id authed, chamado pelo APIService depois de validar a chave de API SIGNATURE; reutiliza o EsignEnvelopeService, etiquetas envelopes EsignUsageOrigin. API - * ************* ganha uma sobrecarga de origem (default manual) - Caminho de assinatura agora metros pela origem do envelope (API -> overage, MANUAL nunca) - OTKAuthFilter bypass /api/esig/internal (interno-secreto autorizado, não OTK)

Seu universo está esperando.
Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.
Gratuito para sempre — não é necessário cartão de crédito