Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· EmailService
Quem causou uma notificação viaja com ele, para que o sino pode atraí-los como um membro
- NotificationRequest ganha actorMemberId/actorName; o construtor antigo permanece para cada produtor que Antes deles. - raise () mantém o par apenas quando ambas as metades estão lá, o nome se encaixa em sua coluna, eo título ou corpo realmente soletra: um nome que o texto não contém não tem lugar para ser desenhado, e um passado 255 Caso contrário, falharia a inserção e levaria toda a notificação com ele. - toPayload () envia actorMemberId como TEXT ao lado do actorName - a lista, navegar e a moldura do socket. - /api/internal/notifications lê actorMemberId (texto ou número) e actorName. - /api/notifications/self (cartão não lido do navegador) mantém o ator apenas quando esse membro está em A própria organização de ligação. O ID é a palavra do navegador; pode nomear o remetente que viu, mas não ter alguém de outro lugar (uma contraparte Exec2Exec, um id velho) desenhado como um colega. Precisa de uma biblioteca 727c0ec2 e da DDL em... aplicado à produção à mão em 2026-09-23 antes disso foi empurrado. Testes: MemberNotificationServiceTest (+4), NotificationSelfraiseActorTest (4). Suíte completa: 1912, 0 falhas, 1 falta.
· kamo-shared-library
Uma notificação pode dizer de quem é
Notificação de membros ganha ACTOR MEMBER ID (INT8) e ACTOR NAME (255): o membro que o causou - quem você, cujo encontro está começando, que escreveu para você - e seu nome exatamente como o título ou corpo soletra. kamo-internal desenha esse trecho do texto como o nome do membro, assim pairando-o abre seus Cartão de membro. Até agora cada nome no sino era texto simples, porque nada registrou quem era. DDL, aplicado manualmente à produção em 2026-09-23 como o proprietário kamo (ddl-auto não é nenhum em toda parte): TABELA ALTER public.member notifications ADD COLUNN SE NÃO EXISTE actor member id INT8; TABELA ALTER public.member notifications ADD COLUNN SE NÃO EXISTE nome actor VARCHAR(255) As mesmas declarações enviam-se por correio electrónico como... EmailService é o único serviço que lê ou escreve esta tabela.
· InitializerService
O recurso do plano Notas é "Notas & Listas de Verificação"
O aplicativo Notas detém checklists também desde 2026-09-23 e é chamado "Notas & Checklists" em qualquer lugar que é nomeado. Comparação da página de preços o gráfico pega seus nomes de linha do commerce assinscription features, assim o A linha NOTAS também é renomeada: NotasChecklistsRenameMigration (@ Order 215) renomeia cada linha NOTAS ainda carregando o nome padrão antigo, e reescreve Assina a descrição do Pink onde ainda lê a frase antiga. Uma reformulação a linha é deixada sozinha e uma repetição não muda nada. Apenas cópia: service type e is included, que decide o que um plano dá direito, são intocados. KamoCRMPricing Carregador semeia o novo nome para catálogos criados a partir daqui. Aplicado à mão em 2026-09-23 com as mesmas declarações, desde que este serviço não está implantado.
· kamo-internal
Uma caixa de correio comutada permanece ao vivo e a caixa de pesquisa está polida
Actualizações ao vivo. A página pede ao EmailService para ver a caixa de correio que está aberta quando não é próprio do membro (/app/email/watch, reenviado após uma reconexão, parou ao sair da página), e a lista de pastas e a árvore de recarga alterações da caixa de correio - correio novo, e alterações feitas de qualquer outro cliente ou por qualquer outra pessoa - exatamente como já fizeram para o próprio membro. O relé tem um tópico próprio, por isso o crachá de correio e o novo som de correio nunca ouvido falar caixa de correio de outra pessoa; uma mudança só é agido para a caixa de correio na verdade no ecrã (lib/email/mailboxWatch). Polonês, tudo encontrado dirigindo os componentes reais no Chrome: - O diálogo de ajuda e o formulário avançado re-ran seu efeito de abertura em cada renderização de página (a página passa um novo noFechar), que puxou foco de volta para o botão fechar / a caixa "De" para fora de baixo do membro. Eles agora fogem uma vez por abertura. O diálogo também mantém a aba dentro dela e as mãos se concentram de volta para "Como pesquisar" quando fecha. - A caixa de pesquisa placeholder é "E-mail de pesquisa"; o longo foi cortado para "Search mail - try f" na coluna 320px (dicionário 6401409c). - "Como pesquisar" senta-se no início de sua própria linha quando a coluna é demasiado estreita para ele ao lado do escopo alternar, em vez de pendurar à direita. - O escopo comutar é uma aba parar com as setas, como qualquer grupo de rádio; o lista de sugestões anuncia a opção destacada (descendente-ariana), mantém-no em vista, e marca seus cabeçalhos como apresentação.
· kamo-internal
Aulas de áudio — carregue uma gravação, e os alunos podem realmente navegar por ela
Autores (/hr/diretor de cursos de formação) - "Arquivo de carregamento" em cada slide, ao lado de "Escolha de mídia": áudio (MP3, M4A, AAC, WAV, OGG/Opus, FLAC), vídeo ou uma imagem, através do oleoduto de imagem em Recursos de RH, anexado no momento em que é armazenado. O coletor de bibliotecas também sabe áudio (bodge, thumbnail waveform) e a cobertura do curso Picker agora oferece apenas imagens. - Um slide de áudio recebe seu próprio editor: uma descrição necessária (o nome acessível), a lição jogando exatamente como um aluno encontra-o, capítulos (adicionar um no playhead, editar vezes como m:ss ou h:mm:ss, jogar de qualquer, ou colar uma lista nas formas habituais "00:00 Título", e uma transcrição que segue-nos. Um trabalho terminado nunca substitui o texto digitado enquanto ele foi executado (ele é oferecido em vez disso), e um encontrado correndo quando o slide é reaberto é oferecido da mesma forma. - A gravação é medida uma vez, em anexar: comprimento e forma de onda vêm do ConversionService e são armazenados no slide (media meta json), então nenhum aluno espera por eles. "Escute o gravação" é a redação de áudio da regra play-through. Aprendizes (o jogador do curso) - Um limpador de formas de onda que mostra o que foi tocado, o que foi realmente ouvido, os capítulos, seus favoritos e uma repetição A–B; clique, arraste ou seta através dele, com um tempo-e-capítulo pré-visualização no hover. - Capítulos com per-capítulo ouviram o progresso, capítulo anterior/próximo, e "repetir este capítulo". - Uma transcrição que segue a gravação, salta em qualquer lugar no clique, e busca com próximo / anterior através dos fósforos; legendas da linha sendo falada sob a forma de onda. - Favoritos com notas, mantidos nas próprias preferências do membro para que os sigam entre dispositivos (nunca escrita antes da lista gravada ter carregado, o que a substituiria; uma nota pendente é enviada, não caiu, quando o slide fecha). - Velocidade de 0,5× a 2× (e o tempo esquerdo nessa velocidade), ±10 s, volume, o membro escolhido alto-falante, as teclas de mídia do sistema operacional, e um mapa de teclado (Espaço/K, J/L, setas, Shift+setas ou P/N, < >, 0–9, M, B, A, C, /, ?) com uma folha de ajuda. - Retoma onde pararam neste dispositivo, e oferece a primeira parte que não ouviram. - A exigência do play-through só conta trechos realmente jogados: uma busca (scrubber, skip, loop, devtools, ou um carrapato que pousa no meio da busca) não ganha nada, e nem faz mais rápido do que 2×. Ao contrário da regra de vídeo que ele créditos uma tabulação de fundo longo tick, porque o áudio é o que as pessoas jogam Em um. Ouvido dentro de meio segundo do fim conta como toda a gravação: o formulário armazenado rodadas de 0,1 s e a duração não, e 100% usado para ler como 99% para sempre. - A escotilha de fuga para um arquivo que o navegador não pode jogar aparece uma vez que o comprimento da gravação tem passado, como faz para vídeo; atalhos funcionam onde o foco está dentro do diálogo do jogador. Fixo no caminho, para vídeo tanto quanto áudio - O portão de jogo medido com a duração congelada da versão, que nunca publica escreveu: cada versão de vídeo carrega nulo, então assistir nunca poderia atender à exigência. A O portal agora usa a duração do elemento. - O que um membro tinha visto chegou ao servidor apenas quando eles pressionaram Next, então fechando o curso O meio-lição perdeu-o. É salvo a cada 20 s, em pausa e perto, com a porcentagem de o manifesto de conclusão lê (nunca foi enviado, então cada manifesto registrou 0% de cobertura). - Slide mídia, perguntas imagens ea própria lição agora carregar através do próprio membro ************************* em vez da imagem stream, que requer VEZ DOCUMENTOS — um direito 32 de 149 membros não realizou. - O editor chaveado slide cards por UID, que cada salvamento automático substitui, para que cada cartão — e teria parado o áudio que um autor estava ouvindo ao digitar um capítulo. An O upload em voo segue o seu slide através de um movimento ou um delete. - A rota de mídia membro responde com um sandboxing CSP e nosniff: uma imagem slide pode ser um SVG, que abriu diretamente seria de outra forma executar script nesta origem. Necessidades DocsService (endpoint de mídia, media meta json) e ConversionService (picos, transcrições) implantado ao lado; o inglês está no dicionário kamo-tradução a4c6f856.
· KlusterServices
Uma maneira de realmente construir a imagem dourada
build-golden-image.sh disse "Correr por CI (ver .././.forgejo/workflows/)". Não existe O fluxo de trabalho já foi escrito. Precisa de libguestfs, qemu-img e virt-customize, nenhum dos quais são instalados na máquina este repo é trabalhado, e não há tempo de execução do recipiente lá – então o único artefato que o aplicativo inteiro depende tinha nenhum caminho para existir. Foi assim que a primeira pessoa a atribuir um computador descobriu. A compilação é executada no cluster, que é o único lugar já equipado para it: os nós executam KubeVirt e expõem /dev/kvm através dos dispositivos.kubevirt.io/kvm 'plugin' de dispositivos, por isso a libguestfs é acelerada por hardware em vez de emular para horas. O trabalho escreve diretamente no PVC dourado, porque vm/datavolume-template clones com source.pvc e um clone CDI de um volume Filesystem copia seu conteúdo — então qualquer reivindicação segurando disk.img é uma fonte válida. Isso remove a etapa de hospedagem HTTP, a credencial de upload e uma segunda cópia de um arquivo multi-gigabyte. golden-datavolume.yaml fica para uma imagem construída em outro lugar. Três coisas que valem a pena saber ao escrevê-lo: Os scripts viajam como ConfigMaps em vez de um clone git, então o trabalho não precisa Credencial. Eles montam somente leitura sem executar bit, então eles são copiados para um caminho gravável antes de virt- customize --run pode executá-los. A compilação acontece no zero e apenas o arquivo terminado é copiado para a reivindicação. O script escreve um qcow2 de 20 GB e, em seguida, qemu-img convert -c escreve um segundo comprimido ao lado dele; fazendo isso na reivindicação de ouro precisaria que fosse duas vezes o tamanho da imagem que ela acaba segurando. A VERSÃO é imperdível agora. O caminho em grupo tem que saber a versão ANTES do construir começa, porque a reivindicação o carrega em seu nome e deve existir para o trabalho para escrever, para que o wrapper resolve serial de Canonical uma vez e usa esse valor para ambos. Uma reconstrução de uma versão existente é recusada em vez de escrita em: a segundo escrever em um PVC dourado povoado é a falha que atinge cada inquilino em Uma vez.
· ConversionService
Áudio — uma miniatura de forma de onda no upload, e picos e transcrições sob demanda
Um arquivo de áudio carregado caiu para o caminho PDF Docs, que não pode abrir um, então cada o envio de áudio terminou com "Conversão falhou" com um ladrilho da biblioteca em branco. O áudio agora tem o seu próprio ramo, como vídeo: transmitido para arranhar (nunca em heap), decodificado ONCE em picos, e sua página-0 miniatura tirada desses picos em Java. Não o showwavespic da FMPEG, que mantém todos descodificados. quadro até ao final do ficheiro: medido a 298 MB para um MP3 de 30 minutos e 546 MB durante uma hora, em um thread não ligado por upload em um pod tamanho para documentos; o decodificador transmitido atinge 54 MB. FLAC, quadro MIME armazena como um binário genérico, é reconhecido pela sua extensão. **************************** - GET /picos - a duração e uma forma de onda de 1.600 bucket (base64 de 0–255 picos). PCM do ffmpeg é ler como ele flui e apenas uma janela curta por 50 ms é mantido, por isso uma hora custa 72.000 shorts; Decodificação do navegadorAudioData iria segurar sobre um gigabyte para a mesma hora. Armazenado ao lado do arquivo como <datId> peaks v1.json, então ele é calculado uma vez por conteúdo. - POST oGET / transcript — uma transcrição WebVTT cronometrada do sussurro-asr (vad filter ligado), executado como um trabalho em um thread virtual com seu estado em <datId> transcript v1.json, que qualquer réplica pode ler (uma tabela de trabalho na memória seria invisível para o outro pod). Um trabalho por cápsula de cada vez: sussurre-asr é uma réplica ligada à CPU compartilhada com voicemail e transcrição de encontro. Uma execução O trabalho reescreve o seu marcador a cada minuto a partir do seu próprio tópico (juntado antes do resultado ser escrito), assim um trabalho cujo pod morreu lê como falhou após três batidas perdidas em vez de bloquear o autor ?restart=true substitui uma transcrição terminada. Medida com o serviço ao vivo: uma gravação de 2 min 7 s levou 25 s. Ambos requerem VEZ DOCUMENTOS e o nível de acesso por imagem, e servem apenas recursos de RH: mensagens de voz, Chamar gravações e notas de voz de bate-papo cada um carrega uma regra por registro em DocsService que este serviço Não conseguem ver, por isso ficam um 404 até que algo que precisa deles traga essa regra. A compilação também capta os aliases de MIME de áudio da biblioteca compartilhada com kamo: M4A, WAV, OGG e AAC estavam a ser recusados como um erro MIME.
· DocsService
Slides de áudio — metadados de mídia e os alunos reproduzem mídia através de sua atribuição
A navegação de um slide de áudio vive em media meta json (duração, picos de forma de onda, capítulos), que o editor escreve e o jogador lê de volta literalmente. É salvo (ligado a 256K e a um JSON objeto, e mantido apenas enquanto o slide tem mídia), duplicado, congelado na publicação e servido no Jogador DTO. Publicar também escreve media duration ms dele — declarado na versão desde o início e nunca foi escrito — e a estimativa do curso conta a duração real de uma aula de áudio. A impressão digital contém uma transcrição e metadados de um slide AUDIO, por isso, corrigir uma linha de transcrição ou mover um capítulo é uma mudança publicável. Cada outro hashes slide exatamente como antes: alargamento do hash para todos os slides teria virado cada curso publicado com uma transcrição de vídeo "não publicado" No dia em que isto foi enviado. * * ************* serve um slide's (ou uma pergunta) mídia com suporte Range, autorizado pela própria atribuição do membro: o arquivo deve estar no versão foram designados, em Recursos de RH, em sua organização, ao vivo e sem trilha. A fluxo de imagem que ele substitui para os alunos precisa VER DOCUMENTOS, que 32 dos 149 membros segurando nenhum direito tinha — cada um deles encontrou um jogador morto. Porque um aluno é autorizado por a presença do arquivo em um curso, salvando uma unidade agora recusa um arquivo que seu autor não pode abrir (422 nomeando o slide ou pergunta), e anexando qualquer arquivo em todas as necessidades o próprio fluxo de imagens exige; a publicação re-executa ambas as verificações ao longo de todo o curso, de modo que um rascunho salvo antes ou por um co-autor é mantido à mesma regra. Caso contrário, GERÊNCIA FORMAÇÃO sozinho poderia publicar um ficheiro que o seu titular não possa ler num curso e atribuí-lo a si próprio. O caminho do aprendiz também só serve uma imagem, um vídeo ou uma gravação — nunca um documento de um salvo criado nomeado. Recursos de RH também é mais estreito do que qualquer outra regra de byte (pacotes emitidos são SERVICE APLICATION, documentos por parte Empréstimo ou CONTA MEMBER VAULT, e chat/voicemail/call media têm suas próprias coleções). As leituras são auditadas como /imaging/stream, e a resposta Range é um helper compartilhado (ImgRangeResponses) que /imaging/stream agora usa também. A publicação recusa um slide de áudio sem uma descrição nas próprias palavras do áudio. Precisa da biblioteca compartilhada com kamo "feat(imagem, treinamento): uploads de áudio passam pela verificação MIME e slides carrega metadados de mídia" (media meta json em ambas as entidades de slide; o DDL é aplicado).
· kamo-shared-library
Envios de áudio passam pela verificação MIME, e slides carregam metadados de mídia
Todos os uploads de áudio, mas MP3 foi recusado como um erro MIME. Um envio só é aceito quando o tipo do navegador e Tika sniff resolver para o mesmo ImageMimeType, e para áudio os dois lados Nunca soletrar um formato da mesma forma. Medido contra Tika 2.9.2: um WAV cheira como áudio/vnd.wave (os navegadores enviam áudio/wav), Ogg como áudio/vorbis ou áudio/opus (áudio/ogg), ADTS AAC como áudio/x-aac (áudio/aac), e Windows e macOS enviam uma .m4a como áudio/x-m4a onde Tika diz áudio/mp4. stringToImageMimeType agora ignora o caso, o espaço e os parâmetros circundantes, e mapeia esses nomes falsos na constante que eles nomeiam. Nada mapeia um recipiente que pode transportar vídeo (Matroska, WebM, MP4) para uma constante de áudio, e FLAC permanece um binário genérico em ambos os lados, como antes. TrainingSlide e TrainingVersionSlide gain media meta json (TEXT): a duração, picos de forma de onda e capítulo marca o jogador de treinamento navega uma lição de áudio por — escrito pelo editor, congelado com a versão. DDL, aplicado à produção à mão antes deste commit (InitializerService não é implantado): TABELA ALTER public.hr training slide ADD COLUNN SE NÃO EXISTE TEXTO para media meta json; TABELA ALTA COLUMN ADICIONADO SE NÃO EXISTE TEXTO Media meta json;
· kamo-internal
O título completo de uma janela de ferramentas, no entanto é abreviado
Uma barra de título é uma linha, e uma conversa, um e-mail ou assunto de ticket ou um o diretório do terminal é regularmente mais longo do que o quarto que recebe — o membro só podia ler o início do corte. Cada lugar onde o título de uma janela é desenhado agora abre uma carta com a totalidade: a barra de título na linha da frente, o tiras de janelas atrás, uma barra de janela flutuante ou maximizada, e as abas acima do painel maximizado (onde ele substitui o próprio navegador dica de ferramenta 'title' sem estilo). Atingido de todas as formas que um membro pode perguntar: - pairar: após um breve descanso, e imediatamente quando deslizar de outro título; uma carta de cada vez - pressione: imediatamente; derrubado no momento em que a imprensa se torna uma janela arrastar, e mantido para baixo até o ponteiro sair ou voltar de novo - toque: imediatamente, realizada após o dedo levanta até que uma torneira pousa em outro lugar - teclado: focando uma tira, uma aba ou uma barra de janela flutuante; Escape fecha - clique com o botão direito: o menu da janela agora nomeia a janela na íntegra no topo e tem uma linha "Copiar título" Apenas para um título que é realmente cortado (medido quando iria abrir, incluindo um sub-pixel transbordar `scrollwidth` rodadas de distância), e segue o janela como a linha se move, atualizações quando o título é renomeado sobre o socket, e vai embora uma vez que uma maximize ou uma linha mais larga permite que o título se encaixe. O cartão é um tom mais profundo da própria cor da barra de título da org, linhas o título completo sob o ponto de corte, é selecionável, e copia todo o título. O cartão é portalizado, mas Reagir bolhas seus eventos de volta para a barra de título, assim pára a imprensa, clique, clique duas vezes, menu de contexto e teclas que arrastar, elevar, maximizar ou mover a janela por baixo dela.
· InitializerService
Coloque o aplicativo no catálogo de direitos, somente add-on
**************** assevera que cada aplicativo vendido é categorizado e senta-se em algum lugar na escada da camada, porque um aplicativo o catálogo não descreve terras em nenhum lugar na matriz de preços e silêncio escreve is included=false em cada nível. Computadores hospedados foi vendido e descrito em nenhum lugar, por isso quebrou ambas as asserções momento ServiceType 37 existiu. Apenas complemente, e por uma razão nenhum dos outros aplicativos somente complemente compartilhar. MLOS, o sistema de empréstimo pessoal e Registros de Pacientes são negociados por causa do que eles Carregar; Computadores hospedados é negociado por causa do que gasta. Um degrau de nível entregaria a cada organização desse plano o direito de atribuir VMs KubeVirt, e o programador limita a frota por PEDIDOS em vez de uso, de modo que as orgs que usado o direito primeiro iria tomar os nós do resto - em um publicado preço, que é a parte que torna difícil voltar. O que o move para um rug é mais nós, não uma mudança de preços. O complemento segue a forma que o laço já se aplica aos aplicativos negociados: não preço de lista, então nada torna um, e compatível apenas com os planos ADUANEIROs. Está. também não é oferecido em qualquer lugar até que o aplicativo atinge COMPLETED, o que ele não tem. A entrada do catálogo fica na Produtividade ao lado das outras coisas em que as pessoas trabalham. A categoria segurando um aplicativo lê como um descuido para quem abre a matriz.
· kamo-internal
Contas de membros humanos/AI, nomes fonéticos, cargo e requisitos de departamento
Adicionar Membro / Adicionar Membro da Equipa - Uma primeira seção "Pessoa ou IA": Inteligência Humana (padrão) ou Inteligência Artificial como dois cartas de escolha operáveis por teclado. AI traz o membro da equipe de supervisão (por padrão para você quando você são um membro da equipe) e o modelo de IA; a localização de trabalho de um membro da equipe pré-preenchimento como Remote. - Nome fonético ao lado do nome preferido, com dicas de pronúncia e dois botões de reprodução Nome como escrito e escrito foneticamente através do motor de fala do navegador. - O resumo mostra Inteligência e "Diz"; escolher um título de trabalho ou departamento mostra o que espera (descrição + requisitos); um aviso de uma conta existente diz o seu nome e pronúncia são mantidos. - Bulk add: uma configuração de inteligência em lote (+ supervisor), uma substituição por linha e uma coluna fonética; CSV importa auto-mapas "pronunciação", "humano ou ai" e amigos ("AI", "Bot", "Humano"...). Após a criação - Membros / Equipe Membros grades: uma coluna de Inteligência, um All · Humano · filtro de IA com contagens, e busca rápida que encontra "AI" e nomes fonéticos. - A carta de membro (cada nome paira): uma pílula de IA e uma linha "Diz-o" com um botão de jogo; roster linhas Prime-o com ambos. - Perfil: o herói usa a pílula de IA e "diz"; o nome fonético é editado ao lado do preferido nome; o cartão de associado mostra/edita Inteligência, supervisor e modelo (somente no seu próprio perfil); a sala de trabalho ganha um cartão vivo, somente para leitura. Títulos e serviços de emprego (/settings/essencial) - O diálogo adicionar/editar ganha uma seção Expectativas: uma descrição (4.000 caracteres, contador) e um requirements editor — category, text, Needed/Prefered, reorder, remove, Enter adiciona o seguinte, colar uma lista divide-a em linhas, exemplo fichas, 50 linha cap. - Tabelas mostram a primeira linha da descrição e uma coluna Requisitos com uma lista hover; ambas as páginas atualizar o live (pausado enquanto a janela está aberta) e mostrar as palavras do próprio servidor em uma gravação recusada. Peças partilhadas: app/lib/members/intelligence, app/lib/speech (detetado por características, seguro por SSR), InteligênciaBadge / IntelligenceChoice / PhoneticNameField / SayItButton, app/lib/orgRequisitos, RequisitosEditor, Expectativas de Papel. Especificar e planejar sob documentos/superpoderes. Precisa de kamo-shared-library + securityservice (mesma característica) e as chaves do dicionário empurradas primeiro.
· SecurityService
Membros humanos/AI, nomes fonéticos, requisitos de funções; corrigir posição salva segurança de limpeza
Membros - Criar, criar-equipe-member e bulk-create aceitar 'intelligenceType', 'namePhonetic' (novo apenas contas, como o nome), e para as contas de IA `aiSupervisorMemberId` + `aiModel`. A O supervisor deve ser um membro ativo da equipe humana da org e nunca a conta em si; quando nenhum é nomeado o criador está em se eles se qualificarem (AiSupervisor Policy). Cada recusa nomeia o seu campo antes de tudo está escrito. - PUT /members/{id}: `namePhonetic` é um campo de identidade do usuário (a mesma autoridade que o nome legal). «IntelligenceType», «aiSupervisorMembro Id, 'aiModel' precisa de MANAGEM MEMBERS ou de uma janela de Deus aberta, e são recusados em sua própria associação (CANOT RELABEL SElf) para que uma IA não possa se reescrever humana. Mudando para HUMANo limpa supervisor e modelo. - GET /members/{id}, /members/{id}/card, o roster by-department e as linhas da lista de contas `intelligenceType` e `nomePhonetic` (o perfil também recebe o supervisor id/nome e modelo). - os títulos e departamentos de trabalho da org-config carregam descrição + requisitos para o formulário de criação. Títulos e serviços de emprego - POST/PUT/DELETE agora exigem CONFIGURE SISTEMA (ou uma janela de deus aberta) — as páginas de configuração que escreve- os já o fizeram; o servidor aceitou qualquer membro da org. Parece inalterado. - Descrição e requisitos fluem através dos serviços compartilhados (ver biblioteca compartilhada kamo). Corrigir: PUT /member-security/{id} substituiu funções, direitos diretos e o tempo- limite de sessão, mesmo quando o O pedido não os nomeou. O cartão Posição do perfil envia apenas o departamento / título do trabalho / oficial title / manager, então cada edição de posição apagou as funções personalizadas do membro, direitos diretos e tempo limite Ativar. Cada um agora é substituído apenas quando sua chave está presente; o editor de segurança envia todos os três. DDL: (aplicado à mão como proprietário antes deste push; zero erros de esquema-mismatch em segurança/email/media durante os 15 minutos seguintes).
· kamo-shared-library
Tipo de informação, nomes fonéticos, supervisão de IA, requisitos de cargo/departamento
Membros: «Membro.intelligenceType» (HUMAN □ ARTIFICIAL, STRING, defaults HUMAN em cada construção caminho e na coluna), `aiSupervisorMember Id` (plain id — membros é a mesa mais quente e é «iModel». Usuários: `namePhonetic`, ao lado do nome em vez de dentro do EmbNameFull, que conduz, contas, mutuários e sessões também incorporam. Títulos e departamentos de trabalho: uma ‘descrição’ (TEXT, 4.000 caracteres) e requisitos ordenados em duas tabelas de filhos (`org job title requirements`, `dept requirements`: categoria, Requerida/Preferida, texto ≤ 500, IDs estáveis, EM CASCADE DELETO). «OrgRequirements» é a regra definida para ambos — validação antes de tudo ser escrito, diff-by-id para que um requisito mantido mantenha o seu ID, e um ID de outro proprietário é tratado como novo. As atualizações seguem "ausente significa inalterado" para ambos os campos novos, então um O chamador que nunca os envia não os pode limpar; "" / [] claro. **************** agora aceite o pedido DTO (apenas o Serviço de Segurança os chama). O DDL é aplicado à mão. 2026-09-22 03:01Z, antes deste empurrão). Uma SessionFactory verdadeira sobre toda a biblioteca fixa o novo tabelas e colunas para que DDL (RoleRequirementsMappingTest).
· kamo-internal
A opção de navegação, a seção de configurações e a figura de armazenamento
O próprio computador Linux de um membro, aberto da barra superior. A aplicação (ServiceType 37) e os seus três direitos Pousaram na biblioteca partilhada; esta é a metade que as pessoas vêem. A OPÇÃO NAV aparece exatamente quando há algo atrás dela Gated na resposta do servidor para "que computadores podem este membro abrir", não à direita e não em deus. A Dev-máquina opção tinha que ser ensinado isto: foi Deus-gated uma vez, que colocou um ícone na frente das pessoas com nenhuma conta na máquina e produziu o erro genérico de Guacamole quando eles clicaram nela. Então, um gerente segurando ACESS SUBORDINATE COMPUTERS e nenhum computador deles mesmos ainda recebe o ícone — há algo por trás — e um administrador que gere o GESTÃO e nada atribuído não o faz. A lista é do servidor, na ordem do servidor: possuir primeiro, depois subordinados, depois da organização. Nada aqui filtra ou reordena, pela razão pela qual a listagem da rede é decidida pelo servidor — um lado cliente filtro é uma lista que já foi enviada, e a ordem carrega informações que o cliente nunca vê porque não tem a cadeia de gerente. Cada linha se expande para os tamanhos de DESKTOP RESOLUTIONS, reutilizado em vez de reposto para um tamanho adicionado lá cai no lado correto da regra sob "Fit my window" sem ninguém mover um limite. Cada linha usa seu estado, porque "sono" é o estado de repouso normal de um destes computadores em vez de um Culpa, e uma briga que dizia que nada deixaria alguém que esperasse um minuto a pensar que tinha falhado. openHostedComputer é mais do que uma busca e um redirecionamento pela mesma razão: um lançamento tem três respostas e dois deles não são uma ligação. Dormir significa que um velório começou e leva 30-90 segundos enquanto o hóspede lê sua memória de volta de um volume replicado, então a aba diz que — uma aba em branco por um minuto é indistinguível de um quebrado, que openKamoDesktop teve que ser ensinado também. Sem login ainda significa O Kamo nunca guardou a senha e o membro confirma- a uma vez; isto é, o desenho a funcionar, não uma falha, assim a aba fecha e uma janela pergunta em vez de deixar uma página de explicação que ninguém queria. Três fixa as tarifas. Um foi pedido; os outros dois são porque é utilizável Computadores é o único: atribuir, redimensionar, mudar de armazenamento, dormir, remover, viver no usoOrgChanges. Capacidade responde "por que isso não vai começar?", que de outra forma não tem resposta em qualquer lugar do produto — e a resposta é contra-intuitivo, então as barras dizem PEDIDOS em vez de uso, porque uma máquina pode parecer meio ocioso e Não tenho espaço. O padrão impede uma organização de escolher de novo um tamanho e um disco para cada pessoa, e cada caixa pode haver em branco, onde em branco significa "seguir a plataforma" e não zero. A janela de redimensionamento avisa e a janela de armazenamento diz que não irá, que é o par que vale a pena ter: um tamanho a alteração reinicia o computador porque uma imagem de sono está ligada ao tamanho da memória em que foi escrita, e uma a mudança de armazenamento expande o volume online e não perturba nada. ARMAZENAMENTO NA PAPEL DAS ESTATÍSTICAS HostedComputerUsagePanel se senta diretamente após o armazenamento em Configurações → Minha Conta → Estatísticas & Custos. Nem uma fileira que tabela: suas linhas vêm do snapshot de faturamento varrer armazenamento ambulante RECORDS, e um disco de computador tem nenhum — o que está nele é conhecido apenas para o convidado, que relata sua própria figura do sistema de arquivos. Número de Longhorn seria errado de uma forma que importa, porque conta tudo o que já foi escrito e nunca cai quando Alguém apaga um ficheiro. O arquivo de swap está excluído: é o tamanho da memória do computador e existe assim A máquina consegue dormir. Duas coisas meus próprios cheques capturados e corrigidos: o portão de navegação retornou `indefinido` em vez de `falso' para um organização sem conjunto de bandeiras (`indefinido & & & x`), e a coluna de armazenamento passou `null' para uma UTI placeholder — o teto e "ele cresce" são o mesmo fato, então ele agora lê o teto uma vez e deixa TypeScript siga o estreitamento. Verificado: tsc limpo de tudo, exceto quatro erros pré-existentes de respostaQuato no chat e suporte, presentes em As mesmas linhas na origem/principal. 320 testes de navegação e lib. eslint limpar em cada novo arquivo e nenhum novo aviso nos editados. Todos os três protetores de construção de imagem passe — check-i18n-keys limpar mais de 4268 arquivos contra a cabeça do dicionário, que foi empurrada primeiro e verificada pela ancestralidade.
· kamo-internal
Listas de verificação no aplicativo Notas – pré-requisitos, adesivos, painéis domésticos e o calendário
Uma nota é memória; uma lista de verificação é trabalho. /notas tem agora duas metades — Notas e Listas de verificação (?view=checklists) — e uma lista de verificação é seu próprio registro (/api/checklists, KBService) com tarefas que podem esperar por outras tarefas. Listas de verificação - Um cartão por lista em sua própria parede: borda de progresso e anel, tarefas o cartão, o chip de programação; filtros de trilho para em andamento / não iniciado / feito / agendado / em casa / favoritos, pesquisa que atinge dentro de cada tarefa. - O editor: adicionar tarefas rapidamente (Enter; Shift+ Digite adiciona-o como o próximo passo; colar uma lista), clique para editar, arrastar ou Alt+setas para reordenar, excluir com Desfazer, Tudo/Pronto/Esperando/Feito filtro, "fazer em ordem", desmarque tudo, limpo feito, duplicar como uma cópia nova, copiar como Markdown. - Pré-requisitos: o modo link escolhe o que uma tarefa espera, apagando qualquer coisa Isso faria um loop. Uma tarefa bloqueada mostra seu cadeado e o que ele espera; pressionando-o agita a linha, ilumina as tarefas no caminho e oferece Salta para eles. Desembaraçar algo do trabalho acabado depende, ou dar um terminou tarefa um pré-requisito aberto, pergunta primeiro e nomeia o que reabre. A rail dependência desenha cada link e ilumina a tarefa pairada. O servidor Faz cumprir as mesmas regras, para que nada as rodeie. - Desbloquear, marcar e terminar uma lista são animados; o acabamento recebe confete e um tom na superfície onde o último tique foi feito. Onde quer que vá um bilhete - Flutuando: checklists flutuam como pegadas na mesma sobreposição, empilhando ordem, layout salvo e dock hex-head como notas (seu próprio grupo dock). - Início: uma lista de verificação fixa é um painel de lançamento ao lado de notas fixas, ticável. - Uma loja ao vivo alimenta cada superfície, refrescada pelas 'checklists' org mudar, por isso um carrapato aterra em todo o lado. Calendário - Uma lista de verificação vai para o calendário como um evento real (sourceType CHECKLIST), agendado através do próprio diálogo de eventos do calendário de qualquer superfície, ou por arrastando-o da nova bandeja de verificação do calendário para um dia ou uma hora. - Os eventos da lista de verificação mostram o seu progresso em todas as vistas; a janela de eventos mostra a lista, se possível no lugar; pulsos de trabalho atrasados vermelho. - O proxy do calendário agora publica a mudança de 'calendar' org em cada escrita: Os tópicos próprios do EmailService são por pod, então uma aba na outra cápsula nunca ouviu. Design:
· APIService
Encaminhar /api/checklists para KBService
Listas de verificação ao vivo no aplicativo Notas e são servidas pelo KBService ao lado das notas eles mesmos; sem esta rota toda a característica responde 404 no portal.
· KBService
A API da lista de verificação, com pré-requisitos que o servidor impõe
/api/checklists: lista, obter, criar, atualizar, excluir, duplicar, repor, clear-done, sequência ("fazer em ordem"), links claros, e por tarefa adicionar, editar, assinalar/desmarcar, definir pré-requisitos, mover e apagar. Cada mutação responde Toda a lista de verificação para que cada superfície se redesenhe de uma resposta. As regras vivem em ChecklistRegras, pura e exaustivamente testadas, e manter uma invariante: uma tarefa feita nunca espera por uma tarefa aberta. Um tick é recusado enquanto um pré-requisito está aberto (409 PREREQUISITES OPEN, nomeando-os); um untick que tarefas feitas dependem de é recusado a menos que cascata=verdadeiro; um link que iria loop é recusado (409 CYCLE, com o laço); um link que deixaria o trabalho terminado à espera das necessidades de trabalho aberto reabrir=verdade (409 REOPEN REQUIRED). As mesmas regras executar no navegador para feedback instantâneo, mas este é o que decide - um pegajoso, o calendário ou uma aba velha não conseguem contornar. Os direitos são os seguintes: VER NOTAS a ler, CRIAR NOTAS, EDIT NOTAS e DELETA NOTA a mudança. Mutações carregam @RetryOnDbConflito e bater o A versão da lista de verificação, por isso duas tabulações a marcar de uma vez em série. create checklists.sql é o DDL, idempotent, aplicado como proprietário.
· kamo-shared-library
Checklist e ChecklistItem entidades, repositório e DTOs
Checklists são o segundo tipo de registro do aplicativo Notas: trabalhe para passar, cujo tarefas podem esperar em outras tarefas. Três quadros — listas de verificação, itens de lista de verificação e checklist item prequisites — tudo chaveado pelo UUID para que nenhum ID seja sempre um int64 a O navegador pode dar a volta. Texto da tarefa é texto cifrado sob a tecla de nota do membro. A linha de lista de verificação carrega seu próprio created at/updated at (EmbRecordState's DATA UPDATED is insert/update=false and never move) and a @Version the o serviço bate em todas as mutações, por isso as edições simultâneas para uma lista colidem em vez de sair. O DDL é aplicado à mão. Uma mesa.
· SecurityService
A superfície virada para o navegador e o segundo gateway Guacamole
SecurityService é o limite de confiança para computadores hospedados. Realiza a sessão, os direitos e a org gráfico; ComputeService possui as credenciais do Kubernetes e nenhuma sessão. Nenhuma verificação a jusante uma direita e nada aqui toca num aglomerado. A identificação do ORG nunca é tirada do pedido. Cada chamada carimba a própria organização resolvida. A O computador hospedado é uma máquina inteira em uma rede que vê somente sua própria organização e a internet, assim um handler que aceitou um id org de um corpo não seria uma lista furada — seria uma porta para alguém No desktop do outro lado. O caminho de atribuição resolve adicionalmente o email do membro alvo através do próprio chamador organização, que duplica como a verificação de associação: sem ele um administrador poderia atribuir um computador para um ID de membro pertencente a outro inquilino e ter a máquina construída no espaço de nomes desta org sob que nome da pessoa. Três gates diferentes, porque há três perguntas diferentes. Gestão das necessidades GESTÃO HOSTED COMPUTERS. A abertura precisa que o computador seja seu, ou um dos dois direitos do ACESSO Alargue-o — e se o chamador pode abrir QUE computador é respondido pedindo novamente a mesma visibilidade pergunta que o menu de navegação foi construído a partir, em vez de por uma segunda regra que poderia discordar. Um membro que era nunca mostrado um computador não pode alcançá-lo adivinhando um id. Confirmar uma senha não precisa de nenhum direito: ele é como o computador de um membro recebe um login. O ORG CHART é tratado apenas quando um direito precisa dele, e em uma consulta. ACESSO SUBORDINATO COMPUTERS alcança toda a subárvore abaixo de um membro, de modo que as bordas voltar como pares e a travessia rio abaixo caminha-los sobre um conjunto visitado — managerId é um campo de perfil de forma livre, não uma árvore validada, então um ciclo é um Reorganização. Um membro sem direitos paga uma chamada, o que importa porque a navegação pergunta sobre Todas as páginas. O formato token agora é dividido, não copiado. GuacamoleTokenCodec é extraído de GuacamoleJsonAuth porque existem dois gateways: desktop.<domínio> para administradores de plataformas e computadores.<domínio> para locatários, com diferentes chaves de assinatura e diferentes modelos de conexão. Duas cópias desse formato seriam uma. implementação e uma responsabilidade, e o erro que a cópia eventualmente cometeria é o erro de expiração ele lê como um link TTL e é realmente a janela de reconexão da sessão, e obtê-lo errado esvazia um Lista de ligações do utilizador vivo silenciosamente. O andar é imposto por ambos os ouvintes. HostedComputerSSo é um irmão em vez de um ramo. Esse portal oferece três alvos fixos e coloca todos os eles em cada token; este tem uma conexão por computador, com o nome do computador, com uma única vez credencial cunhada por lançamento — assim a senha do membro Kamo nunca viaja em um token. A plataforma desktop tem que manter uma cópia descriptografável de uma senha de conta precisamente para que Guacamole possa auto- login; isto Não faz, e isso é a melhoria. PasswordChangeController agora empurra a nova senha para os computadores do membro. Este é o ÚNICO momento. plaintext existe — Kamo armazena um hash e não mantém nenhuma cópia reversível em qualquer lugar — e o push é o melhor esforço por construção: uma falha nunca deve falhar a mudança que o membro pediu, e um computador adormecido está marcado O seu próximo lançamento pede uma confirmação. Nada está em fila, porque uma senha em fila é armazenada senha com um atraso. Suite: 2755 testes, 5 falhas, e todos os cinco são os mesmos pristine origem / principal produz — o UnautenticatedEndpointRatchet on PromotionCodeInternalController (adicionado por 9578ca0 e nunca adicionado ao ********************* NPEs sobre o JobStamp aplicado. Verificado ao executar ambos em uma worktree limpa na origem/principal. Meu próprio controlador passa a catraca: cada manipulador resolve uma sessão e responde 401 sem um. Precisa do segredo hc-guac-sso para menta links; até que exista o caminho de lançamento diz tão claramente em vez de devolvendo um link que pousa na tela de erro genérica do Guacamole.
· EmailService
Um membro pode colocar uma lista de verificação em seu calendário, uma vez
Listas de verificação ao vivo no KBService e o calendário possui somente QUANDO, então um lista de verificação agendada é um evento de membro comum que transporta fonteType CHECKLIST, a lista de verificação UUID e um link profundo em /notas. A ligação é servidor derivado, nunca lido do corpo, e o evento passa o membro normal criar caminho para que a mudança de calendário publicar ainda incêndios. Um segundo esquema ativo da mesma lista de verificação é um 409 nomeando o primeiro. - Está bem. lista-os para as fichas em /notas. Uma edição ainda não pode alterar o que é um evento. Chamadas da lista de verificação manter o tipo de calendário e obter um ícone de lista de verificação.
· APIService
Encaminhar o caminho do agente de computador hospedado, e somente esse caminho
/api/computadores/agentes hospedados/** -> Serviço de computação. A política de rede de um computador hospedado nega o cluster inteiramente — nenhuma base de dados, nenhum serviço, nem mesmo cluster DNS — então a única maneira para a máquina virtual de um inquilino dizer a Kamo alguma coisa é para fora para a internet e de volta através do api.<domínio> como qualquer outro cliente. Tudo o mais sobre um computador é empurrado para ele; Este é o único caminho de entrada. O segredo é o ponto. Seus irmãos em /api/hosted-computers/ são a API de gerenciamento interno: atribuir um computador, redimensionar um, apagar um, ler a capacidade de outro inquilino. Este portal SecurityConfig é totalmente comentado, então um caminho encaminhado é público e o serviço upstream possui o auth — um wildcard aqui publicaria uma API de criação de VM na internet. Esse é o mesmo erro. /api/bulktext/inbound/** existe para evitar, e a razão pela qual a superfície do agente foi feita uma criança de /agent Em vez de um irmão das rotas de gestão. em vez de em frenteWebhook: ao contrário de um webhook portador não há assinatura de terceiros sobre o bytes brutos, e a credencial é uma autorização comum: Cabeçalho do portador — um segredo girado por computador em cada velório, que a ComputeService verifica contra aquele computador. O ponto final é apenas telemetria escrita cuja resposta não carrega nada sobre a organização, então uma credencial levantada do próprio desktop de um inquilino compra a capacidade de postar a figura de armazenamento do desktop e nada mais.
· kamo-shared-library
Uma consulta para o gráfico completo de relatórios de uma organização
findMemberAndManagerIds retorna cada borda (memberId, managerId) em uma organização, para hospedado ACESSO SUBORDINATO COMPUTERS direito — que atinge toda a subárvore abaixo de um membro em vez do que apenas os seus relatórios directos. A alternativa é encontrarDirectReportMemberIds caminhado nível por nível, que é uma consulta por nível em um caminho o menu de navegação bate em cada carga de página, e a profundidade é uma propriedade do gráfico de org do cliente em vez de qualquer coisa que este código controle. Retorna o EDGES em vez de uma subárvore resolvida, porque a travessia tem que se proteger contra um ciclo: managerId é uma referência de forma livre no próprio perfil de um membro, não uma árvore validada, então A reportando para B enquanto B relata para A é um erro de clique ou uma reorganização de distância e uma consulta recursiva não retornaria. O ouvinte anda por estes primeiros lugares sobre um conjunto visitado. Filters mirror findDirectReportMemberIds exatamente, incluindo a associação de esquerda explícita no tm.user — a implicited path join é uma associação INNER no JPQL e iria silenciosamente soltar cada relatório cuja linha de usuário é Faltando, qual é o registro de comentários desse método. Validado por LibraryQueryParseTest, que traduz cada @Query na biblioteca contra a entidade real Mapeamento. Isso importa aqui: Spring Data valida uma consulta anotada quando constrói o bean do repositório, então um caminho ruim compila, passa por CI, navios e, em seguida, impede o serviço consumidor de começar em tudo.
· kamo-internal
Uma caixa de entrada social de uma mensagem mais antiga nomeia seu autor com seu cartão
A citação agora retira seu autor do servidor (@kamo/chat-core's cote.senderMemberId), que retém o id de um contacto social desde que o serviço de comunicação social ceee73e — as palavras de um contacto são armazenadas sob a proprietário da conexão, e a cotação usada para nomear o proprietário. Então o nome de um representante em uma citação de uma mensagem mais antigo do que a página carregada abre o seu cartão, como um já carregado fez. Uma mensagem de contacto carregada é recusado aqui também, o que um servidor mais velho diz.
· kamo-internal
O cartão mostra o ID do membro para aqueles que gerenciam os membros
RH e suporte ler o id de um membro fora de uma dica nas listas de RH, que o cartão membro substituiu (a dica sentou-se onde o cartão abre). Os detalhes do cartão agora carregam uma linha de identificação do membro, com o mesmo botão de cópia como os valores de contato, para os espectadores que podem abrir o perfil desse membro — os direitos que gerem os membros, Deus, e os próprios membros. Os outros não vêem identificação.
· kamo-shared-library
O aplicativo, três direitos, níveis/estados e as entidades
ServiceType.HOSTED COMPUTERS na ID 37, TESTANDO ao invés de COMPLETADO. O estágio está carregando peso aqui em vez de descrever o progresso: AppCatalogService resolve `disponível` como `stage] COMPLETED`, e um aplicativo não disponível é ignorado pelo loop de auto-fornecimento do FeatureController. Todos os outros app chega ligado para todas as 25 organizações no dia em que envia; este entrega máquinas virtuais mantendo RAM real em um cluster de dois nós, então ele tem que ser concedido por organização por um operador que olhou para a capacidade. Nada é perdido — a tela Apps & Features da plataforma existe precisamente para publicar um aplicativo independentemente de seu estágio, então a linha está esperando lá em "Não Disponível". Três direitos em 326-328, não 320-322: o checkout local foi 30 commits atrás e 320 é GESTÃO DE EMAIL. Leia o IDS nesse arquivo, nunca a ordem de linha - 318-325 sentar centenas de linhas acima da constante que parece durar. Todos os três são raízes e nenhum é filho de outro, que é a decisão que vale a pena gravar em vez de A contagem. GESTÃO HOSTED COMPUTERS fecha a seção de configurações; os dois portões de direitos de acesso O computador aparece no menu de navegação de um membro. Ser pai ou sob a GESTÃO seria errado no custo direcção — um chumbo de TI que necessita de abrir qualquer máquina que chegue segurando o ecrã de provisionamento, e um gerente concedeu uma visão dos computadores de sua equipe seria capaz de redimensioná-los. Nem os portões computador próprio do membro: isso não é um direito em tudo, porque tornando-se um permite um computador provido para alguém que não consegue alcançá-lo. HostedComputerTier e HostedComputerState persistem pelo nome. Estas mesas são novas, por isso não há nada para proteger e nenhuma razão para herdar o perigo de reordenação AssocType e ServiceType têm que viver com. Duas derivações na camada são suporte de carga e ambas falham silenciosamente sem elas: - minimumDiskGb() é memória convidada + 25. Um computador dorme escrevendo sua RAM em seu próprio arquivo de swap, assim, um disco sem espaço para a imagem produz um computador que nunca dorme — ou escreve uma parcial imagem e botas limpas com a sessão do membro ido. Nenhum deles relata nada, por isso a palavra é mais forçado do que sugerido. - requestMib() adiciona o lançador de KubeVirt, medido em ~324 MiB no desktop-1 e arredondado para 400. Capacidade deve comparar com o que o POD solicita: um cheque que omite diz que um computador se encaixa e depois deixa a sua cápsula pendente indefinidamente, que é indistinguível de um computador que nunca apareceu e registra nada que um membro possa ver. **************** é o que o planeamento de capacidade subtrai, e ASLEEP não é deliberadamente nele — esta é toda a característica. A pausa do próprio KubeVirt "congela o processo sem liberar CPU recursos, mas a memória permanece alocada", então dormir aqui significa suspender-para-disco: o VMI e seus A cápsula do lançador desapareceu e o pedido de memória voltou com o programador. Armazenamento é um par nullable com um terceiro significado e sem booleano. Um teto acima do disco atual é "ilimitado" como um membro experimenta-o; um teto ausente significa que o disco não cresce. Não existe `ilimitado` bandeira porque uma bandeira definida sem teto é a configuração que silenciosamente come um cluster - a regra StorageAutoExpandSweep já impõe para arquivos, pela razão que registra. PhiModule.HOSTED COMPUTERS é BLOCKED NO BAA, e a razão é uma propriedade da coisa em vez de um Gap na papelada. Cada outro módulo é uma superfície conhecida com fluxos de dados conhecidos; esta é uma área de trabalho alguém pode instalar qualquer coisa e colar qualquer coisa em, e Kamo não pode inventariá-lo sem a ver o ecrã. O isolamento é genuinamente forte e não é isso que um BAA pede. Também mapeou KAMO UNIVERSE, CHESS e HOLDEM, que foram enviados sem PhiModule e deixaram Mapeamento de Tipos do PhiService Teste vermelho. Não o meu, mas o teste falha na primeira lacuna que encontrar, então sem eles também não pode provar que HOSTED COMPUTERS está mapeado. Eles tomam JOGOS, que seus próprios pais tomam. Suíte: 3026 testes, e as 4 falhas restantes são as mesmas que a origem intocada / principal produz — RelatórioVisibilidade Teste (PlatformRightType ordinal, intocado aqui), os dois CRESCIMENTO REQUEST IMAGE testes de domínio, e SystemBugCountContractTest NoSuchMethod. Verificado ao executá-los numa limpeza worktree na origem/main antes de mudar qualquer coisa. As mesas estão na base de dados ao vivo.
· kamo-internal
Uma resposta a uma mensagem mais antiga nomeia seu autor com seu cartão também
Move @kamo/chat-core para 0.1.19, cuja cotação de resposta carrega o remetenteMembroId: o servidor paiSenderMemberId quando enviou um (null for a web-chat visitor, cujas palavras são armazenadas sob o membro do sistema), caso contrário o membro do pai carregado. Antes, o console só podia ler o autor desligado um pai carregado, então uma resposta a uma mensagem mais antiga do que a página carregada citou um nome simples. - Conversas de colegas (MessageList) tomar o autor da citação como é. - Os bilhetes aplicam a regra que o rosto de uma bolha lhe segue — o lado do espectador apenas, uma vez que os lados são conhecidos (isOwnSide) — que agora detém para os pais descarregados também. - Caixas sociais mantêm sua própria regra (um pai carregado de um dos representantes da organização): o servidor não retém o id de um contato social, uma vez que os contatos são armazenados sob o membro do sistema. package-lock.json: a versão da entrada do chat-core, resolvida e integridade (verificada tarball baixado); suas dependências fixadas (@kamo/net 0.1.2, @kamo/realtime 0.1.1) estão inalteradas.
· KlusterServices
Ilhas VM per-org, suspense-para-disk, e uma imagem dourada de marca branca
O próprio computador Linux de um membro, rodando como uma VM KubeVirt no espaço de nomes de sua organização e aberto do navegador. Separar da área de trabalho/ de todas as formas que interessam: essa é uma partilha máquina para administradores de plataforma, deliberadamente na rede pod para que possa chegar ao banco de dados, NATS e MinIO. Estas são máquinas de inquilino cuja propriedade definidora é o oposto. Três fatos moldaram isso, e cada um contradiz a leitura óbvia: - Pausar uma VM não liberta nada. Documentos do KubeVirt: pausar "congela o processo sem liberar CPU recursos, mas a memória permanece alocada". Assim, dormir é suspender-para-DISK — o convidado escreve seu memória em sua própria troca e potências desligadas, o lançador pod termina, eo pedido de memória vai De volta ao programador. Isso precisa ser executadoStrategy RerunOnFailure, documentado para deixar um convidado fechar ele mesmo para baixo sem ser relançado; sob Sempre o sono seria desfeito em segundos. - A sede é limitada por pedidos de agendamento, não RAM física. Uma cápsula de lançamento que não se encaixa senta-se Pendente para sempre, que se parece exatamente com um computador que nunca aparece e registra nada. Assim, um velório é recusado antes de ser tentado, e a recusa nomeia o número. - As identidades reservadas do Cílio não podem corresponder a uma regra CIDR. **************************** registra que de uma parada, onde paraEntities [host, remoto-node] teve que ser adicionado ao nó. Aqui o mesmo fato é a defesa invertida: nenhuma regra os nomeia, e default-deny. inhaml egressDenibiliza-os para que nenhuma edição posterior possa abri-los — um Cilium nega bate cada permissão, de qualquer arquivo. O isolamento é afirmado em vez de revisto. canary/verify-isolation.sh executa um pod carregando o mesmo kamo.io/hc-org etiquetar um pod lançador carrega, para que obtenha a mesma identidade e a mesma política, e sonda ambas as direções: os nós, kube-apiserver, YugabyteDB, NATS, MinIO, kube-dns, os metadados o endereço e os computadores de outra org devem ser inalcançáveis; a internet e os computadores do mesmo org deve funcionar. Também relata, sem afirmar, se o roteador a montante pierpins — api.kamocrm.com resolve-se em 47.181.8.84 enquanto o IP LoadBalancer de Traefik é o próprio 192.168.4.22 do k1m1, então o agente O batimento cardíaco é o melhor esforço da construção e nada depende disso. A marcação branca não precisa de ser reconstruída, que foi verificada primeiro pela superfície. Cada visível A identidade Xubuntu é config ou um pacote removível. strip-distro-identity.sh remove-los e pinos eles tão apt não pode restaurá-los — um arquivo sombreado volta na próxima atualização e a falha é Um inquilino a ver o logótipo de outra pessoa semanas depois. A imagem dourada envia sem logotipo e sem cores em tudo; o agente pinta-os por org de Comportamento & Rotulagem, honrando a regra de que um inquilino nunca vê as imagens de KamoCRM. O agente é stdlib-somente e não pode chamar, porque a política de rede significa que não há ninguém para Chama. Config é empurrado dentro, a decisão do sono é local assim que sobrevive a uma parada de Kamo, e hibernação a prontidão é verificada (tamanho de troca, currículo= E currículo offset=, disco em /sys/power/state) antes do Temporizador ocioso está armado — um hibernato mal configurado não levanta, ele inicia limpo e perde a sessão. 26 testes cobrem essa aritmética mais a validação de entrada de marca. **************** é aplicado à mão (ddl-auto não é nenhum e InicializerService não é e foi, contra a base de dados ao vivo como o proprietário. Precisava de um subsídio a receita existente não menciona: um esquema NEW não tem nenhum ACL, então os privilégios padrão globais que cobrem tabelas deixadas kamo app com "permissão negada para esquema host computer" na primeira inserção. Verificado depois. Cada manifesto validado com kubectl aplica -- dry-run=server.
· kamo-shared-library
Deixe um chamador resolver um MediaObjImg pelo ID Img sozinho
Os parâmetros de imagem do DocsService (download/stream/list/delete) conhecem um ID de Img mas não têm nenhuma razão para segurar o MediaObj foi anexado a — até que eles precisam para honrar o chat-attachment revogar bandeira sobre ele (MediaObjImg.isAccessRevoked) sem possuir nenhum esquema de chat/media. MediaObjImgRepositório apenas suportada a outra direção (por obj id, ordenado, para renderização de uma mensagem Anexos). findByImg Id fecha a lacuna; plural porque a única a restrição está ligada (OBJ ID, IMG ID), não apenas na IMG ID. Novo teste: MediaObjImgRepositoryQueryTest, fixando a consulta derivada assinar a forma como ************* já faz para o seu repositório de irmãos (esta biblioteca não tem nenhum arnês executável @DataJpaTest/H2, então um método derivado de no-@Query é afirmado pela reflexão em vez de exercitado). Conjunto completo: 3013 testes, 4 falhas pré-existentes + 1 erro pré-existente, todos confirmado presente numa origem limpa/checkout principal antes desta alteração e (PhiServiceTypeMappingTest: ServiceType.KAMO UNIVERSE não tem nenhum PhiModule. Não reclamado por um StorageDomain. RelatórioVisibilidadeTest: uma contagem de relatórios off-by-one; SystemBugCountContractTest: SystemBugRepository.findVisible signature drif).
· DaemonService
Dobre os livros de chumbo a cada 30 s e reconte-os todas as noites; o gatilho do trabalho precisa do segredo do cluster
Os leadgers (securityservice create lead ledgers.sql, aplicado 2026-09-22) substituem COUNT(*) sobre um 796k-leader pool e sobre lead credits com totais mantidos mais um diário somente de apêndice que linha Os gatilhos escrevem. Este serviço os mantém dobrados e honestos: - LeadLedgerFoldJob (cada 30 s): uma instrução por lote apaga linhas de diário e as adiciona ao totais, assim que um leitor vê a figura antes ou depois, nunca metade. Os leitores já adicionam o diário o total, então um carrapato perdido custa tempo de leitura, nunca correção. No máximo 40 lotes de 5.000 por carrapato. - LeadLedgerReconcileJob (03:40 noite): reconta a piscina de cada org e os créditos disponíveis de cada membro das linhas e compara-as com o total + diário na instrução ONE (um instantâneo). As diferenças são APRESENTADO como deltas 'RECONCILE', nunca escrito sobre um total, então a recontagem não pode correr os gatilhos ou Uma dobra. Ele também nomeia qualquer gatilho diário que esteja faltando ou desativado. Num sistema saudável encontra Nada, por isso todas as correcções estão registadas no Warn. Ambos são @DisallowConcurrentExecution e tenta novamente uma instrução YugabyteDB aborta com 40001 (cada um é atômico, Assim, uma repetição não pode contar duas vezes). O SQL foi reproduzido contra o YugabyteDB antes deste envio (temp tabelas: gatilhos, leituras, dobras e recontagem, 60 verificações). JobTriggerController: POST /api/daemon/trigger/{job} e GET /status respondeu a qualquer um. SegurançaConfig permite a todos, e o daemon-route IngressRoute coloca este serviço no ponto de entrada web seguro público (Host daemon.internal.kamocrm.com; sondado 200 anonimamente), então qualquer trabalho — agora incluindo a recontagem — poderia ser iniciado a partir da internet, tantas cópias sobrepostas como o Quartz pool detém. Ambos agora requer X-Internal-Auth = mlos.internal-auth-secret (tempo constante) e recusa todos quando esse segredo está desligado. Nada na plataforma chama este endpoint; um operador ainda pode, de dentro do cluster. Testes: LeadLedgerMaintenanceTest (dobre loop e cap, relato de recontagem, gatilhos em falta, a repetição regra, e as formas SQL que o tornam seguro ao lado do tráfego ao vivo), JobTriggerControllerAuthTest.

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