Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-internal

    Um "porque não posso aceitar?" na barra de filtro

    Alinhado à direita na barra de filtro /leades, usando o ícone de navegação Leads com o mesmo emblema proibido — então a coisa no navegador que diz "você está bloqueado" e o uma coisa aqui que diz "aqui está o porquê" é visivelmente uma declaração. Apenas renderizado enquanto o membro está bloqueado. Não é um filtro que acontece ser vazio, é um estado que existe ou não, por isso quando o a proibição autoriza – um evento de aceitação-porta em tempo real, ou uma atualização após a última nota foi escrita — o controle desaparece e os filtros voltam Mesmo. Um efeito deixa cair a sobreposição quando isso acontece: deixá-la presa seria encadernar a grelha num 'uid IN ()' que não corresponde a nada, com os filtros ainda acinzentados e nenhum controle visível deixado para ligá-los. Pressionado, ele supera em vez de estreita. buildLeadGridQuery retorna mais cedo blockingLeadUids, portanto, nenhuma aba de mercado, guia de status, agente, data ou termo de pesquisa aplica-se. Isso é deliberado: as pistas de bloqueio estão espalhadas por todo o mercados e status em que eles acontecem de estar, e se cruzando com a barra seria mostrar um subconjunto enquanto lê como a lista inteira — exatamente a coisa errada a dizer Alguém a tentar ser desbloqueado. Um conjunto vazio pede 'uid=0' em vez de Deixando de lado a restrição, para que nunca possa alargar-se à organização. As abas de status e todos os controles na barra são acinzentados e feitos inertes enquanto está em, porque um bar que ainda parecia ao vivo estaria mentindo sobre o que escolheu o Filas. O comutador em si é excluído pelo atributo, de modo que permanece pressionável, e o botões de ação ao lado das abas não são filtros para que eles permaneçam ao vivo. Redefinições de chamada em cada comutação — o conjunto de resultados é diferente e o número de página antigo significa Nada contra isso. Desligado, o botão pulsa: é a única coisa na barra que um membro bloqueado tem que Reparem, já que é por isso que as suas pistas deixaram de chegar. Na própria grelha. é o sinal e a animação seria o ruído. As honras preferem movimentos reduzidos.

  2. · SecurityService

    Listar, renomear e terminar os terminais de um membro

    - Está bem. DELETE e PATCH em /terminais/{id}. Cada um deles resolve a conta Linux da SESSÃO PRÓPRIA DO CALAR e não passa nenhum nome de conta para o agente que veio do pedido. Um membro pode portanto, apenas ver, renomear ou terminar seus próprios terminais — não há id eles poderia fornecer que chegaria a outra pessoa, porque a conta não é parte de O que eles fornecem. Uma máquina inacessível responde 200 com uma lista vazia e `inalcançável: true` em vez de um erro: "a máquina de dev está para baixo" é um fato sobre a máquina, não uma falha da pergunta, e o console pode dizer assim onde uma página de erro poderia Só não digas nada. Essa é a mesma regra que o DesktopSsoController segue. Renomear uma sessão que terminou é um 404 com uma sentença — o status honesto para "você renomeou algo que não existe mais", que após uma reinicialização é Todos os terminais que o membro tinha.

  3. · KlusterServices

    Listar, renomear e terminar os terminais de um membro

    GET /terminals?user=X, POST /terminals/<id>/kill, POST /terminals/<id>/title. Não há base de dados atrás disso, e esse é o design em vez de um atalho. O servidor tmux na máquina é o registro: os terminais de um membro são exatamente as sessões que existem, então uma que termina deixa de ser listada com nada para reconciliar, e uma reinicialização — que leva o servidor tmux com ele — esvazia a lista Sozinho. Uma mesa teria que ser dito tudo isso, e seria errado cada Está na hora. Títulos personalizados vivem em uma opção de usuário tmux na sessão, então um título tem o mesmo vida como a concha que nomeia. Os caracteres de controlo são retirados antes do armazenamento: um título é renderizado em uma lista, e uma sequência de escape em um tela em torno dele — stripping também é o que mantém o separador de campo fora do valor, que é o que torna a listagem processável dividindo-a. Títulos são passou como um único elemento argv, nunca através de uma concha. "Nenhum servidor tmux" é uma lista vazia, não um erro. Esse é o estado da máquina após uma reinicialização, que é precisamente quando o membro precisa da lista para dizer "nada Aqui" em vez de falhar. 20 testes: a forma de listagem e sua ordenação, sessões sem título relatando null em vez de "", sessões que este agente não criou permanecer invisível, malformado e linhas não numéricas sendo ignoradas em vez de fatais, matar sendo idempotente, títulos sendo despidos/truncados/desactivados, e um título contendo metacaracteres de concha chegando como um elemento argv. Também guarda a seleção da bomba contra um descritor fechado sob ele — o mesmo desligamento normal que termina o caminho recv já tratado. 131 testes.

  4. · kamo-internal

    Um atalho de senha no herói, e um portão mais estreito

    Duas metades do mesmo assunto. O atalho. Mudar a palavra-passe tinha três quartos atrás do trilho. a única coisa que o layout da sala tornou genuinamente mais difícil de alcançar do que o velho Role, e é o controle mais conseqüente da conta. O herói agora carrega-o, deliberadamente NÃO como uma terceira pílula de vidro: os dois ao lado dele são destinos, isto é uma ação, então é sólido. Quando o multifactor está desligado Torna-se âmbar e assim o diz, porque é o momento em que o prompt vale a pena A fazer. Ele percorre o mesmo caminho de foco que a paleta de comandos usa, então ele abre A sala de acesso E rola o cartão de senha para ver. Esse caminho é agora uma função partilhada pela paleta, o anel de força e este atalho, em vez de três que poderiam derivar; os segmentos do anel já campo que os corrige e agora realmente usá-lo. SenhaSecurityCard não é um PerfilCard, então seu invólucro carrega a âncora de rolagem. O portão. MANAGEM MEMBER SECURITY já não mostra a senha na o registo de outra pessoa — apenas o próprio membro ou um deus elegível espectador. Esta é a metade DISPLAY; a metade que importa enviado em Serviço de Segurança 197b591, que devolve 403 para a mesma condição. Direito removido de uma tela é uma tela mais arrumada, não um controle de segurança. Chaves de dicionário pousou primeiro em kamo-tradução-dicionário 982c1f62. Verificado: teste npm (14 guardas + 5.139 testes), tsc --noEmit, próxima compilação.

  5. · kamo-internal

    Emblema de navegação proibido, Atribuir a mim mesmo, e mascaramento de contato ofuscado

    ** O ícone de navegação Leads diz quando você não pode aceitar.** Um membro que detém leads eles não têm trabalhado recebe um emblema de bloco vermelho sobre o ícone Leads e uma dica nomear o que é bloqueado, porquê e o que limpar. Alimentado por /leads/ available-summary e mantido ao vivo por um novo evento de aceitação no socket de crédito/atribuição — o load carrega apenas um ID de membro, então cada navegador ignora todos os outros e reaplica o servidor para o seu próprio. Mostrado a qualquer membro que possa ver leads, não apenas titulares de crédito: desde um O chumbo livre para todos pode agora ser auto-aclamado, o portão também os governa. A O ponto de disponibilidade permanece apenas a crédito, pelo que as duas demonstrações permanecem separáveis — você pode ser bloqueado de aceitar enquanto leads sentar lá disponível, e esses são coisas diferentes para dizer. ** Cada status é nomeado da forma como esta org nomeá-lo.** A dica, o /leaders / aviso disponível e a cópia detalhada da página resolver New Lead / Farm Fresh através do usoStatusLabels: etiquetas são substituíveis em /settings/features/crm, e dizendo a um membro para mover uma pista de "New Lead" quando sua org chama algo outro nomeia um status que eles não podem encontrar no coletor. **/leaders/disponible's releases divide-se em duas razões** — leads deveted a note, leads deveu uma mudança de status — porque fundiram-se em uma lista que leram como um pilha indiferenciada e o membro tem que abrir cada lead para saber o que Quer. Uma falha de chumbo está listada uma vez, marcada. ** Atribuir a mim mesmo** senta-se sob Hot Reatribuir em uma liderança não atribuída. Oferecido em livre-para-todos levam a qualquer pessoa que não esteja atualmente barrada, e em qualquer Um detentor de ASSIGN LEADS. A resposta leva o chumbo de volta desmascarado, então configurando-o em estado flips atributedToMe, recomputa a decisão da máscara para UNMASKED, e revela as informações de contato sem recarga. **O estado controla pulsos** enquanto o chumbo é meu e ainda em New Lead ou Farm Fresh — esse é o controle que o corrige, e o cabeçalho é lido por muito tempo antes de uma dica de navegação. As honras preferem movimentos reduzidos. ** Informações de contato mascadas são ofuscadas, não em branco.** contatoObfuscator.ts mirrors o ContactObfuscator do servidor exatamente, afirmando as mesmas strings, porque o em tempo real lead retransmite um DTO totalmente desmascarado para cada assinante na org e O navegador é a única coisa à frente dele. Um campo em branco é lido como "este lead não tem e-mail", que é uma declaração diferente e errada. **O filtro /leades não atribuído é oferecido a todos. ** Sem VEZ UNASSIGNED LEADS retorna os leads livres-para-todos não atribuídos deste membro pode reivindicar, e o rótulo diz isso em vez da opção silenciosamente significando dois Coisas diferentes. O cliente não mais forças atribuídas=ASSINADA para aqueles membros — o andar do servidor é mais amplo do que isso agora, e enviar clip exatamente as linhas que esta mudança existe para mostrar.

  6. · SecurityService

    Sirva o portão de aceitação ampliado, adicione auto-atribuição e feche dois bypass de máscara de contato

    **Endpoints for the new gate.** /leaders/disponível-síntese e /leaders/disponível No que se refere à questão de saber se um membro está bloqueado, a Comissão considera que, no caso em apreço, a Comissão não pode aceitar a alteração n.o 1 do artigo 4. atribuído, e leva ainda em seu estado de admissão — com os próprios o texto do estado do SISTEMA mais IDs, para que o navegador possa resolver o próprio org etiquetas personalizadas antes de mostrar a alguém a razão pela qual estão presos. bloqueadosPorComment é mantido como um apelido do novo 'proibido' para que um navegador ainda em execução o pacote anterior continua trabalhando através da implantação. O portal é avaliado para qualquer um que possa ver leads, não só os membros segurando SPEND RECEIVE LEAD CREDIT: um membro que só pode reivindicar um lider livre para todos é sujeito à mesma disciplina e seu navegador tem que ser capaz de dizer isso. A credit-pool scan abaixo ainda requer o direito de crédito. **POST /leaders/{id}/atribuir-me** reivindica um lead não atribuído. Devolve o chumbo UNMASKED — o chamador é seu atribuído pelo tempo que o servidor responde — que é o que permite que a página de detalhes revele as informações de contato sem recarregar. Um novo sujeito da NATS, publicado quando uma nota cai sobre uma pista, quando um status muda, e em ambos os lados de cada designação Mudança. O relé do MediaService já assina security.leades.> e mapas assuntos para tópicos genericamente, por isso não precisa de mudança. A carga transporta apenas um ID de membro: a resposta do portão depende do livro inteiro desse membro, então há nada de útil para colocar em um tópico org-wide, e um assunto que cada membro recebe É o lugar errado para qualquer coisa que valha a pena reter. **Dois bypass de máscara de contato, ambos encontrados auditoria onde os detalhes de um lead podem chegar a um navegador:** - GET /leaders/{id}/história não tinha nenhuma tarefa ou portão de contato em tudo. Uma mudança de campo log é um registro completo de cada valor que um campo já possuiu, então ele retornou o e-mail e os números de telefone que a máscara do próprio chumbo retira — e não apenas as atuais, todas as anteriores também. Agora tem as mesmas duas decisões que getLeadById, e LeadHistoryContactMask ofusca as linhas de suporte de contato. Status, atribuição e histórico de montantes em empréstimo não são tocados: esta retenção informações de contacto, não a pista de auditoria. - GET /leads/callback-context/{id} enviou um endereço de e-mail e dois telefones números para qualquer chamada de volta na org, ungido. Um ID de retorno de chamada era uma maneira de ler Os dados de contacto da pista de qualquer colega. ** Um guarda de gravação na atualizaçãoLead.** A máscara de leitura já não tem contacto com espaços em branco campos, ofusca-os — por isso um ouvinte mascarado agora detém cordas reais que persistiria perfeitamente feliz. A hierarquia certa torna isto difícil de alcance, mas "difícil de alcançar" não é uma garantia e o modo de falha é silencioso corrupção do número de telefone de um cliente. **Visibilidade da grade.** Sem VISÃO UNASSIGNED LEADS o piso /leaders torna-se "meu leads plus unatributed free-for-all leads" em vez de "meu leads", e um o lead livre-para-todos não atribuído pode ser aberto e seu histórico lido — uma linha que você pode ver mas não conseguir abrir é um erro. Ler a CORRESPONDÊNCIA em um é diferente question and LeadCommsReadGate ainda responde com VER LEAD CONTACT INFO OTHERS; o escopo grade-comms mantém deliberadamente o piso mais estreito, com um comentário dizendo por que os dois agora diferem.

  7. · kamo-shared-library

    Ampliar o portão de aceitação, ofuscar informações de contato mascaradas, deixar livre-para-todos os leads ser reivindicado

    Três alterações relacionadas ao núcleo de atribuição de chumbo. **O portão de aceitação agora faz duas perguntas, sobre cada liderança atribuída.** LeadAcceptElegibilidadeService substitui o portão de comentários que viveu dentro CreditLeadAssignmentService. Um chumbo bloqueia o seu titular de tomar outro quando Ou não tem nenhuma nota deles escrita, desde que lhes foi atribuída, ou é ainda sentado em Fresh > New Lead / Farm > Farm Fresh. Ambas as metades fecham um buraco. A velha regra contava qualquer nota escrita, por isso uma pista que voltou para um membro passado em uma nota de sua passada anterior com ele. E olhou apenas para os leads adquiridos através do sistema de auto-atribuição, que deixou todas as outras rotas — a atribuição manual de um gestor, uma importação, uma auto-declaração — como forma de acumular pistas intocadas com a piscina ainda aberta. A regra é duas consultas baseadas em conjuntos qualquer que seja o tamanho do livro do membro: atribuições atuais, em seguida, um agregado agrupado MediaObj sobre seu fluxo Guids. Alargando o escopo para cada atribuição fez o antigo loop de consulta-por-lead inacessível - é a forma que fez a grade /leaders lento, e isso roda em Cada transmissão dos leads nav para cada membro assinado. Os status de bloqueio são nomeados explicitamente no LeadStatusType em vez de derivados de isAllowSwitchBack. Esses dois são os únicos que têm esse estatuto. bandeira, mas responde a uma pergunta diferente, e um status futuro marcou o mesmo O caminho não deve começar silenciosamente a bloquear aceita. A correspondência está no sistema armazenado descrições, então as etiquetas de status personalizadas de uma org nunca afetam a regra. ** Informações de contato mascaradas estão ofuscadas ao invés de em branco. ContactObfuscator transforma (555) 555-5555 em (555) 555-**55, snadjafinia@gmail.com em ******@gmail.com, e 123 Main St em *** Main St. Um campo em branco é indistinguível de um ninguém preenchido, então um espectador restrito não poderia dizer "há um número aqui que você não pode ler" de "este chumbo não tem número" — e os funcionários perseguiram a segunda leitura. Cidade, código postal e país sobrevivem agora na mesma base o estado sempre fez: suficientemente grosseiro para identificar uma duplicata, inútil para falar com alguém assim que o número da rua desaparecer. Data de nascimento ausente; nenhuma forma parcial é tanto reconhecível quanto segura. O navegador espelha exactamente isto porque... Fãs LeadRealtimePublisher um DTO totalmente desmascarado para todos os assinantes do Org sem projecção por beneficiário possível. As suites Java e Vitest afirmam As mesmas cordas para que os dois não se afastem despercebidos. ** Os leads gratuitos não atribuídos são visíveis e reclamáveis. ** * * ******************Afirma uma pista específica não atribuída. Free-for-all é a porta aberta e carrega o portão aceita com ele — caso contrário seria o caminho em torno da disciplina que existe ao lado — e mentas / gastos seu próprio crédito exatamente como aceita NextLead faz, por isso Max Daily Spend ainda o tampa. ASSIGN LEADS é a porta elevada: qualquer chumbo não atribuído, nenhum portão, nenhum crédito. Licenciamento é uma restrição legal e nenhuma das portas o renuncia. Ganhos do LeadGridQuery **************************** girando a grade O andar de permissão de "lideres atribuídos a mim" em "lideres atribuídos a mim, mais qualquer coisa genuinamente para agarrar". Escondendo pistas não reclamadas de todos sem view UNASSIGNED LEADS os deixaram passíveis em teoria e inatingível na prática.

  8. · kamo-internal

    Bandeiras em idiomas e parar de copiar listas de plataformas

    Completa c20bac57. As línguas agora carregam sua bandeira, o mesmo que o NavTop switcher mostra e da mesma fonte — o valor fechado, bem como todas as linhas do menu. Chegando lá exposto o problema real: options.ts tinha crescido cópias privadas de quatro listas a plataforma já possui, que é como a página que substituiu Também funcionou. • As línguas eram uma cópia retipada sem códigos de país, por isso uma bandeira não era Mesmo possível. Agora app/lib/languages.ts, que o NavTop switcher e o tradutor de chat já compartilha. • As moedas foram uma semente de 34 entradas contra 160-odd da plataforma, de modo que um membro pago em naira ou shekels ler sua própria moeda como um código nu sem símbolo e sem nome. Agora app/constants/moencies.ts. • Zonas horárias foram redigidas a partir dos mesmos 27 nomes. Agora derivado de TIMEZONE ENUM TO IANA, o único mapa completo, por isso o catador não pode oferecer uma zona que nada pode resolver. • O local de trabalho mantém os seus valores, mas agora são verificados em relação ao Java enum por teste. O status de membro da equipe permanece uma lista explícita de propósito: o gerado TypeScript mirror is STALE and missing CONTRACTS SENT, so deriving it from não iria silenciosamente soltar um status membros estão realmente definidos para. O enum Java tem nove; um test pins todos os nove. As linhas do fuso horário agora mostram que horas são. Vinte e sete nomes com os sublinhados removidos é uma lista que você já tem que saber a resposta para ler; o tempo é a coisa que está sendo escolhida, por isso é a coisa mostrada. Também corrige uma reivindicação que o primeiro commit não entregou: framer-motion não consulta prefere-reduzido-moção por si só, de modo que a sala crossfade ea poupança bar animado independentemente da configuração. MotionConfig reduxMotion="user" agora cobre ambos; as peças orientadas por CSS já carregavam suas próprias dúvidas. E o campo de campo renderiza sua bandeira na visão lida, combinando com o selecionador que o produziu. Verificado: teste npm (14 guardas + 5.121 testes, 70 deles acima app/lib/memberProfile), tsc --noEmit, próxima compilação.

  9. · kamo-internal

    Reconstruir meu perfil como um herói e cinco quartos

    **************** foi uma versão de 1.999 linhas treze cartas idênticas numa única coluna. Um ajudante SectionCard deu todos eles o mesmo raio, a mesma sombra, o mesmo chip de ícone e o mesmo Editar / Salvar / Cancelar trio, então "Informações de Conta" — duas datas ninguém pode editar — levou exatamente o peso de "Password & MFA". A disposição foi dizendo a verdade sobre uma hierarquia que a página não tinha. A reconstrução: • Um herói que mantém a resolução de papel de parede do MemberHeader verbatim, cicatriz comentários incluídos, e acrescenta a identidade foi apenas decoração: o nome como a página é uma peça de grande tipo, a hora local do membro Tiquetaque na sua zona, estado MFA, último sinal, e um anel de força. • Cinco quartos atrás de um trilho — Identidade, Aparência, Trabalho, Acesso, Regional — um aberto de cada vez, carregado na URL como &room=. Um quarto cujo cartão é fechado para o espectador não renderiza nenhum item ferroviário em tudo. • Click-to-edit campos e uma barra de poupança de nível de sala, substituindo 39 botões. Salva a ventoinha por endpoint sob allSetled: um grupo que tem sucesso commits enquanto um grupo que falha mantém seus campos sujos com uma razão. • Cmd+K sobre cada campo, por isso quartos escondem coisas sem escondê-las. • esqueletos cambaleados em forma de cartão em vez de um spinner full-tab. Dois defeitos encontrados durante a leitura, corrigidos aqui: • O endereço nunca funcionou em qualquer direção. O carregador codificado cinco texto vazio e nunca ler data.address, que o SecurityService faz enviar; e do cliente {rua, cidade, estado, zip, país} não é o formato de fio — Membro.endereço é um endereço de {endereço, endereçoDetalhes, localidade, subdivisão, código postal, país}. Então, ficou em branco para todos e chaves salvas que a entidade não carrega. Agora usa a forma O resto da plataforma já envia, com testes de ida e volta. • "Nome legal:" e "Nascido" eram literais em inglês no MemberHeader, e o o trabalho-localização e emprego-status rótulos foram literais ingleses no componente. Todos com chave. Estrutura. As regras passaram para app/lib/memberProfile, onde o vitest realmente recolhe-os — app/settings/** não está na lista de inclusão, portanto, um teste escrita ao lado da página teria passado por nunca correr. fields.ts is a pedra chave: cada campo declarado uma vez com seu quarto, cartão, etiqueta, portão e endpoint. A paleta, o anel de força, o save fan-out e direitos gating todos o leram em vez de reimplementá-lo, e 57 testes prendem as portas para baixo — incluindo que nenhum campo é mais visível do que seu cartão, e que edição nunca é maior do que ver. As dicas rápidas são retiradas apenas para esta página, omitindo a ajudaDicas; ConfiguraçõesView torna o trilho da aba ativa, então os outros nove mantêm o deles. Impersonate move do cabeçalho de configurações para o herói. Também exclui ProfileTab.tsx (2.650 linhas), LoginSecurityTab.tsx (787) e PermissionsTab.tsx (2.136), que não tinha importadores. Chaves de dicionário pousou primeiro em kamo-tradução-dicionário 4bb91245. Verificado: teste npm (14 protectores + 5106 testes), tsc --noEmit, próxima compilação, e check-i18n-keys -- requer-mensagens contra um novo clone do dicionário.

  10. · kamo-internal

    Um terminal Linux real em uma janela de ferramentas e um submenu para alcançá-lo

    A opção Linux Desktop nav torna-se um menu em vez de um lançamento — Remote Desktop com seus tamanhos, Terminal Remoto — exatamente como o softphone possui chamada, voicemail e SMS. Uma mudança de registro faz isso: `kind: 'action'` torna-se `kind: 'tool'', e NavToolButton já renderiza um submenu nas três posições enquanto toolSections já é a fonte compartilhada para o navegador e o home launchpad, então os dois não podem derivar. O TERMINAL. xterm.js contra um PTY real na própria máquina de dev do membro, assim que é um terminal e não um corredor de comandos: aplicativos de tela alt (vim, htop, less), 24 bits cor, relatório do rato, pasta emparelhada, glifos largos e combinados, clicáveis Ligações OSC 8. Nada é interpretado no caminho através — teclas são bytes para o PTY e saída é bytes para trás — que é a única maneira de um terminal é sempre realmente compatível com o que as pessoas correm em um. No topo do emulador: a status chip que pulsa em vez de confiar na cor sozinho, um título que segue o A própria sequência OSC do shell para que rastreie o cd e o comando em execução, copy- on- select com Ctrl+Shift+C/V, Ctrl+Shift+F pesquisa, Ctrl +/-0 zoom, e uma paleta que segue o tema do espectador. A concha sobrevive à janela. Ele é executado sob tmux chaveado no ID da janela, então um atualizar, uma conexão descartada ou uma restauração de janela de ferramentas religa-se ao mesmo sessão com seu scrollback e seu comando em execução — que também é por isso o 'socket' caiu religa- se com o 'backoff' em vez de comunicar uma falha. A transporte vive em ************* livre de React e de xterm, então backoff e a frame split são testáveis sem um DOM. A DIMENSÃO DE DESKTOP MANTIDO foi-se, e com ele DesktopResolutionPicker. Estava pronto. em uma página de configurações quatro telas de cada lançamento e ler fora do localStorage, então "por que abriu pequeno?" não tinha resposta em nenhum lugar perto da coisa que abriu pequeno. O tamanho agora é escolhido no mesmo clique que abre o desktop; openKamoDesktop toma-o explicitamente e um chamador sem opinião passa `fit`, que é o que o padrão sempre foi. Três defeitos encontrados e corrigidos na auto-revisão, todos silenciosos: o manipulador de atalho foi anexado por um efeito que dispara antes da existência do emulador assync, nunca vinculado; fechando uma janela enquanto seu pedido de ticket estava em voo ainda abriu um soquete depois, deixando uma concha ligada ao nada que o por-member cap continuou contando; e as decorações de busca omitidas ISearchOptions' duas cores required overview-ruler. Digitando os refs xterm Em vez de "qualquer" foi o que apanhou o último. 405 arquivos de teste / 5049 testes passar, os 14 guardas estão limpos, tsc está limpo, eo A verdadeira construção da produção é bem sucedida — só um tsc verde não prova nada aqui. Dicionário empurrado primeiro (115c267f); verificado contra um novo clone da forma CI faz isso, uma vez que mensagens locais/ é gitignored.

  11. · kamo-internal

    Um estado da quarta janela — float, arrastar para desligar, arrastar para reordenar

    Uma janela de ferramenta popup teve três estados: acoplado na linha ao longo da inferior, maximizado sobre o viewport, ou minimizado para um chat head. Isto adiciona FLOTING — descolado da linha, largado em qualquer lugar na tela, e redimensionou de qualquer lado — e alcança-o de duas maneiras. O botão. Um controle na barra de título, usando o mesmo ícone que Detacha uma nota, levanta a janela da ranhura em que estava e em cascata Afastem-se da doca para que o olho possa segui-la. Pressionado novamente volta para A fila. Uma janela maximizada não é maximizada e centralizada, uma vez que Não tem espaço para sair. O DRAG, que é a metade interessante. Pressionando a barra de título e puxar é UM gesto com três resultados, e onde a janela é deixada ir decidir quais: - libertado com a sua borda inferior dentro de 96px do fundo do viewport, é preciso um espaço na fileira — assim arrastando uma janela acoplada de lado REORDEA o cais, o que não era possível anteriormente; - lançado em qualquer outro lugar que flutua lá, que para uma janela acoplada é No momento em que se desprende. Descobre exactamente onde estava. Nada salta; - e uma janela flutuante arrastada de volta para a fila como ele aproxima-se, no seu tamanho normal e em ordem com os seus vizinhos. O EDGE inferior é medido, não o ponteiro: arrastando uma janela 650px por sua barra de título coloca o ponteiro 600px acima da doca no primeiro quadro, e um teste de ponteiros iria separar cada tentativa de uma reordenação. Nada está comprometido até o ponteiro aparecer. A janela carregada, o vizinhos embaralhando para dar espaço (ou fechando fileiras atrás dele), a queda trilho brilhando como a doca se aproxima e o halo ao redor da fenda que ele vai terra em são todos uma pré-visualização resolvido da caixa ao vivo cada quadro — que é o que faz a Escape, e mudar de ideias a meio caminho, não custa nada. Duas decisões menores valem a pena nomear. Janelas acopladas estão agora posicionadas de sua borda TOP em vez de presa com "baixo: 0"; topo e fundo são propriedades diferentes e nenhuma transição carrega um elemento entre Eles, por isso o estalo teria saltado no que fosse cronometrado. E... "resizable: false" torna-se um FLOOR uma vez que uma janela está fora da linha em vez do que um veto — o compositor de email é uma das ferramentas de tamanho fixo, e Os membros da janela querem mais espaço. A ordem da linha e a geometria flutuante sobrevivem a uma recarga: o instantâneo carrega a caixa flutuante, o tamanho da doca para retornar, e a ordem do array, que é o acordo de esquerda para direita do próprio membro. Requer @ kamo/tool-core 0.1.6 (setFloating / setFloatGeometria / SetWindowOrder), bateu aqui.

  12. · SecurityService

    Servir Terminal Remoto — um shell real sobre um WebSocket

    Bridges um navegador para um PTY na própria máquina de dev do membro. Quadros binários são o terminal, os quadros de texto são controlados; no hop distante um HTTP 101 em uma stream prefixo de comprimento atinge o agente na porta a política de rede já Permissão, portanto não é necessária nenhuma mudança de Cílio. O primeiro WebSocket neste serviço, e deliberadamente um cru. STOMP é um message broker sobre um socket e o que viaja aqui é um fluxo de byte entre um navegador e uma shell — um envelope ao redor de cada tecla não compra nada. A autorização acontece antes do soquete. Um navegador não pode colocar um cabeçalho em uma Construtor WebSocket, então em vez de ensinar o aperto de mão para analisar ***, e o objetivo normal autenticado toma toda a decisão com a sessão em mão e mãos para a frente como um bilhete de uso único que é inútil 30 segundos várias vezes após uma utilização. Isso espelha o link KamoDesktop, que foi endurecido por exatamente esta razão: um token replayable fica na história e em Ctrl+Shift+T, e uma shell é pior nesse aspecto do que uma área de trabalho, não melhor. O aperto de mão não lê mais nada do cliente — não um nome de usuário, não um conta, apenas uma dica de tamanho os grampos do agente de qualquer maneira. A conta Linux vem de credenciaisPara ( < ID do próprio membro do chamador>), então uma solicitação não pode nomear alguém O outro escudo, e a Origem está presa ao hospedeiro a ser endereçado. Nenhuma senha é leia em tudo: o agente é raiz e cai na conta, por isso o reversível Credencial Guacamole necessidades nunca é tocado neste caminho. Auditado antes do fato, síncrono, no mesmo Registro de Acesso que já respostas "quem assinou de onde" — com IP, geo e usuário-agente, no ALTO gravidade. Uma linha que só apareceu no sucesso estaria faltando exatamente os casos Isso importa. Oito terminais por membro, porque cada um é um PTY e um thread em um VM compartilhada que foi derrubada pela pressão da memória antes. Fechar o 'socket' não mata o 'shell'; o agente executa- o sob o 'tmux' de modo a atualizar ou uma conexão descartada retorna ao trabalho ainda em execução. 21 testes: utilização única, expiração de ambos os lados da fronteira, silêncio desconhecido, tampa por membro e sua liberação, tokens não sequenciais, e o codec frame incluindo a entrega one-byte-at-a-time, um comprimento declarado absurdo, e leitura a linha de status da atualização sem engolir o fluxo por trás dela.

  13. · KlusterServices

    Dê ao agente um ponto final PTY para Terminal Remoto

    GET /pty atualiza a conexão para `kamo-pty` e se torna uma shell: um PTY por janela de ferramenta do navegador, `su - <user>` em `tmux new-session -A`, quadros bombeados Tanto sobre o soquete cru. Um 101 em vez de um WebSocket. O chamador é Serviço de Segurança segurando o portador token, não um navegador, por isso não há razão para rodar manualmente RFC 6455 Mantém-te estável. Depois da linha de status é `uint32 comprimento , uint8 tipo , payload`, e ThreadingHTTPServer thread-per-connection é exatamente a forma Isto precisa. tmux, não uma concha nua, e é por isso que está aqui. Um PTY cru morre com seu socket, então uma atualização de página, um laptop fechado ou um blip wifi mataria um executar build — e o kamo- internal restaura janelas de ferramentas ao carregar, então um restaurado O terminal voltava com um cadáver. `new-session -A` faz a primeira ligação e reconectar o mesmo comando. A segurança segue a regra existente do arquivo: o nome de usuário já chega resolvido da própria sessão do membro e é revalidada contra USERNAME RE e lista reservada antes de qualquer processo iniciar, os IDs de sessão são verificados porque o tmux lê `.` e `:` como sintaxe de endereço, os tamanhos são framebuffer em uma máquina compartilhada, e uma conta desabilitada é recusada mesmo que 'su' ainda funcionaria por isso. Nenhuma senha é lida em tudo — o agente é root e cai para a conta, então ao contrário do caminho Guacamole a credencial armazenada nunca deixa a base de dados. TERM é forçado através de `env` porque `su - `reconstrui o ambiente a partir de scratch, e um terminal que aparece como 'dumb' não tem vim, htop ou menos. As sessões de tmux abandonadas são podadas quando o membro seguinte se conecta, o que precisa nem um temporizador nem uma lista de todas as contas na máquina. 24 testes: forma argv, recusas reservadas/inválidas, aperto de tamanho, codec frame incluindo um quadro dividido entre leituras e um comprimento declarado absurdo, controle A manipulação de quadros, e os quatro casos do Ceifador. Passagem 107.

  14. · kamo-shared-library

    Gravar um terminal de máquinas dev no registo de acesso

    Um membro abrindo uma shell no desktop-1 agora tem um tipo de evento próprio. Isso. máquina possui um cluster-admin kubeconfig e suas contas têm senha gerenciamento de pacotes, que é root-equivalente — "quem tinha uma shell lá, de qual endereço, e quando" tem que ser responsável a partir do mesmo log de acesso que já responde para logins. Seguro para adicionar: system access logs não carrega nenhuma restrição de verificação (verificado em produção hoje) e event type é varchar(30). Contraste PhiResourceType, cujo valor identificado por Hibernate whitelist ddl-auto: update nunca irá ampliar.

  15. · SecurityService

    Enviar a empresa ao lado do contato onde quer que um registro é rotulado

    Um registro que é tanto uma organização e uma pessoa é chamado de "Harmony Home Loans (Nickolas McGarry)" — a empresa lidera, o contato se qualifica. Essa regra vive na entidade do navegadorLabel(), então esses endpoints param de escolher uma metade e enviam As duas coisas. - A linha do tempo da grade /leades carimbou cada entrada com o contato e caiu de volta para A empresa. Mesmo chumbo, portanto, lido como uma pessoa em sua linha do tempo e como um empresa na rede que o produziu. - O histórico de crédito / atribuição de chumbo resolveu o contato apenas. Resolvido aqui em vez de no serviço de história compartilhada porque este é o seu único renderizador, e um findAllById sobre os leads distintos da página é uma única consulta. - A página de Leads de uma conta estava a enviar {uid, organizationId} e nada mais, então cada coluna lê "---" e cada linha ligada a /leads/view/undefined. Agora. envia id (que é o que as chaves e links da tabela sobre), as duas metades do nome, Estado e dataCriada. O e-mail do líder está fechado como o contacto do líder. está em todos os outros lugares: sua própria liderança sempre, qualquer outra pessoa só com VER LEAD CONTACT INFO OTHERS.

  16. · kamo-shared-library

    Envie a empresa de uma conta ao lado de seu contato para os catadores de clientes

    Seis catadores de clientes ler ContaResumoDTO — o editor de pedidos, o serviço-trabalho formulário, o detalhe da subscrição e assistente, e a guia de inscrições do gasoduto — e Cada um deles nomeou um cliente por quem quer que seja o ponto de contacto. Alguém. escolher qual cliente um trabalho ou um pedido pertence é procurar o organização. displayName é agora o contato SOMENTE. Ele costumava carregar um sufixo "(#123)", que fez sentido enquanto era toda a etiqueta e produziu colchetes aninhados no momento a empresa o liderou — "Harmony Home Loans (Nickolas McGarry (#123)). O UID é já um campo próprio para qualquer catador que precise separar dois clientes com o mesmo nome, e o navegador compõe as metades através de uma entidadeLabel() que todos os outros ecrãs virados para o cliente também passam.

  17. · kamo-internal

    Visão de Comunicação — todo o livro filtrado como uma linha do tempo

    Três alterações para /leaders. A busca rápida se move para o herói, acima dos links de Configurações de CRM. No filtro row era o último controle em uma linha de onze dropdowns, só Analisando todos eles. LeadManager ainda possui a jornada do valor para o consulta e para o armazenamento de sessão que restaura a barra de filtro no caminho de volta de uma pista — a caixa se moveu, nada mais fez. Um interruptor, centrado na linha de paginação: Lead View / Comunicação View. Duas posições nomeadas em vez de uma Switch, porque nenhuma delas está "desativada" — eles são duas maneiras de olhar para o mesmo conjunto filtrado, e um nome de controle apenas um deixaria o leitor adivinhar o que a outra posição faz. Visão de comunicação substitui a grade com a mesma linha do tempo de um lead A aba de comunicações desenha – mesmo componente, mesmo seis sub-tabs, mesmo item renderizadores — scoped para o que a barra de filtro corresponder atualmente. Cada entrada carrega um chip nomeando seu lead e ligando-se a ele: cross-lead, uma linha que faz não dizer de quem foi a chamada é ilegível, e encontrar a única conversa vale a pena abrir é a razão para analisar a lista. Nenhum compositor de notas, deliberadamente: a nota tem que ser sobre um chumbo, e uma caixa que não poderia dizer que é uma armadilha em vez de uma conveniência. Detalhes que são de carga em vez de incidental: - A busca da página da grade é SUSPENDIDA em Visão de Comunicação. GET /api/security/leaders escreve uma linha de acesso PHI por lead que retorna, e buscando uma página para renderizar uma tela mostrando nenhum deles colocaria leituras na auditoria Uma pista que ninguém fez. - A cadeia de filtros entregue à linha do tempo é deduzida no atraso da grade. A grade descubra seu pedido; a linha do tempo não pode — refetches sempre que o string muda e dispara dois pedidos por mudança, então digitar "smith" foi dez viagens redondas, cada um escrevendo um registro de pesquisa PHI, nenhum deles abortado. - página/tamanho/sort são retirados dele. tamanho colide ativamente, porque o A linha do tempo define a sua própria. - Os dois rastos do pager ficam espalhados quando estão vazios. Uma exibição: nenhuma criança é não é um item de grade em tudo, por isso escondê-los teria deixado o interruptor como o primeiro item e deslize para a faixa esquerda, fora do centro.

  18. · kamo-internal

    Adicionar JustCall como tipo de servidor de telefone

    "Adds JustCall to the chocker" chave e segredo, um contato-importação alterna, status credencial nos provedores tab, e o logotipo. A parte interessante é marcar. JustCall não publica registro SIP e não Credencial WebRTC para aplicativos de terceiros, e sua única chamada de saída Endpoint conduz um agente de voz de IA em vez de uma pessoa — por isso a infra-estrutura reporta voiceCalls=false, que usaSoftphone já dá entrada em, e não O softphone foi construído. Mas um membro da JustCall pode fazer uma chamada perfeitamente bem. apenas não aqui, e "chamadas de voz não disponíveis com o provedor atual" seria um lie. dial() portanto, entrega o número ao próprio web dialler do JustCall. Essa transferência é seu próprio módulo em vez de um ramo dentro do gancho: é um lib concern, e colocá-lo lá torna-o testável. Ele usa o web dialler em vez da chamada justa: protocolo o aplicativo desktop registra, porque um navegador não sei se essa aplicação está instalada e uma navegação de protocolo não manuseada não faz absolutamente nada — um membro sem o aplicativo clicaria em discar e assistir Não aconteceu nada. ProviderCapabilities gained providerType para que uma voz falsaChalls possa ser acionada em vez de ser apenas reportado: para a maioria dos fornecedores significa "sem discagem", para este Um significa "discar para lá". Espelhos SipCredenciaisResult.provider, que existe pela mesma razão. O novo teste de cobertura é o gêmeo frontend da PbxProviderBillingCoverageTest — um provedor ninguém lembrou de etiquetar não falha em voz alta, ele renderiza como um cartão em branco na tela que um administrador usa para escolher. Verificado: TSC limpo, todos os 14 guardas, incluindo check-i18n-keys -- require-mensagens, 4.938 testes de vitela. `próximo build` NÃO foi executado contra estas alterações: outro sessão manteve este diretório de trabalho com seus próprios compilações simultâneas ao longo.

  19. · SecurityService

    Uma linha do tempo de comunicações sobre todo o filtro /leaders, não um único lead

    Get ************* toma a mesma linha de consulta get a página de detalhes do lead desenha — em cada lead a barra de filtro corresponde. "O que tem foi dito às lideranças que estou trabalhando" é uma questão sobre um conjunto, e até agora A única forma de pedir era abri-los um de cada vez. A tradução do filtro move- se para LeadGridFilters para que ambos os terminais resolvam uma query string idênticamente; uma segunda cópia seria deriva, e a forma como ela deriva é uma timeline cobrindo diferentes leads da grade que o produziu. Dois limites diferentes, por duas razões diferentes. Chamadas, mensagens de voz, mensagens e E-mails são ilimitados: LEAD COMMUNICAÇÕES carrega ORG ID e é indexado em (ORG ID, OCCURRED AT), então uma consulta de keyset caminha pela correspondência do org o mais novo primeiro e testa cada linha contra o predicado da grade como correlacionado EXISTE — o mesmo custo, quer sete leads correspondam a setenta mil. Notas e bate-papo não pode ser: eles vivem no MEDIA OBJS, que não carrega org nem chumbo, e a única junção é LEADS.STREAM GUID, que não está indexado. Aqueles dois. resolver os leads correspondentes primeiro, com um limite de 1000, e a resposta diz quando Coberto em vez de deixar cair a história silenciosamente. A autorização é a linha do tempo principal, aplicada no SQL. Uma entrada carrega uma pista próprio número ou endereço mais conteúdo de mensagem, então LeadCommsReadGate agora também declara sua regra sobre as três formas que um chumbo pode ter e emite o predicado correspondente. Escrevendo-o uma segunda vez é onde o erro foi: o primeiro rascunho lido "unssigned needs VIEW UNASSIGNED LEADS" e perdeu essa recusa() através dessa verificação para o contato-info um, que teria colocado cada correspondência de chumbo agrupado na frente de um membro que tem apenas a piscina direita. Os dois formulários estão presos a um ao outro exaustivamente — cada combinação certa contra cada forma. Ao contrário do rollup de uma conta, isso NÃO colapsa um evento que atingiu dois Conexão de pistas. Duas razões apontando da mesma forma: cada linha nomeia o lead it pertence e "esta chamada atingiu ambos" é um fato sobre o livro que está sendo trabalhado, e quebrando linhas de uma única página de tamanho fixo pode deixar o sobrevivente último gémeo como uma entrada nova que o cliente não pode de- duplicar. As consultas de critérios são puxadas para LeadGridCommsQueries como funções puras LeadGridCommunicationsSqlTest pode torná-los contra metadados Hibernate reais. Isso importa aqui mais do que o habitual: a própria especificação da grade já emite EXISTE subqueries, e este ninho-lo dentro de outro — que é exatamente onde este serviço é Hibernate 6.2.13 e a biblioteca compartilhada 6.5 diferem.

  20. · VOIPService

    Fio JustLigar através da abstração do provedor de telefone

    JustCall (api.justcall.io/v2.1) como um TelefoneProvider completo: histórico de chamadas, textos, voicemail, gravações, diretório do agente e disponibilidade, além de assinado Webhooks de conta e uma importação opcional de contatos. Auth é uma conta ampla par chave/secreto enviado como o valor bruto da autorização "key:secret" — não um portador token, que não autentica nada e devolve um 401 que lê como um mau Credencial. Três formas da API do JustCall impulsionam o design: * Voicemail não é um recurso. É uma chamada cujo call info. tipo é "Voicemail", carregando sua transcrição em linha e seu áudio atrás do mesmo gravando endpoint como qualquer outra chamada — então getVoicemails é getCallHistórico com um filtro, e não há estado de leitura para marcar. * Não há credencial de softphone. JustCall não publica registro SIP e não WebRTC token para terceiros, e seu único endpoint de chamada de saída AI Voice Agent em vez de uma pessoa. vozChamadas é, portanto, falso, que é o que usoSoftphone já portas registro em, e getSipCredentials recusa com uma explicação em vez de meio-registro. * O diretório é somente leitura, e não há nenhum conceito de dispositivo, então aqueles manter a interface está jogando padrões em vez de fingir escrever. Os Webhooks estão registados por exemplo em... assinatura por tipo de evento. O HMAC-SHA256 da JustCall cobre o URL registado. para que a string de consulta esteja dentro do material assinado e não possa ser reescrita Pouse os eventos de uma org no servidor de outro telefone. O URL é gravado em config json no provisionamento porque a verificação tem que assinar o mesmo texto JustCall fez — reconstruí-lo da configuração começaria a falhar silenciosamente momento em que o URL base mudou. Textos de entrada e eventos de chamada chegam aos caminhos que o RingCentral já usa. O manipulador do VoipMessageService era em forma de anelCentral em toda parte, então sua análise é dividido de sua ingestão: ambos os trilhos agora compartilham o dedupe, intercepção de palavras-chave, conversação upsert e ligação de chumbo. Essa partilha é deliberada — a palavra-chave passo é o que registra um opt-out, e um segundo trilho crescendo sua própria cópia do sequência é como se acaba por não honrar STOP. SmsKeywordService's reply switch ganhou o novo trilho pela mesma razão: é um interruptor de instrução, então um Constante não listada não teria respondido a ninguém. O MMS é apenas por URL pública — JustCall não aceita bytes enviados — então um o anexo está estacionado atrás de uma URL inimaginável de curta duração neste serviço e Essa ligação é entregue. Deliberadamente não existe um URL de armazenamento de objetos pré- assinado: MinIO Aqui está... um URL pré- assinado está assinado para o host que ele nomeia, e o buscador do JustCall não pode resolver um endereço de inclusão — seria 404 para eles enquanto trabalha perfeitamente de dentro do cluster. Isto serviço já é acessível publicamente porque recebe seus webhooks. Importação de contato está desligada a menos que ligado: um livro de endereços de um cliente é acesso por membro controlado, e importando-o no momento em que uma chave é colada seria Sê uma surpresa. Contatos são de propriedade através do agente JustCall id a sincronização da extensão já gravado, e qualquer um cujo agente mapas para nenhum membro Kamo é ignorado em vez que estacionado num lugar partilhado. Persistência vai para EmailService, que possui o Quadros de contacto. JustCall's AI call sumária, sentimento e score ride na mesma chamada ler e são exibidos em CallLogEntry. Não persistiu: PHONE CALL LOG não tem tais colunas, o provedor retorna-os em cada leitura, e adicionar colunas custaria uma DDL janela para uma cópia da sua loja. Nenhuma DDL nesta mudança.

  21. · EmailService

    Endpoint interno para importar contatos de um sistema externo

    A integração da VOIPService JustCall precisa de localizar os contactos de um cliente no livro de endereços do membro direito, e é aqui que os contactos são escritos: um Contacto mapeia apenas escalares, com seus e-mails, telefones, endereços, orgs, URLs, IMs e relações em sete tabelas sem cascata, alcançáveis apenas através ContactoDetailStore. Um chamador escrevendo essas tabelas de outro serviço seria Largue silenciosamente cada número de telefone — o único campo em que existe uma integração telefónica entregar — de modo que a persistência permanece aqui e o chamador posta nele. A propriedade é a parte de carregar. CONTACT.OWNER ID NÃO é NULL e pontos em usuários, e o proprietário de um ContactBook é seu controle de acesso (um livro sem proprietário pertence a ninguém e 404s para todos), por isso um lote deve nomear o Os contactos pertencem e são recusados quando não pertencem. Cada fonte recebe seu próprio livro por trás de uma linha ContactIntegration em vez de ser misturado em "Meu Contatos": linhas sincronizadas e linhas digitadas à mão têm diferentes ciclos de vida, e o membro pode esconder ou soltar os importados sem tocar em seus próprios. Os Upserts coincidem com o UID, que o chamador namespaces para o seu sistema. UID é único por livro, então também é isso que faz uma re-sincronização uma atualização em vez de um segundo cópia de tudo. Montado sob /api/internal, vigiado inteiro por InternalAuthFilter — não existe sessão de membro por trás destas chamadas, por isso sem esse filtro isto seria um endpoint para escrever contatos arbitrários em livros de membros arbitrários.

  22. · kamo-shared-library

    Adicionar JUST CALL como um tipo de provedor de telefone

    Aparecido no ordinal 5. ************* é EnumType.ORDINAL e não carrega nenhuma restrição de verificação, por isso o apêndice é seguro e inserindo em qualquer lugar Caso contrário, reorientaria silenciosamente as linhas existentes para um fornecedor diferente — PbxProviderBillingCoverageTest pinos a ordem do outro lado. Third PARTY Facturado: a organização detém sua própria subscrição JustCall (suas API precisa de pelo menos um plano de equipe) e JustCall carrega as chamadas, então este é um taxa de integração, não hospedagem. PbxBillingClass.of não tem nenhum braço padrão, que é o que forçou a decisão em vez de deixar um novo provedor nada Para sempre.

  23. · kamo-internal

    Uma cor de papel por bloco, e blocos que se encaixam no seu texto

    As fechaduras agora encaixam no conteúdo. Os blocos do leitor eram todos 200px de altura. eles mantiveram, porque richTextension configura o editor com minHeight: 200px — forma do compositor de artigos, onde o editor é a página. Mudando o leitor para RichTextView removeu-o; nada no painel A altura do bloco agora é tão alta como as suas palavras. Os editores do compositor crescem em vez de roçar. Mesmo 200px, mais transbordamento: auto no recipiente, significa que cada bloco abriu três linhas muito altas e depois entregou - se uma barra de rolagem em vez de crescer — uma barra de rolagem dentro de uma Bloqueie dentro do roller da página. KbArticleEditor ganha 'autoGrow': o recipiente pára de rolar, a área de escrita começa na altura de uma linha, e os tamanhos de raiz para o conteúdo em vez de preencher seu host. Opt-in, então o artigo o compositor mantém a forma certa para um documento de tamanho de página. Cor do papel. Cada bloco carrega um, escolhido no NoteColorMenu — o mesmo menu e a mesma paleta que as notas e os painéis de lançamento usam, então um swatch significa uma coisa através do produto em vez de três. A cor é armazenada como paleta ID e resolvido através da resoluçãoStickyColor em renderização, então ambos os o compositor e o Centro de Interação pintam de uma fonte e uma paleta posterior correção atinge scripts escritos hoje. No leitor, um bloco colorido mantém a sua cor, quer seja ou não actual. "Onde estou" já é levado pela fronteira, o elevador e o coluna; escurecimento do papel também faria a escolha do autor parecer um Falha de renderização.

  24. · kamo-internal

    Adicionar o logotipo do fornecedor JustCall

    A pasta de logotipo VOIP tinha FreePBX, Microsoft e RingCentral mas não JustCall marca, então qualquer lista de superfície JustCall como um provedor tinha nada para render.

  25. · kamo-shared-library

    Uma cor de papel por bloco

    **************** *************** com uma identificação de paleta - "lemon", "vidro" — e nunca um valor de maldição. Armazenou as notas de forma e os painéis de lançamento armazenam as suas, pelo motivo que a paleta é definida uma vez no cliente (STICKY PALETE) e cada superfície resolve um ID através resolverStickyColor. O feitiço persistente congelaria a sombra de hoje na fila. uma correção posterior à paleta corrigiria as notas e deixaria silenciosamente o scripts na cor antiga — e o mesmo swatch significaria então dois diferentes coisas dependendo de que tela foi escolhido. Null não é cor: o bloco usa qualquer superfície em que se senta. Um branco ou O valor do espaço em branco é normalizado para nulo no caminho, porque "" não é "não cor" para resolverStickyColor - ele devolve o primeiro swatch da paleta, então um autor que limpou a cor teria ficado com limão. Transportado através do bloco completo substituir como todos os outros campos, e coberto lá: a cor sobrevive a uma edição, e uma limpa volta nula.

  26. · EmailService

    Deixe uma mensagem enviada levar imagens dentro de seu corpo

    O corpo tinha quatro formas possíveis e send() só poderia construir três. A branch multipart/relacionado — aquele que coloca uma imagem onde o cid do HTML: pontos para ele — sentou-se atrás do ramo anexo, então uma mensagem com ambos um colado imagem e um arquivo perdeu a imagem na saída: o corpo manteve um cid: referência para uma parte que já não estava na mensagem, e nada disse isso. Foi também inatingível na prática, porque apenas o caminho transacional já definido inlineImagens; nada que um membro enviou poderia chegar lá em tudo. applyBody agora constrói qualquer forma que o conteúdo requer — html sozinho, relacionado quando o corpo referencia imagens, misturadas quando existem anexos, embrulho misto relacionado quando há ambos — e um convite de calendário mantém suas imagens oferecendo o relacionado como a alternativa HTML. responder e avançar passar por enviar, por isso eles Herde tudo. /send toma as imagens como suas próprias partes binárias, cada uma com o nome do id de conteúdo o HTML já faz referências. Base64 dentro da parte JSON custaria um terceiro novamente em tamanho contra o menor teto da cadeia, então uma imagem ou dois ser recusado por uma razão que o membro não poderia fazer nada sobre. O nome de uma parte torna-se um cabeçalho Content-ID, então o InlineImageParts corresponde à forma exata do compositor menta e recusa tudo o mais — um errado falha o envio em vez do que cair silenciosamente e deixar um buraco no corpo.

  27. · kamo-asterisk-support

    Reconcile blocos WebRTC por extensão em vez de editar à mão uma lista

    Uma extensão criada através da API do FreePBX não recebe nenhum bloco WebRTC, então ele registra sobre WSS e, em seguida, não tem DTLS ou ICE — o softphone do navegador mostra um chamada conectada sem áudio. Essas configurações não podem ser expressas em nenhum lugar O FreePBX irá aceitá-los: `dtls cert file` e `transport` não são colunas em a tabela `sip' e não os campos sobre a mutação `addExtension`, então eles têm que ser `[<ext>](+)` anexa em **************** Até agora esse arquivo foi um roster mantido à mão em um ConfigMap, o que significou cada nova extensão foi silenciosamente quebrado até que alguém lembrou-se de editá-lo e reinstalá-lo (8888 não listados durante meses). A extensão 8777 foi a mais recente. WebRTCReconciler lê a lista de extensão do FreePBX gerado pjsip.endpoint.conf e mantém uma seção gerenciada delimitada por marcadores na etapa com A cada 30 anos. Extensões apagadas perdem seu bloco automaticamente — um bloco (+) para uma secção que já não existe faz com que o log Asterisco "A secção não existe" em cada recarga. Só preenche lacunas: qualquer bloco escrito fora dos nossos marcadores (os KlusterServices roster, um administrador) é deixado exatamente como é, nunca duplicado e nunca Assumiu. Apenas os parâmetros de avaliação numéricos são tocados, pelo que os troncos não são fixados um transporte WS com DTLS forçado. Um pjsip.endpoint.conf em falta é um no-op em vez de "zero extensões", que de outra forma iria tirar WebRTC de cada extensão que tem um. OFF por padrão (MANAGEM WEBRTC ENDPOINTS), ligado para k1m1. O bloco é exactamente errado para um telefone de secretária SIP: ele força DTLS-SRTP o telefone não pode fazer e prende-lo para um transporte que não fala. Duas coisas medidas na caixa k1m1 ao invés de assumir: - A recarga tem que ser `module reload res pjsip.so`, não `pjsip reload`. Após adicionar um bloco `[8999](+)`, `pjsip reload` deixou o endpoint em webrtc=no; um módulo de recarga o aplicou, e um módulo de recarga também reverteu quando o o bloqueio foi removido. Usando o próprio 'pjsip reload' da CLI aqui escreveria um Corrigir o ficheiro e deixar a configuração em execução incorrecta. - A (+) bloco só pode opções ADD, nunca sobrepor. Anexando `direct media=yes` para um endpoint cuja configuração gerada disse `direct media=no` deixou-o no `no` — ganha o primeiro valor. ('webrtc=yes' é o exceção apenas porque é uma abreviatura aditiva, não um campo armazenado.) Qualquer coisa que deve MUDAR um valor gerado tem que ser corrigido no FreePBX base de dados. Verificado contra o /etc/asterisco real: corretamente escolhido extensão descoberta de 23, pulou o tronco Erik Primary, deixou o existente roster byte-for-byte idêntico, e foi um no-op na segunda passagem.

  28. · kamo-internal

    Impersonate, para que um operador possa abrir uma org como um de seus membros

    Mostrado ao lado do Enter em todas as vistas /network para um administrador de plataforma O novo Impersonate direita. Um direito diferente do SYSTEM USER e deliberadamente não implicado por ele: entrar como o Usuário do Sistema é uma identidade visível, separada inquilino pode ver em sua própria lista de membros, enquanto isso produz uma sessão nada a jusante pode dizer a partir dessa pessoa assinar em si mesmos. O coletor é o MemberPickerDialog — o mesmo popup que o filtro /leaders Agent abre — inalterado. Já possui a pesquisa, o paging, o manuseio do teclado e a forma como uma linha não-escolhida se explica. O que é novo é o seu 'fetcher', que substitui o endpoint do diretório de imediato e pontos na organização alvo membros, porque o diretório padrão é a própria org da sessão e que é precisamente a lista errada. Ninguém é filtrado do lado do cliente. O servidor marca uma conta de deus, uma plataforma administrador ou um membro fora de bordo não selecionável com uma razão e a tabela da razão do diálogo cresceu para cobri-los: escondendo essas linhas deixaria uma operador à procura de um colega claramente na organização e nada para trás, que lê como uma busca quebrada em vez de como uma recusa. A aba é reivindicada síncrona dentro do próprio clique do aguarde, e sua sessãoStorage limpo — o mesmo punho de dançaEnter documentos, pelas mesmas duas razões: um popup aberto após uma espera é um o navegador nunca viu qualquer um pedir, e uma janela de mesma origem. abrir CLONES armazenamento desta aba, ID da sessão incluído. Também adiciona o ícone que a página de Administração da Plataforma necessita para o novo direito; tsc capturou isso, que é para o que o Right ICON é um registro exaustivo.

  29. · SecurityService

    Digite uma organização de inquilinos como um de seus membros, da /rede

    Uma segunda porta ao lado do mesmo modo de Deus. Preso no novo IMPERSONATE plataforma direita via @RequirePlatformRight, onde a porta existente está fechada a sessão com GD. Mantido como dois manipuladores em vez de um com uma bandeira. Os seus portões de chamada são genuinamente diferente, e @RequirePlatformRight não tem variante in-handler por design — um portão que você tem que se lembrar de chamar é um que eventualmente começa esquecido no ponto final que importava. Quem pode ser ENTRADO AS é uma pergunta separada, e imitaçãoTargetRegras responde como uma função pura sobre fatos resolvidos: recusado para o nível superior org, você mesmo, uma associação sem usuário, o usuário do sistema, uma conta deus, uma administrador de plataforma, ou qualquer pessoa que não poderia assinar em si. O mesmo. função decide se uma linha no selecionador é selecionável, então a lista não pode oferecer a alguém o ponto final iria virar as costas. A porta do mesmo-org deliberadamente não compartilha essas regras. Ele opera dentro a própria organização do chamador, que para um administrador deus é geralmente o nível superior um, e em pessoas que são frequentemente administradores próprios — tanto difícil Recusas aqui. Dobrar os dois juntos quebraria a página de configurações ou Alarga-o discretamente. ****************enche o catador. É o ponto final em que controlador nomeando uma organização diferente da da sessão, por isso é um manipulador separado em vez de um parâmetro em /search: a promessa da classe que a pesquisa não pode ser alargada por acidente permanece verdadeira. As pessoas recusadas ficam em casa a lista com uma razão em vez de desaparecer de uma busca por um colega que está claramente na org. espaço de trabalhoHost Para sair do EnterAsController para o WorkspaceHostResolver, desde Ambas as portas precisam da resposta idêntica. Duas cópias de "qual máquina é openable" é como um continua a enviar operadores para um certificado intersticial após o outro Pare. Seus testes se moveram com ele.

  30. · kamo-shared-library

    IMPERSONATE, para que um operador possa entrar em um inquilino como um de seus membros

    Aplicado ao PlatformRightType em vez de inserido: getSortOrder() retorna ordinal (), então uma direita adicionada no meio renumera cada direito abaixo dela no consola. Subsídios são @Enumerados(STRING), portanto, adicionar alterações já Concedida. Deliberadamente não dobrado em SYSTEM USER. Esse direito entra como um visível, identidade separada que um inquilino pode ver na sua própria lista de membros e pista de auditoria; este produz uma sessão que nada a jusante pode dizer da assinatura do membro em si mesmos. Perguntas diferentes, raio de explosão diferente, então um operador O direito ao primeiro não tem direito ao segundo. RelatórioVisibilidade Test pined MANAGEM REPORTS como o último valor, que se junta o invariante que importa é que nada era Introduzi-lo, por isso agora prende o ordinal. Dois levantamentos de repositórios em lote para o catador por trás: os membros um conjunto de usuários detêm em uma organização, e qual de um conjunto de membros são plataforma administradores. Row-at-a-time que é duas consultas por nome, em um controle que Reproduz em cada tecla.

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