Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    Consultas de repositório para encontrar correspondência exata, lista de páginas, recibos

  2. · kamo-shared-library

    Adicionar dataLastViewed to MediaSessionMember for receiver timestamps

  3. · kamo-shared-library

    Adicionar isAccessRevoked flag para controle de acesso per-attachment

  4. · kamo-marketing

    Distinguish actively-translating vs queued messages

    The translation queue was already sequential, but every queued bubble rendered "Translating…". Now the single in-flight message shows "Translating…" with a pulsing dot and the rest show "Pending Translation…" with a static dot, so the visitor can see the queue progressing.

  5. · kamo-internal

    Distinguish actively-translating vs queued messages

    The streaming queue was already strictly sequential (one fetch at a time), but every queued message rendered "Translating…" because they all shared the same pendingTranslation flag. Split that into two states: the single message currently in flight shows "Translating…" with a pulsing dot, all the other queued messages show "Pending Translation…" with a static dot. Live (just-arrived) messages are translated alone and start in the active state.

  6. · kamo-marketing

    Show error icon when a message fails to translate

    When the per-message translate call returns translated:false, errors out, or times out, the chat bubble now renders an AlertTriangle icon in red with tooltip "Failed to translate message." instead of silently leaving the bubble in the original language.

  7. · kamo-internal

    Show error icon when a message fails to translate

    When the per-message translate call returns translated:false, errors out, or times out, the chat bubble now renders a small red ErrorOutline icon in place of the translate badge with tooltip "Failed to translate message." instead of silently leaving the bubble in the original language. The flag is reset whenever the user picks a new language so a re-attempt can succeed without the stale error sticking around.

  8. · kamo-marketing

    Stream translations newest-first for visitor history

    When the visitor lands on a non-English locale and the support chat has existing English messages, every bubble flagged needsTranslation by the backend now shows a "Translating…" placeholder while a streaming queue fills them in one at a time, starting from the newest message. A generation counter prevents stale queues from clobbering current state.

  9. · kamo-internal

    Stream message translations newest-first on language switch

    When the user picks a new language (or opens an existing chat in a language different from the messages' source), every bubble that needs translation immediately renders a "Translating…" placeholder and the translations stream in one at a time starting from the most recent message and working backwards. This includes the user's own past messages — anything authored in a different language than the viewer is now translated. A generation counter cancels in-flight queues if the user changes language again.

  10. · kamo-marketing

    Auto-translate visitor and agent messages

    Live agent replies arriving in a language other than the visitor's URL locale now show a "Translating…" bubble while the TranslateService call resolves, then swap to the translated text with a Languages badge whose tooltip shows the source language and the original message. Visitor messages are tagged with the URL locale on send so the agent's chat can translate them into the agent's profile language. Messages loaded into history are translated up front via the new ?lang=<locale> query param on /api/chat/support.

  11. · kamo-internal

    Translate chat messages into the viewer's language

    Adds a "My Language" flag picker in NavTop (left of the email tool, separated by a vertical rule). Selecting a language writes back to Member.language and syncs the locale cookie so the entire UI switches; it also broadcasts an event that any open ChatBox uses to re-fetch its history in the new language. ChatBox now fetches messages with ?lang=<locale>, renders translated bubbles with a small Translate badge whose tooltip shows the original text and source language, and shows a "Translating…" placeholder for live messages until the TranslateService call returns. The send path tags every outbound message with the author's locale so other viewers can translate it on demand.

  12. · APIService

    Proxy support-message translate endpoint

    Adds a passthrough route for the new MediaService endpoint that translates a single support-chat message into the visitor's URL locale. The marketing-side chat widget hits **************** which the gateway now forwards to MediaService with the standard public-chat auth and rate-limit checks.

  13. · MediaService

    On-demand translation for chat and support messages

    Captures the source language for every chat / support message and adds an optional ?lang=XX param on the message-fetch endpoints plus a per-message POST /translate endpoint. MediaService now talks to TranslateService via TranslationServiceClient, and MessageTranslationService caches results in MediaObjMsgTranslation so the same translation is never paid for twice. Wires the same flow into the public-chat (visitor) path: visitors send their URL locale as sourceLanguage, and the agent / visitor sides each pull translations into their own preferred language. Adds the translate-service secret to the MediaService deployment so the new client can authenticate.

  14. · kamo-shared-library

    Translation cache for chat messages

    Adds the MediaObjMsgTranslation entity (one row per (message, language) pair) and an optional sourceLanguageId column on MediaObjMsg so chat messages can be translated on demand and re-served instantly to other viewers in the same language. ChatMessageDto carries sourceLanguageId so live recipients know whether they need to translate. MediaService.createMessage gains an overload that takes the authoring language, falling back to Member.language for legacy callers.

  15. · kamo-internal

    Adicionar Pessoal + Chat/Docs/Notes/KB/HRS secções

    O índice /settings não mostrou seções para não-administra seção existente foi fechado em um administrador à direita (CONFIGURE SYSTEM, GESTÃO * SETTINGS, GESTÃO ACCESS RULES). Um membro regular da equipa com apenas direitos de suporte viu exatamente 3 cartas (Topics, Analytics, Scheduled Apoio) e nada mais. Adicionar uma seção pessoal sempre visível (Meu perfil, áudio e vídeo, Atividade de Conta, e Planos & Faturamento em orgs de crianças) que Páginas próprias do visualizador /settings/member/<myId> — para que as configurações nunca estejam vazias, independentemente dos direitos de org. Também sobressai o bate-papo / Docs / Notas / Conhecimento anteriormente perdido Seções de base / HRS — cada uma das seções do sinal de função de org correspondente mais o direito adequado de MANAGEM * SETTINGS — para corresponder ao dedicado /settings/features/<app> páginas que já existem para esses aplicativos.

  16. · kamo-internal

    Rodar a abertura do objetivo com base na relação de aspecto do viewport

    O quadro de golo agora inclina-se por atan2(viewportH, viewportW) assim que seu aberto o lado direito aponta para a diagonal do viewport — para 16:9 monitora o pontos de abertura ~29° sul do leste; para retrato aponta mais perto Sul. Lê a forma como os usuários jogam naturalmente cabeças da maior parte do tela de volta para o canto superior esquerdo. Física: colisão de meta agora é executado em coordenadas de gol-LOCAL. Cada jogada centro da cabeça+velocidade gira para o quadro local, o AABB existente colisão contra paredes alinhadas com o eixo corre inalterada, em seguida, qualquer A reflexão de push-out e velocidade gira de volta para o espaço mundial. A verificação de zona de pontuação também é feito em coordenadas locais para uma cabeça genuinamente entrando na (rotação) abertura ainda marca. Visual: o quadro SVG + brilho do lado de entrada ao vivo dentro de uma rotação recipiente; sobreposições de celebração (GOAL!/MISS!) e a legenda REMOVE Sente-se fora da rotação para que o texto permaneça legível. Aperta-te agora. oscila em torno do ângulo base em vez de zero. O ângulo de objetivo é recomputado no redimensionamento do viewport através de um setter de estado, com um ref paralelo para que o lançamento RAF lê o valor mais recente cada quadro sem recriar a chamada.

  17. · kamo-internal

    Joga-para-remover gol com pontuação / miss celebrações

    Um quadro de 132×132 gol aparece na parte superior esquerda sempre que uma cabeça está em solo-drag ou ativo-jogar, offset 56px do canto para que as cabeças possam perder passado ou por trás dele. Três paredes sólidas (top, esquerda, fundo) funcionam como superfícies elásticas (0,65 restituição); o lado direito é o aberto entrada. Um X vermelho em negrito no painel traseiro faz com que a intenção "remover" inconfundível, e um indicador de entrada pulsante marca o lado aberto. Quando o centro de uma cabeça atirada entra na zona de pontuação, é removido. a partir do mapa de lançamento, a janela da ferramenta subjacente é fechada via ferramenta:fechar, e a cabeça é removida via removeHead. Um radial verde Flash, 18 partículas de ouro/laranja estourar, e um golo saltitante! sobreposição Fogo em cheio. Quando uma cabeça atirada simplesmente salta de qualquer parede (deposto por 350ms para que um único fracasso não spam eventos), o objetivo Agita o vermelho e um miss! A sobreposição bate. Estabilidade: colisão meta vive inteiramente dentro do loop de lançamento RAF (sem contencioso do sistema de molas), e HexHeadGoalZone possui tudo Estado de celebração internamente — o motor só dispara eventos. Puro recurso aditivo; caminhos de arrastar/descartar não são inalterados.

  18. · kamo-internal

    Jogue física com colisões em mesas de bilhar e trilha de cometas

    Flicking uma cabeça após o limiar de lançamento lança-lo através do viewport em física explícita (fricção, reboco de borda, elástico cabeça-vs-cabeça colisões). As gotas lentas ainda pousam exactamente onde foram libertadas. Enquanto a cabeça está em movimento uma trilha de fogo estilo arcade segui-lo. O lançamento é fechado pela velocidade de liberação (> = 650 px/s em média sobre o última ~110 ms) e distância total de arrasto (>= 30 px) para uma precisão rápida A reposição nunca dispara acidentalmente um arremesso. Amplitude está fechada em 3200 px/s para manter a borda de detecção domesticada. O loop RAF lança unidades motion-value escreve diretamente via .set() — contornando molas de movimento de framer durante o voo – e auto-para quando Todas as cabeças caem abaixo do limiar de velocidade de paragem. placeHomeCluster e softPushCluster pular qualquer âncora atualmente no mapa jogar para que o O sistema de molas nunca combate o integrador de física. Cabeças golpeadas se desprendem de qualquer cluster, promovem um cluster solo, e Juntar a simulação de lançamento com o impulso transmitido pela colisão. Trail rendering: Camada SVG com brasas de grau radial ao longo de recentes posições, mix-blend-mode: tela para brilho aditivo, único borrão CSS filtro para suavidade — arcade estética, quase zero custo de CPU.

  19. · kamo-internal

    Usar OTK com mente de servidor para mudar para nova org

    Prefere o otk devolvido pelo POST /api/security/org sobre o acompanhamento /api/segurança/ent-a-entrar na viagem de ida e volta. O servidor agora menta um novo proprietário sessão como parte da criação de org, para que o pós-criar redirecionar para o novo org /validate é determinístico — nenhuma raça com criação de domínio, não falha de entrada silenciosa deixando o criador na sessão pai-org.

  20. · SecurityService

    O proprietário da hortelã ***+OTK ao criar org

    Depois de criarOrganizationOwner, menta uma nova *** ligada ao novo proprietário TeamMember e devolva sua OTK ao lado de id/members. Sem isto, criador permanece na sessão pai-org — direitos limitados e isOrganizaçãoOwner=false — então a página de configurações da nova criança org aparece Gated e Plans & Billing está escondido até que eles re-entrem manualmente.

  21. · kamo-shared-library

    Ordens de COMP auto-cura não previstas na inicialização

    No @PostConstruct, escaneie todas as ordens COMP aprovadas e forneça qualquer que Falta uma assinatura da conta. Idempotente — encontrar ou criar significa seguro para Correr repetidamente.

  22. · kamo-internal

    Mover status de disponibilidade dropdown para o lado esquerdo antes de My Businesses

    Relocaliza a pílula de status da barra de ação direita para a seção de boas-vindas à esquerda, colocando-a entre o separador de saudações e Minhas Empresas com um separador. Remove a regra vertical agora órfã que separou previamente o estado dos botões do ícone.

  23. · kamo-internal

    Adicionar alvoOrganizaçãoId à AssinaturaTipos de ordem e criarAssinatura Ordem

  24. · SecurityService

    Adicionar parâmetro de previsão-comp para ativar a assinatura do COMP de ordem aprovada

    * ******************************* chamadas **************** então invalida direitos para o alvo org via EntitmentService.

  25. · kamo-shared-library

    Aprovação do pedido COMP auto-fornecimentos ContaAssinatura e atribui licença

    - Ordem de Assinatura: adicionar destinoOrganização (FK nulable para orgs) - ************* *** *** adicionar alvoOrganizaçãoId string - AccountRepository: add findByPrimaryMember Id for account lookup by holder member - Serviço de Assinatura: injetar recibos de faturamento; provisãoCompSubscription cria/upserts **************************** AssinaturaMembro, e Conta AtivaLicença para o membro-alvo-org; AprovarOrdenar pede o método de pagamento COMP; nova activaçãoCompOrdem para provisionamento retroativo de ordens COMP APROVADAS existentes

  26. · kamo-internal

    Substituir o clique para abrir com o popover de ação + controles de tamanho

    Clicando em uma cabeça hex agora abre um popover de vidro polido com ações contextuais em vez de abrir imediatamente sua janela de ferramentas. Estado Bate-papo expor: Abrir chat, Ver conta, E-mail, Convidar para reunião, Chamada (quando ambos os lados têm uma extensão VOIP registada); cabeças de ferramentas expone Open <toolName>. Um sub- menu Tamanho permite ao utilizador escolher pequeno/ médio/ grande para essa cabeça específica (persistido por membro através do novo MemberUiPreference store) mais uma barra deslizante global que afeta cada Hex cabeça nesta máquina (persistido em localStorage). Janelas de ferramentas agora largura/altura da pinça para o viewport para que nunca abram parcialmente - tela mesmo com janelas encolhidas.

  27. · InitializerService

    Adicionar tabela MEMBRO UI PREFERÊNCIAS (ordem 60)

    CREATE idempotente para o suporte genérico por membro UI-preferência loja o seletor de tamanho de popover hex-head e as configurações futuras de UI por membro. O esquema reflete a convenção EmbRecordState (is active, date created, date updated) usado em outro lugar no modelo de dados.

  28. · SecurityService

    Add MemberUiPreferenceController for per-member UI settings

    Backs the new hex-head popover size selector and any future small per- member UI preference. Endpoints under /api/security/members/me/ui- preferences resolve the member from the OTK session and read/write JSON values keyed by an opaque prefKey string.

  29. · kamo-shared-library

    Add MemberUiPreference entity for per-member UI prefs

    Generic per-member UI preference store (memberId, prefKey, JSONB value) for small persisted UI settings. First consumer is the hex-head popover size selector.

  30. · kamo-internal

    Wire FeaturesManager to platform subscription for child-org gating

    O "Manager" chamou-lhe legado. arremessos (fallback ungado) em vez de ler a assinatura real da plataforma. Agora chama **************** que consulta o root org encomendas de subscrição de comércio para a associação cross-org do chamador. Quando chamador tem uma ordem COMP aprovada no root org, todos os portões de recurso aberto como esperado para administradores comped child-org.

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